[Script] KNN |
Brenower « Censeur » 1587355020000
| 6 | ||
OBS: SE QUISER SÓ VER O SCRIPT PULA PARA "EXEMPLO"!!! Se n tiver vendo as imagens, só ir para: https://www.notion.so/KNN-6a22f037830940159f2535ad003e0ae6 Motivação [1] Imagine que você esteja tentando predizer em qual candidato uma pessoa vá votar na próxima eleição presidencial. Se você tem os dados de quem os vizinhos da pessoa que vai ser usada na predição vão votar é possível ter a hipótese que a predição vá seguir seus vizinhos. Agora imagine que você não tenha apenas os dados dos votos de algumas pessoas e possa predizer outras pessoas baseada na distância entre elas, porém, também tenha os dados da idade, o salário, quantas crianças aquela pessoa tem, etc. O comportamento daquela pessoa pode ser influenciado (ou caracterizado) por esses dados e olhando para os "vizinhos próximos" de uma pessoa para fazer predição e olhando as várias dimensões dos dados desses vizinhos podemos tentar dizer que o voto que essa pessoa vai ter está entre os "k vizinhos mais próximos". O modelo [1] O modelo KNN é um dos mais simples para fazer predições. Ele não faz nenhuma suposição matemática e também não requer um grande custo computacional. As únicas coisas que esse modelo requere é: - Uma noção de distância (como distância euclidiana); - A suposição de que os pontos que estão pertos entre si são similares. A maioria dos outros modelos olham para o `dataset` como "um todo" para poder aprender certos padrões que estão entre os dados. O modelo KNN, por outro lado, "negligencia" várias informações, já que a predição de um novo ponto depende apenas no número "k" de pontos pertos do mesmo. Essas informações fazem o modelo não ajuda a entender o que têm por trás da predição (como no exemplo da motivação, o modelo apenas pode predizer em quem alguma pessoa vai votar, porém não consegue o que causa aquela pessoa a votar no valor da predição), diferentemente de outros modelos que podem podem predizer e também podem indicar as causas que motivaram aquela predição. Em Knn o número de "k vizinhos próximos" é o fator de decisão para que seja possível fazer a predição do modelo. O número "k" é um número escolhido de acordo com o `dataset`, sendo ele geralmente um número ímpar, caso o número de classes para problemas de classificação seja par. Quando temos `k = 1` o algoritmo é conhecido como `nearest neighbor algorithm`, esse caso é o simples, já que envolve apenas checar o ponto mais próximo no ponto que eu queria predizer. Siga o exemplo gráfico abaixo: No exemplo acima queremos predizer qual é a classe do ponto `?`, essa predição poder nos dar: - Class A - Class B Olhando o exemplo é intuitivo que o nosso modelo vá dar que aquele ponto pertence à classe `A`, já que, possui um ponto da classe A entre todos os pontos do dataset mais próximo ao ponto que queremos predizer. Um algoritmo simples para decidir qual é a predição para um ponto segue abaixo: Algoritmo: 1. Calcula a distância do ponto que queremos predizer com todos os outros do dataset; 2. Procura os k vizinhos mais próximos entre as distâncias calculadas; 3. Decide qual será a classe desse novo ponto de acordo com a maior incidência de uma classe (basicamente uma votação entre os k vizinhos). Como decidir o número de "k vizinhos próximos" [2, 3] Pesquisas mostram que não existe nenhum número idela de "k vizinhos próximos" que consegue ter boa perfomance em todos os tipos de `datasets`. Cada dataset tem o seu próprio número "k" adequado. Escolhendo um pequeno valor para o "k" pode levar a `overfitting` no resultado e resulta em um modelo mais complexo, porém escolhendo um valor vai tornar o modelo ter um custo computacional alto, também tornando o modelo menos complexo. Olhe um exemplo abaixo com vários números `k` para o mesmo `dataset`: Prós e contras Prós: - O módelo é muito rapido comparado a outros algoritmos de classificação; - Não há necessidade de treinar o modelo para que ele possa generalizar; - KNN pode ser útil em casos de dados não lineares; - Além de problemas problemas de classificação também pode ser usado em problemas de regressão fazendo pequenas alterações no modelo e ainda si tendo o mesmo conceito base. Contras: - Testar o modelo é um processo lento e custoso em termos de memória; - Ele requer um larga quantidade de memória para poder armazenar um dataset inteiro para fazer predições; - No uso da distância Euclidiana o KNN requer que data seja normalizada na mesma escal, já que a mesma é sensível para magnitudes diferentes nos dados. Nesse exemplo vamos usar o `iris dataset`, facilmente encontrado pelo google. Esse é um dataset que contém dados de três flores, sendo elas [6]: Essas flores serão usadas como nossas `target variables`, ou seja, dado algum `input` que queremos predizer vamos tentar dar como `output` a espécia da flor entre as três acima. Nesse `dataset` vamos conter as seguintes `features`: - Petal length X (comprimento da pétala); - Petal width X (largura da pétala); - Sepal length (comprimento da sépala); - Sepal width (largura da sépala). Obs.: As features marcadas com X serão usadas no nosso modelo para facilitar a criação do código, fica como exercício para o leitor utilizar as outras features. Usando python é possível gerar gráficos para fazer uma analise exploratória dos dados de forma fácil, veja abaixo os gráficos gerados: Com os gráficos em mãos podemos verificar quais features possui relações entrei si. Para mostrar um exemplo disso vamos verificar o gráfico Petal Width vs Length abaixo: Como é possível visualizar no gráfico as duas `features` são altamente correlacionadas, se tivermos um modelo que usa apenas essas `features` para dizer uma das nossas `target variable` conseguiriamos facilmente utilizar o algoritmo KNN para fazer a predição. Usando o algoritmo nessas duas `features` seria basicamente separar em três áreas diferentes os dados que estão mais próximos e cada novo ponto para fazer predição é facilmente visualizado onde ele estaria como no exemplo abaixo (observe que o exemplo não está em proporções reais do modelo KNN): O código do nosso modelo EM LUA poderia ser escrito da seguinte forma: https://gist.github.com/MetlHedd/d6f5f19ca95aca9750cb70c534b917d2 E vamos ter como output: Predição de {1.4, 0.2}: 0 Acurácia do modelo: 0.80645161290323 Conseguimos 80% de acurácia com esse simples código, não é algo maravilhoso!!!?? O modelo KNN consegue ter uma melhor performance com um número menor de `features` (ou seja, as colunas do `dataset` no caso de um arquivo .csv). Podemos dizer que quando o número de `features` aumenta o número de dados do nosso `dataset` também deve aumentar. Aumentar dimensões também pode nos levar ao problema de `overfitting`, para evitar isso o número de dados vai ter que aumentar exponencialmente de acordo com o número de dimensões. Para lidar com esse problema é necesário que aplicar uma análise explorátoria antes de aplicar qualquer algoritmo de machine learning ou aplicar um método de seleção de `features` [5]. Pesquisas mostram quem usar a distância Euclidiana em dimensões mais altas não se torna mais útil, para isso é possível utilizar outras medições, como a `Cosine Similarity` [3], que são menos afetadas em dimensões mais altas. 1. DataScience from Scratch, Second Edition, by Joel Grus (O’Reilly). Copyright2019 Joel Grus, 978-1-492-04113-9. 2. [https://www.datacamp.com/community/tutorials/k-nearest-neighbor-classification-scikit-learn](https://www.datacamp.com/community/tutorials/k-nearest-neighbor-classification-scikit-learn) 3. [https://learn.datacamp.com/courses/supervised-learning-with-scikit-learn](https://learn.datacamp.com/courses/supervised-learning-with-scikit-learn) 4. [https://en.wikipedia.org/wiki/Cosine_similarity](https://en.wikipedia.org/wiki/Cosine_similarity) 5. [https://machinelearningmastery.com/feature-selection-with-real-and-categorical-data/](https://machinelearningmastery.com/feature-selection-with-real-and-categorical-data/) 6. [https://www.datacamp.com/community/tutorials/machine-learning-in-r](https://www.datacamp.com/community/tutorials/machine-learning-in-r) Dernière modification le 1587581940000 |
Gamedroit « Citoyen » 1587541740000
| 0 | ||
É ótimo Breno, mas revise seu tópico, todos os links que envolvem imagens estão quebrados aqui e poderia explicar o que é "número idela"... |
Brenower « Censeur » 1587581880000
| 0 | ||
Contistente3 a dit : é só vc ir em cada referência e usar o algoritmo (o próprio KNN) em todas as imagens presentes nelas, como são apenas duas abas contendo imagens é só vc usar as abas como target variable e target value seria a aba correspondende. eu coloquei o link da página no notion com o contéudo Dernière modification le 1587581940000 |