Scikit Learn - KNeighborsClassifier

O K no nome deste classificador representa os k vizinhos mais próximos, onde k é um valor inteiro especificado pelo usuário. Portanto, como o nome sugere, esse classificador implementa o aprendizado com base nos k vizinhos mais próximos. A escolha do valor de k depende dos dados. Vamos entender melhor com a ajuda de um exemplo de implementação -

Exemplo de Implementação

Neste exemplo, iremos implementar KNN no conjunto de dados denominado Conjunto de dados Iris Flower usando o scikit-learn KneighborsClassifer.

  • Este conjunto de dados tem 50 amostras para cada espécie diferente (setosa, versicolor, virginica) de flor de íris, ou seja, um total de 150 amostras.

  • Para cada amostra, temos 4 características denominadas comprimento da sépala, largura da sépala, comprimento da pétala, largura da pétala)

Primeiro, importe o conjunto de dados e imprima os nomes dos recursos da seguinte maneira -

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

Resultado

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

Exemplo

Agora podemos imprimir o alvo, ou seja, os inteiros que representam as diferentes espécies. Aqui0 = setos, 1 = versicolor and 2 = virginica.

print(iris.target)

Resultado

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

Exemplo

A linha de código a seguir mostrará os nomes do alvo -

print(iris.target_names)

Resultado

['setosa' 'versicolor' 'virginica']

Exemplo

Podemos verificar o número de observações e recursos com a ajuda da seguinte linha de código (o conjunto de dados da íris tem 150 observações e 4 recursos)

print(iris.data.shape)

Resultado

(150, 4)

Agora, precisamos dividir os dados em dados de treinamento e teste. Estaremos usando Sklearntrain_test_split função para dividir os dados na proporção de 70 (dados de treinamento) e 30 (dados de teste) -

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)

Em seguida, faremos o escalonamento de dados com a ajuda do módulo de pré-processamento Sklearn da seguinte maneira -

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

Exemplo

A seguinte linha de códigos dará a você a forma do trem e dos objetos de teste -

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

Resultado

(105, 4)
(45, 4)

Exemplo

A seguinte linha de códigos lhe dará a forma de novos y objeto -

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

Resultado

(105,)
(45,)

Em seguida, importe o KneighborsClassifier classe do Sklearn da seguinte forma -

from sklearn.neighbors import KNeighborsClassifier

Para verificar a precisão, precisamos importar o modelo de métricas da seguinte forma -

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)

Exemplo

Agora, estaremos traçando a relação entre os valores de K e a precisão do teste correspondente. Isso será feito usando a biblioteca matplotlib.

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

Resultado

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

Exemplo

Para o modelo acima, podemos escolher o valor ideal de K (qualquer valor entre 6 a 14, pois a precisão é mais alta para este intervalo) como 8 e retreinar o modelo da seguinte forma -

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

Resultado

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

Resultado

virginicia
virginicia

Programa completo de trabalho / executável

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