Hoja de ruta

Propósito de este documento

Este documento enumera las directrices generales que los colaboradores principales están interesados en ver desarrolladas en scikit-learn. El hecho de que un elemento se liste aquí no es de ninguna manera una promesa de que va a suceder, ya que los recursos son limitados. Más bien, es una indicación de que la ayuda es bienvenida en este tema.

Declaración de objetivos: Scikit-learn en 2018

Once años después de la creación de Scikit-learn, mucho ha cambiado en el mundo del aprendizaje automático. Los cambios clave incluyen:

  • Herramientas computacionales: La explotación de GPUs, marcos de programación distribuidos como Scala/Spark, etc.

  • Bibliotecas Python de alto nivel para experimentación, procesamiento y gestión de datos: cuaderno de Jupyter, Cython, Pandas, Dask, Numba…

  • Cambios en el enfoque de la investigación en aprendizaje automático: aplicaciones de inteligencia artificial (donde la estructura de entrada es clave) con aprendizaje profundo, aprendizaje de representación, aprendizaje de refuerzo, transferencia de dominio, etc.

Un cambio más sutil en la última década es eso, debido a los intereses cambiantes en ML, Los estudiantes de doctorado en aprendizaje automático son más propensos a contribuir a Pyantch, Dask, etc. que a Scikit-learn, por lo que nuestro fondo de colaboradores es muy diferente al de hace una década.

Scikit-learn sigue siendo muy popular en la práctica para probar las técnicas canónicas de aprendizaje automático, en particular para aplicaciones en la ciencia experimental y en la ciencia de datos. Mucho de lo que proporcionamos está ya muy desarrollado. Pero su mantenimiento puede ser costoso y, por tanto, no podemos incluir nuevas implementaciones arbitrarias. Sin embargo, Scikit-learn también es esencial en la definición de un marco API para el desarrollo de componentes de aprendizaje automático interoperables externos a la biblioteca principal.

Por lo tanto, nuestros principales objetivos en esta ocasión son:

  • seguir manteniendo una colección de herramientas canónicas de alta calidad y bien documentadas para el tratamiento de datos y el aprendizaje automático dentro del ámbito actual (es decir, datos rectangulares en gran medida invariables al orden de las columnas y filas; predicción de objetivos con estructura simple)

  • mejorar la facilidad de desarrollo y publicación de componentes externos para los usuarios

  • mejorar la interoperabilidad con herramientas modernas de ciencia de datos (por ejemplo, Pandas, Dask) e infraestructuras (por ejemplo, procesamiento distribuido)

Muchos de los objetivos más precisos pueden encontrarse en la etiqueta API en el gestor de incidencias.

Objetivos arquitectónicos / generales

