[PYTHON] Probieren Sie SVM mit scikit-learn auf Jupyter Notebook aus

Eine lineare SVM (Support Vector Machine) ist ein Modell für maschinelles Lernen, das Merkmalsräume linear trennt und klassifiziert. Wenn es nicht linear getrennt werden kann, kann es durch SVN unter Verwendung der Kernel-Methode nicht linear getrennt werden.

Bis jetzt habe ich die Kernel-Methode nicht wirklich verstanden, aber der folgende Artikel war sehr einfach zu verstehen.

Über die Kernel-Methode in Machine Learning-Memomemo

Von nun an versuche ich es in der Jupyter Notebook-Umgebung, die gemäß dem folgenden Artikel vorbereitet wurde. Einfache Installation und Inbetriebnahme von Jupyter Notebook mit Docker (unterstützt auch nbextensions und Scala) --Qiita

In dieser Umgebung können Sie mit einem Browser auf Port 8888 zugreifen und Jupyter Notebook verwenden. Sie können eine neue Notiz öffnen, indem Sie oben rechts auf Neu> Python 3 klicken.

Auch eine zufällig erstellte CSV-Datei https://github.com/suzuki-navi/sample-data/blob/master/sample-data-1.csv Ich benutze.

Datenaufbereitung

Liest Daten aus einer CSV-Datei und wandelt sie in ein DataFrame-Objekt um.

import pandas as pd
from sklearn import model_selection
df = pd.read_csv("sample-data-1.csv", names=["id", "target", "data1", "data2", "data3"])

image.png

df ist ein Pandas DataFrame-Objekt.

Referenz Probieren Sie grundlegende Operationen für Pandas DataFrame auf Jupyter Notebook --Qiita aus

Die charakteristischen Variablen dieser CSV-Daten sind "data1", "data2" und "data3", aber lassen Sie uns den Zustand der Daten mit einem Streudiagramm überprüfen.

%matplotlib inline
import matplotlib.pyplot as plt
plt.scatter(df["data1"], df["data2"], c = df["target"])

image.png

plt.scatter(df["data1"], df["data3"], c = df["target"])

image.png

plt.scatter(df["data2"], df["data3"], c = df["target"])

image.png

Referenz Histogramm / Streudiagramm auf Jupyter Notebook - Qiita anzeigen

Wenn ich mir das Streudiagramm anschaue, scheint es, dass es in zwei Kategorien unterteilt werden kann: "data2" und "data3", also werde ich es versuchen.

feature = df[["data2", "data3"]]
target = df["target"]

feature ist ein Pandas DataFrame-Objekt und target ist ein Objekt der Pandas-Serie.

Es gibt 300 Datensätze, die in Trainingsdaten bzw. Validierungsdaten für Merkmalsvariablen und Zielvariablen unterteilt sind. Es teilt den Datensatz nur in zwei Teile, aber Sie können ihn einfach mit model_selection.train_test_split teilen. Dies wird es zufällig teilen.

feature_train, feature_test, target_train, target_test = model_selection.train_test_split(feature, target, test_size=0.2)

test_size = 0.2 ist eine Angabe, dass 20% aller Daten als Verifizierungsdaten verwendet werden.

Feature-Variablen (df [[" data2 "," data3 "]], feature_train, feature_test) sind Pandas DataFrame-Objekte, Zielvariablen (df [" target "], target_train,target_test) Ist ein Serienobjekt.

Lernen

Lernen Sie anhand der erstellten Trainingsdaten (feature_train, target_train).

from sklearn import svm
model = svm.SVC(kernel="linear")
model.fit(feature_train, target_train)

"SVC (kernel =" linear ")" ist ein Modell des SVM-Klassifikators, das sich linear trennt. Lass uns mit fit lernen.

Referenz sklearn.svm.SVC — scikit-learn 0.21.3 documentation

Auswertung

Erstellen Sie ein Inferenzergebnis (pred_train) aus der Merkmalsvariablen ( feature_train) der Trainingsdaten mit dem trainierten Modell, vergleichen Sie es mit der Zielvariablen (target_train) und bewerten Sie die Genauigkeitsrate. Sie können es einfach mit der Funktion "metrics.accuracy_score "auswerten.

from sklearn import metrics
pred_train = model.predict(feature_train)
metrics.accuracy_score(target_train, pred_train)

Aufgrund der Zufälligkeit der Logik kann das Ergebnis jedes Mal anders sein, es steht jedoch "0,95".

