Você está na página 1de 5

23/03/2018 2017 – O Estudante independente

Classificação e regressão com K-nearest neighbors


Como muitos já devem saber o KNN é uma dos algoritmos mais simples em Machine Learning. E por esse
motivo muitas pessoas passam direto por ele, achando que é uma técnica irrelevante, mas para aqueles que
resolvem dar uma investigada nesse modelo descobrirão que ele pode ser muito poderoso quando bem aplicado.

Pensando nisso resolvi escrever esse post sobre as estratégias do KNN para problemas de classificação e
regressão e discorrer um pouco sobre os modelos usados em cada problema.

Nos problemas de classificação analisaremos dois cenários um onde temos poucas classes e outro onde temos
muitas classes e ver qual a melhor estratégia para resolver cada problema.

Nos problemas de Regressões analisaremos duas estratégias que podem ser usadas com o KNN para se conseguir
bons resultados.

Caso você ainda não conheça esse algoritmo escrevi alguns post’s sobre ele:

K-nearest neighbors com scikit learn

K-nearest neighbors seu primeiro algoritmo de machine learning

Vantagem e desvantagens

Antes de partir para uma análise mais aprofundada do algoritmo é preciso alertar para algumas características do
mesmo.

O primeiro a problema que surge é relacionado a dimensionalidade em inglés(curse of dimensionality) , isso


deve ser observado pois na prática o número de atributos/variáveis envolvidos em um problema tendem a
aumentar. Isso faz com que os vetores usados pelo KNN para calculo das distâncias tenham dimensões muito
grandes o que acaba atrapalhando a localização de algum padrão relevante.

Irei reservar um post para falar de curse of dimensionality.

A boa notícia é que uma vez que conseguir reduzir o número de dimensões ou achar os atributos mais relevantes
ele ira funcionar muito bem.

Outro problema relacionado ao KNN é em relação ao processamento necessário na hora de fazer uma predição.
Por ser um algoritmo que não gera um modelo, mas ao invés disso calcula a distância da instância em relação a
todas as outras do conjunto de treino que foi usado para treiná-lo, isso gera uma enorme necessidade de
processamento o que pode ate inviabilizar o seu uso em aplicações reais.

Felizmente existem métodos como KD-tree e Ball-tree para se lidar com esse tipo de problema falarei desses
métodos futuramente.
https://juliocprocha.wordpress.com/2017/ 1/5
23/03/2018 2017 – O Estudante independente

Classificação

Com certeza a aplicação mais comum do KNN é em problemas de classificação.

Nesse caso umas das formas de se medir a distância entre os pontos é a distância euclidiana.

Ele calcula a distâncias entre dois vetores que no caso acima foram representados como sendo linhas de uma
matriz que é sua representação mais comum em aplicações reais.

O KNN procura então achar os K vizinhos mais próximos de um dado ponto no espaço, ele então procura pelo
seguinte conjunto de vetores.

Onde são linhas da matriz , e são os números de vizinhos e número de elemento do vetor
respectivamente e é a instância que sera classificada.

Isso retornara um conjunto de vetores no qual a soma das distâncias entre eles e a instância
,que será classificada, seja a menor possível.

Por exemplo: Caso definimos K igual a 3 teremos três vetores nesse conjunto.

Feito isso é preciso saber qual a classe dominante nesses vetores, cada vetor do conjunto esta associado a uma
classe. Para descobrir a qual classe a instância pertence é feito uma votação para saber em qual classe ela se
encaixa. Isso é definimos a instância em questão como Pertencendo a classe que tenha maior ocorrência no
conjunto que retornar da iteração.

Podemos definir isso de maneira formal usando o conceito de proporção.

No vetor podemos extrair classes de elementos contidas no vetor. A partir dai basta aplicarmos o seguinte
passo.

Onde é uma função de perda do tipo:

Podemos ler a expressão acima como: A probabilidade de pertencer a classe é igual a soma das ocorrências
positivas dividida pela quantidade de vizinhos mais próximas da instância.

https://juliocprocha.wordpress.com/2017/ 2/5
23/03/2018 2017 – O Estudante independente

Dai classificando a instância como sendo da classe com maior proporção de ocorrencia.

Para problemas de classificação com poucas classes esse método pode ser interessante. Porem em problemas
com muitas classes pode acontecer de classificarmos uma instância erroneamente por falta de exemplos da classe
que ela pertence em caso de pequenos, ou o contrário, pode haver muitos vizinhos que estão distantes da
instância terem um peso muito grande e atrapalhar a classificação da instância.

