Scikit Learn - KNeighborsClassifier

Le K dans le nom de ce classificateur représente les k voisins les plus proches, où k est une valeur entière spécifiée par l'utilisateur. Par conséquent, comme son nom l'indique, ce classificateur implémente l'apprentissage basé sur les k voisins les plus proches. Le choix de la valeur de k dépend des données. Comprenons-le davantage avec l'aide si un exemple d'implémentation -

Exemple d'implémentation

Dans cet exemple, nous allons implémenter KNN sur un jeu de données nommé Iris Flower à l'aide de scikit-learn KneighborsClassifer.

  • Cet ensemble de données comprend 50 échantillons pour chaque espèce différente (setosa, versicolor, virginica) de fleur d'iris, soit un total de 150 échantillons.

  • Pour chaque échantillon, nous avons 4 caractéristiques nommées longueur sépale, largeur sépale, longueur pétale, largeur pétale)

Tout d'abord, importez le jeu de données et imprimez les noms des entités comme suit -

from sklearn.datasets import load_iris
iris = load_iris()
print(iris.feature_names)

Production

['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

Exemple

Nous pouvons maintenant imprimer la cible c'est-à-dire les entiers représentant les différentes espèces. Ici0 = setos, 1 = versicolor and 2 = virginica.

print(iris.target)

Production

[
   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
   0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
   1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
   2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
   2 2
]

Exemple

La ligne de code suivante affichera les noms de la cible -

print(iris.target_names)

Production

['setosa' 'versicolor' 'virginica']

Exemple

Nous pouvons vérifier le nombre d'observations et de caractéristiques à l'aide de la ligne de code suivante (l'ensemble de données d'iris a 150 observations et 4 caractéristiques)

print(iris.data.shape)

Production

(150, 4)

Maintenant, nous devons diviser les données en données d'entraînement et de test. Nous utiliserons Sklearntrain_test_split fonction pour diviser les données dans le rapport de 70 (données d'entraînement) et 30 (données de test) -

X = iris.data[:, :4]
y = iris.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.30)

Ensuite, nous ferons la mise à l'échelle des données à l'aide du module de prétraitement Sklearn comme suit -

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

Exemple

La ligne de codes suivante vous donnera la forme du train et des objets de test -

print(X_train.shape)
print(X_test.shape)

Production

(105, 4)
(45, 4)

Exemple

La ligne de codes suivante vous donnera la forme d'un nouveau y objet -

print(y_train.shape)
print(y_test.shape)

Production

(105,)
(45,)

Ensuite, importez le KneighborsClassifier classe de Sklearn comme suit -

from sklearn.neighbors import KNeighborsClassifier

Pour vérifier l'exactitude, nous devons importer le modèle de métriques comme suit -

from sklearn import metrics
We are going to run it for k = 1 to 15 and will be recording testing accuracy, plotting it, showing confusion matrix and classification report:
Range_k = range(1,15)
scores = {}
scores_list = []
for k in range_k:
   classifier = KNeighborsClassifier(n_neighbors=k)
   classifier.fit(X_train, y_train)
   y_pred = classifier.predict(X_test)
   scores[k] = metrics.accuracy_score(y_test,y_pred)
   scores_list.append(metrics.accuracy_score(y_test,y_pred))
result = metrics.confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(result)
result1 = metrics.classification_report(y_test, y_pred)
print("Classification Report:",)
print (result1)

Exemple

Nous allons maintenant tracer la relation entre les valeurs de K et la précision de test correspondante. Cela se fera en utilisant la bibliothèque matplotlib.

%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(k_range,scores_list)
plt.xlabel("Value of K")
plt.ylabel("Accuracy")

Production

Confusion Matrix:
[
   [15 0 0]
   [ 0 15 0]
   [ 0 1 14]
]
Classification Report:
            precision   recall   f1-score    support
         0     1.00     1.00        1.00        15
         1     0.94     1.00        0.97        15
         2     1.00     0.93        0.97        15

micro avg      0.98     0.98        0.98        45
macro avg      0.98     0.98        0.98        45
weighted avg   0.98     0.98        0.98        45

Text(0, 0.5, 'Accuracy')

Exemple

Pour le modèle ci-dessus, nous pouvons choisir la valeur optimale de K (toute valeur entre 6 et 14, car la précision est la plus élevée pour cette plage) comme 8 et recycler le modèle comme suit -

classifier = KNeighborsClassifier(n_neighbors = 8)
classifier.fit(X_train, y_train)

Production

KNeighborsClassifier(
   algorithm = 'auto', leaf_size = 30, metric = 'minkowski',
   metric_params = None, n_jobs = None, n_neighbors = 8, p = 2,
   weights = 'uniform'
)
classes = {0:'setosa',1:'versicolor',2:'virginicia'}
x_new = [[1,1,1,1],[4,3,1.3,0.2]]
y_predict = rnc.predict(x_new)
print(classes[y_predict[0]])
print(classes[y_predict[1]])

Production

virginicia
virginicia

Programme complet de travail / exécutable

from sklearn.datasets import load_iris
iris = load_iris()
print(iris.target_names)
print(iris.data.shape)
X = iris.data[:, :4]
y = iris.target

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30)

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

print(X_train.shape)
print(X_test.shape)

from sklearn.neighbors import KNeighborsClassifier

from sklearn import metrics

Range_k = range(1,15)
scores = {}
scores_list = []
for k in range_k:
   classifier = KNeighborsClassifier(n_neighbors=k)
   classifier.fit(X_train, y_train)
   y_pred = classifier.predict(X_test)
   scores[k] = metrics.accuracy_score(y_test,y_pred)
   scores_list.append(metrics.accuracy_score(y_test,y_pred))
result = metrics.confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(result)
result1 = metrics.classification_report(y_test, y_pred)
print("Classification Report:",)
print (result1)
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(k_range,scores_list)
plt.xlabel("Value of K")
plt.ylabel("Accuracy")

classifier = KNeighborsClassifier(n_neighbors=8)
classifier.fit(X_train, y_train)

classes = {0:'setosa',1:'versicolor',2:'virginicia'}
x_new = [[1,1,1,1],[4,3,1.3,0.2]]
y_predict = rnc.predict(x_new)
print(classes[y_predict[0]])
print(classes[y_predict[1]])