Módulo de K-Vizinhos Mais Próximos no Scikit-Learn
KNeighborsClassifier: Módulo de classificação KNNKNeighborsRegressor: 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
- O parâmetro
n_neighborsespecifica 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) - O parâmetro
weightsdefine o tipo de peso, podendo ter os valoresuniform,distanceou uma função personalizada: (1)uniformindica que todos os pontos vizinhos têm o mesmo peso, independentemente da distância, representando a abordagem padrão do KNN. (2)distanceatribui pesos inversamente proporcionais à distância, ou seja, quanto mais próximo do ponto de destino, maior o peso. (3)custom functionpermite ao usuário definir uma função que retorna valores de peso com base nas coordenadas de entrada - O parâmetro
algorithmdetermina o algoritmo utilizado pelo modelo KNN, com opções:brute,kd_tree,ball_treeeauto: (1)brutecalcula todas as distâncias diretamente e depois ordena (2)kd_treeutiliza uma árvore kd para implementar o algoritmo KNN (3)ball_treeusa 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) ematriz 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)