[Python] Die erste SVM von Python / Scikit-learn

Einführung

Wenn ich Python berühre, höre ich oft, dass es viele Bibliotheken für maschinelles Lernen gibt. Ich wusste, dass es existiert, aber ich hatte meine Hand nie wirklich bewegt. Es scheint jedoch einfach zu sein, [diesen Artikel] zu lesen (https://qiita.com/ryu1104/items/06a71d8f6956da889bb8)! Ich dachte, ich hätte maschinelles Lernen versucht, insbesondere SVM (Support Vector Machine), also werde ich es veröffentlichen.

Hier erledigen Sie alles von der Erfassung von Wetterdaten bis hin zur sehr einfachen Datenverarbeitung, zum Lernen und zur Visualisierung.

Ich habe mich hauptsächlich auf die folgenden zwei Artikel bezogen. [Python] Einfache Einführung in das maschinelle Lernen mit Python (SVM) [Für Anfänger des maschinellen Lernens in Python] Einfache Implementierung von SVM mit scikit-learn

Umgebung

Ich laufe auf Anaconda unter Windows 10.

Name Ausführung
Python 3.7.3
Scikit-learn 0.23.1
Pandas 1.0.5
Numpy 1.18.5
matplotlib 3.2.2
mlxtend 0.17.3

Jedes kann wie unten gezeigt mit Pip installiert werden.

$ pip install scikit-learn
$ pip isntall pandas
$ pip isntall numpy
$ pip install matplotlib
$ pip install mlxtend

Zielgruppe

Es befindet sich auf dem gleichen Niveau wie die beiden oben aufgeführten Artikel.

Was ist maschinelles Lernen und SVM?

Ich werde hier nicht auf Details eingehen. Bitte beachten Sie die Referenzartikel.

Was ist die Klassifizierung des maschinellen Lernens?

Klassifizierung In der Klassifizierungsaufgabe wird eine endliche Anzahl vorbestimmter Klassen definiert, und jeder Klasse wird ein Klassenname zugewiesen, der als Klassenbezeichnung (oder einfach als Bezeichnung) wie "Katze" oder "Hund" bezeichnet wird. Der Zweck der Klassifizierungsaufgabe besteht darin, zu erraten, zu welcher der gegebenen Eingaben x gehört. [Klassifikation für maschinelles Lernen - Wikipedia](https://ja.wikipedia.org/wiki/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92#%E5%88% 86% E9% A1% 9E)

Hier wird das Wetter (Etikett) anhand von Daten wie Temperatur, Niederschlag und Wolkenvolumen durch maschinelles Lernen erraten.

Darüber hinaus ist SVM wie folgt.

Die Support Vector Machine (SVM) ist eines der Mustererkennungsmodelle, das überwachtes Lernen verwendet. Anwendbar auf Klassifizierung und Regression. SVM - Wikipedia

fließen

Hier folgt die Erklärung dem folgenden Ablauf.

  1. Datenerfassung
  2. Datenverarbeitung
  3. Lernen
  4. Visualisierung

1. Datenerfassung

Da wir uns dieses Mal entschlossen haben, Wetterdaten zu verarbeiten, laden wir sie von Diese Seite der Meteorologischen Agentur herunter.

Bitte wählen Sie den Ort, das Element (Temperatur, Niederschlag usw.) und den Zeitraum zum Herunterladen aus. Fühlen Sie sich frei, Elemente wie Temperatur und Niederschlag herunterzuladen. Ich denke nicht, dass es ein Problem ist, weil Sie eine Auswahl treffen können, wenn Sie es zum Lernen verwenden. Sie sollten in der Lage sein, eine CSV-Datei mit dem Namen data.csv herunterzuladen.

Als ich es selbst eine Weile ausprobiert habe, zum Beispiel aus den Daten für das Jahr 2019, 12 Monate Oktober-November 2001, Oktober-November 2002, Oktober-November 2003 usw. Die Daten scheinen besser klassifiziert zu sein. (Ich denke, Sie können irgendwie verstehen, dass es besser wäre, mit Daten aus derselben Zeit zu studieren.)

2. Datenverarbeitung

2-1 Löschen unnötiger Daten

Von hier aus werden wir die Daten mit Pandas usw. verarbeiten.

Die heruntergeladene Datei befindet sich in der ersten Zeile Downloadzeit: 2020/11/16 18: 18: 28 Da es Daten gibt, die als "header = 2" bezeichnet werden, um sie zu vermeiden und zu lesen, und weil sie Japanisch enthalten, wird sie auf "encoding =" SHIFT-JIS "gesetzt.

import numpy as np
import pandas as pd

#CSV-Datei lesen(data.CSV ist Ihr eigenes Verzeichnis/Bitte stimmen Sie mit dem Dateinamen überein)
df = pd.read_csv("data.csv", header = 2,encoding="SHIFT-JIS")

Ich denke, der df an dieser Stelle ist wie folgt. image.png

Da es dieselben Spaltennamen gibt, existieren Spaltennamen wie ". 1". Sie können sehen, dass dies daran liegt, dass sich in der 0. Zeile Spalten wie Qualitätsnummer und Homogenitätsnummer befinden. Ich brauche es diesmal nicht, also lass es uns löschen. Es ist ein wenig gewaltsam, aber ich habe folgendes getan. Löschen Sie die Zeilen mit fehlenden Werten.

#Zeile 0 löschen
df = df.drop(df.index[[0]])

# ".1", ".2", ".3"Löscht die Spalte am Ende des Spaltennamens
df = df.drop(df.loc[:, df.columns.str.endswith(".1")], axis = 1)
df = df.drop(df.loc[:, df.columns.str.endswith(".2")], axis = 1)
df = df.drop(df.loc[:, df.columns.str.endswith(".3")], axis = 1)

#Löschen Sie Zeilen mit fehlenden Werten
df = df.dropna(how='all')

Ich denke es ist jetzt sauber! image.png

2-2 Anordnung der Etiketten

Schauen wir uns nun die eindeutige Anzahl der Etiketten an (Wetterübersicht). Die Daten, die ich heruntergeladen habe, waren satte 64. Es gibt zu viele.

print(len(df["Wetterübersicht(Mittag: 06:00 bis 18:00 Uhr)"].unique().tolist()))

Es ist ein Teil, aber es sieht so aus.

['Teilweise bewölkt', 'Temporärer Regen nach bewölkt', 'Wolkig', '晴後Wolkig', 'Wolkig後雨', '晴後薄Wolkig', '雨一時Wolkig',
 'Fein', 'Bewölkt manchmal Regen','曇一時Fein', 'Regen', '曇後Fein', 'Regen時々曇', '曇一時Regen', '快Fein',
 'Sonnig nach Regen', 'Vorübergehend bewölkt nach schönem Wetter', 'Lichtwolke','Vorübergehend sonnig nach Regen', 'Bewölkt nach Regen', 'Vorübergehende Geldstrafe nach Bewölkung',
'Sonnig und vorübergehend bewölkt', 'Mit Regen und Donner', '晴後一時Mit Regen und Donner', 'Starkregen','Bewölkt und sonnig nach einem vorübergehenden Regen',
'Bewölkter vorübergehender Nebel', 'Leicht bewölkt vorübergehend klar', 'Bewölkt und manchmal sonnig', 'Bewölkt nach Regen', 'Sonnig Temporär bewölkt', 'Bewölkter vorübergehender Regen, begleitet von Donner']

** Dieses Mal ** habe ich die folgenden Maßnahmen ergriffen, um die Klassifizierung zu vereinfachen. ① Holen Sie sich den ersten Brief. Durch 2 Zahlen ersetzen

df["Wetterübersicht(Mittag: 06:00 bis 18:00 Uhr)"] = df["Wetterübersicht(Mittag: 06:00 bis 18:00 Uhr)"].str[:1]
df["Wetter Nr"] = df["Wetterübersicht(Mittag: 06:00 bis 18:00 Uhr)"].str.replace("Wolkig","0").replace("Fein", "1").replace("Groß", "3").replace("Regen", "3").replace("Dünn", "0").replace("Angenehm", "1").replace("Nebel","0")

Eine Liste der ersetzten Nummern und des Wetters. Diesmal ist es sehr vereinfacht. Wenn es Ihnen nicht gefällt, ändern Sie es natürlich selbst.

Wetter(1. Zeichen) Numerischer Wert Originalnotation
Wolkig 0 Wolkig(Irgendwie vorübergehend etc.)
Dünn 0 Lichtwolke(Irgendwie vorübergehend etc.)
Nebel 0 Nebel(Irgendwie vorübergehend etc.)
Angenehm 1 Sonnig(Irgendwie vorübergehend etc.)
Fein 1 Fein(Irgendwie vorübergehend etc.)
Regen 2 Regen(Irgendwie vorübergehend etc.)
Groß 2 Starkregen(Irgendwie vorübergehend etc.)

3. Lernen

Es lernt endlich. Dieses Mal verwenden wir eine Funktion namens "train_test_split", um die Daten in Trainingsdaten und Testdaten zu unterteilen, um zu überprüfen, ob wir gut lernen und sowohl Trainingsdaten als auch unbekannte Daten vorhersagen können.

Das Lernen selbst ist sehr einfach

model.fit(x_train, y_train)

Nur diese Zeile.

from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

#Speicherung erklärender Variablen
x = df.loc[1:, ["Gesamtniederschlag(mm)","Durchschnittliches Wolkenvolumen(10 Minuten Verhältnis)"]]

#Speicherung der Zielvariablen
y = df.loc[1:,"Wetter Nr"].astype("int64")

#Unterteilt in Trainingsdaten und Testdaten.
# test_size=0.3 :Testdaten sind 30%, Trainingsdaten: 70%
# random_state=Keine: Generieren Sie jedes Mal andere Daten
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=None )

#Wählen Sie SVM
model = svm.SVC()

#Lernen
model.fit(x_train, y_train)

#Genauigkeit der Trainingsdaten
pred_train = model.predict(x_train)
accuracy_train = accuracy_score(y_train, pred_train)
print('Richtige Antwortrate für Trainingsdaten:%.2f' % accuracy_train)

#Genauigkeit zum Testen von Daten
pred_test = model.predict(x_test)
accuracy_test = accuracy_score(y_test, pred_test)
print('Richtige Antwortrate für Testdaten:%.2f' % accuracy_test)

Wenn Sie die folgenden Ergebnisse erhalten, sind Sie erfolgreich!

Richtige Antwortrate für Trainingsdaten: 0.81
Richtige Antwortrate für Testdaten: 0.82

Da die Klassifizierung durch "model.predict ()" erfolgt, wird das Klassifizierungsergebnis sogar unterhalb der Extremtheorie zurückgegeben.

model.predict([[1,1]])

4. Visualisierung

Zum Schluss Visualisierung. Visualisieren Sie die Entscheidungsgrenzen mit plot_decision_regions. plot_decision_regions ist ebenfalls einfach zu verwenden und erstellt ein Diagramm für Sie, wenn Sie die Daten und das Modell übergeben. Das hier übergebene x ist jedoch zweidimensional. Jedes gilt für die x- und y-Achse des resultierenden Graphen.

#Visualisierung von Entscheidungsgrenzen
import matplotlib.pyplot as plt
from mlxtend.plotting import plot_decision_regions

x_combined = x_test.values
y_combined = y_test.values

fig = plt.figure(figsize=(13,8))
plot_decision_regions(x_combined, y_combined, clf=model,  res=0.02)
plt.show()

In meinem Fall kam die folgende Abbildung heraus. Gehen ...? image.png

Ganzer Code

import numpy as np
import pandas as pd
from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
from mlxtend.plotting import plot_decision_regions

#CSV-Datei lesen(data.CSV ist Ihr eigenes Verzeichnis/Bitte stimmen Sie mit dem Dateinamen überein)
df = pd.read_csv("data.csv", header = 2,encoding="SHIFT-JIS")

#Zeile 0 löschen
df = df.drop(df.index[[0]])

# ".1", ".2", ".3"Löscht die Spalte am Ende des Spaltennamens
df = df.drop(df.loc[:, df.columns.str.endswith(".1")], axis = 1)
df = df.drop(df.loc[:, df.columns.str.endswith(".2")], axis = 1)
df = df.drop(df.loc[:, df.columns.str.endswith(".3")], axis = 1)

#Löschen Sie Zeilen mit fehlenden Werten
df = df.dropna(how='all')

#Etikettenverarbeitung
df["Wetterübersicht(Mittag: 06:00 bis 18:00 Uhr)"] = df["Wetterübersicht(Mittag: 06:00 bis 18:00 Uhr)"].str[:1]
df["Wetter Nr"] = df["Wetterübersicht(Mittag: 06:00 bis 18:00 Uhr)"].str.replace("Wolkig","0").replace("Fein", "1").replace("Groß", "3").replace("Regen", "3").replace("Dünn", "0").replace("Angenehm", "1").replace("Nebel","0")

#Speicherung erklärender Variablen
x = df.loc[1:, ["Gesamtniederschlag(mm)","Durchschnittliches Wolkenvolumen(10 Minuten Verhältnis)"]]

#Speicherung der Zielvariablen
y = df.loc[1:,"Wetter Nr"].astype("int64")

#Unterteilt in Trainingsdaten und Testdaten.
# test_size=0.3 :Testdaten sind 30%, Trainingsdaten: 70%
# random_state=Keine: Generieren Sie jedes Mal andere Daten
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=None )

