Algoritmo KNN - Encontrando Vizinhos Mais Próximos
Introdução
O algoritmo K-mais próximos vizinhos (KNN) é um tipo de algoritmo de ML supervisionado que pode ser usado tanto para classificação quanto para problemas preditivos de regressão. No entanto, é usado principalmente para problemas de previsão de classificação na indústria. As duas propriedades a seguir definiriam bem o KNN -
Lazy learning algorithm - KNN é um algoritmo de aprendizagem preguiçoso porque não possui uma fase de treinamento especializada e usa todos os dados para treinamento durante a classificação.
Non-parametric learning algorithm - KNN também é um algoritmo de aprendizagem não paramétrico porque não assume nada sobre os dados subjacentes.
Trabalho de algoritmo KNN
O algoritmo de vizinhos K-mais próximos (KNN) usa 'similaridade de recursos' para prever os valores de novos pontos de dados, o que significa ainda que o novo ponto de dados receberá um valor com base em quão próximo ele corresponde aos pontos no conjunto de treinamento. Podemos entender seu funcionamento com a ajuda das seguintes etapas -
Step 1- Para implementar qualquer algoritmo, precisamos de um conjunto de dados. Portanto, durante a primeira etapa do KNN, devemos carregar o treinamento, bem como os dados de teste.
Step 2- Em seguida, precisamos escolher o valor de K, ou seja, os pontos de dados mais próximos. K pode ser qualquer número inteiro.
Step 3 - Para cada ponto nos dados de teste, faça o seguinte -
3.1- Calcular a distância entre os dados de teste e cada linha de dados de treino com a ajuda de qualquer um dos métodos a saber: distância Euclidiana, Manhattan ou Hamming. O método mais comumente usado para calcular a distância é o euclidiano.
3.2 - Agora, com base no valor da distância, classifique-os em ordem crescente.
3.3 - Em seguida, ele escolherá as K primeiras linhas da matriz classificada.
3.4 - Agora, ele atribuirá uma classe ao ponto de teste com base na classe mais frequente dessas linhas.
Step 4 - Fim
Exemplo
O seguinte é um exemplo para entender o conceito de K e o funcionamento do algoritmo KNN -
Suponha que temos um conjunto de dados que pode ser traçado da seguinte forma -
Agora, precisamos classificar o novo ponto de dados com ponto preto (no ponto 60,60) em classe azul ou vermelha. Estamos assumindo K = 3, ou seja, ele encontraria os três pontos de dados mais próximos. É mostrado no próximo diagrama -
Podemos ver no diagrama acima os três vizinhos mais próximos do ponto de dados com o ponto preto. Entre esses três, dois deles estão na classe Vermelha, portanto, o ponto preto também será atribuído na classe vermelha.
Implementação em Python
Como sabemos, o algoritmo de K-vizinhos mais próximos (KNN) pode ser usado tanto para classificação quanto para regressão. A seguir estão as receitas em Python para usar KNN como classificador e também regressor -
KNN como classificador
Primeiro, comece importando os pacotes Python necessários -
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
Em seguida, baixe o conjunto de dados iris de seu weblink da seguinte forma -
path = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
Em seguida, precisamos atribuir nomes de coluna ao conjunto de dados da seguinte maneira -
headernames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
Agora, precisamos ler o conjunto de dados para o dataframe do pandas da seguinte forma -
dataset = pd.read_csv(path, names=headernames)
dataset.head()
Sim. Não. | comprimento de sépala | largura sépala | comprimento de pétala | largura da pétala | Classe |
---|---|---|---|---|---|
0 | 5,1 | 3,5 | 1,4 | 0,2 | Iris-setosa |
1 | 4,9 | 3,0 | 1,4 | 0,2 | Iris-setosa |
2 | 4,7 | 3,2 | 1,3 | 0,2 | Iris-setosa |
3 | 4,6 | 3,1 | 1,5 | 0,2 | Iris-setosa |
4 | 5.0 | 3,6 | 1,4 | 0,2 | Iris-setosa |
O pré-processamento de dados será feito com a ajuda das seguintes linhas de script -
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 4].values
A seguir, dividiremos os dados em treinamento e divisão de teste. O código a seguir dividirá o conjunto de dados em 60% dos dados de treinamento e 40% dos dados de teste -
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.40)
Em seguida, o escalonamento de dados será feito da seguinte forma -
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
Em seguida, treine o modelo com a ajuda da classe KNeighborsClassifier do sklearn da seguinte maneira -
from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors=8)
classifier.fit(X_train, y_train)
Por fim, precisamos fazer previsões. Isso pode ser feito com a ajuda do seguinte script -
y_pred = classifier.predict(X_test)
A seguir, imprima os resultados da seguinte forma -
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
result = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(result)
result1 = classification_report(y_test, y_pred)
print("Classification Report:",)
print (result1)
result2 = accuracy_score(y_test,y_pred)
print("Accuracy:",result2)
Resultado
Confusion Matrix:
[[21 0 0]
[ 0 16 0]
[ 0 7 16]]
Classification Report:
precision recall f1-score support
Iris-setosa 1.00 1.00 1.00 21
Iris-versicolor 0.70 1.00 0.82 16
Iris-virginica 1.00 0.70 0.82 23
micro avg 0.88 0.88 0.88 60
macro avg 0.90 0.90 0.88 60
weighted avg 0.92 0.88 0.88 60
Accuracy: 0.8833333333333333
KNN como Regressor
Primeiro, comece importando os pacotes Python necessários -
import numpy as np
import pandas as pd
Em seguida, baixe o conjunto de dados iris de seu weblink da seguinte forma -
path = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
Em seguida, precisamos atribuir nomes de coluna ao conjunto de dados da seguinte maneira -
headernames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
Agora, precisamos ler o conjunto de dados para o dataframe do pandas da seguinte forma -
data = pd.read_csv(url, names=headernames)
array = data.values
X = array[:,:2]
Y = array[:,2]
data.shape
output:(150, 5)
Em seguida, importe o KNeighborsRegressor do sklearn para ajustar o modelo -
from sklearn.neighbors import KNeighborsRegressor
knnr = KNeighborsRegressor(n_neighbors=10)
knnr.fit(X, y)
Por fim, podemos encontrar o MSE da seguinte forma -
print ("The MSE is:",format(np.power(y-knnr.predict(X),2).mean()))
Resultado
The MSE is: 0.12226666666666669
Prós e Contras do KNN
Prós
É um algoritmo muito simples de entender e interpretar.
É muito útil para dados não lineares porque não há nenhuma suposição sobre os dados neste algoritmo.
É um algoritmo versátil, pois podemos usá-lo para classificação e também para regressão.
Ele tem uma precisão relativamente alta, mas há modelos de aprendizado supervisionado muito melhores do que o KNN.
Contras
É computacionalmente um algoritmo um pouco caro porque armazena todos os dados de treinamento.
É necessário alto armazenamento de memória em comparação com outros algoritmos de aprendizagem supervisionada.
A previsão é lenta no caso de N. grande
É muito sensível à escala dos dados, bem como aos recursos irrelevantes.
Aplicações de KNN
A seguir estão algumas das áreas em que KNN pode ser aplicada com sucesso -
Sistema bancário
O KNN pode ser usado no sistema bancário para prever se um indivíduo está apto para a aprovação de um empréstimo? Esse indivíduo tem características semelhantes às do inadimplente?
Calculando classificações de crédito
Os algoritmos KNN podem ser usados para encontrar a classificação de crédito de um indivíduo, comparando-a com as pessoas com características semelhantes.
Política
Com a ajuda dos algoritmos KNN, podemos classificar um eleitor em potencial em várias classes, como “Vai votar”, “Não vai votar”, “Vai votar no partido 'Congresso',“ Vai votar no partido 'BJP'.
Outras áreas nas quais o algoritmo KNN pode ser usado são reconhecimento de fala, detecção de escrita, reconhecimento de imagem e reconhecimento de vídeo.