Para resolver esse problema podemos usar a distância ponderada. Uma maneira muito popular de lidar com esse
problema é usar o inverso da distância euclidiana:

Onde é um vetor do conjunto dos vizinhos mais próximos, o número de elementos/dimensões do vetor e a
instância que será classificada.

Agora a invés de avaliarmos as classes dos vetores mais próximos passamos a avaliar seus pesos. Dai
avaliamos a instância como pertencendo a classe na qual a soma dos inversos das distâncias em relação a ela
seja a maior possível.

Com isso em mão podemos lidar melhor com problemas que envolve muitas classes pois damos menos
importância a aquelas classes que estão mais distantes. Isso faz com que mesmo que uma classe mais distante
tenha muitas ocorrências ela pode perder para uma classe que esteja mais perto e com menos ocorrência.

Esse mecanismo é interessante pois possibilita repartir o espaço em torno da instância que o KNN ira classificar
em pedaços.

Uma representação da divisão do plano em torno


de um ponto.

https://juliocprocha.wordpress.com/2017/ 3/5
23/03/2018 2017 – O Estudante independente

É uma maneira interessante de pensar, porém perde precisões em grandes dimensões devido a perda
de peso dos elementos do vetor o que faz com que variáveis não tão importantes tenham uma grande
influência na distância.

Isso acontece pois o KNN diferente de outros algoritmos da o mesmo peso para todos os elementos
de um vetor. Por isso é interessante fazer uma análise de correlação nas variáveis que serão usadas
para treiná-lo e assim pode ser aplicado apenas nas mais relevantes.

Regressão.

Com algumas pequenas modificações é possível aplicar o KNN para problemas de regressões.
Assim como antes podemos utilizar a distância euclidiana para calcular a distância entre as
instâncias porem a diferença reside na forma em que será calculado o valor para ser associar a
instância que está sendo testada.

Invés de usarmos aquela classe que aparece com mais frequência no vetor dos vizinhos mais
próximos, pegaremos uma média dos valores dessas instâncias.

Agora suponha o conjunto de vetores pertencendo ao conjunto dos vizinhos mais próximos:

Como sabemos cada vetor desse conjunto esta associado a um valor real, pois o KNN usa o próprio
conjunto de treino como parte do algoritmo, logo usaremos o vetor que representa esses valores,
então podemos associar a cada vetor do conjunto a um valor real que representa seu valor.

Logo teremos o seguinte vetor que denominei :

A primeira estratégia que pode ser usada para se achar o valor da instância pode ser a média desses
vizinhos mais próximos.

Então o valor de saída nada mais seria do que a média dos vizinhos mais próximos daquela
instância.

Apesar de interessante na prática tendemos a ter variáveis com alto grau de dispersão, ou seja, a
probabilidade de se encontrar valores “próximos” da média tende a ser menor do que a de encontrar
valores distantes.

https://juliocprocha.wordpress.com/2017/ 4/5
23/03/2018 2017 – O Estudante independente

Para resolver isso podemos utilizar uma média ponderada pelo peso das distâncias. Como vimos
anteriormente:

Então nesse caso a função que associa um valor a instância que será classificada seria dada pela
seguinte expressão:

Onde é o peso de cada valor real associado ao vetor dos vizinhos mais próximos.

E pode ser calculado como vimos anteriormente pela seguinte equação:

Onde é o vetor que queremos estimar o valor.

Mais uma vez separamos o espaço em partes e assim as instâncias em diferentes lugares do espaço
terão diferentes pesos na formação do valor da predição.

Conclusão

O mais importante na hora de se estudar o KNN não é ó algoritmo em si, mas a estratégia usada para
se estimar um valor.

Quando fazemos isso fica claro que o bias do KNN é associar valores semelhantes a instâncias
semelhantes. Porem ele considera semelhantes instâncias que tenham o mesmo valor para seus
atributos. Ele também trata cada instância de forma isolada, ao contrário de modelos como Decision
trees ou as redes neurais que criam um modelo único para classificar ou estimar um valor para todas
as instâncias.

Ele também associa o mesmo peso a todos os atributos de uma instância, por isso é importante
preparar e normalizar o conjunto de treino antes de aplicá-lo e ate mesmo selecionar os atributos
necessários para usá-lo.

Outro ponto importante é que o KNN se torna mais útil quando usado em conjunto com outros
algoritmos assim um pode corrigir a fraqueza do outro aumentando a precisão.

Esse foi o post de hoje qualquer sugestão ou crítica é sempre bem vinda e bons estudos.

https://juliocprocha.wordpress.com/2017/ 5/5