3. Aprendizado de Máquina Supervisionado Aprendizado de Máquina Supervisionado
3.2 Modelos Modelos de de Classificação Classificação
3.2.4 K-Vizinhos K-Vizinhos Próximos Próximos (KNN) (KNN)
3.2.4
K-Vizinhos K-Vizinhos Próximos Próximos (KNN)(KNN)
O método K-Vizinhos próximos -
O método K-Vizinhos próximos - K-Nearest Neighbours KNN K-Nearest Neighbours KNN - pode ser utilizado para resolver - pode ser utilizado para resolver
um problema de classificaçã
um problema de classificação. o. Esse modelo é um Esse modelo é um dos mais simples e intuitidos mais simples e intuitivos: seu vos: seu treinametreinamentonto consiste em armazenar cada uma das instâncias (ou exemplos) da base de treino e, através de uma consiste em armazenar cada uma das instâncias (ou exemplos) da base de treino e, através de uma função de distância
função de distância 14 14 e do número de vizinhos mais próximos, é capaz de predizer qual a classe dee do número de vizinhos mais próximos, é capaz de predizer qual a classe de um novo indivíduo.
um novo indivíduo.
A simplicidade desse método tem um preço:
A simplicidade desse método tem um preço: ele é ele é sensívsensível a el a ruídos (aleatoriedruídos (aleatoriedade dos dados) eade dos dados) e
outliers
outliers, não possui uma capacidade alta de generalização e é altamente sensível a seu hiperparâmetro:, não possui uma capacidade alta de generalização e é altamente sensível a seu hiperparâmetro:
o número de vizinhos mais próximos. Em situação de alta dimensionalidade não é muito efetivo o número de vizinhos mais próximos. Em situação de alta dimensionalidade não é muito efetivo e pouco eficiente. Seu tempo de treino costuma ser rápido, porém o tempo para predição envolve e pouco eficiente. Seu tempo de treino costuma ser rápido, porém o tempo para predição envolve calcular a distância entre a instância (indivíduo) nova e todas as outras instâncias, sendo assim, em calcular a distância entre a instância (indivíduo) nova e todas as outras instâncias, sendo assim, em bases de dados muito grandes, esse método pode ter um tempo de execução alto. Em bases de dados bases de dados muito grandes, esse método pode ter um tempo de execução alto. Em bases de dados balanceadas e representativ
balanceadas e representativas, esse as, esse modelo costuma ter modelo costuma ter bons resultados.bons resultados.
Agora trazendo um exemplo mais concreto: imagine a seguinte situação,uma exposição de Agora trazendo um exemplo mais concreto: imagine a seguinte situação,uma exposição de veiculos antigos está ocorrendo em sua cidade e é informado em uma placa próxima a cada veículo, veiculos antigos está ocorrendo em sua cidade e é informado em uma placa próxima a cada veículo, se este foi fabricado nos Estados Unidos, Japão ou Europa. Os carros estão espalhados pelo salão sem se este foi fabricado nos Estados Unidos, Japão ou Europa. Os carros estão espalhados pelo salão sem uma lógica aparente e em algum lugar existe um veículo que não tem uma placa de nacionalidade e uma lógica aparente e em algum lugar existe um veículo que não tem uma placa de nacionalidade e você quer descobrir onde este carro foi
você quer descobrir onde este carro foi fabricadofabricado. . SeguindSeguindo a o a lógica do KNN lógica do KNN você faria o seguinte:você faria o seguinte: olharia os vizinhos mais próximos a este carro e veria onde eles foram fabricados, digamos que olharia os vizinhos mais próximos a este carro e veria onde eles foram fabricados, digamos que você decidiu olhar os cinco carros mais próximos, três deles eram dos Estados Unidos, um do Japão você decidiu olhar os cinco carros mais próximos, três deles eram dos Estados Unidos, um do Japão e por fim um da Europa e como existem mais carros fabricados nos Estados Unidos próximos ao e por fim um da Europa e como existem mais carros fabricados nos Estados Unidos próximos ao seu, você induzir
seu, você induziria que o ia que o carro também foi fabricado lá. carro também foi fabricado lá. É importante dizer que a distância entreÉ importante dizer que a distância entre os carros pode ser física ou algo que mede similaridade entre atributos levando em consideração os carros pode ser física ou algo que mede similaridade entre atributos levando em consideração características dos carros. Vemos que a lógica do modelo é bem simples, porém bastante poderosa, características dos carros. Vemos que a lógica do modelo é bem simples, porém bastante poderosa, com isso em mente podemos agora partir para codificação.
com isso em mente podemos agora partir para codificação.
Continuando com a situação acima em mente, vamos aplicar nosso nosso modelo em forma Continuando com a situação acima em mente, vamos aplicar nosso nosso modelo em forma de código.Vamos fazer apenas algumas modificações para que o método faça mais sentido - na de código.Vamos fazer apenas algumas modificações para que o método faça mais sentido - na situação acima informamos que os caros
situação acima informamos que os caros estavam dispostestavam dispostos sem uma lógica os sem uma lógica aparente e para aparente e para o métodoo método fazer sentido vamos imaginar que os carros estejam dipostos segundo as seguintes variáveis: Milhas fazer sentido vamos imaginar que os carros estejam dipostos segundo as seguintes variáveis: Milhas por litros (
por litros (mpgmpg), Número de cilindros (), Número de cilindros (cylinderscylinders), Volume nos pistões (), Volume nos pistões (cubicinescubicines, Cavalos no, Cavalos no
motor(
motor(hphp), Peso em libras (), Peso em libras (weigthlbsweigthlbs), Tempo de aceleração até 60 milhas por hora (), Tempo de aceleração até 60 milhas por hora (time-for-60time-for-60) e) e
por fim o ano do carro (
por fim o ano do carro (yearyear).).
Escolhidas as variáveis, vamos continuar primeiramente importando as bibliotecas que vamos Escolhidas as variáveis, vamos continuar primeiramente importando as bibliotecas que vamos usar:
usar:
import
import pandas pandas asas pdpd
import
import numpy numpy asas npnp
import
import seaborn seaborn asas snssns #Us #Usaremaremos os estesta a bibbibliotlioteca eca parpara a ploplotar tar destdesta a vez vez
from
from sklearn.model_selection sklearn.model_selection import import train_test_split train_test_split# # crcriaiar r grgrupupo o de de trtreieino no e e teteststee
from
from sklearn.preprocessing sklearn.preprocessing import import StandardScaler StandardScaler # # nornormamalizlizar ar os os daddadosos 14
33..2 2 MMooddeelloos s dde e CCllaassssiifificcaaççãão o 3333
from
from sklearn.neighbors sklearn.neighbors import import KNeighborsClassifier KNeighborsClassifier # # bibiblibliototeca eca do do memetodtodoo
from
from sklearn.metrics sklearn.metrics import import classifclassification_ication_report, report, confusioconfusion_matrixn_matrix # # acacururacacia do métia do métododo.o.
Então podemos importar nosso dataset e separar as classes de cada carro para facilitar a manipu- Então podemos importar nosso dataset e separar as classes de cada carro para facilitar a manipu- lação dos dados:
lação dos dados:
dataset
dataset== pdpd..read_csv(read_csv("cars_.csv""cars_.csv")) classe
classe== dataset[ dataset[brandbrand]]
dataset
dataset..drop([drop([brandbrand],axis],axis=1=1,inplace,inplace== True True))
Uma vez separadas as classes das variáveis, temos que criar nosso grupo de treino e nosso grupo Uma vez separadas as classes das variáveis, temos que criar nosso grupo de treino e nosso grupo de teste, para isso utilizamos uma função do python que é
de teste, para isso utilizamos uma função do python que é muito útil:muito útil:
X_tr
X_trainain, , X_tX_test, est, y_try_train, ain, y_tey_testst == train_test_splitrain_test_split(dataset(dataset,classt,classe, e, test_sitest_sizeze=0.20=0.20,random_s,random_s
Com os dados separados, só
Com os dados separados, só precisamos normalizáprecisamos normalizá-los antes de -los antes de aplicar o KNN:aplicar o KNN:
scaler
scaler == StandardScaler() StandardScaler() scaler
scaler..fit(X_train)fit(X_train) X_train
X_train == scaler scaler..transform(X_train)transform(X_train) X_test
X_test == scaler scaler..transform(X_test)transform(X_test)
Como foi dito no
Como foi dito no exempexemplo o lo o método induz qual a método induz qual a classe do elemento olhando as classes dosclasse do elemento olhando as classes dos seus vizinhos próximos, então é muito importante definir qual é o numero de vizinhos que se deve seus vizinhos próximos, então é muito importante definir qual é o numero de vizinhos que se deve olhar para conseguir chegar a um número no qual o
olhar para conseguir chegar a um número no qual o erro é minimizado. erro é minimizado. Para isso utilizamos o códigoPara isso utilizamos o código abaixo para ver a média dos erros e usar o K (número de vizinho próximos) que gera menor número abaixo para ver a média dos erros e usar o K (número de vizinho próximos) que gera menor número de erros na base de teste:
de erros na base de teste:
error
error==[][]
for
for ii inin range range((11, 40, 40):): knn
knn == KNeighborsClassifier(n_neighbors KNeighborsClassifier(n_neighbors==i)i) knn
knn..fit(X_tfit(X_train, rain, y_train)y_train) pred_i
pred_i == knnknn..predict(X_test)predict(X_test) error
error..append(npappend(np.. mean(pred_i mean(pred_i !=!= y_test)) y_test)) plt
plt..figure(figsizefigure(figsize==((1212,, 66)))) plt
plt..plot(plot(rangerange((11, 40, 40), er), errorror, , colcoloror==redred, , linlinestyestylele==dasheddashed, mark, markerer==oo,,
markerfacecolor
markerfacecolor==blueblue, , marmarkerskersizeize=10=10))
plt
plt..title(title(EErrrro o ddo o KK))
plt
plt..xlabel(xlabel(ValValor or KK))
plt
plt..ylabel(ylabel(MédMédia ia do do errerroo))
Com isso temos o
Com isso temos o seguintseguinte gráfico:e gráfico:
Nele fica bem claro os números que geram os menores erros para o método.
Nele fica bem claro os números que geram os menores erros para o método. Neste caso usaremosNeste caso usaremos 6 como o número de vizinhos próximos, porém poderíamos usar o outro número com tranquilidade. 6 como o número de vizinhos próximos, porém poderíamos usar o outro número com tranquilidade. Com o melhor K
Figura 3.5:
Figura 3.5: Grafico de Erros para K Grafico de Erros para K vizinhos Proximvizinhos Proximosos
classif
classif == KNeighborsClassifier(n_neighbors KNeighborsClassifier(n_neighbors=6=6)) classif
classif..fit(X_tfit(X_train, rain, y_train)y_train) y_pred
y_pred == classif classif..predict(X_test)predict(X_test) classif
classif..score(X_test,y_test)score(X_test,y_test)
Com o modelo apresen
Com o modelo apresentado temos uma precitado temos uma precisão de 75% em nosso grupo de testsão de 75% em nosso grupo de teste. e. Porém,Porém, para validarmos o método precisamos de mais informações e para isso iremos usar uma matriz de para validarmos o método precisamos de mais informações e para isso iremos usar uma matriz de confusã
confusão: o: ela nos permite ver se ela nos permite ver se nosso método está acertandnosso método está acertando bem o bem em todas as em todas as classes de nossoclasses de nosso dataset, por exemplo.
dataset, por exemplo. VVocê pode entender melhor ocê pode entender melhor este topico clicando aquieste topico clicando aqui1515. Além da matriz vamos. Além da matriz vamos
utilizar um reporte de classificação que o sklearn nos oferece: utilizar um reporte de classificação que o sklearn nos oferece:
print(confus(confusion_matrion_matrix(y_tesix(y_test, t, y_pred))y_pred))
print(classi(classificationfication_report(_report(y_test, y_test, y_pred))y_pred))
Com esses métodos vemos que nosso modelo conseguiu acertar muito bem para os veículos dos Com esses métodos vemos que nosso modelo conseguiu acertar muito bem para os veículos dos Estados Unidos e Europa e
Estados Unidos e Europa e acertando um pouco menos para acertando um pouco menos para veículoveículos do s do Japão.Japão.