Machine Learning from scratch: Implementando o KNN (K vizinhos mais próximos) em Python

Tipo de aprendizado: Baseado em instância

Características do KNN (K vizinhos mais próximos):

  1. Armazenamento dos Dados: Todos os exemplos de treinamento são armazenados.
  2. Comparação: Quando um novo exemplo aparece, o KNN compara esse exemplo com todos os exemplos armazenados, medindo a “distância” entre eles.
  3. Previsão: A partir dos exemplos mais próximos, o KNN determina a classe do novo exemplo. Para isso, ele vê qual é a classe mais comum entre os vizinhos mais próximos (no caso de classificação) ou calcula a média dos valores (no caso de regressão).

Funcionamento do Algorítimo

  • Escolha de K: O valor de K é um hiperparâmetro que deve ser escolhido cuidadosamente. Valores pequenos de K podem ser sensíveis ao ruído nos dados, enquanto valores grandes podem suavizar a previsão excessivamente.
  • Cálculo da Distância: Calcula-se a distância entre a amostra de teste e todas as amostras de treinamento.
  • Seleção dos Vizinhos: Seleciona-se os K exemplos de treinamento mais próximos (menor distância) da amostra de teste.
  • Votação ou Média:
    • Para classificação, a previsão é a classe mais comum entre os K vizinhos (votação majoritária).
    • Para regressão, a previsão é a média dos valores dos K vizinhos.

KNN from scratch com Python

import numpy as np
from collections import Counter
from sklearn import datasets
# Carrega os dados do dataset iris
iris = datasets.load_iris()

# Define as variáveis preditoras (X) e target (y)
X, y = iris.data, iris.target

# Separa os dados entre treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234)

# Plot dos dados
plt.figure()
plt.scatter(X[:,2], X[:,3], c=y, cmap=cmap, edgecolors='k', s=20)
plt.show()
k = 3
predictions = []
for x in X_test:
    # Calcula a distância euclidiana entre x e todos os pontos de treinamento
    distances = []
    for x_train in X_train:
        distance = np.sqrt(np.sum((x - x_train) ** 2))
        distances.append(distance)
X_test: [6.1 3.  4.6 1.4]
X_train: [5.1 2.5 3.  1.1]
Distância Euclidiana: 1.974

X_test: [6.1 3.  4.6 1.4]
X_train: [6.2 2.8 4.8 1.8]
Distância Euclidian: 0.500

X_test: [6.1 3.  4.6 1.4]
X_train: [5.  3.5 1.3 0.3]
Distância Euclidiana: 3.682
distances = np.array(distances)
k_indices = np.argsort(distances)[:k]
k_indices:  [ 51 111 113]
k_nearest_labels = [y_train[i] for i in k_indices]
k_nearest_labels:  [0, 0, 0]
most_common = Counter(k_nearest_labels).most_common(1)
most_common: [(0, 3)]
predictions.append(most_common[0][0])
predictions = np.array(predictions)
print("Predições from scratch:", predictions)
Predições from scratch: 
[ 1 1 2 0 1 0 0 0 1 2 1 0 2 1 0 1 2 0 2 1 1 1 1 1 2 0 2 1 2 0 1 1 2 0 1 0 0
 0 1 2 1 0 2 1 0 1 2 0 2 1 1 1 1 1 2 0 2 1 2 0 1 1 2 0 1 0 0 0 1 2 1 0 2 1
 0 1 2 0 2 1 1 1 1 1 2 0 2 1 2 0 1 1 2 0 1 0 0 0 1 2 1 0 2 1 0 1 2 0 2 1 1
 1 1 1 2 0 2 1 2 0]
# Importação das bibliotecas 
import numpy as np
from collections import Counter
from sklearn import datasets
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

cmap = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])

# Carrega os dados do dataset iris
iris = datasets.load_iris()

# Define as variáveis preditoras (X) e target (y)
X, y = iris.data, iris.target

# Separa os dados entre treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234)

# Plot dos dados
plt.figure()
plt.scatter(X[:,2], X[:,3], c=y, cmap=cmap, edgecolors='k', s=20)
plt.show()

# Número de vizinhos a considerar
k = 3

# Armazena as previsões para os dados de teste
predictions = []

# Para cada ponto de teste
for x in X_test:
    # Calcula a distância euclidiana entre x e todos os pontos de treinamento
    distances = []
    for x_train in X_train:
        distance = np.sqrt(np.sum((x - x_train) ** 2))
        distances.append(distance)
    
    # Converte a lista de distâncias para um array numpy
    distances = np.array(distances)
    
    # Encontra os índices dos k pontos mais próximos
    k_indices = np.argsort(distances)[:k]
    
    # Encontra as etiquetas dos k vizinhos mais próximos
    k_nearest_labels = [y_train[i] for i in k_indices]
    
    # Determina a classe mais comum entre os vizinhos
    most_common = Counter(k_nearest_labels).most_common(1)
    
    # Adiciona a previsão para a lista de previsões
    predictions.append(most_common[0][0])

# Converte a lista de previsões para um array numpy
predictions = np.array(predictions)

# Imprime as previsões
print("Predições from scratch:", predictions)

Implementação com o Scikitlearn

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Carregando um dataset de exemplo (Iris)
data = load_iris()
X, y = data.data, data.target

# Dividindo o dataset em treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Criando e treinando o modelo KNN
model = KNeighborsClassifier(n_neighbors=3)
model.fit(X_train, y_train)

# Fazendo previsões
y_pred = model.predict(X_test)

# Avaliando o modelo
accuracy = accuracy_score(y_test, y_pred)
print("Acurácia com scikit-learn:", accuracy)
Acurácia com scikit-learn: 1.0

Conclusão

Guide to K-Nearest Neighbors Algorithm in Machine Learning
Implementation of K-Nearest Neighbors from Scratch using Python
KNN (K-Nearest Neighbors)

1 comentário em “Machine Learning from scratch: Implementando o KNN (K vizinhos mais próximos) em Python”

  1. Pingback: Machine Learning from scratch: Implementando o SVM (Máquinas de Vetores de Suporte) em Python - IA Com Café

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima
×