K-Nearest Neighbors (k-NN)
ESTAT0109 – Mineração de Dados em Estatística
Objetivo da Aula
- Compreender a intuição e o funcionamento matemático do algoritmo k-NN para tarefas de Classificação e Regressão.
- Aplicar técnicas essenciais de pré-processamento, com ênfase na normalização de dados numéricos e codificação de variáveis categóricas.
- Calcular manualmente a distância euclidiana para determinar a similaridade entre instâncias.
- Analisar o impacto da escolha do hiperparâmetro \(k\) no tradeoff entre viés e variância (overfitting vs underfitting).
- Avaliar as vantagens e limitações do paradigma de “aprendizado preguiçoso” (lazy learning) em comparação a modelos ansiosos.
Classificadores de vizinhos mais próximos (nearest neighbors)
- São classificadores que atribuem rótulos a instâncias não rotuladas a partir da similaridade com exemplos rotulados.
- Esses classificadores buscam replicar a capacidade humana de extrair conclusões sobre situações atuais a partir de experiências passadas.
- Exemplos de aplicações bem sucedidas:
- Visão computacional: reconhecimento de caracteres e reconhecimento facial em imagens estáticas e vídeos;
- Sistemas de recomendação que preveem se uma pessoa irá gostar de um filme ou música;
- Identificação de padrões em dados genéticos para detectar proteínas ou doenças específicas.
O algoritmo k-NN
O algoritmo k-NN utiliza informações sobre os \(k\) vizinhos mais próximos de um exemplo para classificar exemplos não rotulados.
A letra \(k\) representa o número de vizinhos mais próximos que serão usados para a classificação de uma instância sem rótulo.
- Definido \(k\), o algoritmo usa um conjunto de dados de treinamento classificados em várias categorias.
- Para cada instância não rotulada, o k-NN identifica as \(k\) instâncias mais similares nos dados de treinamento.
- À instância sem rótulo é atribuída a classe da maioria dos \(k\) vizinhos mais próximos.
![]()
FONTE: NWANGANGA, Fred; CHAPPLE, Mike. Practical machine learning in R. John Wiley & Sons, 2020.
Vantagens e desvantagens
- Simples e efetivo.
- Não faz suposições sobre a distribuição dos dados (não paramétrico).
- Fase de treinamento rápida (apenas armazena os dados).
- Não produz um modelo explícito, limitando a interpretabilidade de como as características afetam a classe.
- Requer a seleção de um \(k\) apropriado.
- Fase de classificação lenta (custosa computacionalmente).
- Características nominais e dados ausentes exigem processamento adicional cuidadoso.
Encontrando os vizinhos mais próximos
- Para encontrar os vizinhos mais próximos de uma instância é preciso calcular a distância entre as instâncias.
- Tradicionalmente, o algoritmo k-NN usa a distância euclidiana:
- Sejam \(p\) e \(q\) duas instâncias com \(n\) atributos. Então a distância euclidiana entre \(p\) e \(q\) é dada por \[
dist(p,q) = \sqrt{(p_1-q_1)^2 +(p_2-q_2)^2 + \cdots + (p_n-q_n)^2}
\] em que \(p_i\) e \(q_i\), \(i=1,\ldots,n\), representam os atributos associados às instâncias \(p\) e \(q\), respectivamente.
- Outras distâncias que podem ser usadas: distância de Hamming, distância de Manhattan (ou L1), distância Minkowski e distância de Mahalanobis.
Preparando os dados
- Observação: antes do cálculo da distância euclidiana devemos normalizar os atributos, pois atributos com valores mais elevados tendem a ter um impacto desproporcional no cálculo de distância.
- Para o k-NN podemos usar a normalização min-max: \[
x_{novo} = \frac{x - min(X)}{max(X)-min(X)}
\]
- ou a transformação z-score: \[
x_{novo} = \frac{x - média(X)}{DesvPad(X)}.
\]
Preparando os dados (Variáveis Categóricas)
- Se o atributo é do tipo nominal, devemos transformá-lo.
- Atenção: Embora em regressão usemos \(n-1\) dummies, em algoritmos de distância (k-NN) é comum usar One-Hot Encoding (criar \(n\) variáveis) para manter a equidistância entre categorias.
- Exemplo: se o atributo temperatura possui as categorias quente, médio e frio:
\[
quente = \begin{cases}
1 & \text{se } x = \text{ quente}\\
0 & \text{caso contrário}
\end{cases}
\] \[
frio = \begin{cases}
1 & \text{se } x = \text{ frio}\\
0 & \text{caso contrário}
\end{cases}
\]
\[
médio = \begin{cases}
1 & \text{se } x = \text{ médio}\\
0 & \text{caso contrário}
\end{cases}
\]
- Como a dummy possui apenas os valores 0 e 1, os valores caem na mesma escala da transformação min-max.
Exemplo
Considere os dados de treinamento abaixo. Calcule a distância euclidiana para um novo paciente com 45 anos e colesterol de 225 (após normalizar).
| 1 |
45 |
297 |
F |
| 2 |
41 |
172 |
V |
| 3 |
46 |
202 |
V |
| 4 |
48 |
193 |
V |
| 5 |
46 |
243 |
F |
| 6 |
48 |
256 |
V |
| 7 |
49 |
212 |
V |
| 8 |
41 |
289 |
V |
| 9 |
49 |
271 |
F |
| 10 |
43 |
315 |
F |
- Atividade: Ordene os dados de treino da menor distância para a maior distância do novo paciente e classifique usando \(k=3\).
Determinando \(k\) apropriado
- A decisão de quantos vizinhos usar determina a generalização do modelo (Tradeoff Viés-Variância).
- \(k\) pequeno: Baixo viés, alta variância. O modelo é sensível a ruídos (Overfitting).
- \(k\) grande: Alto viés, baixa variância. O modelo é muito simples e ignora padrões locais (Underfitting).
- O valor escolhido para \(k\) em classificação binária deve ser preferencialmente ímpar para evitar empates.
- Uma forma de determinar \(k\) é testar diversos valores com os dados de validação e escolher aquele com menor erro.
Por que o algoritmo k-NN é preguiçoso?
- Algoritmos de classificação baseados em métodos de vizinho mais próximo são considerados algoritmos de aprendizado preguiçoso (lazy learning).
- Um aprendiz preguiçoso não está realmente “aprendendo” um modelo matemático durante o treino; ele apenas armazena os dados.
- O processamento real acontece apenas na hora da classificação (inferência).
- O aprendizado preguiçoso também é conhecido como aprendizado baseado em instâncias ou aprendizado por repetição.
E a Regressão k-NN?
- Em problemas de regressão, a estimativa é numérica. Pode-se usar a média simples ou a média ponderada (preferível).
- A média ponderada pelo inverso da distância dá mais importância aos vizinhos muito próximos: \[
\widehat{y}_{nova} = \frac{\sum_{i=1}^k w_i \cdot y_i}{\sum_{i=1}^k w_i}
\] em que:
- \(y_i\) é o valor da variável resposta do vizinho \(i\);
- \(w_i = \frac{1}{distancia(x_{novo}, x_i)}\) é o peso.
Escolha de \(k\) na Regressão k-NN
Escolha de \(k\) na Regressão k-NN
- Raiz do erro quadrático médio (RMSE): \[RMSE(y,\widehat{y}) = \sqrt{\frac{1}{n}\sum\limits_{i=1}^n (y_i-\widehat{y}_i)^2}\]