Pelo que entendi, o k-NN é um algoritmo de aprendizado lento e não precisa de uma fase de treinamento. Então, por que precisamos usar .fit()
com o sklearn e o que acontece quando o usamos?
Pelo que entendi, o k-NN é um algoritmo de aprendizado lento e não precisa de uma fase de treinamento. Então, por que precisamos usar .fit()
com o sklearn e o que acontece quando o usamos?
No nível conceitual
Ajustar um classificador significa pegar um conjunto de dados como entrada e, em seguida, produzir um classificador, escolhido a partir de um espaço de possíveis classificadores. Em muitos casos, um classificador é identificado - ou seja, distinto de outros possíveis classificadores - por um conjunto de parâmetros. Os parâmetros geralmente são escolhidos resolvendo um problema de otimização ou algum outro procedimento numérico. Mas, no caso de knn, o classificador é identificado pelos próprios dados de treinamento. Portanto, em um nível abstrato, a instalação de um classificador knn simplesmente exige o armazenamento do conjunto de treinamento.
No nível de implementação
Para avaliar um classificador knn em um novo ponto de dados, é necessário procurar seus vizinhos mais próximos no conjunto de treinamento, o que pode ser uma operação cara quando o conjunto de treinamento é grande. Como o RUser mencionou, existem vários truques para acelerar essa pesquisa, que normalmente funcionam criando várias estruturas de dados com base no conjunto de treinamento. A ideia geral é que parte do trabalho computacional necessário para classificar novos pontos é realmente comum entre pontos. Portanto, esse trabalho pode ser feito com antecedência e reutilizado, em vez de repetido para cada nova instância. Uma implementação knn usando esses truques faria esse trabalho durante a fase de treinamento. Por exemplo, o scikit-learn pode construir kd-trees ou ball trees durante a chamada para a fit()
função.
Escolhendo e a métrica da distância
O número de vizinhos e a métrica da distância são hiperparâmetros dos classificadores knn. O desempenho geralmente pode ser melhorado, escolhendo-os para se adequar ao problema. Porém, as configurações ideais geralmente não são conhecidas antecipadamente e precisamos procurá-las durante o procedimento de treinamento. Essa pesquisa equivale a resolver um problema de otimização e é semelhante ao ajuste do hiperparâmetro para outros métodos.
Você pode implementá-lo de forma preguiçosa e faz um exercício decente ao descobrir um idioma. (veja, por exemplo, uma das postagens do meu blog ). Mas você também pode indexar os dados, para fazer a previsão (muito mais rápida).
Se o espaço do recurso tivesse uma dimensão de um, classificar os pontos de acordo com esse recurso o ajudaria a encontrar os vizinhos muito mais rapidamente (usando, por exemplo, pesquisa dicotômica). Em dimensão maior, não há generalização natural da classificação, mas você pode indexar os pontos usando (por exemplo) quadríceps .
Observando a fonte , você pode ver que vários métodos foram implementados no scikit learn. E há algumas pesquisas que continuam melhorando essas consultas de vizinhos mais próximos.
Embora os pontos apresentados pelos outros respondentes sejam certamente válidos e interessantes, eu gostaria de destacar mais uma coisa do ponto de vista da engenharia de software:
Para torná-lo consistente com sua API
Os Estimadores da sklearn devem, entre outras coisas, ter um fit
método que gere um ou dois gostos de array (dependendo se é um estimador supervisionado / não supervisionado) e vários detalhes específicos da implementação ( Fonte ).
Portanto, mesmo que o fit
método de knn não fizesse absolutamente nada, provavelmente ainda existiria, porque knn é um estimador e os desenvolvedores do sklearn, assim como o código que eles contribuem, esperam que os estimadores tenham um fit
método.