Bewerten Sie anhand von Trainingsdaten, ob diese übertrainiert oder verallgemeinert sind.

pred_test = model.predict(feature_test)
metrics.accuracy_score(target_test, pred_test)

Es wurde als "0.93333333333333333" angezeigt. Ich bin mir nicht sicher, ob es in Ordnung ist.

Wenn Sie "plotting.plot_decision_regions" verwenden, das im Paket "mlxtend" getrennt von scikit-learn enthalten ist, können Sie visualisieren, wie es in einem Streudiagramm klassifiziert ist. Sie müssen ein Array von NumPy anstelle eines Pandas-Objekts an "plot_decision_regions" übergeben. Konvertieren Sie es also mit der Methode "to_numpy ()".

from mlxtend import plotting
plotting.plot_decision_regions(feature.to_numpy(), target.to_numpy(), clf=model)

image.png

Gute Stimmung.

Referenz plot_decision_regions - Mlxtend.plotting - mlxtend pandas.DataFrame.to_numpy — pandas 0.25.3 documentation

Versuchen Sie es mit der Kernel-Methode

Ich möchte eine nichtlineare Trennung versuchen. Verwenden wir den RBF-Kernel.

Alles was Sie tun müssen, ist "svm.SVC (kernel =" linear ")" in "svm.SVC (kernel =" rbf ", gamma =" scale ")" zu ändern. "gamma =" scale "" ist ein Hyperparameter für den RBF-Kernel. Wenn Sie "scale" angeben, wird dieser automatisch aus der Anzahl der Trainingsdaten und der Verteilung der Merkmalsvariablen berechnet.

Mit dem folgenden Code wird das Modell erstellt, trainiert, abgeleitet und sogar bewertet.

model = svm.SVC(kernel="rbf", gamma="scale")
model.fit(feature_train, target_train)
pred_train = model.predict(feature_train)
metrics.accuracy_score(target_train, pred_train)

Es wurde als "0,95" angezeigt.

Mit Trainingsdaten auswerten, um die Generalisierungsleistung zu sehen.

pred_test = model.predict(feature_test)
metrics.accuracy_score(target_test, pred_test)

Es wurde als "0,95" angezeigt. Es ist etwas besser als die lineare Trennung, die ich zuvor erwähnt habe.

plotting.plot_decision_regions(feature.to_numpy(), target.to_numpy(), clf=model)

image.png

Da es nicht linear ist, ist es sicherlich durch eine Kurve getrennt.

Diese Probe war leicht linear zu trennen, daher war es möglicherweise nicht ausreichend, sie nichtlinear zu machen.

Versuchen Sie die Kernel-Methode mit anderen Daten

Da data2 und data3 linear getrennt werden können, versuchen Sie den RBF-Kernel mit anderen Datenkombinationen.

Zunächst "data1" und "data2". Machen Sie nur die Figur, die aussieht, als wären sie durch den folgenden Code getrennt.

feature = df[["data1", "data2"]]
target = df["target"]
feature_train, feature_test, target_train, target_test = model_selection.train_test_split(feature, target, test_size=0.2)
model = svm.SVC(kernel="rbf", gamma="scale")
model.fit(feature_train, target_train)
plotting.plot_decision_regions(feature.to_numpy(), target.to_numpy(), clf=model)

image.png

Mal sehen, die richtige Antwortrate.

pred_train = model.predict(feature_train)
metrics.accuracy_score(target_train, pred_train)

Es war "0,75833333333333333".

pred_test = model.predict(feature_test)
metrics.accuracy_score(target_test, pred_test)

Es war "0,7833333333333333".

Übrigens, selbst wenn ich es linear (kernel =" linear ") mit denselben Daten versuchte, waren es 0,71 bis 0,74. Wenn man sich die Abbildung ansieht, scheint die Kernel-Methode hart zu arbeiten, aber gibt es keinen großen Unterschied bei den numerischen Werten? Sollten wir nicht zu viel erwarten, nur weil wir Nichtlinearität herstellen können?

Ich habe es mit data1 und data3 versucht, aber es war ähnlich, also habe ich es weggelassen ...

das ist alles.

Folge Versuchen Sie, mit einem gemischten Gaußschen Modell auf Jupyter Notebook-Qiita zu clustern

Recommended Posts

