Laboratorium 5 - Regresja Logistyczna

Ćwiczenia bazujące na materiałach Andrew Ng.
Przed zajęciami przejrzyj wykłady VI-VII: Logistic regression

Instructions in English.

Ćwiczenia do pobrania (files to download): logistic-regression.zip

Lista i opis plików

Pliki oznaczone znakiem wykrzyknika (:!:) należy wypełnić własnym kodem

  • ex2.m - Skrypt Octave, który pomaga w przejściu pierwszej części laboratorium
  • ex2_reg.m - Skrypt Octave, który pomaga w przejściu pierwszej części laboratorium
  • ex2data1.txt - Training set for the rst half of the exercise
  • ex2data2.txt - Training set for the second half of the exercise
  • mapFeature.m - Function to generate polynomial features
  • plotDecisionBounday.m - Function to plot classi er's decision boundary
  • plotData.m - Function to plot 2D classi cation data
  • :!: sigmoid.m - funkcja sigmoidalna
  • :!: costFunction.m -funkcja kosztu dla regresji logistycznej
  • :!: predict.m - funkcja klasyfikująca
  • :!: costFunctionReg.m - zregularyzowana funkcja kosztu dla regresji logistycznej

Wstęp

W tej części laboratorium będziemy budować model regresji logistycznej, który pozwoli przewidywać czy kandydat na studia zostanie przyjęty, czy odrzucony.

Zakładając że chcesz ustalić szanse dostania się na studia bazując na wynikach dwóch egzaminów. Masz dostępne dane historyczne w postaci wyników z poprzednich lat i związanej z nimi decyzji: przyjęty/nieprzyjęty.

Twoim zadaniem jest zbudowanie klasyfikatora, który oszacuje prawdopodobieństwo przyjęcia danego kandydata na studia w zależności od wyników dwóch egzaminów.

Wykres obrazujący dane historyczne przedstawiony jest poniżej. Żółte kropki oznaczają odrzucone kandydatury, a czarne krzyżyki przyjętych studentów. Na osiach przedstawione są punkty z danego egzaminu.

Dane historyczne o przyjęciach na studiach

Sigmoid Function

Funkcja hipotezy dla regresji logistycznej wygląda w sposób następujący:

$$h_0(x) = g(\theta^Tx)$$

Funkcja g jest funkcją sigmoidalną, określoną wzorem:

$$g(z) = \frac{1}{1+e^{-z}}$$

Funkcja sigmoidalna została przedstawiona na rysunku poniżej. Uzupełnij kod pliku sigmoid.m tak aby można wyznaczała ona wartość funkcji sigmoidalnej. Możesz spróbować wyrysować funkcję sigmoidalną przy pomocy zaimplementowanej funkcji. Powinna ona wyglądać tak jak poniżej.

Funkcja sigmoidalna

Uwaga Funkcja powinna działać także dla wektorów i macierzy!

Uwaga W przypadku macierzy/wektora funkcja powinna wyznaczyć wartość funkcji sigmoidalnej dla każdego elementu z osobna.

Przetestuj działanie funkcji za pomocą skryptu check.m

Cost Function

Funkcja kosztu dla regresji logistycznej wygląda następująco:

$$J(\theta) = \frac{1}{m}\sum\limits_{i=1}^m(-y^{(i)}log(h_\theta(x^{(i)})) - (1 - y^{(i)})log(1-h_\theta(x^{(i))})))$$

Natomiast gradient funkcji kosztu to wektor o tych samych wymiarach co wektor $\theta$, gdzie $j$-ty element (dla $j=0,1,...,n$) jest zdefiniowany jako:

$$\frac{\partial J(\theta)}{\partial\theta_j}= \frac{1}{m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x^{(i)}_j$$

Zaimplementuj funkcję znajdującą się w pliku costFunction.m i przetestuj jej działanie za pomocą skryptów check.m i ex2.m.

Gradient Descent

Na poprzednich laboratoriach implementowaliśmy funkcję gradient descent, która krok po kroku aktualizowała współczynniki $\theta$.

W tym laboratorium skorzystamy z wbudowanej w Octave funkcji fminunc. Otwórz plik ex2.m i obejrzyj kod w okolicach linii 77-87 aby zobaczyć w jaki sposób korzysta się z tej funkcji.

Predict

Dzięki wyznaczonym parametrom jesteśmy w stanie obliczyć prawdopodobieństwo dostania się na studia. Dla przykładu prawdopodobieństwo że student, który uzyskał 45 punktów z pierwszego egzaminu i 85 punktów z drugiego zostanie przyjęty na uczelnię wynosi 0.776.

Nam zależy jednak na tym aby otrzymać jednoznaczną odpowiedź tak lub nie. W tym celu uzupełnij funkcję predict.m. Powinna ona zwracać 1, gdy wartość funkcji hipotezy jest większe bądź równe 0.5 i 0 w przeciwnym wypadku.

Przetestuj działanie funkcji za pomocą skryptu check.m

Regularized Cost Function

Regularyzacja pomaga zwalczyć problem tzw. overfittingu danych, który pojawia się gdy do uczenia wykorzystujemy zbyt wiele parametrów przy jednoczesnej niewielkiej ilości przykładów uczących. Overfitting skutkuje nadmiernym dopasowaniem do danych uczących i utrata pewnej generalizacji. Efektem Overfittingu jest to, że algorytm idealnie działa na zbiorze uczącym, natomiast bardzo niedokładnie klasyfikuje dane ze zbioru testowego - zobacz rysunek poniżej.

Overfitting

Parametrem, który pozwala na regularyzację jest parametr $\lambda$. W zależności od jego wartości możemy skutecznie zlikwidować problem overfittingu. Jednak zwiększając nieodpowiedzialnie wartość tego parametru możemy doprowadzić do sytuacji, w której algorytm uczący nie będzie dobrze klasyfikował nawet danych treningowych - zobacz rysunek poniżej.

Funkcja kosztu uwzględniająca regularyzację określona jest następującym wzorem:

$$J(\theta) = (\frac{1}{m}\sum\limits_{i=1}^m(-y^{(i)}log(h_\theta(x^{(i)})) - (1 - y^{(i)})log(1-h_\theta(x^{(i))}))))+\frac{\lambda}{2m}\sum\limits_{j=2}^n\theta_j^2$$

Uwaga Nie normalizujemy parametru $\theta_0$ :!: W Octave indeksy zaczynają się od 1, dlatego parametr, który powinien zostać pominięty to theta(1). Gradient w takim wypadku przedstawia się następująco:

Dla $j=0$

$$\frac{\partial J(\theta)}{\partial\theta_0}= \frac{1}{m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x^{(i)}_j$$

Dla $j\geq1$

$$\frac{\partial J(\theta)}{\partial\theta_j}= (\frac{1}{m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x^{(i)}_j)+\frac{\lambda}{m}\theta_j$$

Sprawdź swoją implementację za pomocą skryptu ex2_reg.m oraz check.m.

Uwaga Otwórz plik ex2_reg.m i przetestuj działanie algorytmu zmieniając wartość współczynnika $\lambda$ w okolicach linii 90.

pl/dydaktyka/ml/lab5.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0