Si j'ai bien compris, k-NN est un algorithme d'apprentissage paresseux et il n'a pas besoin d'une phase de formation. Alors, pourquoi devons-nous utiliser .fit()
avec sklearn et que se passe-t-il lorsque nous l'utilisons?
Si j'ai bien compris, k-NN est un algorithme d'apprentissage paresseux et il n'a pas besoin d'une phase de formation. Alors, pourquoi devons-nous utiliser .fit()
avec sklearn et que se passe-t-il lorsque nous l'utilisons?
Au niveau conceptuel
Ajuster un classificateur signifie prendre un ensemble de données en entrée, puis sortir un classificateur, qui est choisi dans un espace de classificateurs possibles. Dans de nombreux cas, un classificateur est identifié - c'est-à-dire qu'il se distingue des autres classificateurs possibles - par un ensemble de paramètres. Les paramètres sont généralement choisis en résolvant un problème d'optimisation ou une autre procédure numérique. Mais, dans le cas de knn, le classificateur est identifié par les données d'apprentissage elles-mêmes. Ainsi, à un niveau abstrait, l'ajustement d'un classificateur tricoté nécessite simplement de stocker l'ensemble d'apprentissage.
Au niveau de la mise en œuvre
L'évaluation d'un classificateur tricoté sur un nouveau point de données nécessite de rechercher ses voisins les plus proches dans l'ensemble d'apprentissage, ce qui peut être une opération coûteuse lorsque l'ensemble d'apprentissage est volumineux. Comme l'a mentionné RUser, il existe différentes astuces pour accélérer cette recherche, qui fonctionnent généralement en créant diverses structures de données basées sur l'ensemble de formation. L'idée générale est que certains des travaux de calcul nécessaires pour classer de nouveaux points sont en fait communs à tous les points. Ainsi, ce travail peut être effectué à l'avance, puis réutilisé, plutôt que répété pour chaque nouvelle instance. Une implémentation connue utilisant ces astuces ferait ce travail pendant la phase de formation. Par exemple, scikit-learn peut construire des kd-arbres ou des boules pendant l'appel à la fit()
fonction.
Vous pouvez l'implémenter de manière paresseuse et cela fait un exercice décent lors de la découverte d'une langue. (voir par exemple un de mes articles de blog ). Mais vous pouvez également indexer les données, pour faire la prédiction (beaucoup plus rapidement).
Si l'espace d'entité avait une dimension de un, le tri des points selon cette fonction vous aiderait à trouver les voisins beaucoup plus rapidement (en utilisant par exemple la recherche dichotomique). Dans une dimension plus grande, il n'y a pas de généralisation naturelle du tri, mais vous pouvez indexer les points à l'aide (par exemple) d' arbres quadruples .
En regardant la source , vous pouvez voir que diverses méthodes ont été implémentées dans scikit learn. Et il y a des recherches qui continuent d'améliorer ces requêtes de voisins les plus proches.
Bien que les points soulevés par les autres répondants soient certainement valables et intéressants, je voudrais souligner une dernière chose du point de vue strictement de l'ingénierie logicielle:
Pour le rendre cohérent avec leur API
Les estimateurs de sklearn devraient, entre autres, avoir une fit
méthode qui prend un ou deux tableaux-like (selon qu'il s'agit d'un estimateur supervisé / non supervisé) et un certain nombre de détails spécifiques à l'implémentation ( Source ).
Donc, même si la fit
méthode de knn ne devait absolument rien faire, elle existerait probablement encore, car knn est un estimateur et les développeurs de sklearn, ainsi que le code qu'ils contribuent, s'attendent à ce que les estimateurs aient une fit
méthode.