|
|
pl:dydaktyka:ml:lab5 [2013/03/21 13:37] esimon [Regularized Cost Function] |
pl:dydaktyka:ml:lab5 [2019/06/27 15:50] |
====== Laboratorium 5 - Regresja Logistyczna ====== | |
Ćwiczenia bazujące na materiałach Andrew Ng.\\ | |
Przed zajęciami przejrzyj wykłady VI-VII: [[https://class.coursera.org/ml/lecture/preview|Logistic regression]] | |
| |
{{:pl:dydaktyka:ml:ex2.pdf|Instructions}} in English. | |
| |
Ćwiczenia do pobrania (files to download): {{:pl:dydaktyka:ml: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 classier's decision boundary | |
* //plotData.m// - Function to plot 2D classication 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. | |
| |
{{:pl:dydaktyka:ml:plot-data-lr1.png|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. | |
| |
{{:pl:dydaktyka:ml:sigmoid-lr2.png|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) | |
| |
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$$ | |
| |