[PYTHON] Méthode de voisinage K (classification multi-classes)

Quelle est la méthode du voisinage K?

KNN (K voisin le plus proche). Une méthode de discrimination de classe. Les données d'apprentissage sont tracées sur l'espace vectoriel, et lorsque des données inconnues sont obtenues, toutes les K pièces sont acquises par ordre de distance par rapport aux données inconnues, et la classe à laquelle les données appartiennent est estimée par une décision majoritaire.

Par exemple, dans le cas de la figure ci-dessous, le flux de discrimination de classe est le suivant. 1 Tracez les données connues (données d'entraînement) sous forme de cercles jaunes et violets. 2 Décidez du nombre de K. Comme K = 3. 3 Si une étoile rouge est obtenue sous forme de données inconnues, en acquérir trois à partir des points les plus proches. 4 Estimez la classe à laquelle appartiennent les trois classes. Cette fois, on estime que l'étoile rouge inconnue appartient à la classe B.

スクリーンショット 2016-05-04 3.33.02.png

Préparation des données d'utilisation

Préparez le jeu de données iris avec sklearn.

{get_iris_dataset.py}


from sklearn.datasets import load_iris
iris= load_iris() #acquisition de données d'iris
X = iris.data     #Variable explicative(Variables pour l'estimation de classe)
Y = iris.target   #Variable objective(Valeur de classe)

#Convertir les données d'iris en DataFrame
iris_data = DataFrame(X, columns=['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width'])
iris_target = DataFrame(Y, columns=['Species'])

# iris_La cible étant une valeur comprise entre 0 et 2, elle est difficile à comprendre, alors convertissez-la au nom d'Ayame
def flower(num):
"""Fonction de conversion de nom"""
    if num == 0:
        return 'Setosa'
    elif num == 1:
        return 'Veriscolour'
    else:
        return 'Virginica'

iris_target['Species'] = iris_target['Species'].apply(flower)
iris = pd.concat([iris_data, iris_target], axis=1)

Aperçu des données

{describe_iris.py}


iris.head()
スクリーンショット 2016-05-04 3.45.38.png

スクリーンショット 2016-05-04 3.50.37.png  の長さと幅のデータ

Associez la parcelle avec seaboan et voyez l'aperçu par classe

{desplay_each_data.py}


import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
%matplotlib inline

sns.pairplot(iris, hue = 'Species', size =2) # hue:Diviser par des données spécifiées
スクリーンショット 2016-05-04 3.54.59.png

Setosa [point bleu] semble être facile à classer. Veriscolour [point vert] et Virginie [point rouge] peuvent être classés par longueur de pétale? Impression sur.

Essayer

Exécutez KNN avec sklearn.

{do_knn.py}


from sklearn.neighbors import KNeighborsClassifier
from sklearn.cross_validation import train_test_split #Pour train et test split

#Préparation des données pour le train et le test. tester_Spécifiez le rapport entre les données de test et la taille. Aléatoire_Pour l'état, définissez la valeur de départ de manière appropriée.
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.4, random_state=3) 

knn = KNeighborsClassifier(n_neighbors=6) #Génération d'instance. n_neighbors:Nombre de K
knn.fit(X_train, Y_train)                 #Exécution de la création du modèle
Y_pred = knn.predict(X_test)              #Exécution prédictive

#Importez et exécutez la bibliothèque pour vérifier l'exactitude
from sklearn import metrics
metrics.accuracy_score(Y_test, Y_pred)    #Mesure de la précision des prévisions
> 0.94999999999999996

Précision d'environ 95%.

La précision change en fonction du nombre de K. → Je ne sais pas quel K doit être utilisé, donc je vais changer K de différentes manières et dessiner un graphique des changements de précision.

{create_graph_knn_accracy_change_k.py}


accuracy = []
for k in range(1, 90):
    knn = KNeighborsClassifier(n_neighbors=k) #Génération d'instance.
    knn.fit(X_train, Y_train)                 #Exécution de la création du modèle
    Y_pred = knn.predict(X_test)              #Exécution prédictive
    accuracy.append(metrics.accuracy_score(Y_test, Y_pred)) #Stockage de précision

plt.plot(k_range, accuracy)

Le résultat de tourner 90 fois

スクリーンショット 2016-05-04 4.10.41.png

K = 3, c'est assez. S'il dépasse 30, la précision se détériore. Comme il n'y a que 90 données d'entraînement cette fois, il n'y a qu'environ 30 données d'entraînement par classe. Si le nombre de K dépasse 30, si toutes les données de la classe de réponse correcte sont incluses, seules des classes différentes peuvent être captées dans le voisinage le plus proche, on s'attend donc à ce que la précision s'aggrave de plus en plus.

Recommended Posts

Méthode de voisinage K (classification multi-classes)
[Python] [scikit-learn] k-Introduction au mémo de la méthode du voisin le plus proche
SVM (classification multi-classes)
Naive Bays (classification multi-classes)
Iris de classification multiclasse Keras
Méthode de voisinage #k d'apprentissage automatique et sa mise en œuvre et divers
Implémentation de la méthode k-voisinage en python à partir de scikit learn
2. Analyse multivariée expliquée dans Python 8-1. Méthode de voisinage k (scikit-learn)
Courbe ROC pour la classification multi-classes
Apprentissage automatique ④ Résumé du K-plus proche voisin
2. Analyse multivariée énoncée dans Python 8-3. Méthode de voisinage K [vérification d'intersection]
Classification par méthode k-voisinage (kNN) par python ([High school information department information II] matériel pédagogique pour la formation des enseignants)
2. Analyse multivariée expliquée dans Python 8-2. Méthode de voisinage k [méthode de pondération] [modèle de retour]