Eine Serie, die Coursera Machine Learning-Programmieraufgaben in Python implementiert. (23.10.2015) ex2_reg hinzugefügt und hinzugefügt. (25.12.2015) Es wurde eine Version hinzugefügt, die mithilfe von Polynom-Funktionen mit ex2_reg einfach geschrieben werden kann
In diesem Beispiel werden die Ergebnisse der beiden Tests als Eingabedaten angegeben, und die Testergebnisse (bestanden oder nicht bestanden) werden als Ausgabedaten angegeben, und ein Klassifizierer durch logistische Regression wird erstellt.
ex2.py
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model
data = pd.read_csv("ex2data1.txt", header=None)
# read 1st, 2nd column as feature matrix (100x2)
X = np.array([data[0],data[1]]).T
# read 3rd column as label vector (100)
y = np.array(data[2])
# plot
pos = (y==1) # numpy bool index
neg = (y==0) # numpy bool index
plt.scatter(X[pos,0], X[pos,1], marker='+', c='b')
plt.scatter(X[neg,0], X[neg,1], marker='o', c='y')
plt.legend(['Admitted', 'Not admitted'], scatterpoints=1)
plt.xlabel("Exam 1 Score")
plt.ylabel("Exam 2 Score")
# Logistic regression model with no regularization
model = linear_model.LogisticRegression(C=1000000.0)
model.fit(X, y)
# Extract model parameter (theta0, theta1, theta2)
[theta0] = model.intercept_
[[theta1, theta2]] = model.coef_
# Plot decision boundary
plot_x = np.array([min(X[:,0])-2, max(X[:,0])+2]) # lowest and highest x1
plot_y = - (theta0 + theta1*plot_x) / theta2 # calculate x2
plt.plot(plot_x, plot_y, 'b')
plt.show()
Das resultierende Diagramm sieht folgendermaßen aus.
Verwenden Sie für die logistische Regression die Klasse "sklearn.linear_model.LogisticRegression ()" und lernen Sie mit dem bekannten "model.fit (X, y)".
In der Klasse "LogisticRegression" wird die Stärke der Regularisierung durch den Parameter "C" angegeben. In der Klasse wurde dies durch den Parameter $ \ lambda $ angegeben, aber C
ist die Umkehrung von $ \ lambda $ (wird in einer späteren SVM-Sitzung angezeigt). Je kleiner das "C" ist, desto stärker ist die Regularisierung, und je größer das "C" ist, desto schwächer ist die Regularisierung. In diesem Beispiel möchten wir keine Regularisierung haben, also setzen wir einen großen Wert (1.000.000) in "C".
Zeichnen Sie nach dem Training des Modells eine Entscheidungsgrenze. Die Entscheidungsgrenze der logistischen Regression ist eine gerade Linie, die durch $ \ theta ^ {T} X = 0 $ definiert ist. Im Fall des Beispiels, wenn Sie es in Komponenten aufschreiben, $ \ theta_0 + \ theta_1 x_1 + \ theta_2 x_2 = 0 $, und lösen Sie dies mit der Formel $ x_2 = - \ frac {\ theta_0 + \ theta_1 x_1} {\ theta_2} $ Berechnen Sie die Koordinaten der Punkte an der Entscheidungsgrenze mit und übergeben Sie sie an die Plotfunktion.
plot_x
keine Vektoroperationen ausführen können, wenn Sie es nicht als Numpy Array erstellen (wenn Sie es als Python-Standardliste erstellen).In diesem Beispiel werden die beiden Testergebnisse des Mikrochips als Eingabedaten angegeben, und das Bestanden- oder Nichtbestanden-Flag wird als Ergebnisdaten angegeben. Erstellen Sie einen Klassifizierer, der Bestehen und Nichtbestehen mithilfe eines logistischen Regressionsmodells klassifiziert. Da eine lineare Trennung mit einer geraden Linie nicht möglich ist, wird eine polymorphe Anpassung verwendet. Erstellen Sie außerdem ein Modell mit verschiedenen Regularisierungsparametern $ \ lambda $ und sehen Sie die Auswirkungen der Regularisierung.
ex2_reg.py
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model
# mapFeature(x1, x2)
#Führen Sie eine Feature-Zuordnung durch
#Argument: Merkmalsvektor x1,x2 (muss die gleiche Abmessung haben n)
#Rückgabewert: Feature-Matrix X.(nx28 Matrix)
#Bis zur 6. Ordnung 1, x1, x2, x1^2, x1*x2, x2, x1^3, .... x1*x2^5, x2^28 Zeilen wie 6
def mapFeature(x1, x2):
degree = 6
out = np.ones(x1.shape) #Die erste Spalte ist 1
for i in range(1, degree+1): #Schleife von 1 bis Grad
for j in range(0, i+1): #Schleife von 0 bis i
out = np.c_[out, (x1**(i-j) * x2**j)] #Erhöhen Sie die Anzahl der Spalten
return out
#Text von hier
data = pd.read_csv("ex2data2.txt", header=None)
x1 = np.array(data[0])
x2 = np.array(data[1])
y = np.array(data[2])
#Zeichnen Sie Beispieldaten
pos = (y==1) # numpy bool index
neg = (y==0) # numpy bool index
plt.scatter(x1[pos], x2[pos], marker='+', c='b') #Das richtige Beispiel ist'+'
plt.scatter(x1[neg], x2[neg], marker='o', c='y') #Negatives Beispiel'o'
plt.legend(['y = 0', 'y = 1'], scatterpoints=1)
plt.xlabel("Microchip Test 1")
plt.ylabel("Microchip Test 2")
#X ist eine nx28-Matrix für die Feature-Zuordnung
X = mapFeature(x1, x2)
#Logistisches Regressionsmodell mit Regularisierung
model = linear_model.LogisticRegression(penalty='l2', C=1.0)
model.fit(X, y)
# Decision Boundary(Entscheidungsgrenze)Plotten
px = np.arange(-1.0, 1.5, 0.1)
py = np.arange(-1.0, 1.5, 0.1)
PX, PY = np.meshgrid(px, py) # PX,Jeder PY ist eine 25x25-Matrix
XX = mapFeature(PX.ravel(), PY.ravel()) #Feature-Mapping. Argument ist Ravel()In einen 625-dimensionalen Vektor konvertieren und übergeben. XX ist eine 625x28-Matrix
Z = model.predict_proba(XX)[:,1] #Vorausgesagt mit einem logistischen Regressionsmodell. y=Die Wahrscheinlichkeit von 1 befindet sich in der zweiten Spalte des Ergebnisses. Z ist ein 625-dimensionaler Vektor
Z = Z.reshape(PX.shape) #Konvertieren Sie Z in eine 25x25-Matrix
plt.contour(PX, PY, Z, levels=[0.5], linewidths=3) # Z=0.Die Konturlinie von 5 wird zur Entscheidungsgrenze
plt.show()
Der Teil, der die Klasse "LogisticRegression" verwendet, ist derselbe wie im vorherigen Beispiel. Da es sich bei der in Coursera angezeigten Regularisierung um die L2-Regularisierung (Ridge-Regression) handelt, fügen Sie die Option'penalty = 'l2' hinzu. Ich werde eine Entscheidungsgrenze mit einem Modell ziehen, das durch Ändern der Stärke der Regularisierung trainiert wurde, aber in Coursera gab es 3 Arten von $ \ lambda = 0, 1, 100 $, aber im Python-Beispiel "C = 1000000.0" , "C = 1,0", "C = 0,01".
Im Fall von "C = 1000000.0" (keine Regularisierung, Überanpassung)
Wenn "C = 1,0"
Wenn "C = 0,01" (zu regelmäßig, Unteranpassung)
ravel ()
in einen Vektor. Matlab / Octave unterstützt A (:)
. Dies liegt daran, dass die von "meshgrid" erstellte Koordinatenmatrix ein Vektor sein muss, wenn sie an "mapFeature" und "LogisticRegression.predict_proba ()" übergeben wird. Umgekehrt wird der Rückgabevektor "Z" mit der Methode "reshape ()" an die Matrix zurückgegeben.Im obigen Code habe ich meine eigene Funktion namens "mapFeature ()" erstellt, um Merkmale von Polynomen zu generieren, aber "scikit-learn" hat eine Klasse namens "sklearn.preprocessing.PolynomialFeatures", die dasselbe tut. Es gibt, also ersetzen Sie es hier. Klicken Sie hier für den Code.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import sklearn
data = pd.read_csv("ex2data2.txt", header=None)
x1 = np.array(data[0])
x2 = np.array(data[1])
y = np.array(data[2])
#Zeichnen Sie Beispieldaten
pos = (y==1) # numpy bool index
neg = (y==0) # numpy bool index
plt.scatter(x1[pos], x2[pos], marker='+', c='b') #Das richtige Beispiel ist'+'
plt.scatter(x1[neg], x2[neg], marker='o', c='y') #Negatives Beispiel'o'
plt.legend(['y = 0', 'y = 1'], scatterpoints=1)
plt.xlabel("Microchip Test 1")
plt.ylabel("Microchip Test 2")
#X ist eine nx28-Matrix für die Feature-Zuordnung
poly = sklearn.preprocessing.PolynomialFeatures(6)
X = poly.fit_transform(np.c_[x1,x2])
#Logistisches Regressionsmodell mit Regularisierung
model = linear_model.LogisticRegression(penalty='l2', C=1.0)
model.fit(X, y)
# Decision Boundary(Entscheidungsgrenze)Plotten
px = np.arange(-1.0, 1.5, 0.1)
py = np.arange(-1.0, 1.5, 0.1)
PX, PY = np.meshgrid(px, py) # PX,Jeder PY ist eine 25x25-Matrix
XX = poly.fit_transform(np.c_[PX.ravel(), PY.ravel()]) #Das Feature-Mapping-Argument ist ravel()Konvertiert in einen 625-dimensionalen Vektor und durchläuft XX eine 625x28-Matrix
Z = model.predict_proba(XX)[:,1] #Vorausgesagt durch das logistische Regressionsmodell y=Da die Wahrscheinlichkeit von 1 in der zweiten Spalte des Ergebnisses liegt, ist das zu extrahierende Z ein 625-dimensionaler Vektor.
Z = Z.reshape(PX.shape) #Konvertieren Sie Z in eine 25x25-Matrix
plt.contour(PX, PY, Z, levels=[0.5], linewidths=3) # Z=0.Die Konturlinie von 5 wird zur Entscheidungsgrenze
plt.show()
Ich studiere sowohl Python als auch maschinelles Lernen, daher wäre ich dankbar, wenn Sie auf merkwürdige Punkte hinweisen könnten (^^)
Recommended Posts