La lista está numerada no como indicación del orden de prioridad, sino para facilitar la referencia a puntos concretos. Por favor, añada nuevas entradas sólo al final. Tenga en cuenta que las entradas tachadas ya están hechas, y que intentamos mantener el documento actualizado mientras trabajamos en estos temas.

  1. Mejora del manejo de Pandas DataFrames

    • el manejo actual del documento

    • reordenamiento de columnas #7242

    • evitar la conversión innecesaria a ndarray #12147

    • devolviendo DataFrames de los transformadores #5523

    • obtención de DataFrames de cargadores de conjuntos de datos #10733, #13902

    • Sparse actualmente no se considera #12800

  2. Mejora el manejo de características categóricas

    • Los modelos basados en el árbol deben ser capaces de manejar características continuas y categóricas #12866 y #15550.

    • En cargadores de conjuntos de datos #13902

    • Como transformadores genéricos para ser utilizados con ColumnTransforms (por ejemplo, codificación ordinal supervisada por correlación con la variable objetivo) #5853, #11805

    • Manejo de mezclas de variables categóricas y continuas

  3. Mejora de la gestión de los datos que faltan

    • Asegurarse de que los meta-estimadores son indulgentes con los datos que faltan, :issue:`15319

    • Imputadores no triviales #11977, #12852

    • Los participantes manejan directamente los datos que faltan #13911

    • Un generador de muestra de amputación para hacer desaparecer partes de un conjunto de datos :issue:`6284

  4. Más documentos didácticos

    • Más y más opciones se han añadido a scikit-learn. Como resultado, la documentación está abarrotada, lo que hace que sea difícil para los principiantes obtener una visión general. Se podría trabajar en la priorización de la información.

  5. Pasar alrededor de la información que no es (X, y): Propiedades de muestra

    • Necesitamos poder pasar los pesos de las muestras a los puntuadores en la validación cruzada.

    • Deberíamos tener formas estándar/generalizadas de pasar las propiedades de la muestra en los meta-estimadores. #4497 #7646

  6. Pasar información que no es (X, y): Propiedades de las características

    • Lo ideal es que los nombres o descripciones de las características estén disponibles para ajustarse a, por ejemplo. #6425 #6424

    • La gestión de cada característica (por ejemplo, «¿se trata de un texto nominal / ordinal / en inglés?») tampoco debería proporcionarse a los constructores de estimadores, idealmente, sino que debería estar disponible como metadatos junto a X. #8480

  7. Pasar alrededor de la información que no es (X, y): Propiedades de objetivo

    • Tenemos problemas para obtener el conjunto completo de clases en todos los componentes cuando los datos se dividen/muestran. #6231 #8100

    • No tenemos forma de tratar una mezcla de objetivos categóricos y continuos.

  8. Hacer más fácil para usuarios externos escribir componentes compatibles con Scikit-learn

    • Comprobaciones de estimadores más flexibles que no seleccionan por nombre de estimador #6599 :issue:`6715

    • Ejemplo de cómo desarrollar un estimador o un meta-estimador, #14582

    • Ejecución más autosuficiente de scikit-learn-contrib o un recurso similar

  9. Soporta el remuestreo y la reducción de la muestra

    • Permitir el submuestreo de las clases mayoritarias (¿en una pipeline?) #3855

    • Implementar bosques aleatorios con #8732

  10. Mejores interfaces para el desarrollo interactivo

    • __repr__ y visualizaciones HTML de estimadores #6323 y #14180.

    • Incluir herramientas de gráfico, no sólo como ejemplos. #9173

  11. Herramientas mejoradas para el diagnóstico de modelos e inferencia básica

    • implementaciones alternativas de importación de características, #13146

    • mejores formas de manejar los conjuntos de validación cuando se ajustan

    • mejores formas de encontrar umbrales / crear reglas de decisión #8614

  12. Mejores herramientas para seleccionar hiperparámetros con estimadores transductivos

    • La búsqueda en cuadrícula y la validación cruzada no son aplicables a la mayoría de las tareas de conglomerados. La selección basada en la estabilidad es más pertinente.

  13. Mejor soporte para construcción manual y automática de pipelines

    • Una forma más fácil de construir pipelines complejos y espacios de búsqueda válidos #7608 #5082 #8243

    • ¿proporcionar rangos de búsqueda para los estimadores comunes?

    • cf. searchgrid

  14. Mejora del seguimiento del ajuste

    • Verbose no es muy amigable y debería usar una biblioteca de registro estándar #6929, #78

    • Las devoluciones o un sistema similar facilitarían el registro y la parada anticipada

  15. Paralelismo distribuido

    • Acepta los datos que cumplen con __array_function__

  16. Un paso adelante para sacar más provecho del núcleo

    • Dask permite una fácil ejecución fuera del núcleo. Aunque el modelo Dask probablemente no pueda adaptarse a todos los algoritmos de aprendizaje automático, la mayor parte del aprendizaje automático se realiza sobre datos más pequeños que el ETL, por lo que quizá podamos adaptarnos a una escala muy grande mientras soportamos solo una fracción de los patrones.

  17. Soporte para trabajar con modelos previamente entrenados

    • El estimador se «congela». En particular, ahora mismo es imposible clonar un CalibratedClassifierCV con prefit. #8370. #6451

  18. Serialización de algunos estimadores compatible con las versiones anteriores

    • Actualmente la serialización (con pickle) se interrumpe entre versiones. Aunque no podamos evitar otras limitaciones de pickle en cuanto a seguridad, etc., sería estupendo ofrecer seguridad entre versiones desde la versión 1.0. Nota: Gael y Olivier piensan que esto puede causar una pesada carga de mantenimiento y que deberíamos gestionar las compensaciones. Una posible alternativa se presenta en el siguiente punto.

  19. Documentación y herramientas para la gestión del ciclo de vida del modelo

    • Documentar las buenas prácticas para el despliegue y el ciclo de vida del modelo: antes de desplegar un modelo: fijar las versiones del código (numpy, scipy, scikit-learn, repo de código personalizado), el script de entrenamiento y un alias sobre cómo recuperar los datos históricos de entrenamiento + fijar una copia de un pequeño conjunto de validación + fijar las predicciones (probabilidades predichas para los clasificadores) en ese conjunto de validación.

    • Documento y herramientas para facilitar la gestión de la actualización de las versiones de scikit-learn:

      • Prueba a cargar el pickle anterior, si funciona, fija la predicción del conjunto de validación para detectar que el modelo serializado sigue comportándose igual;

      • Si joblib.load / pickle.load no funcionan, utiliza el script de entrenamiento de control de versiones + el conjunto de entrenamiento histórico para volver a entrenar el modelo y usa la predicción del conjunto de validación para afirmar que es posible recuperar el rendimiento de la predicción anterior: si no es el caso, probablemente hay un error en scikit-learn que debe ser reportado.

  20. Todo en Scikit-learn debe probablemente ajustarse a nuestro contrato de API. Todavía estamos tomando decisiones sobre algunas de estas cuestiones relacionadas.

    • Pipeline <pipeline.Pipeline> y FeatureUnion modifican sus parámetros de entrada ajustado. Para solucionarlo es necesario asegurarse de que conocemos bien sus casos de uso para garantizar que se mantiene toda la funcionalidad actual. #8157 #7382

  21. (Opcional) Mejorar el conjunto de tests comunes de scikit-learn para asegurarse de que (al menos para los modelos de uso frecuente) tienen predicciones estables a través de las versiones (para ser discutido);

    • Ampliar la documentación para mencionar cómo desplegar los modelos en entornos sin Python, por ejemplo ONNX. y utilizar las mejores prácticas anteriores para evaluar la consistencia predictiva entre las funciones de predicción de scikit-learn y ONNX en el conjunto de validación.

    • Documentar las buenas prácticas para detectar la derivación de la distribución temporal para el modelo desplegado y las buenas prácticas para el reentrenamiento en datos actuales sin causar regresiones catastróficas en el rendimiento predictivo.

