In het vorige artikel “Inleiding tot classificatie en logistische regressie” heb ik de wiskundige grondbeginselen geschetst van het logistische regressie-algoritme, dat tot taak heeft de zaken in het trainingsvoorbeeld van elkaar te scheiden door de beslissingsgrens te berekenen.
De beslissingsgrens kan worden beschreven door een vergelijking. Net als bij lineaire regressie zal het logistische regressie-algoritme in staat zijn de beste parameters te vinden om de beslissingsgrens daadwerkelijk de gegevenspunten correct te scheiden. In dit artikel zullen we zien hoe we die \thetas kunnen berekenen.
Voorstel dat we een generieke trainingsverzameling
{ (x^{(1)}, y^{(1)}), (x^{(2)}, y^{(2)}), \dots, (x^{(m)}, y^{(m)})
gemaakt van m trainingsvoorbeelden, waarbij (x^{(1)}, y^{(1)}) het 1e voorbeeld is, enzovoort. Meer specifiek is x^{(m)} de inputvariabele van het m-de voorbeeld, terwijl y^{(m)} de outputvariabele is. Aangezien dit een classificatieprobleem is, heeft elk voorbeeld natuurlijk de output y die ligt tussen 0 en 1. Met andere woorden, y ligt in {0,1}.
Elk voorbeeld wordt zoals gewoonlijk voorgesteld door zijn kenmerkvector
vec{x} = \begin{bmatrix} x_0 \ x_1 \ x_n \eind{bmatrix}
waarbij x_0 = 1 (dezelfde oude truc). Dit is een generiek voorbeeld, we kennen het exacte aantal features niet.
Ten slotte hebben we de hypothese functie voor logistische regressie, zoals gezien in het vorige artikel:
h_theta(x) = \frac{1}{1 + e^{theta^{\top}} x}}
Onze taak is nu om de beste parameters \theta’s in de bovenstaande vergelijking te kiezen, gegeven de huidige trainingsset, om fouten te minimaliseren. Vergeet niet dat \theta niet een enkele parameter is: het breidt zich uit tot de vergelijking van de beslissingsgrens, die een lijn of een complexere formule kan zijn (met meer \theta’s om te raden).
De procedure is vergelijkbaar met wat we deden voor lineaire regressie: definieer een kostenfunctie en probeer de best mogelijke waarden van elke \theta te vinden door de uitvoer van de kostenfunctie te minimaliseren. De minimalisatie wordt uitgevoerd door een gradient descent algoritme, dat tot taak heeft de uitvoer van de kostenfunctie te analyseren tot het laagste minimumpunt is gevonden.
De kostenfunctie die in lineaire regressie is gebruikt, werkt hier niet
U herinnert zich misschien de oorspronkelijke kostenfunctie J(\theta) die in lineaire regressie is gebruikt. Ik kan u nu al zeggen dat die hier niet zal werken met logistische regressie. Als u probeert om de kostenfunctie van lineaire regressie te gebruiken om J(\theta) te genereren in een logistisch regressieprobleem, zou u eindigen met een niet-convexe functie: een vreemd gevormde grafiek zonder gemakkelijk te vinden globaal minimumpunt, zoals te zien is in het onderstaande plaatje.
Deze vreemde uitkomst is te wijten aan het feit dat we bij logistische regressie de sigmoïde functie om ons heen hebben, die niet-lineair is (d.w.z. niet een lijn). Met de J(\theta) zoals afgebeeld in figuur 1. zou het gradiënt afdalingsalgoritme kunnen blijven steken in een lokaal minimum punt. Daarom hebben we nog steeds een nette convexe functie nodig zoals bij lineaire regressie: een komvormige functie die het werk van de gradiënt afdaalfunctie om naar het optimale minimumpunt te convergeren vergemakkelijkt.
Een betere kostenfunctie voor logistische regressie
Laat me even teruggaan naar de kostenfunctie die we bij lineaire regressie gebruikten:
J(\vec{theta}) = \frac{1}{2m} \_{i=1}^{m} (h_theta(x^{(i)}) – y^{(i)})^2
die op een iets andere manier kan worden herschreven:
J(\vec{\theta}) = \frac{1}{m} \sum_{i=1}^{m} \frac{1}{2}(h_theta(x^{(i)}) – y^{(i)})^2
Niets engs gebeurd: Ik heb alleen de \frac{1}{2} naast het sommatiegedeelte gezet. Laten we het nu wat algemener maken door een nieuwe functie te definiëren
Mathrm{Cost}(h_theta(x^{(i)}),y^{(i)}) = \frac{1}{2}(h_theta(x^{(i)}) – y^{(i)})^2
Met andere woorden, een functie \mathrm{Cost} die twee parameters als invoer neemt: h_theta(x^{(i)}) als hypothese functie en y^{(i)} als output. Je kunt het zien als de kosten die het algoritme moet betalen als het een voorspelling doet h_theta(x^{(i)}) terwijl het eigenlijke label y^{(i)} was.
Met dit nieuwe stukje van de puzzel kan ik de kostenfunctie voor de lineaire regressie als volgt herschrijven:
J(\theta) = \dfrac{1}{m} \sum_{i=1}^m \mathrm{Cost}(h_theta(x^{(i)}),y^{(i)})
We weten echter dat de kostenfunctie van de lineaire regressie niet gebruikt kan worden bij logistische regressieproblemen. Dus waar gaat dit over? Wel, het blijkt dat we voor logistische regressie gewoon een andere functie moeten vinden, terwijl het sommatiegedeelte hetzelfde blijft.
Logistische regressie kostenfunctie
Voor logistische regressie is de \mathrm{Cost} functie gedefinieerd als:
\mathrm{Cost}(h_theta(x),y) =>begin{cases}-[log(h_theta(x)] &
De i-indexen zijn voor de duidelijkheid verwijderd. In woorden is dit de kost die het algoritme betaalt als het een waarde h_theta(x) voorspelt terwijl het werkelijke kostenetiket y blijkt te zijn. Door deze functie te gebruiken verlenen we de convexiteit aan de functie die het gradiënt afdaalalgoritme moet verwerken, zoals hierboven besproken. Daar is ook een wiskundig bewijs voor, dat buiten het bestek van deze inleidende cursus valt.
In het geval y = 1, nadert de output (d.w.z. de te betalen kosten) tot 0 naarmate h_theta(x) tot 1 nadert. Omgekeerd groeien de te betalen kosten tot oneindig naarmate h_theta(x) dichter bij 0 komt. U kunt dit duidelijk zien in de grafiek 2. hieronder, links. Dit is een wenselijke eigenschap: we willen een grotere straf als het algoritme iets voorspelt dat ver van de werkelijke waarde af ligt. Als het label y = 1 is maar het algoritme voorspelt h_theta(x) = 0, dan is de uitkomst helemaal verkeerd.
Omgekeerd geldt dezelfde intuïtie wanneer y = 0, afgebeeld in de plot 2. hieronder, rechterzijde. Grotere straffen wanneer het label y = 0 is maar het algoritme h_theta(x) = 1 voorspelt.
Aanvullende optimalisaties van de kostenfunctie
Wat we zojuist hebben gezien is de uitgebreide versie van de kostenfunctie voor logistische regressie. We kunnen hem compacter maken in een expressie van één regel: dit zal helpen om saaie if/else statements te vermijden bij het omzetten van de formule in een algoritme.
Proef: probeer y te vervangen door 0 en 1 en je krijgt de twee stukken van de oorspronkelijke functie.
Met de optimalisatie op zijn plaats kan de logistische regressie-kostenfunctie worden herschreven als:
begin{align}J(\theta) & = \dfrac{1}{m} \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)}) \8333> = – \dfrac{1}{m}
Ik heb het minteken naar buiten verplaatst om extra haakjes te vermijden.
De kostenfunctie en de gradiëntafdaling samenvoegen
Wat blijft er over? We hebben de hypothese functie en de kostenfunctie: we zijn bijna klaar. Het is nu tijd om de beste waarden te vinden voor de parameters in de kostenfunctie, of met andere woorden om de kostenfunctie te minimaliseren door het gradient descent algoritme uit te voeren. De procedure is identiek aan wat we voor lineaire regressie hebben gedaan.
Meer formeel willen we de kostenfunctie minimaliseren:
Min_{theta} J(\theta)
Waarmee een set parameters \theta wordt verkregen, de beste (d.w.z. met minder fouten). Als we dat gedaan hebben, zijn we klaar om voorspellingen te doen voor nieuwe ingangsvoorbeelden met hun kenmerken x, door de nieuwe \theta’s in de hypothese-functie te gebruiken:
h_theta(x) = \frac{1}{1 + e^{\theta^{\top}} x}}
Waarbij h_theta(x) de output, de voorspelling, of toch de waarschijnlijkheid dat y = 1 is.
De manier waarop we de kostenfunctie gaan minimaliseren is door gebruik te maken van de gradiënt-afdaling. Het goede nieuws is dat de procedure voor 99% identiek is aan wat we voor lineaire regressie hebben gedaan.
Om de kostenfunctie te minimaliseren moeten we de gradiënt-aflopende functie op elke parameter uitvoeren:
begin{align} \Herhaal dit tot de convergentie. \theta_j & := \theta_j – \alpha \frac{\partieel}{partieel \theta_j} J(\theta) \text{\}}
Bedenk dat alle \theta_j gelijktijdig moeten worden geactualiseerd, net zoals in de lineaire regressie tegenhanger: als je n features hebt, dat is een feature vector \vec{theta} = , moeten al die parameters gelijktijdig bij elke iteratie worden geactualiseerd:
begin{align} \Herhaal dit tot de convergentie. \theta_0 & := \theta_1 & := \theta_n & := \cdots \theta_1 & : = \cdots \theta_1 & : = \cdots \cdots \theta_n
Terug naar het algoritme, ik bespaar u de berekening van de ontmoedigende afgeleide \frac{\partieel}{partieel \theta_j} J(\theta), die wordt:
J(\theta) = \dfrac{1}{m} \sum_{i=1}^{m} (h_theta(x^{(i)}) – y^{(i)}) x_j^{(i)}
Dus de lus hierboven kan worden herschreven als:
begin{align} \tekst{herhalen tot convergentie} \theta_j & := \theta_j – \alpha \dfrac{1}{m} \sum_{i=1}^{m} (h_theta(x^{(i)}) – y^{(i)}) x_j^{(i)})
Verrassend genoeg ziet het er identiek uit als wat we deden voor de multivariate lineaire regressie. Wat wel veranderd is, is de definitie van de hypothese h_theta(x): voor lineaire regressie hadden we h_theta(x) = \theta^{{\top}{x}, terwijl we voor logistische regressie h_theta(x) = \frac{1}{1 + e^{\theta^{{\top}} x}}.
Van nu af aan kun je dezelfde technieken toepassen om het gradient descent algoritme dat we hebben gezien voor lineaire regressie te optimaliseren, om er zeker van te zijn dat de conversie naar het minimum punt goed werkt. In het volgende hoofdstuk zal ik ingaan op enkele geavanceerde optimalisatietrucs, en op het definiëren en vermijden van het probleem van overfitting.