Scikit Learn - KNeighborsClassifier

La K nel nome di questo classificatore rappresenta i k vicini più vicini, dove k è un valore intero specificato dall'utente. Quindi, come suggerisce il nome, questo classificatore implementa l'apprendimento basato sui k vicini più vicini. La scelta del valore di k dipende dai dati. Comprendiamolo di più con l'aiuto se un esempio di implementazione -

Esempio di implementazione

In questo esempio, implementeremo KNN sul set di dati denominato Iris Flower data set utilizzando scikit-learn KneighborsClassifer.

  • Questo set di dati ha 50 campioni per ogni diversa specie (setosa, versicolor, virginica) di fiore di iris, per un totale di 150 campioni.

  • Per ogni campione, abbiamo 4 caratteristiche denominate lunghezza del sepalo, larghezza del sepalo, lunghezza del petalo, larghezza del petalo)

Innanzitutto, importa il set di dati e stampa i nomi delle funzioni come segue:

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

Produzione

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

Esempio

Ora possiamo stampare il target cioè gli interi che rappresentano le diverse specie. Qui0 = setos, 1 = versicolor and 2 = virginica.

print(iris.target)

Produzione

[
   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
]

Esempio

La seguente riga di codice mostrerà i nomi del target -

print(iris.target_names)

Produzione

['setosa' 'versicolor' 'virginica']

Esempio

Possiamo controllare il numero di osservazioni e caratteristiche con l'aiuto della seguente riga di codice (il set di dati iris ha 150 osservazioni e 4 caratteristiche)

print(iris.data.shape)

Produzione

(150, 4)

Ora, dobbiamo suddividere i dati in dati di addestramento e test. Useremo Sklearntrain_test_split funzione per dividere i dati nel rapporto di 70 (dati di addestramento) e 30 (dati di prova) -

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)

Successivamente, eseguiremo il ridimensionamento dei dati con l'aiuto del modulo di pre-elaborazione Sklearn come segue:

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

Esempio

La seguente riga di codici ti darà la forma del treno e degli oggetti di prova:

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

Produzione

(105, 4)
(45, 4)

Esempio

La seguente riga di codici ti darà la forma del nuovo y oggetto -

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

Produzione

(105,)
(45,)

Quindi, importa il file KneighborsClassifier classe da Sklearn come segue -

from sklearn.neighbors import KNeighborsClassifier

Per verificare l'accuratezza, è necessario importare il modello Metrics come segue:

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)

Esempio

Ora tracceremo la relazione tra i valori di K e la corrispondente accuratezza del test. Sarà fatto usando la libreria matplotlib.

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

Produzione

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')

Esempio

Per il modello sopra, possiamo scegliere il valore ottimale di K (qualsiasi valore compreso tra 6 e 14, poiché la precisione è la più alta per questo intervallo) come 8 e riqualificare il modello come segue:

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

Produzione

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]])

Produzione

virginicia
virginicia

Completo programma funzionante / eseguibile

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]])