![](https://miro.medium.com/max/2560/1*Ui6SeSMmCeCSc9Q67n5_Wg.jpeg)
In unserem früheren Beitrag haben wir uns mit den Gründen für die Verwendung einer Sigmoid-Funktion für die logistische Regression anstelle einer normalen linearen Funktion beschäftigt. In diesem Beitrag werden wir uns weiter mit der Kostenfunktion befassen.
Die Kostenfunktion ist wichtig, weil sie uns die Fehler unserer Vorhersagen liefert und somit für unseren Lernalgorithmus benötigt wird. Konkret möchten wir die Fehler unserer Vorhersagen minimieren, d.h. die Kostenfunktion minimieren. Wenn alle unsere Fehler gleich Null sind, ist das im Idealfall so, als würden wir ein Dartspiel spielen, bei dem alle unsere Darts das Bull’s Eye treffen. Auf der anderen Seite bedeutet ein sehr hoher Fehler, dass unsere vorhergesagten Werte alle wahren beobachteten Werte verfehlen, d.h. unsere Darts treffen im Allgemeinen nicht ins Schwarze.
Während wir gerne null Fehler haben, wenn wir unsere Kostenfunktion mit unseren hypothetischen Werten ausführen (perfekte Vorhersage für jeden Wert), könnte dies kein gutes Szenario sein, da es zu einem Phänomen namens „hohe Varianz“ führen könnte. Wir werden in späteren Beiträgen noch näher darauf eingehen.
Zurück zur Formulierung der Verlustfunktion: Eine typische Verlustfunktion wäre die Minimierung der Summe der quadrierten Fehler, d.h.
![](https://miro.medium.com/max/60/1*_N0B9M03cZPcwP340czORA.png?q=20)
Diese Funktion kann jedoch während des Optimierungsprozesses zu mehreren lokalen Optima führen, was bedeutet, dass Ihre optimierte Lösung möglicherweise nicht die optimalste ist (es besteht die Möglichkeit, dass es eine bessere Lösung gibt). Idealerweise sollte die optimierte Lösung das globale Minimum und nicht das lokale Minimum sein.
![](https://miro.medium.com/max/60/1*wuoWtRejugq6kxRgdZHXwg.png?q=20)
Wie im obigen Diagramm zu sehen ist, könnten wir die Parameter versehentlich initialisieren und sie auf das lokale Minimum optimieren, ohne das „wahre“ globale Minimum zu erreichen. Daher wäre die oben erwähnte Verlustfunktion nicht ideal für uns.
Was könnte dann unsere Verlustfunktion sein?
Eine Verlustfunktion, die üblicherweise für die logistische Regression verwendet wird, ist die folgende:
![](https://miro.medium.com/max/60/1*Ox4gV6NSORI9fws0lSCRYQ.png?q=20)
Bitte beachten Sie, dass ich die Begriffe „Kosten“ und „Verlust“ synonym verwendet habe, aber für diejenigen, die mit den Vorlesungen von Andrew Ng vertraut sind, gilt die „Verlustfunktion“ für ein einzelnes Trainingsbeispiel, während die „Kostenfunktion“ den Durchschnitt über alle Trainingsbeispiele bildet.
Um zu sehen, warum diese Verlustfunktion sinnvoll ist: Nehmen wir an, dass y = 1 ist, und konzentrieren wir uns auf die oberste Gleichung, -log(h⊖(x)), so wollen wir, dass sie sehr negativ ist, da dies eine Verlustfunktion ist (wir erinnern uns, dass wir die Verlustfunktion als Ziel minimieren wollen). Infolgedessen wird h⊖(x) groß sein. Allerdings ist h⊖(x) auf den Maximalwert 1 begrenzt, da die Sigmoid-Funktion den geschätzten Hypothesenwert auf einen Wert zwischen 0 und 1 beschränkt:
h⊖(x) = ŷ = σ(z)
Wenn y=1 ist, ist die Verlustfunktion also auf das Äußerste minimiert, wenn ŷ = 1 ist. Eine perfekte Vorhersage, bei der keine oder nur geringe Verluste/Kosten anfallen.
Umgekehrt, wenn y = 0 ist, und mit Blick auf den unteren Teil der Gleichung, -log(1- h⊖(x)). Aufgrund unseres Ziels der Verlustminimierung möchten wir, dass dieser Wert sehr negativ ist. Infolgedessen wäre 1- h⊖(x) sehr groß, was zur Folge hätte, dass h⊖(x) sehr klein wäre. Es sei jedoch daran erinnert, dass h⊖(x) auf den Minimalwert 0 begrenzt ist, da die Sigmoid-Funktion den geschätzten Hypothesenwert zwischen 0 und 1 liegen lässt.
Wenn y=0 ist, ist die Verlustfunktion also bis zum Extrem minimiert, wenn ŷ = 0. Eine perfekte Vorhersage, bei der keine oder nur geringe Verluste/Kosten entstehen.
Die entsprechenden Graphen veranschaulichen die obigen Punkte:
![](https://miro.medium.com/max/60/1*h0JhrkZuadH0VYnlANuT4A.png?q=20)
Wie man aus dem linken Graphen (y = -log(h⊖(x)) ersehen kann, gehen die Kosten bei y = 1 gegen 0, wenn der angenommene Wert 1 ist, und gegen unendlich, wenn der angenommene Wert nahe bei 0 liegt.
In ähnlicher Weise geht der rechte Graph (y = -log(1 – h⊖(x)), wenn y = 0, die Kosten auf 0, wenn der angenommene Wert 0 ist, und geht gegen unendlich, wenn der angenommene Wert nahe bei 1 liegt.
Kombiniert man beide in einer übersichtlichen Gleichung, erhält man die Kostenfunktion für die logistische Regression mit m Trainingsbeispielen:
![](https://miro.medium.com/max/60/1*ctIxOPOv0Hou7j0F4PUKVw.png?q=20)
wobei i von 1 bis m für m Trainingsbeispiele geht.
In der KI und beim maschinellen Lernen wird mit vielen Begriffen um sich geworfen, und es wäre hilfreich, ein Gefühl für sie zu bekommen.
Beim Training des logistischen Regressionsmodells versuchen wir, die Parameter „w“ und „b“ zu finden, die die Gesamtkostenfunktion minimieren. Im nächsten Artikel werden wir den nächsten wichtigen Abschnitt, den Gradientenabstieg, behandeln.
In numpy können wir die Kostenfunktion wie folgt kodieren:
import numpy as npcost = (-1/m) * np.sum(Y*np.log(A) + (1-Y)*(np.log(1-A)))
Zur Erklärung:
- np.sum summiert über die Elemente des Arrays (Y*np.log(A) + (1-Y)*(np.log(1-A)), was in diesem Fall die Summe über alle Trainingsbeispiele wäre. Lesen Sie hier mehr.
- np.log nimmt den natürlichen Log, elementweise zu den Elementen im Array. Mehr dazu hier.
- „*“ nimmt die Elemente eines Arrays und multipliziert sie, elementweise, mit den Elementen eines anderen Arrays. Dies ist keine Matrixmultiplikation, die eine Formanforderung von beiden Arrays hat: Die Anzahl der Spalten des ersten Arrays muss gleich der Anzahl der Zeilen des zweiten Arrays sein.