Como entendí, k-NN es un algoritmo de aprendizaje lento y no necesita una fase de entrenamiento. Entonces, ¿por qué necesitamos usar .fit()
con sklearn y qué sucede cuando lo usamos?
Como entendí, k-NN es un algoritmo de aprendizaje lento y no necesita una fase de entrenamiento. Entonces, ¿por qué necesitamos usar .fit()
con sklearn y qué sucede cuando lo usamos?
En el nivel conceptual
Ajustar un clasificador significa tomar un conjunto de datos como entrada, luego generar un clasificador, que se elige de un espacio de posibles clasificadores. En muchos casos, un clasificador se identifica, es decir, se distingue de otros clasificadores posibles, por un conjunto de parámetros. Los parámetros generalmente se eligen 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 datos de entrenamiento en sí. Entonces, en un nivel abstracto, instalar un clasificador knn simplemente requiere almacenar el conjunto de entrenamiento.
En el nivel de implementació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 RUser mencionó, hay varios trucos para acelerar esta búsqueda, que generalmente funcionan 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 realmente común en todos los puntos. Por lo tanto, este trabajo puede realizarse con anticipación y luego reutilizarse, en lugar de repetirse para cada nueva instancia. Una implementación knn usando 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 a la fit()
función.
Elegir y la métrica de distancia
El número de vecinos y la métrica de distancia son hiperparámetros de clasificadores knn. El rendimiento generalmente se puede mejorar eligiéndolos para adaptarse al problema. Pero, las configuraciones óptimas generalmente no se conocen con anticipación, y debemos buscarlas durante el procedimiento de entrenamiento. Esta búsqueda equivale a resolver un problema de optimización y es similar al ajuste de hiperparámetro para otros métodos.
Puede implementarlo de manera perezosa y es un ejercicio decente al descubrir un idioma. (ver por ejemplo una de mis publicaciones de blog ) Pero también puede indexar los datos, para hacer la predicción (mucho más rápido).
Si el espacio de entidades tenía una dimensión de uno, ordenar los puntos de acuerdo con esta función lo ayudaría a encontrar a los vecinos mucho más rápido (utilizando, por ejemplo, la búsqueda dicotómica). En una dimensión más grande, no existe una generalización natural de la clasificación, pero puede indexar los puntos usando (por ejemplo) cuadrúpedos .
Mirando la fuente , 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 hicieron las otras respuestas 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 deberían, entre otras cosas, tener un fit
método que tome uno o dos `` me gusta '' de la matriz (dependiendo de si se trata de un estimador supervisado / no supervisado) y una serie de detalles específicos de la implementación ( Fuente ).
Entonces, incluso si el fit
método de knn no hiciera absolutamente nada, probablemente todavía existiría, porque knn es un estimador y los desarrolladores de sklearn, así como el código que contribuyen, esperan que los estimadores tengan un fit
método.