Coursera-Herausforderungen beim maschinellen Lernen in Python: ex5 (Anpassung der Regularisierungsparameter)

Eine Reihe, die Matlab / Octave-Programmieraufgaben in Courseras Klasse für maschinelles Lernen (Professor Andrew Ng) in Python implementiert. Das Konzept bleibt gleich:

Diese Woche (Woche 6) trägt den Titel "Ratschläge zur Anwendung des maschinellen Lernens". Anstatt ein neues Lernmodell zu lernen, lernen Sie, wie Sie Modellparameter optimieren und die Modellleistung überprüfen. Wenn ich diesem Thema eine Woche zuordne, denke ich, dass das Merkmal dieses Kurses ** "eher praktisch als theoretisch voreingenommen" ** erscheint.

Hier ist ein kurzer Blick darauf, wie Sie Ihr Modell optimieren können:

Programmieraufgaben werden ebenfalls mit diesem Verfahren fortgesetzt.

Lesen Sie zuerst die Daten

Sie können matlab .mat-Formatdaten mit scio.loadmat () von scipy laden.

import numpy as np
import matplotlib.pyplot as plt
import scipy.io as scio
from sklearn import linear_model, preprocessing

# scipy.io.loadmat()Lesen Sie Matlab-Daten mit
data = scio.loadmat('ex5data1.mat')
X = data['X']
Xval = data['Xval']
Xtest = data['Xtest']
y = data['y']
yval = data['yval']
ytest = data['ytest']

Es scheint, dass diese Daten den Wasserstand von X = Damm verwenden, um die Wassermenge vorherzusagen, die aus y = Damm fließt.

Versuchen Sie zuerst die lineare Regression

Vorerst werde ich eine lineare Regression durchführen und diese zeichnen.

model = linear_model.Ridge(alpha=0.0)
model.fit(X,y)

px = np.array(np.linspace(np.min(X),np.max(X),100)).reshape(-1,1)
py = model.predict(px)
plt.plot(px, py)
plt.scatter(X,y)
plt.show()

Sie können das Modell "linear_model.LinearRegression ()" verwenden, das Sie immer verwenden, aber ich verwende das Modell "Ridge ()", da ich später einen Regularisierungsterm hinzufügen werde. In diesem Modell können Sie die Stärke der Regularisierung mit dem Parameter "alpha" angeben, aber mit "alpha = 0.0" gibt es keine Regularisierung, die mit dem Modell "LinearRegression ()" identisch ist.

Klicken Sie hier für die Ergebnisse.

スクリーンショット 2015-11-07 09.49.10.png

Wie Sie sehen können, passen die Daten nicht gut zu geraden Linien.

Versuchen Sie dennoch, eine Lernkurve mit linearer Regression zu zeichnen

Versuchen Sie, eine Lernkurve zu zeichnen, indem Sie die Anzahl der Trainingsdaten ändern, obwohl Sie wissen, dass keine gerade Linie gilt. Führen Sie eine lineare Regression mit 1 bis 12 Trainingsdaten durch und zeichnen Sie die Fehler für die Trainingsdaten und die Fehler für die Kreuzvalidierungsdaten auf. "Fehler" ist der quadratische Fehler, der mit der folgenden Formel berechnet werden kann. $ \frac{1}{2m} \sum (h_\theta(x^{(i)}) - y^{(i)})^2 $ Klicken Sie hier für den Code.

#Versuchen Sie, eine Lernkurve mit linearer Regression zu zeichnen
error_train = np.zeros(11)
error_val = np.zeros(11)
model = linear_model.Ridge(alpha=0.0)
for i in range(1,12):
    #Führen Sie eine Regression mit nur i Teilmengen von Trainingsdaten durch
    model.fit( X[0:i], y[0:i] )
    #Berechnen Sie Fehler in i Teilmengen dieser Trainingsdaten
    error_train[i-1] = sum( (y[0:i] - model.predict(X[0:i]))**2 ) / (2*i)
    #Berechnen Sie den Datenfehler für den Kreuztest
    error_val[i-1] = sum( (yval - model.predict(Xval) )**2 ) / (2*yval.size)
    
