Eine Reihe, die die Aufgaben von Courseras Klasse für maschinelles Lernen (Professor Andrew Ng) in Python implementiert. In Beispiel 6 erfolgt die Klassifizierung mit der Support Vector Machine (SVM).
Die erste ist eine lineare SVM (kein Kernel). Beim Scikit-Lernen wird die Schnittstelle von Modellen für maschinelles Lernen vereinheitlicht, und jedes Modell kann instanziiert und dann mit "model.fit (X, y)" trainiert werden. Die Syntax ist dieselbe, unabhängig davon, ob es sich um lineare Regression, logistische Regression oder SVM handelt. SVM verwendet die Klasse sklearn.svm.SVC ()
.
Klicken Sie hier für den Code.
Verwenden Sie wie gewohnt scipy.scio.loadmat
, um die Daten im Matlab-Format zu laden und das Training durchzuführen.
import numpy as np
import matplotlib.pyplot as plt
import scipy.io as scio
from sklearn import svm
# scipy.io.loadmat()Lesen Sie Matlab-Daten mit
data = scio.loadmat('ex6data1.mat')
X = data['X']
y = data['y'].ravel()
pos = (y==1) # numpy bool index
neg = (y==0) # numpy bool index
plt.scatter(X[pos,0], X[pos,1], marker='+', c='k')
plt.scatter(X[neg,0], X[neg,1], marker='o', c='y')
#Lineare SVM
model = svm.SVC(C=1.0, kernel='linear')
model.fit(X, y)
#Zeichnen Sie eine Entscheidungsgrenze
px = np.linspace( np.min(X[:,0]), np.max(X[:,0]), 100)
w = model.coef_[0]
py = - (w[0]*px + model.intercept_[0]) / w[1]
plt.plot(px,py)
plt.show()
Klicken Sie hier für die Ergebnisse.
Passen Sie nun je nach Aufgabe den SVM-Regularisierungsparameter "C" an, um die Verhaltensänderung zu sehen. Klicken Sie hier für das Ergebnis mit "C = 100.0".
Das Erhöhen von "C" schwächt die Regularisierung. Aus diesem Grund hat sich die Entscheidungsgrenze geändert, sodass auch die Ausreißer auf der linken Seite richtig klassifiziert werden. Dies ist eine kleine Überanpassung (Überlernen), und man kann sagen, dass die Klassifizierung der natürlicheren Form erfolgt, wenn "C = 1,0" früher eingestellt wird.
In der nächsten Aufgabe werden wir einen anderen Datensatz, der nur schwer durch eine gerade Linie zu trennen ist, mit dem Gaußschen Kernel SVM klassifizieren. Da der Gaußsche Kernel verwendet wird, setzen Sie im Parameter von "svm.SVC" "kernel =" rbf ".
import numpy as np
import matplotlib.pyplot as plt
import scipy.io as scio
from sklearn import svm
# scipy.io.loadmat()Lesen Sie Matlab-Daten mit
data = scio.loadmat('ex6data2.mat')
X = data['X']
y = data['y'].ravel()
pos = (y==1) # numpy bool index
neg = (y==0) # numpy bool index
plt.scatter(X[pos,0], X[pos,1], marker='+', c='k')
plt.scatter(X[neg,0], X[neg,1], marker='o', c='y')
#Gaußscher Kernel(RBF)SVM
model = svm.SVC(C=1.0, gamma=50.0, kernel='rbf', probability=True)
model.fit(X, y)
# Decision Boundary(Entscheidungsgrenze)Plotten
px = np.arange(0, 1, 0.01)
py = np.arange(0, 1, 0.01)
PX, PY = np.meshgrid(px, py) # PX,Jeder PY ist eine 100x100-Matrix
XX = np.c_[PX.ravel(), PY.ravel()] #XX ist eine 10000x2-Matrix
Z = model.predict_proba(XX)[:,1] #Vorausgesagt vom SVM-Modell. y=Die Wahrscheinlichkeit von 1 befindet sich in der zweiten Spalte des Ergebnisses. Z ist ein 10000-Dimensionsvektor
Z = Z.reshape(PX.shape) #Konvertieren Sie Z in eine 100x100-Matrix
plt.contour(PX, PY, Z, levels=[0.5], linewidths=3) # Z=0.Die Konturlinie von 5 wird zur Entscheidungsgrenze
plt.xlim(0.0,1.0)
plt.ylim(0.4,1.0)
plt.show()
Das resultierende Diagramm sieht folgendermaßen aus, und Sie können sehen, dass selbst die Daten, die zur Entscheidungsgrenze komplizierter Formen werden, sauber klassifiziert werden können.
Der Punkt dieses Mal ist ungefähr "Gamma" des RBF-Kernels, der einer der Parameter von SVM ist. In Coursera der Gaußsche Kernel
gamma
wird als Parameter an sklearn.svm.SVC ()
übergeben. Beim Vergleich der beiden Gleichungen entspricht dies $ \ gamma = \ frac {1} {2 \ sigma ^ 2} $. Im Coursera-Beispiel wurde $ \ sigma = 0.1 $ festgelegt, daher setzen wir $ \ gamma = 50 $ entsprechend.
C
und σ einWie wir gesehen haben, erfordert die Gaußsche Kernel-SVM eine Anpassung der Parameter C
und $ \ sigma $.
―― C
ist die Stärke der Regularisierung. Je kleiner C ist, desto regelmäßiger wird es (= es passt nicht zu den Trainingsdaten, die Generalisierungsleistung wird stärker) und je größer C es ist, desto weniger regelmäßig wird es (= es passt zu den Trainingsdaten, es wird zu Übertraining).
Basierend auf dieser Eigenschaft werden wir beide Parameter einstellen.
In der nächsten Aufgabe werden wir den neuen Datensatz mit verschiedenen Kombinationen von C
und $ \ sigma $ trainieren und den Parametersatz mit dem höchsten Prozentsatz an richtigen Antworten in der Klassifizierung übernehmen. Acht Arten von Werten von 0,01, 0,03, 0,1, 0,3, 1, 3, 10, 30 werden als Werte von "C" und "$ \ sigma" versucht, so dass 8x8 = 64-maliges Training durchgeführt wird.
Klicken Sie hier für den Code.
import numpy as np
import matplotlib.pyplot as plt
import scipy.io as scio
from sklearn import svm
# scipy.io.loadmat()Lesen Sie Matlab-Daten mit
data = scio.loadmat('ex6data3.mat')
X = data['X']
y = data['y'].ravel()
Xval = data['Xval']
yval = data['yval'].ravel()
c_values = np.array([0.01, 0.03, 0.1, 0.3, 1.0, 3.0, 10.0, 30.0])
gamma_values = 1/ (2* c_values**2)
#Gaußscher Kern mit unterschiedlichem C und Gamma(RBF)Lerne SVM
scores = np.zeros([8,8])
for i_c in range(0,8):
for i_g in range(0,8):
model = svm.SVC(C=c_values[i_c], gamma=gamma_values[i_g], kernel='rbf')
model.fit(X, y)
#Berechnen Sie die Punktzahl in den Kreuztestdaten
scores[i_c, i_g] = model.score(Xval, yval)
#C mit der höchsten Punktzahl,Fragen Sie nach Gamma
max_idx = np.unravel_index(np.argmax(scores), scores.shape)
#Maximum C.,Lerne SVM noch einmal mit Gamma
model = svm.SVC(C=c_values[max_idx[0]], gamma=gamma_values[max_idx[1]], kernel='rbf', probability=True)
model.fit(X, y)
#Zeichnen Sie Kreuztestdaten
pos = (yval==1) # numpy bool index
neg = (yval==0) # numpy bool index
plt.scatter(Xval[pos,0], Xval[pos,1], marker='+', c='k')
plt.scatter(Xval[neg,0], Xval[neg,1], marker='o', c='y')
# Decision Boundary(Entscheidungsgrenze)Plotten
px = np.arange(-0.6, 0.25, 0.01)
py = np.arange(-0.8, 0.6, 0.01)
PX, PY = np.meshgrid(px, py) # PX,Jeder PY ist eine 100x100-Matrix
XX = np.c_[PX.ravel(), PY.ravel()] #XX ist eine 10000x2-Matrix
Z = model.predict_proba(XX)[:,1] #Vorausgesagt vom SVM-Modell. y=Die Wahrscheinlichkeit von 1 befindet sich in der zweiten Spalte des Ergebnisses. Z ist ein 10000-Dimensionsvektor
Z = Z.reshape(PX.shape) #Konvertieren Sie Z in eine 100x100-Matrix
plt.contour(PX, PY, Z, levels=[0.5], linewidths=3) # Z=0.Die Konturlinie von 5 wird zur Entscheidungsgrenze
plt.show()
Als Ergebnis der Überprüfung mit den Kreuztestdaten hat "C = 1,0, Gamma = 0,1" die höchste Leistung, und die Entscheidungsgrenze des Klassifikators ist wie folgt.
Memo
A
->np.unravel_index (np.argmax (A), A.shape)
Ein Taple mit einem Index wird als Ergebnis zurückgegeben.Dr. Andrew hat die folgenden Richtlinien zur ordnungsgemäßen Verwendung der logistischen Regression, der linearen SVM und der Gaußschen Kernel-SVM herausgegeben. Wenn m = Anzahl der Proben (Trainingsdaten) und n = Anzahl der Merkmale
Die zweite Hälfte von ex6 (Spamfilter mit SVM) wird separat durchgeführt.
Recommended Posts