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.
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)
{describe_iris.py}
iris.head()
の長さと幅のデータ
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
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.
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
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.