px = np.arange(1,12)
plt.plot(px, error_train, label="Train")
plt.plot(px, error_val, label="Cross Validation")
plt.xlabel("Number of training examples")
plt.ylabel("Error")
plt.legend()
plt.show()

Das Ergebnis ist so. スクリーンショット 2015-11-07 17.56.21.png

Selbst wenn die Trainingsdaten auf 12 (alle) erhöht werden, verringert sich der Fehler nicht sowohl für Zugdaten als auch für Kreuzvalidierungsdaten. Da dies beim linearen Regressionsmodell nicht der Fall ist, besteht der nächste Schritt darin, eine polymorphe Anpassung zu versuchen.

Polygonale Anpassung

Die oben implementierte lineare Regressionshypothese lautet $ h_\theta(x) = \theta_0 + \theta_1x$ Bei der Polynomanpassung wird hier jedoch der Skalenterm $ x $ hinzugefügt. $ h_\theta(x) = \theta_0 + \theta_1x + \theta_2x^2 + \theta_3x^3 + ... + \theta_px^p$ Es ist ein Ausdruck wie. Insbesondere wird der numerische Wert des Produkts des Merkmalsbetrags $ x $ im Voraus berechnet, und dieser wird als neuer Merkmalsbetrag von $ x_1, x_2, x_3 ... $ verwendet, und diese Daten werden verwendet. $ h_\theta(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 + \theta_3x_3 + ... + \theta_px_p$ Lernen Sie mit dem linearen Regressionsmodell, das durch dargestellt wird.

In scikit-learn gibt es eine Klasse namens "sklearn.preprocessing.PolynomialFeatures", die die Merkmale dieses Polynoms berechnet und erstellt. Wir werden diese also verwenden. Klicken Sie hier für den Code.

#Berechnen Sie den Multiplikator von X und dem neuen Merkmal X._Lass es poly sein
#X ist eine m x 1 Matrix, X._Poly ist eine m x 8-Matrix
poly = preprocessing.PolynomialFeatures(degree=8, include_bias=False)
X_poly = poly.fit_transform(X)

# X_Lineare Regression mit poly
model = linear_model.Ridge(alpha=0.0)
model.fit(X_poly,y)

#Handlung
px = np.array(np.linspace(np.min(X)-10,np.max(X)+10,100)).reshape(-1,1)
#Dieses Modell ist x_Da Poly als Eingabe akzeptiert wird, wird x zum Zeichnen auch in Form einer Skala erweitert.
px_poly = poly.fit_transform(px)
py = model.predict(px_poly)
plt.plot(px, py)
plt.scatter(X, y)
plt.show()

Klicken Sie hier für die Anpassungsergebnisse.

スクリーンショット 2015-11-07 21.25.37.png

Die Anpassung mit einem Polypoly 8. Ordnung gilt für alle Trainingsdaten. Dies ist jedoch ein Übertraining und kann ein schlecht vorhersehbares Modell für neue Daten sein. Dieses Mal werden wir bei der Überprüfung dieses Modells mit den Daten für den Kreuztest die Regularisierungsparameter anpassen, indem wir den Regularisierungsterm einfügen.

Optimierung der Regularisierungsparameter

Durch Einbeziehung des Regularisierungsterms wird die Kostenfunktion der linearen Regression $ J = \ frac {1} {2m} \ sum_ {i = 1} ^ m (h_ \ theta (x ^ {(i)}) --y ^ {(i)}) ^ 2 + \ frac {\ Es sieht aus wie Lambda} {2m} \ sum_ {j = 1} ^ n \ theta_j ^ 2 $. Der zweite Term ist der Regularisierungsterm, der ein Überlernen verhindern kann, indem die Werte von Parametern, die von 0 abweichen, bestraft werden. Diese Form der Regularisierung wird als L2-Regularisierung, Ridge-Regression usw. bezeichnet.

$ \ Lambda $ im Molekül des zweiten Terms ist ein Parameter, der die Stärke der Regularisierung anpasst. Wie wir oben gesehen haben, entspricht dies dem Parameter "alpha" in "linear_model.Ridge ()". Ändern Sie diesen Parameter wie bei Coursera in 0,001, 0,003, 0,01, 0,03, 0,1, 0,3, 1, 3, 10 und zeichnen Sie die Lernkurve auf, um festzustellen, welches $ \ lambda $ für Sie geeignet ist.

Klicken Sie hier für den Code.

#Berechnen Sie den Multiplikator von X und dem neuen Merkmal X._Lass es poly sein
#X ist eine m x 1 Matrix, X._Poly ist eine m x 8-Matrix
poly = preprocessing.PolynomialFeatures(degree=8, include_bias=False)
X_poly = poly.fit_transform(X) #Trainingsdaten
Xval_poly = poly.fit_transform(Xval) #Kreuzvalidierungsdaten

#Versuchen Sie, eine Lernkurve zu zeichnen, indem Sie λ ändern
error_train = np.zeros(9)
error_val = np.zeros(9)
lambda_values = np.array([0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1.0, 3.0, 10.0])
for i in range(0,9):
    # X_Lineare Regression mit poly
    model = linear_model.Ridge(alpha=lambda_values[i]/10, normalize=True ) #Ändern Sie den Regularisierungsparameter Alpha
    model.fit(X_poly,y)
    #Berechnen Sie Fehler in Trainingsdaten (mit Regularisierungsbegriff)
    error_train[i] = sum( (y - model.predict(X_poly))**2 ) / (2*y.size) + sum(sum( model.coef_**2 )) * lambda_values[i]/(2*y.size)
    #Berechnen Sie den Fehler in den Daten für den Kreuztest (mit Regularisierungsterm).
    error_val[i] = sum( (yval - model.predict(Xval_poly) )**2 ) / (2*yval.size) + sum(sum( model.coef_**2 ))* lambda_values[i]/(2*yval.size)

px = lambda_values
plt.plot(px, error_train, label="Train")
plt.plot(px, error_val, label="Cross Validation")
plt.xlabel("Lambda")
plt.ylabel("Error")
plt.legend()
plt.show()

Die Darstellung sieht folgendermaßen aus, und das Ergebnis ist, dass $ \ lambda = 3 $, das im Kreuztest den kleinsten Fehlerwert aufweist, gut ist.

ex5.PNG

abschließend

sklearn.linear_model.Ridge () hat auch ein Modell namenssklearn.linear_model.RidgeCV ()für Kreuztests, und es scheint, dass es die optimale Alpha-Zahl zusammen berechnet, wenn es trainiert wird.

Verweise

Recommended Posts

Coursera-Herausforderungen beim maschinellen Lernen in Python: ex5 (Anpassung der Regularisierungsparameter)
Coursera-Herausforderungen beim maschinellen Lernen in Python: ex2 (Logistic Return)
Coursera Machine Learning Challenge in Python: ex1 (lineare Regression)
Coursera Machine Learning Challenge in Python: ex6 (Anpassen von SVM-Parametern)
Coursera-Herausforderungen für maschinelles Lernen in Python: ex7-2 (Primäranalyse)
Coursera Machine Learning Challenge in Python: ex7-1 (Bildkomprimierung mit K-bedeutet Clustering)
Lassen Sie uns einen Teil des maschinellen Lernens mit Python berühren
Das Ergebnis des maschinellen Lernens von Java-Ingenieuren mit Python www
MySQL-automatische Escape-Funktion von Parametern in Python
Python: Vorverarbeitung beim maschinellen Lernen: Übersicht
[Python] Techniken, die häufig beim maschinellen Lernen verwendet werden
Python: Vorverarbeitung beim maschinellen Lernen: Datenerfassung
[Python] Speichern von Lernergebnissen (Modellen) beim maschinellen Lernen
Python: Vorverarbeitung beim maschinellen Lernen: Datenkonvertierung
Python: Vorverarbeitung beim maschinellen Lernen: Umgang mit fehlenden / Ausreißern / unausgeglichenen Daten
Python & Machine Learning Study Memo ⑤: Klassifikation von Ayame
Python & Machine Learning Study Memo Introduction: Einführung in die Bibliothek
Vollständige Offenlegung der beim maschinellen Lernen verwendeten Methoden
Zusammenfassung der beim maschinellen Lernen verwendeten Bewertungsfunktionen
Liste der wichtigsten Wahrscheinlichkeitsverteilungen, die beim maschinellen Lernen und in der Statistik verwendet werden, sowie Code in Python
Tool MALSS (Anwendung), das maschinelles Lernen in Python unterstützt
Zählen Sie die Anzahl der Parameter im Deep-Learning-Modell
Tool MALSS (Basic), das maschinelles Lernen in Python unterstützt
Über das Testen bei der Implementierung von Modellen für maschinelles Lernen
[Maschinelles Lernen] "Erkennung von Abnormalitäten und Erkennung von Änderungen" Zeichnen wir die Abbildung von Kapitel 1 in Python.
Zusammenfassung des grundlegenden Ablaufs des maschinellen Lernens mit Python
Versuchen Sie, das Modell des maschinellen Lernens in das Python-Paket aufzunehmen
Cross-Entropie zur Überprüfung in Coursera Machine Learning Woche 2 Aufgaben
MALSS (Einführung), ein Tool, das maschinelles Lernen in Python unterstützt
Umfrage zum Einsatz von maschinellem Lernen in realen Diensten
Die Zusammenfassung des maschinellen Lernens in Python für Anfänger ist sehr kurz.
Maschinelles Lernen in Delemas (Praxis)
Grundlagen des maschinellen Lernens (Denkmal)
Maschinelles Lernen mit Python! Vorbereitung
Objektäquivalenzbeurteilung in Python
Python Machine Learning Programming> Schlüsselwörter
Wird in EDA für maschinelles Lernen verwendet
Bedeutung von Datensätzen für maschinelles Lernen
Beginnend mit maschinellem Python-Lernen
Implementierung der schnellen Sortierung in Python
[Python Machine Learning] Empfehlung zur Verwendung von Spyder für Anfänger (Stand August 2020)
Wie wäre es mit Anaconda zum Erstellen einer maschinellen Lernumgebung mit Python?
Einführung in die Python-Grundlagen des maschinellen Lernens (unbeaufsichtigtes Lernen / Hauptanalyse)
Memorandum of Scraping & Machine Learning [Entwicklungstechnik] von Python (Kapitel 4)
Memorandum of Scraping & Machine Learning [Entwicklungstechnik] von Python (Kapitel 5)
Beachten Sie, dass ich den Algorithmus des maschinell lernenden Naive Bayes-Klassifikators verstehe. Und ich habe es in Python geschrieben.
Werden Sie bald KI-Ingenieur! Lernen Sie in wenigen Tagen umfassend Python / KI / Maschinelles Lernen / Deep Learning / Statistische Analyse!
Implementieren Sie das Stacking-Lernen in Python [Kaggle]
Bildpixel-Manipulation in Python
Bedeutung des maschinellen Lernens und des Mini-Batch-Lernens
Python: Anwendung des überwachten Lernens (Rückkehr)
Maschinelles Lernen mit Python (1) Gesamtklassifizierung
Zeitdelta in Python 2.7-Serie teilen
Zusammenfassung des maschinellen Lernens von Python-Anfängern
Automatisieren Sie Routineaufgaben beim maschinellen Lernen
Umgang mit JSON-Dateien in Python
Implementierung eines Lebensspiels in Python
In Python implementierte Widrow-Hoff-Lernregeln
Audio-Wellenform-Anzeige in Python
Maschinelles Lernen ③ Zusammenfassung des Entscheidungsbaums
Klassifikation und Regression beim maschinellen Lernen