La précédente Essayez SVM avec scikit-learn sur Jupyter Notebook C'est un article dont je veux faire suite.
Après ça, Installation et démarrage faciles de Jupyter Notebook à l'aide de Docker (prend également en charge nbextensions et Scala) --Qiita Je suis en train de l'essayer dans l'environnement de Jupyter Notebook préparé selon.
Dans cet environnement Jupyter, vous pouvez accéder au port 8888 avec un navigateur et utiliser Jupyter Notebook. Vous pouvez ouvrir une nouvelle note en suivant Nouveau> Python 3 sur le bouton en haut à droite.
Fichier CSV créé au hasard https://github.com/suzuki-navi/sample-data/blob/master/sample-data-2.csv Je l'utilise aussi.
Essayez-le avec sample-data-2.csv.
import pandas as pd
from sklearn import model_selection
df = pd.read_csv("sample-data-2.csv", names=["id", "target", "data1", "data2"])
Ce sont les données.
%matplotlib inline
import matplotlib.pyplot as plt
plt.scatter(df["data1"], df["data2"])
Je ne peux pas dire si c'est tout, mais il y a quatre groupes. Je vais organiser les graphiques de dispersion de manière bâclée afin que vous puissiez voir les quatre, mais en résumé, les quatre suivants.
A. Une petite quantité de données dispersées B. Gros morceau de données à proximité du centre C. Un petit morceau de données dans le centre près du centre D. Un très petit morceau de données près du centre et légèrement en haut à droite du centre
Vous trouverez ci-dessous un diagramme de dispersion à code couleur.
plt.scatter(df["data1"], df["data2"], c = df["target"])
Il y a une grande quantité de données près du centre (B vert, C bleu, D violet) et une petite quantité de données dispersées autour (A jaune).
Agrandissons la zone près du centre.
plt.xlim(-5, 5)
plt.ylim(-5, 5)
plt.scatter(df["data1"], df["data2"], c = df["target"])
Il y a deux bosses sombres (C bleu, D violet) dans la zone verte.
Développons encore plus.
plt.xlim(-2, 2)
plt.ylim(-2, 2)
plt.scatter(df["data1"], df["data2"], c = df["target"])
Le centre est C bleu et le coin supérieur droit est D violet.
Comme vous pouvez le voir en regardant le code ci-dessous qui a généré ces données, nous avons juste superposé quatre couleurs qui ont été distribuées aléatoirement avec une distribution normale pour chaque couleur.
https://github.com/suzuki-navi/sample-data/blob/master/sample-data-2.py
Je souhaite regrouper ces 4 couleurs sans professeur.
Avant le modèle gaussien mixte, essayez K-means, qui est également un clustering non supervisé. Cela semble impossible avec K-means de la distribution de données, mais essayons de comprendre comment le faire.
Pour le moment
feature = df[["data1", "data2"]]
target = df["target"]
Apprenez avec le modèle K-means. Spécifiez que le nombre de clusters est de quatre.
from sklearn import cluster
model = cluster.KMeans(n_clusters=4)
model.fit(feature)
référence sklearn.cluster.KMeans — scikit-learn 0.21.3 documentation
Si vous utilisez plotting.plot_decision_regions
inclus dans le package mlxtend
, vous pouvez visualiser comment il est classé dans un diagramme de dispersion. Vous devez passer un tableau de NumPy à plot_decision_regions
au lieu d'un objet Pandas, alors convertissez-le avec la méthode to_numpy ()
.
from mlxtend import plotting
plotting.plot_decision_regions(feature.to_numpy(), target.to_numpy(), clf=model)
Comme vous pouvez le voir, cela n'a pas du tout fonctionné.
référence plot_decision_regions - Mlxtend.plotting - mlxtend pandas.DataFrame.to_numpy — pandas 0.25.3 documentation
Essayons le modèle gaussien mixte du sujet.
référence sklearn.mixture.GaussianMixture — scikit-learn 0.21.3 documentation
from sklearn.mixture import GaussianMixture
model = GaussianMixture(n_components=4, covariance_type='full')
model.fit(feature)
plotting.plot_decision_regions(feature.to_numpy(), target.to_numpy(), clf=model)
Eh bien, pas autant que je m'y attendais ...
Je ne savais pas comment développer avec plot_decision_regions
, donc je regarde généralement le centre du résultat de la classification avec matplotlib.
pred = model.predict(feature)
plt.xlim(-5, 5)
plt.ylim(-5, 5)
plt.scatter(feature["data1"], df["data2"], c = pred)
Les deux bosses au centre se sont rapprochées.
Il y a un élément aléatoire dans l'apprentissage, alors je l'ai essayé d'une manière ou d'une autre, mais cela ne sépare pas les deux morceaux au centre, et partout ailleurs, il semble dessiner des limites disjointes.
C'est abrupt, mais ici j'ai écrit mon propre code basé sur K-means afin que les clusters qui suivent une distribution normale puissent être séparés.
J'ai écrit mon propre code dans Scala pour le moment, mais je vais omettre les détails ici. Si je peux me le permettre, je le présenterai dans un autre article.
Enregistrez le résultat du clustering avec votre propre code dans pred1.csv et voyez-le dans le diagramme de dispersion.
pred1 = pd.read_csv("pred1.csv", names=["pred"])
plt.scatter(feature["data1"], feature["data2"], c = pred1["pred"])
Cela semble bon.
Agrandir la partie centrale.
plt.xlim(-5, 5)
plt.ylim(-5, 5)
plt.scatter(feature["data1"], feature["data2"], c = pred1["pred"])
plt.xlim(-2, 2)
plt.ylim(-2, 2)
plt.scatter(feature["data1"], feature["data2"], c = pred1["pred"])
J'ai pu le séparer proprement en quatre.
La motivation de cet article était de vouloir se séparer sans enseignant dans le cas de cet échantillon de données, qui ne peut pas être séparé proprement avec des K-means, mais l'ordre des articles était différent et le modèle gaussien mixte n'était pas clair au début. , J'ai écrit ma propre logique plus tôt. C'est une version améliorée de K-means.
J'ai été impressionné par la séparation nette avec ma propre logique, mais lorsque j'ai consulté @stkdev en pensant que je réinventais juste un algorithme connu, on m'a fait remarquer que cela pouvait être fait avec un modèle gaussien mixte. Je n'ai pas encore entièrement compris l'algorithme du modèle gaussien mixte, et je ne suis pas sûr qu'il soit identique à la logique originale que j'ai écrite. C'est peut-être la même chose, mais au moins je pense que c'est similaire.
Cependant, je ne suis pas sûr qu'il s'agisse d'un problème de réglage qui ne s'est pas clairement manifesté lorsque je l'ai essayé avec un modèle gaussien mixte avec scicit-learn.
Je publierai ma propre logique séparément si je peux me le permettre.
Recommended Posts