I den tidigare artikeln ”Introduktion till klassificering och logistisk regression” beskrev jag de matematiska grunderna för den logistiska regressionsalgoritmen, vars uppgift är att separera saker och ting i träningsexemplet genom att beräkna beslutsgränsen.
De logistiska regressionsalgoritmernas beslutsgränser kan beskrivas med en ekvation. Precis som vid linjär regression kommer den logistiska regressionsalgoritmen att kunna hitta de bästa \thetas-parametrarna för att beslutsgränsen faktiskt ska separera datapunkterna korrekt. I den här artikeln ska vi se hur man beräknar dessa \thetas.
Antag att vi har en generisk träningsmängd
\{ (x^{(1)}, y^{(1)}), (x^{(2)}, y^{(2)}), \dots, (x^{(m)}, y^{(m)}) \}
gjord av m träningsexempel, där (x^{(1)}, y^{(1)}) är det första exemplet och så vidare. Närmare bestämt är x^{(m)} ingångsvariabeln för det m:e exemplet, medan y^{(m)} är dess utgångsvariabel. Eftersom detta är ett klassificeringsproblem har varje exempel naturligtvis utgångsvariabeln y som ligger mellan 0 och 1. Med andra ord är y \in {0,1}.
Varje exempel representeras som vanligt av sin funktionsvektor
\vec{x} = \begin{bmatrix} x_0 \\ x\ x_1 \\ \\dots \\ x_n \end{bmatrix}
där x_0 = 1 (samma gamla trick). Detta är ett generiskt exempel, vi känner inte till det exakta antalet funktioner.
Slutligt har vi hypotesfunktionen för logistisk regression, som vi såg i föregående artikel:
h_\theta(x) = \frac{1}{1 + e^{\theta^{\top} x}}
Vår uppgift är nu att välja de bästa parametrarna \thetas i ekvationen ovan, givet den aktuella träningsuppsättningen, för att minimera felen. Kom ihåg att \theta inte är en enskild parameter: den expanderar till ekvationen för beslutsgränsen som kan vara en linje eller en mer komplex formel (med fler \thetas att gissa).
Förfarandet liknar det vi gjorde för linjär regression: definiera en kostnadsfunktion och försök att hitta de bästa möjliga värdena för varje \theta genom att minimera kostnadsfunktionens utgång. Minimeringen kommer att utföras av en gradient descent-algoritm, vars uppgift är att analysera kostnadsfunktionsutgången tills den hittar den lägsta minimipunkten.
Kostnadsfunktionen som används i linjär regression kommer inte att fungera här
Du kanske minns den ursprungliga kostnadsfunktionen J(\theta) som användes i linjär regression. Jag kan redan nu säga att den inte kommer att fungera här med logistisk regression. Om du försöker använda den linjära regressionens kostnadsfunktion för att generera J(\theta) i ett logistiskt regressionsproblem skulle du få en icke-konvex funktion: en konstigt formad graf utan någon lätt att hitta en global minimipunkt, vilket framgår av bilden nedan.
Detta märkliga resultat beror på att vi i logistisk regression har sigmoidfunktionen runt omkring oss, som är icke-linjär (dvs. inte en linje). Med den J(\theta) som avbildas i figur 1. kan gradientnedgångsalgoritmen fastna i en lokal minimipunkt. Därför behöver vi fortfarande en snygg konvex funktion som vi gjorde för linjär regression: en skålformad funktion som underlättar gradient nedstigningsfunktionens arbete med att konvergera till den optimala minimipunkten.
En bättre kostnadsfunktion för logistisk regression
Låt mig återgå ett ögonblick till kostnadsfunktionen som vi använde i linjär regression:
J(\vec{\theta})) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) – y^{(i)})^2
som kan skrivas om på ett något annorlunda sätt:
J(\vec{\theta}) = \frac{1}{m} \sum_{i=1}^{m} \frac{1}{2}(h_\theta(x^{(i)}) – y^{(i)})^2
Inget skrämmande hände: Jag har bara flyttat \frac{1}{2} bredvid summeringsdelen. Nu gör vi det mer generellt genom att definiera en ny funktion
\mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)})) = \frac{1}{2}(h_\theta(x^{(i)}) – y^{(i)})^2
Med andra ord, en funktion \mathrm{Cost} som tar två parametrar i indata: h_\theta(x^{(i)}) som hypotesfunktion och y^{(i)} som utgång. Man kan se det som den kostnad som algoritmen måste betala om den gör en förutsägelse h_\theta(x^{(i)}) medan den faktiska etiketten var y^{(i)}.
Med denna nya pusselbit kan jag skriva om kostnadsfunktionen för den linjära regressionen på följande sätt:
J(\theta) = \dfrac{1}{m}{m} \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)})
Vi vet dock att den linjära regressionens kostnadsfunktion inte kan användas i logistiska regressionsproblem. Så vad handlar det här om? Jo, det visar sig att för logistisk regression behöver vi bara hitta en annan \mathrm{Cost}-funktion, medan summeringsdelen förblir densamma.
Kostnadsfunktion för logistisk regression
För logistisk regression definieras \mathrm{Cost}-funktionen som:
\mathrm{Cost}(h_\theta(x),y) =\begin{cases}-\log(h_\theta(x)) & \text{if y = 1} \\-\log(1-h_\theta(x)) & \text{if y = 0}\end{cases}
Indexen i har tagits bort för tydlighetens skull. Med andra ord är detta den kostnad som algoritmen betalar om den förutsäger ett värde h_\theta(x) medan den faktiska kostnadsetiketten visar sig vara y. Genom att använda denna funktion ger vi konvexitet åt den funktion som gradientdescentalgoritmen måste bearbeta, som diskuterats ovan. Det finns också ett matematiskt bevis för detta, som ligger utanför ramen för denna introduktionskurs.
I fallet y = 1 närmar sig resultatet (dvs. kostnaden att betala) 0 när h_\theta(x) närmar sig 1. Omvänt växer kostnaden att betala till oändlighet när h_\theta(x) närmar sig 0. Du kan tydligt se det i diagrammet 2. nedan, vänster sida. Detta är en önskvärd egenskap: vi vill ha en större straffavgift när algoritmen förutspår något som ligger långt ifrån det faktiska värdet. Om etiketten är y = 1 men algoritmen förutsäger att h_\theta(x) = 0 är resultatet helt fel.
Omvänt gäller samma intuition när y = 0, vilket avbildas i diagrammet 2. nedan, höger sida. Större straff när etiketten är y = 0 men algoritmen förutsäger h_\theta(x) = 1.
Tillkommande kostnadsfunktionsoptimeringar
Det vi nyss har sett är den verbeiga versionen av kostnadsfunktionen för logistisk regression. Vi kan göra den mer kompakt till ett enradigt uttryck: detta kommer att hjälpa oss att undvika tråkiga if/else-uttalanden när vi omvandlar formeln till en algoritm.
\mathrm{Cost}(h_\theta(x),y) = -y \log(h_\theta(x)) – (1 – y) \log(1-h_\theta(x))
Bekräftelse: Försök att ersätta y med 0 och 1 så får du de två delarna av den ursprungliga funktionen.
Med optimeringen på plats kan den logistiska regressionens kostnadsfunktion skrivas om som:
\begin{align}J(\theta) & = \dfrac{1}{m} \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)}) \\& = – \dfrac{1}{m} \\\end{align}
Jag har flyttat minustecknet utanför för att undvika ytterligare parenteser.
Plugging the cost function and the gradient descent together
Vad är kvar? Vi har hypotesfunktionen och kostnadsfunktionen: vi är nästan klara. Det är nu dags att hitta de bästa värdena för \thetas parametrar i kostnadsfunktionen, eller med andra ord att minimera kostnadsfunktionen genom att köra gradientdescent-algoritmen. Förfarandet är identiskt med det vi gjorde för linjär regression.
Mer formellt sett vill vi minimera kostnadsfunktionen:
\min_{\theta} J(\theta)
Vilket kommer att ge ut en uppsättning parametrar \theta, de bästa (dvs. med mindre fel). När detta är gjort är vi redo att göra förutsägelser om nya inmatningsexempel med deras egenskaper x, genom att använda de nya \thetas i hypotesfunktionen:
h_\theta(x) = \frac{1}{1 + e^{\theta^{\top} x}}
Varvid h_\theta(x) är resultatet, förutsägelsen eller ändå sannolikheten att y = 1.
Sättet vi ska minimera kostnadsfunktionen är genom att använda gradient descent. Den goda nyheten är att förfarandet är 99 % identiskt med det vi gjorde för linjär regression.
För att minimera kostnadsfunktionen måste vi köra gradient descent-funktionen på varje parameter:
\begin{align} \text{upprepa tills konvergens \{} \\\theta_j & := \theta_j – \alpha \frac{\partial}{\partial \theta_j} J(\theta) \\ \text{\}}\end{align}
Håll dig till att samtidigt uppdatera alla \theta_j som vi gjorde i den linjära regressionens motsvarighet: om du har n funktioner, det vill säga en funktionsvektor \vec{\theta} = , så måste alla dessa parametrar uppdateras samtidigt vid varje iteration:
\begin{align} \text{repeat until convergence \{} \\\\theta_0 & := \cdots \\\theta_1 & := \cdots \\\cdots \\ \\theta_n & := \cdots \\\ \text{\}}\end{align}
Tillbaka till algoritmen, jag besparar er beräkningen av den skrämmande derivatan \frac{\partial}{\partial \theta_j} J(\theta), som blir:
\frac{\partial}{\partial \theta_j} J(\theta) = \dfrac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) – y^{(i)}) x_j^{(i)}
Så slingan ovan kan skrivas om till:
\begin{align} \text{repeat until convergence \{} \\\theta_j & := \theta_j – \alpha \dfrac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) – y^{(i)}) x_j^{(i)} \\ \text{\}}\end{align}
Förvånansvärt nog ser det identiskt ut med vad vi gjorde för den multivariata linjära regressionen. Det som dock har ändrats är definitionen av hypotesen h_\theta(x): för linjär regression hade vi h_\theta(x) = \theta^{\top}{x}, medan vi för logistisk regression har h_\theta(x) = \frac{1}{1 + e^{\theta^{\top}} x}}.
Från och med nu kan du tillämpa samma tekniker för att optimera gradientnedgångsalgoritmen som vi har sett för linjär regression, för att se till att omvandlingen till minimipunkten fungerar korrekt. I nästa kapitel kommer jag att fördjupa mig i några avancerade optimeringsknep, samt definiera och undvika problemet med överanpassning.