[Python] Premier SVM de Python / Scikit-learn

introduction

Quand je touche Python, j'entends souvent qu'il existe de nombreuses bibliothèques d'apprentissage automatique. Je savais que cela existait, mais je n'avais jamais vraiment bougé la main. Cependant, il semble facile de lire cet article! Je pensais avoir essayé le machine learning, en particulier SVM (Support Vector Machine), donc je le posterai.

Ici, vous ferez tout, de l'obtention de données météorologiques ** au traitement, à l'apprentissage et à la visualisation de données très simples **.

J'ai principalement évoqué les deux articles suivants. [Python] Introduction facile à l'apprentissage automatique avec python (SVM) [Pour les débutants de l'apprentissage automatique de python] Implémentation facile de SVM avec scikit-learn

environnement

J'utilise Anaconda sous Windows 10.

Nom version
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

Chacun peut être installé avec pip comme indiqué ci-dessous.

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

Public cible

Il est au même niveau que les deux articles listés ci-dessus.

Qu'est-ce que l'apprentissage automatique et SVM?

Je n'entrerai pas dans les détails ici. Veuillez vous référer aux articles de référence.

Qu'est-ce que la classification par apprentissage automatique?

Classement Dans la tâche de classification, un nombre fini de classes prédéterminées est défini, et chaque classe se voit attribuer un nom de classe appelé une étiquette de classe (ou simplement une étiquette) telle que «chat» ou «chien». Le but de la tâche de classification est de deviner à laquelle des entrées données x appartient. [Classification de l'apprentissage automatique-Wikipedia](https://ja.wikipedia.org/wiki/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92#%E5%88% 86% E9% A1% 9E)

Ici, le temps (étiquette) est deviné à l'aide de données telles que la température, les précipitations et le volume des nuages par apprentissage automatique.

De plus, SVM se présente comme suit.

La machine à vecteurs de support (SVM) est l'un des modèles de reconnaissance de formes qui utilise l'apprentissage supervisé. Applicable à la classification et à la régression. SVM - Wikipedia

couler

Ici, l'explication suit le flux suivant.

  1. Acquisition de données
  2. Traitement des données
  3. Apprentissage
  4. Visualisation

1. Acquisition de données

Puisque nous avons décidé de gérer les données météorologiques cette fois, téléchargeons-les depuis Cette page de l'Agence météorologique.

Veuillez sélectionner l'emplacement, l'élément (température, précipitations, etc.) et la période à télécharger. N'hésitez pas à télécharger des éléments tels que la température et les précipitations. Je ne pense pas que ce soit un problème car vous pouvez faire une sélection lorsque vous l'utilisez pour apprendre. Vous devriez pouvoir télécharger un fichier csv nommé data.csv.

Quand je l'ai essayé moi-même pendant un certain temps, par exemple, à partir des données de l'année 2019, 12 mois d'octobre-novembre 2001, octobre-novembre 2002, octobre-novembre 2003, etc. Les données semblent mieux classées. (Je pense que vous pouvez en quelque sorte comprendre qu'il serait préférable d'étudier avec des données de la même période)

2. Traitement des données

2-1 Suppression des données inutiles

À partir de là, nous traiterons les données à l'aide de pandas, etc.

Le fichier téléchargé est sur la première ligne Temps de téléchargement: 2020/11/16 18: 18: 28 Puisqu'il y a des données appelées header = 2 pour les éviter et les lire, et parce qu'elles incluent le japonais, elles sont définies sur encoding =" SHIFT-JIS ".

import numpy as np
import pandas as pd

#Lire le fichier csv(data.csv est votre propre répertoire/Veuillez faire correspondre avec le nom du fichier)
df = pd.read_csv("data.csv", header = 2,encoding="SHIFT-JIS")

Je pense que le df à ce stade est le suivant. image.png

Puisqu'il y a les mêmes noms de colonnes, des noms de colonnes tels que «". 1 "» existent. Vous pouvez voir que c'est parce qu'il y a des colonnes telles que le numéro de qualité et le numéro d'homogénéité dans la 0ème ligne. Je n'en ai pas besoin cette fois, alors supprimons-le. C'est un peu forcé, mais j'ai fait ce qui suit. Supprimez les lignes qui ont des valeurs manquantes.

#Drop line 0
df = df.drop(df.index[[0]])

# ".1", ".2", ".3"Supprime la colonne à la fin du nom de la colonne
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)

#Supprimer les lignes avec des valeurs manquantes
df = df.dropna(how='all')

Je pense que c'est propre maintenant! image.png

2-2 Disposition des étiquettes

Regardons maintenant le nombre unique d'étiquettes (aperçu météo). Les données que j'ai téléchargées étaient un énorme 64. Il y a trop.

print(len(df["Aperçu météo(Midi: de 6h00 à 18h00)"].unique().tolist()))

C'est une partie, mais ça ressemble à ça.

['Partiellement nuageux', 'Pluie temporaire après nuageux', 'Nuageux', '晴後Nuageux', 'Nuageux後雨', '晴後薄Nuageux', '雨一時Nuageux',
 'Bien', 'Nuageux parfois pluie','曇一時Bien', 'pluie', '曇後Bien', 'pluie時々曇', '曇一時pluie', '快Bien',
 'Ensoleillé après la pluie', 'Légèrement nuageux après le beau temps', 'Nuage léger','Ensoleillé temporaire après la pluie', 'Nuageux après la pluie', 'Amende temporaire après nuageux',
'Ensoleillé et temporairement nuageux', 'Avec la pluie et le tonnerre', '晴後一時Avec la pluie et le tonnerre', 'forte pluie','Nuageux et ensoleillé après une pluie temporaire',
'Brouillard temporaire nuageux', 'Légèrement nuageux temporaire clair', 'Nuageux et parfois ensoleillé', 'Nuageux après la pluie', 'Ensoleillé Temporairement nuageux', 'Nuageux pluie temporaire, accompagné de tonnerre']

** Cette fois, ** j'ai pris les mesures suivantes pour simplifier la classification. ① Obtenez la première lettre. Remplacer par 2 chiffres

df["Aperçu météo(Midi: de 6h00 à 18h00)"] = df["Aperçu météo(Midi: de 6h00 à 18h00)"].str[:1]
df["Météo Non"] = df["Aperçu météo(Midi: de 6h00 à 18h00)"].str.replace("Nuageux","0").replace("Bien", "1").replace("Gros", "3").replace("pluie", "3").replace("Mince", "0").replace("Agréable", "1").replace("brouillard","0")

Une liste des numéros remplacés et de la météo. Cette fois, c'est très simplifié. Si vous ne l'aimez pas, bien sûr, changez-le vous-même.

conditions météorologiques(1er caractère) Valeur numérique Notation originale
Nuageux 0 Nuageux(D'une manière ou d'une autre temporairement, etc.)
Mince 0 Nuage léger(D'une manière ou d'une autre temporairement, etc.)
brouillard 0 brouillard(D'une manière ou d'une autre temporairement, etc.)
Agréable 1 Ensoleillé(D'une manière ou d'une autre temporairement, etc.)
Bien 1 Bien(D'une manière ou d'une autre temporairement, etc.)
pluie 2 pluie(D'une manière ou d'une autre temporairement, etc.)
Gros 2 forte pluie(D'une manière ou d'une autre temporairement, etc.)

3. Apprentissage

C'est enfin apprendre. Cette fois, nous utilisons une fonction appelée train_test_split pour diviser les données en données d'entraînement et en données de test afin de vérifier si nous pouvons bien apprendre et prédire à la fois les données d'entraînement et les données inconnues.

L'apprentissage lui-même est très facile

model.fit(x_train, y_train)

Seulement cette ligne.

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

#Stockage des variables explicatives
x = df.loc[1:, ["Précipitations totales(mm)","Volume moyen des nuages(Rapport de 10 minutes)"]]

#Stockage de la variable objective
y = df.loc[1:,"Météo Non"].astype("int64")

#Divisé en données d'entraînement et données de test.
# test_size=0.3 :Les données de test sont 30%, Données d'entraînement: 70%
# random_state=Aucun: générer des données différentes à chaque fois
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=None )

