|
|
pl:dydaktyka:ml:lab5 [2017/07/17 10:08] |
pl:dydaktyka:ml:lab5 [2019/06/27 15:50] (aktualna) |
| ====== 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. |
| |
| {{:pl:dydaktyka:ml:overfit-lr3.png|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. |
| |
| {{:pl:dydaktyka:ml:underfit-lr4.png|}} |
| |
| 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. |
| |
| |