Machine Learning für Softwareentwickler. Paolo Perrotta. Читать онлайн. Newlib. NEWLIB.NET

Автор: Paolo Perrotta
Издательство: Bookwire
Серия:
Жанр произведения: Математика
Год издания: 0
isbn: 9783969100264
Скачать книгу
harte Arbeit. Allerdings haben wir in unserem Fall das Glück, dass die Datenpunkte so ausgerichtet sind, dass wir sie durch eine besonders einfache Funktion annähern können, nämlich eine Gerade.

      Wie aber sieht diese Gerade aus? Für den Anfang wählen wir wie im folgenden Diagramm gezeigt eine Gerade aus, die durch den Ursprung verläuft, da dies die Sache einfacher macht.

image

      Wenn wir die Gerade bestimmt haben, ist die Trainingsphase beendet. Die Gerade ist unser Modell der Relation zwischen Reservierungen und Pizzas.

      Anschließend können wir zur Vorhersagephase übergehen, in der wir die Gerade dazu heranziehen, das Label zu einer gegebenen Eingabevariablen vorherzusagen, also etwa anzugeben, wie viele Pizzas wir bei 20 Reservierungen zu verkaufen erwarten können. Um diese Frage zu beantworten, habe ich von dem Punkt x = 20 auf der Achse der Reservierungen eine senkrechte Linie nach oben bis zu der Geraden eingezeichnet und bin von dem Kreuzungspunkt aus nach links zur Pizzaachse gegangen, wo ich beim Punkt y = 42 gelandet bin:

image

      Da haben wir das Ergebnis: Bei 20 Reservierungen können wir etwa 42 Pizzabestellungen erwarten.

      Diese Methode wurde von Statistikern lange schon genutzt, bevor es überwachtes Lernen gab. Sie wird als lineare Regression bezeichnet. »Regression« ist der statistische Begriff dafür, die Relation zwischen zwei Variablen zu finden, und da wir hier keine Kurve, sondern eine gerade Linie verwenden, ist diese Regression »linear«.

      Zusammengefasst läuft überwachtes Lernen mit linearer Regression also wie folgt ab:

      1 Trainingsphase: Wir bestimmen eine Gerade, die die Beispiele annähert.

      2 Vorhersagephase: Wir sagen anhand dieser Geraden das Label zu einer gegebenen Eingabevariablen voraus.

      Natürlich lässt sich nicht jede Relation durch eine gerade Linie annähern. Wenn sich unsere Beispiele entlang einer Kurve verteilen oder gar keine erkennbare Form bilden, können Sie diese einfache Methode nicht nutzen. Robertos Beispiele haben jedoch grob einen linearen Verlauf, weshalb die lineare Regression für unsere vorliegende Aufgabe gut genug ist.

      Als Nächstes müssen wir die lineare Regression in Code umsetzen.

      Um die lineare Regression in ausführbaren Code zu übersetzen, brauchen wir eine Möglichkeit, um eine Gerade numerisch darzustellen. Dazu brauchen wir etwas Mathematik.

      Eine Gerade durch den Ursprung wird durch folgende Gleichung beschrieben:

      y = x * w

      Vielleicht kennen Sie diese Gleichung noch aus der Schulzeit. Jede Gerade, die durch den Ursprung verläuft, ist durch einen einzigen Wert eindeutig bestimmt. Ich habe diesen Wert hier w für weight (Gewicht) genannt, aber Sie können ihn sich auch als Steigung der Geraden vorstellen. Je größer w, umso steiler die Gerade. Betrachten Sie dazu den folgenden Graphen:

image

      Bevor wir weitermachen, möchte ich die Gleichung noch einmal umschreiben:

      ŷ = x * w

      Ich habe das Symbol y hier durch ŷ (sprich: Ypsilon-Dach) ersetzt, um Verwechselungen mit den y-Werten aus Robertos Datei zu vermeiden. Beide Symbole stehen für die Anzahl der Pizzas, aber es gibt einen wichtigen Unterschied zwischen ihnen: ŷ ist unsere Vorhersage dafür, wie viele Pizzas wir zu verkaufen erwarten, wohingegen es sich bei y um Labels aus Beobachtungen der Realität handelt, also das, was beim Machine Learning als Grundwahrheit bezeichnet wird.

      Kommen wir nach dieser kurzen Abschweifung zur Schreibweise wieder zu dem entscheidenden Punkt zurück: w ist eine Konstante, die die Gerade beschreibt. Anders ausgedrückt ist w alles, was wir brauchen, um die Gerade im Code darzustellen.

      Damit können wir nun also den Code schreiben. Wir beginnen dabei mit der Vorhersagephase, da sie einfacher ist als die Trainingsphase. Letztere werden wir im Anschluss angehen.

       Mathematischer Hintergrund: Lineare Gleichungen

      Wenn Sie mit einer Gleichung wie y = x * w nichts anzufangen wissen, können Sie sich die Videos der Khan Academy zu linearen Gleichungen ansehen.1 Diese Videos behandeln jedoch viel mehr Stoff, als Sie zur Lektüre dieses Buchs benötigen, weshalb Sie sich nicht alle ansehen müssen.

      Nehmen wir an, wir haben bereits die Gerade (also den Wert w) und wollen auf deren Grundlage nun den Wert ŷ aus x berechnen, also die Anzahl der Pizzas aus den Reservierungen. Das lässt sich in einer Zeile erledigen:

       02_first/linear_regression.py

      def predict(X, w):

      return X * w

      Die Funktion predict() sagt die Anzahl der Pizzas aus den Reservierungen voraus. Genauer gesagt nimmt sie die Eingabevariable und das Gewicht entgegen und berechnet daraus ŷ.

      Diese kurze Funktion ist viel leistungsfähiger, als sie scheint. Vor allem kann X nicht nur eine einzelne Zahl, sondern ein ganzes Array mit Reservierungen sein. NumPy hat einen eigenen Arraytyp, der Broadcast-Operationen ermöglicht: Wenn wir ein Reservierungsarray mit w multiplizieren, so multipliziert NumPy jedes Element dieses Arrays mit w und gibt ein Array mit den vorhergesagten Pizzaverkaufsmengen zurück. Das ist eine praktische Möglichkeit, um mehrere Vorhersagen auf einmal durchzuführen.

      Zu Anfang dieses Abschnitts haben wir von Hand Linien in den Graphen eingezeichnet, um von der Anzahl der Reservierungen zur Anzahl der Pizzas zu kommen. Die Funktion predict() erledigt den gleichen Vorgang, allerdings viel genauer. Wie viele Pizzas können wir bei 20 Reservierungen zu verkaufen erwarten? Nehmen wir an, unsere Gerade ist durch w = 2.1 definiert. Durch den Aufruf von predict(20, 2.1) erhalten wir die vorhergesagte Pizzamenge von 42.

      Das ist auch schon alles, was wir für die zweite Phase der linearen Regression benötigen. Damit wollen wir uns jetzt der komplizierteren ersten Phase zuwenden. Das wird uns mehrere Seiten lang intensiv beschäftigen.

      Wir wollen nun den Code schreiben, um die erste Phase der linearen Regression zu implementieren. Er dient dazu, die Gerade w als Annäherung an die Menge der durch X und Y gegebenen Beispiele zu finden. Können Sie sich vorstellen, wie wir dazu vorgehen müssen? Halten Sie ruhig eine Minute inne und denken Sie darüber nach, wie Sie dieses Problem lösen würden.

      Vielleicht denken Sie, dass die Mathematik eine einfache Möglichkeit bietet, um w zu finden. Schließlich muss es doch irgendeine Formel geben, die aus einer Liste von Datenpunkten eine passende Näherungsgerade berechnet. Wir könnten im Internet nach einer solchen Formel suchen und vielleicht sogar eine Bibliothek mit einer Implementierung dafür finden.

      Es gibt tatsächlich eine solche Formel, allerdings werden wir sie hier nicht benutzen, da sie eine Sackgasse darstellt. Wenn wir hier eine Formel anwenden, die die Datenpunkte mit einer geraden Linie annähert, dann kommen wir später nicht weiter, wenn wir mit Datenmengen zu tun haben, bei denen verzwicktere Modellierungsfunktionen erforderlich sind. Daher ist es besser, nach einer allgemeineren Lösung Ausschau zu halten, die bei jedem Modell funktioniert.

      So viel zur mathematischen Vorgehensweise. Schauen wir uns stattdessen an, was Programmierer in einem solchen Fall tun.

       Wie falsch liegen wir?

      Welche Strategie können wir verfolgen, um die Gerade zu finden, die sich bestmöglich an die Beispiele annähert? Nehmen wir an, wir haben eine Funktion, die die Beispiele (X und Y) und eine Gerade (w) entgegennimmt und den Fehler