Objetivos específicos de los subpaquetes

sklearn.ensemble

  • una implementación de apilamiento, #11047

sklearn.cluster

  • variantes de kmeans para distancias no euclidianas, si podemos demostrar que éstas tienen beneficios más allá de conglomeración jerárquica.

sklearn.model_selection

  • la puntuación multimétrica es lenta #9326

  • tal vez queremos ser capaces de recuperar más de múltiples métricas

  • el manejo de los estados aleatorios en los separadores de validación cruzada es un diseño pobre y contradice la validación de parámetros similares en los estimadores, #15177

  • explotar los algoritmos de warm-starting y path para que se pueda acceder a las ventajas de los objetos EstimatorCV a través de GridSearchCV y utilizarlos en Pipelines. :issue:`1626

  • La validación cruzada debería poder ser sustituida por estimaciones OOB siempre que se utilice un iterador de validación cruzada.

  • Deben evitarse los cálculos redundantes en las pipelines (relacionado con el punto anterior) cf daskml

sklearn.neighbors

  • Posibilidad de sustituir una implementación de vecinos más cercanos personalizada/aproximada/precalculada por la nuestra en todos/la mayoría de los contextos en los que se utilizan los vecinos más cercanos para el aprendizaje. #10463

sklearn.pipeline

  • Problemas de rendimiento con Pipeline.memory

  • ver «Todo en Scikit-learn debe ajustarse a nuestro contrato de API» arriba