Machine Learning für Softwareentwickler. Paolo Perrotta
Чтение книги онлайн.
Читать онлайн книгу Machine Learning für Softwareentwickler - Paolo Perrotta страница 23
Wenn wir dieses Programm ausführen, erhalten wir folgende Ausgabe:
Iteration 0 => Loss: 1333.56666666666660603369
Iteration 1 => Loss: 151.14311361881479456315
Iteration 2 => Loss: 64.99460808656147037254
...
Iteration 99999 => Loss: 6.89576133146784187034
Der Verlust wird bei jedem Durchlauf kleiner, was schon ein Hinweis darauf ist, dass das Programm tatsächlich lernt. Allerdings ist unsere Arbeit noch nicht getan: Schließlich haben wir zu Anfang den Bias-Parameter entfernt, um die Sache zu vereinfachen, wobei wir ohne den Bias jedoch keine genauen Vorhersagen erwarten dürfen. Zum Glück ist es viel einfacher, den Bias wieder einzuführen, als es den Anschein hat.
Bye-bye, Bias!
Im letzten Abschnitt haben wir die folgende Vorhersageformel implementiert:
ŷ = x1 * w1 + x2 * w2 + x3 * w3
Jetzt wollen wir aber den Bias wieder in unser System aufnehmen:
ŷ = x1 * w1 + x2 * w2 + x3 * w3 + b
Wir könnten jetzt einfach den Bias wie im vorherigen Kapitel wieder überall in den Code einfügen. Allerdings gibt es einen Trick, mit dem wir ihn auf weit weniger aufwendige Weise einfließen lassen können.
Schauen Sie sich die vorstehende Formel noch einmal genau an. Was ist der Unterschied zwischen dem Bias und den Gewichten? Die Gewichte werden mit einer Eingabevariablen multipliziert, der Bias dagegen nicht. Wenn wir nun in unserem System eine weitere Eingabevariable namens x0 hätten, die stets den Wert 1 hat, so könnten wir die Formel wie folgt schreiben:
ŷ = x1 * w1 + x2 * w2 + x3 * w3 + x0 * b
Jetzt gibt es überhaupt keinen Unterschied mehr zwischen dem Bias und den Gewichten. Der Bias ist einfach nur das Gewicht einer Eingabevariablen mit dem konstanten Wert 1. Der Trick, den ich eben erwähnt habe, besteht darin, eine Pseudo-Eingabevariable hinzuzufügen, die stets 1 ist. Dann brauchen wir den expliziten Bias nicht mehr.
Wir könnten dazu in die Datei pizza_3_vars.txt wie folgt eine Spalte mit lauter Einsen aufnehmen:
Allerdings ist es immer besser, nicht in den ursprünglichen Daten herumzupfuschen. Stattdessen fügen wir die Spalte mit den Einsen in X ein, nachdem wir die Daten geladen haben. Die Position dieser Biasspalte spielt keine Rolle, allerdings wird sie vereinbarungsgemäß meistens an erster Stelle eingefügt:
04_hyperspace/multiple_regression_final.py
x1, x2, x3, y = np.loadtxt("pizza_3_vars.txt", skiprows=1, unpack=True)
X = np.column_stack((np.ones(x1.size), x1, x2, x3)) <
Y = y.reshape(-1, 1)
w = train(X, Y, iterations=100000, lr=0.001)
print("\nWeights: %s" % w.T) <
print("\nA few predictions:") <
for i in range(5): <
print("X[%d] -> %.4f (label: %d)" % (i, predict(X[i], w), Y[i])) <
Ich habe diese Gelegenheit genutzt, dem Programm noch einige print-Befehle beizufügen. Sie geben zunächst die Gewichtsmatrix aus (transponiert, sodass sie in eine Zeile passt) und dann die vorhergesagten Werte und die Labels der ersten fünf Beispiele, sodass wir sie vergleichen können.
Damit ist unser Programm für multiple lineare Regression fertig. Zeit für einen letzten Test!
Ein letzter Testlauf
Wenn wir das Programm ausführen, erhalten wir folgende Ausgabe:
Iteration 0 => Loss: 1333.56666666666660603369
Iteration 1 => Loss: 152.37148173674077611395
...
Iteration 99999 => Loss: 6.69817817063803833122
Weights: [[ 2.41178207 1.23368396 -0.02689984 3.12460558]]
A few predictions:
X[0] -> 45.8717 (label: 44)
X[1] -> 23.2502 (label: 23)
X[2] -> 28.5192 (label: 28)
X[3] -> 58.2355 (label: 60)
X[4] -> 42.8009 (label: 42)
Werfen wir zunächst einen Blick auf den Verlust. Wie erwartet ist er niedriger als bei der Version ohne Bias.
Eine Betrachtung der Gewichte ist sehr aufschlussreich. Bei dem ersten Gewicht handelt es sich lediglich um den Bias, den wir durch den »Einserspalten-Trick« zu einem regulären Gewicht gemacht haben. Die restlichen Gewichte dagegen sind diejenigen für die drei Eingabevariablen, also für Reservierungen, Temperatur und Touristendichte. Die Touristendichte hat ein sehr hohes Gewicht, die Temperatur dagegen ein ziemlich kleines. Das zeigt, dass die Pizzaverkäufe sehr stark von der Anzahl der Touristen beeinflusst werden, aber kaum mit dem Wetter schwanken.
Die letzten Zeilen der Ausgabe zeigen die Vorhersagen und Labels für die ersten fünf Beispiele. Keine der Vorhersagen weicht um mehr als eine oder zwei Pizzas ab. Roberto scheint recht gehabt zu haben: Die Erweiterung auf mehrere Variablen hat unsere Vorhersagefähigkeit verbessert.
Herzlichen Glückwunsch – damit haben Sie das schwerste Kapitel in diesem Buch durchgearbeitet! Fassen wir kurz zusammen, was Sie hier gelernt haben.
Zusammenfassung
In diesem Kapitel ging es um multiple lineare Regression. Wir haben unser Programm auf Datenmengen mit mehr als einer Eingabevariablen erweitert. Dazu verwenden wir jetzt auch mehrere Gewichte, nämlich jeweils für die einzelnen Variablen. Außerdem haben wir den expliziten Bias in ein weiteres Gewicht umgewandelt. Unser ML-Programm ist jetzt leistungsfähig genug, um damit auch Probleme aus der Praxis anzugehen, obwohl es nicht komplizierter aussieht als zuvor.
Des Weiteren haben Sie auch die Matrizenmultiplikation und die Transposition kennengelernt. Diese mathematischen Operationen sind für ML von großer Bedeutung. Diese Kenntnisse werden Ihnen noch viele Jahre lang von Nutzen sein.
In diesem Kapitel haben wir uns auch intensiver mit NumPy beschäftigt. Mich persönlich verbindet eine Hassliebe mit dieser Bibliothek: Während ich ihre Vielseitigkeit schätze, verwirrt mich ihre Schnittstelle. Nichtsdestoweniger ist NumPy ein unverzichtbares Werkzeug für ML,