#Sélectionnez SVM
model = svm.SVC()

#Apprentissage
model.fit(x_train, y_train)

#Précision des données d'entraînement
pred_train = model.predict(x_train)
accuracy_train = accuracy_score(y_train, pred_train)
print('Taux de réponse correct pour les données d'entraînement:%.2f' % accuracy_train)

#Précision pour tester les données
pred_test = model.predict(x_test)
accuracy_test = accuracy_score(y_test, pred_test)
print('Taux de réponse correct pour les données de test:%.2f' % accuracy_test)

Si vous obtenez les résultats suivants, vous réussissez!

Taux de réponse correct pour les données d'entraînement: 0.81
Taux de réponse correct pour les données de test: 0.82

Puisque la classification est faite par model.predict (), le résultat de la classification sera retourné même en dessous de la théorie extrême.

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

4. Visualisation

Enfin, la visualisation. Visualisez les limites de décision avec plot_decision_regions. plot_decision_regions est également facile à utiliser et créera un graphique pour vous si vous transmettez les données et le modèle. Cependant, le x passé ici est bidimensionnel. Chacun s'applique aux axes x et y du graphique résultant.

#Visualisation des limites de décision
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()

Dans mon cas, le chiffre suivant est sorti. Aller ...? image.png

Code entier

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

#Lire le fichier csv(data.csv est votre propre répertoire/Veuillez faire correspondre avec le nom du fichier)
df = pd.read_csv("data.csv", header = 2,encoding="SHIFT-JIS")

#Drop line 0
df = df.drop(df.index[[0]])

# ".1", ".2", ".3"Supprime la colonne à la fin du nom de la colonne
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)