#Wählen Sie SVM
model = svm.SVC()

#Lernen
model.fit(x_train, y_train)

#Genauigkeit der Trainingsdaten
pred_train = model.predict(x_train)
accuracy_train = accuracy_score(y_train, pred_train)
print('Richtige Antwortrate für Trainingsdaten:%.2f' % accuracy_train)

#Genauigkeit zum Testen von Daten
pred_test = model.predict(x_test)
accuracy_test = accuracy_score(y_test, pred_test)
print('Richtige Antwortrate für Testdaten:%.2f' % accuracy_test)

#Visualisierung von Entscheidungsgrenzen
x_combined = x_test.values
y_combined = y_test.values

fig = plt.figure(figsize=(13,8))
plot_decision_regions(x_combined, y_combined, clf=model,  res=0.02)
plt.show()

abschließend

Ich bin zum ersten Mal auf maschinelles Lernen gestoßen, aber es war überraschend einfach! (Obwohl es verschiedene verschiedene Teile gab) Ich wurde auch von [diesem Artikel] inspiriert (https://qiita.com/ryu1104/items/06a71d8f6956da889bb8), also versuchen Sie es bitte.

Recommended Posts

[Python] Die erste SVM von Python / Scikit-learn
Erster Python
Erster Python
Erste Python ~ Codierung 2 ~
Erste Python [O'REILLY]
Erste Python 3rd Edition
PyQ ~ Python Erster Schritt ~
Erste Python-Bildverarbeitung
Erstes Python-Memo
[Python] Kapitel 01-01 Über Python (Erster Python)
SVM-Implementierung in Python
First Fabric (Python-Bereitstellungstool)
Erste Nervenzellsimulation mit NEURON + Python
Python
Erster Python 3 ~ Der Beginn der Wiederholung ~
Web Scraping mit Python Erster Schritt
[GUI mit Python] PyQt5-Der erste Schritt-
Bereiten Sie Ihre erste Python-Entwicklungsumgebung vor
Python (vom ersten Mal bis zur Ausführung)
C / C ++ - Programmierer fordert Python heraus (erster Schritt)
Siehe Python zum ersten Mal
Der erste Schritt von Python Matplotlib
Generieren Sie eine erstklassige Sammlung in Python
Spielen Sie kontinuierlich die MV der ersten Python Skusta
Implementiert in Python PRML Kapitel 7 Nichtlineare SVM
[Python] Erste Datenanalyse / maschinelles Lernen (Kaggle)
MongoDB mit Python zum ersten Mal
"Erste elastische Suche" beginnend mit einem Python-Client
Vorbereitung der Python-Umgebung (erste Verwendung)
Python-Standardbibliothek: Erste Hälfte (Python-Lernnotiz ⑧)