Implementação do Algoritmo K-Vizinhos Mais Próximos para Classificação e Regressão

Módulo de K-Vizinhos Mais Próximos no Scikit-Learn

  • KNeighborsClassifier: Módulo de classificação KNN
  • KNeighborsRegressor: Módulo de regressão KNN
# Importação dos módulos
from sklearn.neighbors import KNeighborsClassifier   # Classificação
from sklearn.neighbors import KNeighborsRegressor   # Regressão
from sklearn.model_selection import train_test_split, cross_val_score   # Divisão e validação cruzada


  1. O parâmetro n_neighbors especifica o valor K no algoritmo KNN, com valor padrão 5 (geralmente configurado com números ímpares para evitar empates e aumentar a estabilidade do modelo)
  2. O parâmetro weights define o tipo de peso, podendo ter os valores uniform, distance ou uma função personalizada: (1) uniform indica que todos os pontos vizinhos têm o mesmo peso, independentemente da distância, representando a abordagem padrão do KNN. (2) distance atribui pesos inversamente proporcionais à distância, ou seja, quanto mais próximo do ponto de destino, maior o peso. (3) custom function permite ao usuário definir uma função que retorna valores de peso com base nas coordenadas de entrada
  3. O parâmetro algorithm determina o algoritmo utilizado pelo modelo KNN, com opções: brute, kd_tree, ball_tree e auto: (1) brute calcula todas as distâncias diretamente e depois ordena (2) kd_tree utiliza uma árvore kd para implementar o algoritmo KNN (3) ball_tree usa uma árvore de esferas para implementar o algoritmo KNN (4) auto é o padrão, selecionando automaticamente o algoritmo mais adequado para consrtuir o modelo

Exemplo de Alogritmo KNN (Modelo de Classificação: KNeighborsClassifier)

Os passos gerais para usar o algoritmo KNN:

  • Processar os dados existentes
  • Encontrar o valor K ótimo usando validação cruzada, busca em grade ou curvas de aprendizado
  • Treinar o modelo com o valor K ótimo
  • Usarr o modelo treinado para prever no conjunto de teste separado
  • Avaliar o modelo usando métricas como accuracy_score (acurácia), precision_score (precisão) e matriz de confusão

Encontrando o Valor K Ótimo

Código de Exemplo

"""
-*- coding: utf-8 -*-
@File   : knn_example.py
@author : @analista_dados
@Time   : 2024/10/01 17:21
@problem: "Um clube de teatro está recrutando novos membros e recebeu muitas inscrições. 
    O clube decidiu organizar uma competição individual com duas categorias: atuação e dicção. 
    As pontuações de atuação são representadas por X1 e as pontuações de dicção por X2. 
    Os resultados finais estão no código. 
    Use o algoritmo k-vizinhos mais próximos para criar um modelo e determine se o último candidato pode ingressar no clube (0 = não, 1 = sim)."
"""

import matplotlib.pyplot as plt
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split, cross_val_score

# Processamento dos dados
dados_treinamento = np.array(
    [[19, 30], [30, 40], [39, 47], [40, 52], [47, 50], [50, 55], [60, 60], [62, 65], [73, 70], [75, 82], [77, 85],
     [90, 95], [92, 90]])
resultados = np.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1])
# Divisão: conjunto de treinamento:teste = 7:3
X_treino, X_teste, y_treino, y_teste = train_test_split(dados_treinamento, resultados, test_size=0.3, random_state=42)
# Cálculo da taxa de erro do modelo para diferentes valores de K
taxas_erro = []
# Seleção de K ímpar para evitar empates e melhorar estabilidade (mas não pode exceder o número de amostras de treinamento)
for k in range(3, 11, 2):
    modelo = KNeighborsClassifier(n_neighbors=k)
    # O parâmetro cv define a proporção de divisão do conjunto de dados, aqui 5:1
    # Os scores retornados são um array contendo a pontuação do modelo em cada dobra de validação cruzada
    # A validação cruzada reduz o risco de overfitting
    pontuacoes = cross_val_score(modelo, dados_treinamento, resultados, cv=5, scoring='accuracy')
    taxas_erro.append(1 - pontuacoes.mean())
print('taxas_erro:', taxas_erro)
# Visualização gráfica
plt.rcParams['font.sans-serif'] = 'Simhei'
plt.xticks([_ for _ in range(3, 11, 2)])
plt.plot([_ for _ in range(3, 11, 2)], taxas_erro, 'r-')
plt.xlabel('Valores de K')
plt.ylabel('Taxa de erro de previsão')
plt.show()


Captura de Execução

Treinamento do Modelo com o Valor K Ótimo

Código de Exemplo

# Treinamento do modelo com o valor K ótimo
modelo_5 = KNeighborsClassifier()
modelo_5.fit(X_treino, y_treino)
modelo_7 = KNeighborsClassifier(n_neighbors=7)
modelo_7.fit(X_treino, y_treino)
print('modelo_5:', modelo_5)
print('modelo_7:', modelo_7)


Captura de Execução

Utilizando o Modelo para Previsão

Código de Exemplo

# Previsões
previsoes_5 = modelo_5.predict(X_teste)
previsoes_7 = modelo_7.predict(X_teste)
print('previsoes_5 =', previsoes_5)
print('previsoes_7 =', previsoes_7)


Captura de Execução

Avaliação do Modelo

Código de Exemplo

# Avaliação do modelo
# 1. Acurácia
acuracia_5 = accuracy_score(y_teste, previsoes_5)
acuracia_7 = accuracy_score(y_teste, previsoes_7)
# 2. Matriz de confusão
matriz_confusao_5 = confusion_matrix(y_teste, previsoes_5)
matriz_confusao_7 = confusion_matrix(y_teste, previsoes_7)
# Exibição dos resultados
print('acuracia_5:', acuracia_5)
print('acuracia_7:', acuracia_7)
print('matriz_confusao_5:', matriz_confusao_5)
print('matriz_confusao_7:', matriz_confusao_7)


Captura de Execução

Tags: sklearn knn classificação regressão machine learning

Publicado em 9-9 13:30