Según he entendido, k-NN es un algoritmo de aprendizaje perezoso y no necesita una fase de entrenamiento. Entonces, ¿por qué tenemos que utilizar .fit()
con sklearn y qué ocurre cuando lo utilizamos?
Respuestas
¿Demasiados anuncios?En el plano conceptual
Ajustar un clasificador significa tomar un conjunto de datos como entrada y, a continuación, emitir un clasificador, que se elige entre un espacio de posibles clasificadores. En muchos casos, un clasificador se identifica -es decir, se distingue de otros posibles clasificadores- por un conjunto de parámetros. Los parámetros se suelen elegir resolviendo un problema de optimización o algún otro procedimiento numérico. Pero, en el caso de knn, el clasificador se identifica por los propios datos de entrenamiento. Por lo tanto, a un nivel abstracto, el ajuste de un clasificador knn simplemente requiere el almacenamiento del conjunto de entrenamiento.
En cuanto a la aplicación
La evaluación de un clasificador knn en un nuevo punto de datos requiere la búsqueda de sus vecinos más cercanos en el conjunto de entrenamiento, lo que puede ser una operación costosa cuando el conjunto de entrenamiento es grande. Como mencionó RUser, hay varios trucos para acelerar esta búsqueda, que suelen funcionar creando varias estructuras de datos basadas en el conjunto de entrenamiento. La idea general es que parte del trabajo computacional necesario para clasificar nuevos puntos es en realidad común a todos los puntos. Por lo tanto, este trabajo puede realizarse con antelación y reutilizarse, en lugar de repetirse para cada nueva instancia. Una implementación de knn que utilice estos trucos haría este trabajo durante la fase de entrenamiento. Por ejemplo, scikit-learn puede construir árboles kd o árboles de bolas durante la llamada al fit()
función.
Elegir $k$ y la métrica de distancia
El número de vecinos $k$ y la métrica de distancia son hiperparámetros de los clasificadores knn. Por lo general, el rendimiento puede mejorarse eligiéndolos en función del problema. Sin embargo, los ajustes óptimos no suelen conocerse de antemano, y debemos buscarlos durante el procedimiento de entrenamiento. Esta búsqueda equivale a resolver un problema de optimización, y es similar al ajuste de hiperparámetros para otros métodos.
Se puede implementar de forma perezosa y es un ejercicio decente a la hora de descubrir un lenguaje. (ver por ejemplo una de las entradas de mi blog ). Pero también se pueden indexar los datos, para hacer la predicción (mucho más rápida).
Si el espacio de características tuviera una dimensión de uno, ordenar los puntos según esta característica te ayudaría a encontrar los vecinos mucho más rápido (usando por ejemplo la búsqueda dicotómica). En una dimensión mayor, no hay una generalización natural de la ordenación, pero se pueden indexar los puntos utilizando (por ejemplo) quadtrees .
Mirando la fuente se puede ver que se han implementado varios métodos en scikit learn. Y hay algunas investigaciones que siguen mejorando estas consultas de vecinos más cercanos.
Si bien los puntos que los otros contestadores han hecho son ciertamente válidos e interesantes, me gustaría señalar una cosa más desde un punto de vista estrictamente de ingeniería de software:
Para que sea coherente con su API
Los Estimadores de sklearn deben, entre otras cosas, tener un fit
que toma una o dos matrices (dependiendo de si se trata de un estimador supervisado/no supervisado) y una serie de detalles específicos de la implementación ( Fuente ).
Así que incluso si Knn's fit
no hiciera nunca nada, probablemente seguiría existiendo, porque knn es un estimador y los desarrolladores de sklearn, así como el código que aportan, esperan que los estimadores tengan un fit
método.