#Supprimer les lignes avec des valeurs manquantes
df = df.dropna(how='all')

#Traitement des étiquettes
df["Aperçu météo(Midi: de 6h00 à 18h00)"] = df["Aperçu météo(Midi: de 6h00 à 18h00)"].str[:1]
df["Météo Non"] = df["Aperçu météo(Midi: de 6h00 à 18h00)"].str.replace("Nuageux","0").replace("Bien", "1").replace("Gros", "3").replace("pluie", "3").replace("Mince", "0").replace("Agréable", "1").replace("brouillard","0")

#Stockage des variables explicatives
x = df.loc[1:, ["Précipitations totales(mm)","Volume moyen des nuages(Rapport de 10 minutes)"]]

#Stockage de la variable objective
y = df.loc[1:,"Météo Non"].astype("int64")

#Divisé en données d'entraînement et données de test.
# test_size=0.3 :Les données de test sont 30%, Données d'entraînement: 70%
# random_state=Aucun: générer des données différentes à chaque fois
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=None )

#Sélectionnez SVM
model = svm.SVC()

#Apprentissage
model.fit(x_train, y_train)

#Précision des données d'entraînement
pred_train = model.predict(x_train)
accuracy_train = accuracy_score(y_train, pred_train)
print('Taux de réponse correct pour les données d'entraînement:%.2f' % accuracy_train)

#Précision pour tester les données
pred_test = model.predict(x_test)
accuracy_test = accuracy_score(y_test, pred_test)
print('Taux de réponse correct pour les données de test:%.2f' % accuracy_test)

#Visualisation des limites de décision
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()

en conclusion

J'ai d'abord rencontré l'apprentissage automatique, mais c'était étonnamment facile! (Bien qu'il y ait eu diverses parties diverses,) J'ai également été inspiré par cet article, alors essayez-le.

Recommended Posts

[Python] Premier SVM de Python / Scikit-learn
Premier Python
Premier Python
Premier Python ~ Codage 2 ~
Premier python [O'REILLY]
Première 3e édition de Python
PyQ ~ Première étape de Python ~
Premier traitement d'image Python
Premier mémo divers sur Python
[Python] Chapitre 01-01 À propos de Python (First Python)
Implémentation SVM en python
First Fabric (outil de déploiement Python)
Première simulation de cellule nerveuse avec NEURON + Python
Python
First Python 3 ~ Le début de la répétition ~
Web scraping avec Python Première étape
[GUI avec Python] PyQt5-La première étape-
Préparez votre premier environnement de développement Python
Python (de la première fois à l'exécution)
Un programmeur C / C ++ défie Python (première étape)
Voir python pour la première fois
La première étape de Python Matplotlib
Générer une collection de première classe en Python
Jouez en continu le MV du premier Python Skusta
Implémenté en Python PRML Chapitre 7 SVM non linéaire
[Python] Première analyse de données / apprentissage automatique (Kaggle)
MongoDB avec Python pour la première fois
"Première recherche élastique" commençant par un client python
Préparation de l'environnement Python (première utilisation de venv)
Bibliothèque standard Python: première moitié (mémo d'apprentissage Python ⑧)