Probieren Sie SVM mit scikit-learn auf Jupyter Notebook aus
Formatieren mit autopep8 auf Jupyter Notebook
SVM versucht maschinelles Lernen mit Scikit-Learn
Versuchen Sie, Jupyter Notebook auf einem Mac auszuführen
Versuchen Sie, mit einem gemischten Gaußschen Modell auf Jupyter Notebook zu gruppieren
Mehrklassen-SVM mit Scikit-Learn
Aktivieren Sie Jupyter Notebook mit conda auf dem Remote-Server
Versuchen Sie, die virtuelle Umgebung von conda mit Jupyter Notebook zu verwenden
Probieren Sie Apache Spark mit Jupyter Notebook (auf Local Docker) aus
Verwenden von Graphviz mit Jupyter Notebook
Verwenden Sie pip mit Jupyter Notebook
Überwachen Sie das Trainingsmodell mit TensorBord auf Jupyter Notebook
Versuchen Sie, Jupyter Notebook dynamisch zu verwenden
Probieren Sie grundlegende Operationen mit Pandas DataFrame auf Jupyter Notebook aus
Hohe Charts im Jupyter-Notizbuch
PDF auf Jupyter Notebook anzeigen
EC2-Bereitstellung mit Vagrant + Jupyter (IPython Notebook) auf Docker
Verwenden Sie Cython mit Jupyter Notebook
Spielen Sie mit Jupyter Notebook (IPython Notebook)
Versuchen Sie, Python mit Try Jupyter auszuführen
Führen Sie Jupyter Notebook unter Windows aus
Schreiben Sie Diagramme in Echtzeit mit Matplotlib auf dem Jupyter-Notizbuch
Ermöglichen Sie externe Verbindungen mit dem Jupiter-Notebook
Visualisieren Sie den Entscheidungsbaum mit einem Jupyter-Notizbuch
Markdown mit Jupyter-Notebook verwenden (mit Verknüpfung)
Versuchen Sie, Jupyter mit VS-Code auszuführen
Fügen Sie mit Jupyter Notebook weitere Kernel hinzu
Bequeme Analyse mit Pandas + Jupyter Notebook
Starten Sie das Jupyter Notebook ~ Esper-Training
Verwenden Sie nbextensions mit Anacondas Jupyter-Notizbuch
Ich möchte einen Blog mit Jupyter Notebook schreiben
Verwenden Sie Jupyter Lab und Jupyter Notebook mit EC2
Starten Sie das Jupiter-Notebook auf dem GPU-Server (Remote-Server).
Versuchen Sie die serverseitige Verschlüsselung von S3 mit boto3
Klonen Sie das Github-Repository auf dem Jupyter-Notizbuch
Verwendung des Jupyter-Notebooks mit ABCI
PC-GPU-Prüfung am Jupyter-Notebook
Histogramm / Streudiagramm auf Jupyter Notebook anzeigen
Verknüpfung von Python und JavaScript mit dem Jupiter-Notizbuch
Erstellen Sie ein Jupyter-Notebook auf einem Remote-Server (CentOS).
Verwenden Sie vim-Tastenkombinationen in Jupyter Notebook, das mit Docker gestartet wurde
[Jupyter Notebook Memo] Kanji mit Matplotlib anzeigen
Führen Sie Jupyter Notebook auf einem Remote-Server aus
Reichhaltige Zellenausgabe mit Jupyter Notebook (IPython)
Einstellungen zum Lesen von S3-Dateien mit Pandas aus Jupyter Notebook unter AWS
Installieren Sie matplotlib und zeigen Sie das Diagramm in Jupyter Notebook an
Isomap mit Scikit-lernen
Probieren Sie das Zustandsraummodell aus (Jupyter Notebook + IR-Kernel).
Jupyter Notizbuch Memo
[Jupyter Notebook / Lab] Drei Möglichkeiten zum Debuggen auf Jupyter [Pdb]
Einführung in Jupyter Notebook
Erstellen einer Analyseumgebung mit Docker (Jupyter Notebook + PostgreSQL)
Datenanalyse zur Verbesserung von POG 2 ~ Analyse mit Jupiter-Notebook ~
Versuchen Sie Tensorflow mit einer GPU-Instanz unter AWS
Spielen Sie mit Kubeflow v0.71 mit einem benutzerdefinierten Bildnotizbuch
Verwenden von MLflow mit Databricks ① - Experimentelles Tracking auf Notebooks -
Probieren Sie alle Modelle des Scikit-Lernens mit Kaggles Titanic (kaggle ⑤) aus.