Coursera Machine Learning Challenge in Python: ex6 (Anpassen von SVM-Parametern)

Einführung

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).

Lineare 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. ex6-1.PNG

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". ex6-2.PNG

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.

Gaußscher Kernel SVM

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.

ex6-3.PNG

Der Punkt dieses Mal ist ungefähr "Gamma" des RBF-Kernels, der einer der Parameter von SVM ist. In Coursera der Gaußsche Kernel $ K_{gaussian}(x^{(i)},x^{(j)}) = \exp(-\frac{||x^{(i)} - x^{(j)}||^2}{2\sigma^2}) $ Es wurde in Form von definiert. Auf der anderen Seite lernt der RBF-Kernel Scikit $ \exp(-\gamma \left| x-x' \right| ^2) $ Es hat die Form von und $ \ gamma $ 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.

So stellen Sie die Parameter C und σ ein

Wie 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.

ex6-4.PNG

Memo

Zusammenfassung

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

Coursera Machine Learning Challenge in Python: ex6 (Anpassen von SVM-Parametern)
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-Herausforderungen für maschinelles Lernen in Python: ex7-2 (Primäranalyse)
Coursera Machine Learning Challenge in Python: ex7-1 (Bildkomprimierung mit K-bedeutet Clustering)
Coursera-Herausforderungen beim maschinellen Lernen in Python: ex3 (Handschriftliche Zahlenerkennung mit logistischer Rekursion)
So passen Sie den Bildkontrast in Python an
Wie man Coursera / Maschinelles Lernen genießt (Woche 10)
[Python] Einfache Einführung in das maschinelle Lernen mit Python (SVM)
Versuchen Sie, das Modell des maschinellen Lernens in das Python-Paket aufzunehmen
Cross-Entropie zur Überprüfung in Coursera Machine Learning Woche 2 Aufgaben
Wie man in Python entwickelt
So passen Sie mehrere Bibliotheken für maschinelles Lernen auf einmal an
Wie nutzt man maschinelles Lernen für die Arbeit? 03_Python-Codierungsverfahren
[Python] Wie man PCA mit Python macht
So sammeln Sie Bilder in Python
Verwendung von SQLite in Python
Wie man MySQL mit Python benutzt
So verpacken Sie C in Python
Verwendung von ChemSpider in Python
Python: Vorverarbeitung beim maschinellen Lernen: Übersicht
Verwendung von PubChem mit Python
Umgang mit Japanisch mit Python
Sammeln von Daten zum maschinellen Lernen
Wie wäre es mit Anaconda zum Erstellen einer maschinellen Lernumgebung mit Python?
Menschen merken sich gelerntes Wissen im Gehirn, wie man gelerntes Wissen im maschinellen Lernen auswendig lernt
[Einführung in Python] Wie verwende ich eine Klasse in Python?
Einführung in das maschinelle Lernen: Funktionsweise des Modells
scikit-learn Verwendung der Zusammenfassung (maschinelles Lernen)
Dynamisches Definieren von Variablen in Python
So machen Sie R chartr () in Python
Ich habe Python 3.5.1 installiert, um maschinelles Lernen zu studieren
[Itertools.permutations] So löschen Sie eine Sequenz in Python
[Python] Techniken, die häufig beim maschinellen Lernen verwendet werden
So arbeiten Sie mit BigQuery in Python
Wie bekomme ich Stacktrace in Python?
Python: Vorverarbeitung beim maschinellen Lernen: Datenerfassung
So zeigen Sie die neunundneunzig Tabelle in Python an
So extrahieren Sie einen Polygonbereich in Python
So überprüfen Sie die Version von opencv mit Python
So wechseln Sie die Python-Version in Cloud9
Verwendung von __slots__ in der Python-Klasse
So füllen Sie mit Python dynamisch Nullen aus
Eine Einführung in Python für maschinelles Lernen
[Python] Speichern von Lernergebnissen (Modellen) beim maschinellen Lernen
Python: Vorverarbeitung beim maschinellen Lernen: Datenkonvertierung
Verwendung regulärer Ausdrücke in Python
So zeigen Sie Hello World in Python an
Verwendung ist und == in Python
Wie schreibe ich Ruby to_s in Python
Verwendung der C-Bibliothek in Python
So empfangen Sie Befehlszeilenargumente in Python
[REAPER] Wie man Reascript mit Python spielt
So löschen Sie einen Taple in einer Liste (Python)
So generieren Sie eine Sequenz in Python und C ++
Einbetten von Variablen in Python-Strings
Zusammenfassung zum Importieren von Dateien in Python 3
So vereinfachen Sie die eingeschränkte Polypoly-Anpassung in Python