Coursera Machine Learning ist die weltweit führende Einführung in das maschinelle Lernen. Dies ist der dritte in einer Reihe von Versuchen, nach dem Studium der Matlab / Octave-Programmieraufgaben in Python zu implementieren.
Diesmal in der ersten Hälfte von ex3 die Aufgabe, handgeschriebene Zahlen mithilfe der logistischen Regression zu erkennen. Der Datensatz ist eine Teilmenge von MNIST, die 5000 Graustufenbilder mit 20 x 20 Pixeln im Matlab / Octave .mat-Datenformat erhält. Tatsächlich verfügt scikit-learn über eine Funktion namens "fetch_mldata ()", mit der Sie auch MNIST-Daten (28 x 28 Pixel, 70.000 Blatt) herunterladen können (siehe diesen Artikel: [Handgeschrieben von MNIST mit Multilayer Perceptron] Nummernerkennung](http://aidiary.hatenablog.com/entry/20140205/1391601418), aber dieses Mal werde ich die obigen .mat-Daten zum Vergleich verwenden.
Die zweite Hälfte von ex3 ist ein wenig halbfertiger Inhalt, bei dem nur der Vorwärtsausbreitungsteil des neuronalen Netzwerks erstellt wird, daher werde ich ihn weglassen.
Die Daten sind auch gut formatiert und es handelt sich um einfachen Code, da nur die Klasse "LogisticRegression" von scicit-learn verwendet wird. Die Daten im Mat-Format von Matlab können mit der Funktion scipy.io.loadmat ()
von Scipy gelesen werden.
ex3.py
import numpy as np
import matplotlib.pyplot as plt
import scipy.io as scio
from sklearn import linear_model
# scipy.io.loadmat()Lesen Sie Matlab-Daten mit
data = scio.loadmat('ex3data1.mat')
X = data['X'] #X ist eine 5000x400-Matrix
y = data['y'].ravel() #y ist eine 5000 x 1 Matrix, ravel()Konvertieren Sie mit in einen 5000-dimensionalen Vektor
model = linear_model.LogisticRegression(penalty='l2', C=10.0) #Modelldefinition
model.fit(X,y) #Lernen mit Trainingsdaten
model.score(X,y) #Richtige Antwortrate in den Trainingsdaten
Bei der Ausführung wurde die korrekte Antwortrate für die Zeichenerkennung in den Trainingsdaten als 0,96499999999999997 angezeigt.
Der Parameter $ \ lambda $, der die Stärke der Regularisierung angibt, war in Coursera $ \ lambda = 0.1 $. Wie im vorherigen Artikel beschrieben, wird in der Klasse "sklearn.linear_model.LogisticRegression" der Regularisierungsparameter durch $ C $ angegeben (entsprechend der Umkehrung von $ \ lambda $), sodass das Modell dieses Mal auf "C = 10.0" gesetzt wird. Definiert.
Infolgedessen betrug die korrekte Antwortrate in den Trainingsdaten wie oben erwähnt 96,5%. Das Ergebnis mit Matlab / Octave lag bei 94,9%. Ist es also ein wenig übertrieben? Ich bin mir nicht sicher warum.
Das ist zu einfach, deshalb habe ich einen Code geschrieben, um die Daten anzuzeigen, die falsch erkannt wurden. Beim Training mit dem oben genannten Modell werden 175 von 5000 Trainingsdaten falsch ermittelt. Lassen Sie uns die Beschriftungen (wie Sie einen Fehler gemacht haben) zusammen mit den Bildern für 25 zufällig ausgewählte Elemente anzeigen.
ex3-wrong.py
wrong_index = np.array(np.nonzero(np.array([model.predict(X) != y]).ravel())).ravel()
wrong_sample_index = np.random.randint(0,len(wrong_index),25)
fig = plt.figure()
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.5, hspace=0.5)
for i in range(0,25):
ax = fig.add_subplot(5,5,i+1)
ax.axis('off')
ax.imshow(X[wrong_index[wrong_sample_index[i]]].reshape(20,20).T, cmap = plt.get_cmap('gray'))
ax.set_title(str(model.predict(X[wrong_index[wrong_sample_index[i]]])[0]))
plt.show()
np.array ([model.predict (X)! = Y])
einen Fehler bei der Erkennung machen, True, und wenn Sie richtig antworten, extrahieren Sie eine Matrix (5000x1), die False enthält. Wenn Sie es in die Funktion "np.nonzero ()" einfügen, erhalten Sie eine Matrix mit Indizes der True-Daten. Ich benutze .ravel ()
zweimal, weil ich es endlich als Vektor abrufen möchte.false_sample_index
ist ein Index, der erstellt wurde, um 25 zufällig aus dem Vektor zu extrahieren, der den in der 1. Zeile extrahierten falschen Index (in diesem Fall 175) enthält.set_title
die (falsche) Bezeichnung an, die das Modell als Titel des Bildes angegeben hat. Die Bezeichnung wird von model.predict (X [false_index [false_sample_index [1]]]) erhalten, aber da sie als 1x1-Matrix zurückgegeben wird, wird sie als Skalar mit
[0] `extrahiert.Das Ergebnis ist wie folgt.
Es gibt einige überzeugende Fehler, wie etwa 4 mit 9 zu verwechseln und umgekehrt, aber es gibt auch andere, die dies nicht tun. Nun, es könnte so etwas sein, weil ich gerade eine logistische Regression der Pixeldaten durchgeführt habe, ohne irgendwelche Features zu extrahieren. Es kann ein wenig überpassend sein, daher sollte Coursera den entsprechenden Regularisierungsparameter $ C $ mithilfe der Kreuzvalidierung usw. auswählen, der in einem späteren Modul angezeigt wird.
Recommended Posts