Diferente conjunto de pruebas y distribución de conjuntos de entrenamiento

13

Estoy trabajando en una competencia de ciencia de datos para la cual la distribución de mi conjunto de pruebas es diferente del conjunto de entrenamiento. Quiero submuestrear observaciones del conjunto de entrenamiento que se parece mucho al conjunto de prueba.

¿Cómo puedo hacer esto?

Pooja
fuente
Submuestreo aleatorio, sobremuestreo aleatorio, sobremuestreo basado en clúster, sobremuestreo informado: técnica de sobremuestreo de minorías sintéticas, técnica de sobremuestreo minoritario sintético modificado (MSMOTE), etc.
Aditya
Es mejor marcar una de las respuestas como "Respuesta aceptada" si está satisfecho con alguna de ellas.
TwinPenguins

Respuestas:

15

Gran pregunta, esto es lo que se conoce en el paradigma de Machine Learning como "Covariable Shift", o "Model Drift" o "Nonstationarity" y así sucesivamente.

¡Una de las suposiciones críticas que se haría para construir un modelo de aprendizaje automático para predicciones futuras es que los datos no vistos (prueba) provienen de la misma distribución que los datos de entrenamiento! Sin embargo, en realidad, esta suposición bastante simple se rompe fácilmente y los datos próximos (su distribución) cambian con el tiempo por muchas razones. Para aquellos que no estén familiarizados con este problema tan importante, ¡les recomiendo mirar aquí o publicar !

Para mí, su pregunta cae en la misma categoría. Aunque no tengo la solución perfecta (una implementación que ofrecer), creo que puedes buscar:

  • ¡Esta publicación de blog le brinda una manera simple de manejar el submuestreo de datos de entrenamiento con el código proporcionado en Python!
  • Mira este trabajo de investigación . Proponen para resolver el problema volviendo a ponderar los datos de entrenamiento para que la distribución de la formación está más cerca de la distribución de prueba usando Kullback-Leibler Importancia Procedimiento de Estimación de base en " Kullback-Leibler divergencia " teorema. No sé si proporcionan una implementación o si se puede implementar fácilmente, pero creo que valdría la pena excavar, ya que parece una forma profesional de solucionar el desajuste de distribución.

Actualización RÁPIDA (una buena solución) : encontré una implementación de Python del algoritmo KLIEP de ese trabajo de investigación (último punto) para encontrar esos pesos. ¡Parece bastante fácil de usar! Básicamente, vuelve a muestrear el entrenamiento poniendo pesos (a través del algoritmo KLIEP) para que la suposición de tener una distribución similar de entrenamiento y prueba sea cierta tanto como sea posible.

Pingüinos Gemelos
fuente
5

Quiero submuestrear observaciones del conjunto de entrenamiento que se parece mucho al conjunto de prueba.

No estoy seguro de que quieras hacer eso. Todo el propósito es más bien entrenar su algoritmo para que se generalice bien a datos invisibles.

Por lo general, uno debe adaptar sus datos de prueba a los datos de su tren (por ejemplo, estandarizar los datos de prueba de acuerdo con los datos del tren ) y no al revés. En la práctica, no conoce los datos de su prueba.

Arnaud
fuente
3

¡El submuestreo de trenes podría no ser la mejor solución!

Las diferencias entre el conjunto de prueba / ejecución y la distribución / características del conjunto de entrenamiento son muy comunes en las tareas de aprendizaje supervisado (esta es una de las razones por las que las competencias como Kaggle son desafiantes). Es por eso que decimos que el rendimiento pasado puede (solo) usarse como una guía para estimar el rendimiento futuro, pero no lo indica ni lo garantiza . Por lo tanto, los modelos generalizables siempre han sido preferidos a los modelos afinados que pueden funcionar muy bien en el (sub) conjunto de trenes pero tienen un rendimiento pobre en datos no vistos.

Si bien dicha diferencia es normal, la brecha demasiado grande entre la muestra pasada y futura puede referirse como ejemplos de deriva conceptual, que es un campo de investigación activo en sí mismo. Dada su pregunta, no puedo juzgar que su caso sea un caso normal de LD o que la deriva del concepto realmente esté sucediendo.

Estas son mis sugerencias:

  1. Capacite a varios modelos con alta capacidad de generalización. El uso de arranque del muestreo a su conjunto de datos tren, se puede fácilmente calcular el sesgo y la varianza componentes de errores. Recuerde que está buscando un modelo de baja varianza (donde los cambios en los datos tendrían un efecto marginal en su rendimiento) en lugar de modelos de bajo sesgo pero de alta varianza (que podrían ajustarse a su conjunto (sub) de entrenamiento). Ahora, puede seleccionar los mejores algoritmos y evaluarlos contra el conjunto de prueba. ¡Tenga en cuenta que en el tiempo de entrenamiento se supone que no debemos mirar el conjunto de prueba!

  2. En lugar de varios muestreos aleatorios, busque la estandarización / normalización y la selección / ingeniería de características. Estas técnicas pueden ser prácticas para aprender modelos más generales. Por ejemplo, a veces el rango del dominio de características puede cambiar con el tiempo, mientras que la forma de distribución (sea lo que sea) permanece casi igual (por ejemplo, la misma distribución que se desplaza hacia la izquierda o hacia la derecha). En tal caso, una estandarización simple (es decir, mapear el tren y las muestras de prueba a un espacio predefinido como [0,1] usando diferentes funciones de mapeo) puede reducir los síntomas.

  3. La disminución sistemática de muestras solo puede ser una solución adecuada si lo hace en función de algunos conocimientos sobre el problema (no solo con el fin de obtener una mejor precisión en el conjunto de datos de prueba). Por ejemplo, puede saber que algunos de los registros en los datos del tren se muestrearon hace mucho tiempo, desde el campo lejano, o se ven afectados por factores particulares que ninguno de ellos ocurrirá en el futuro (en la recopilación de datos de prueba). En tal caso, puede eliminar aquellas muestras que pueden ser irrelevantes, ya que está seguro de que no verá dichos patrones en el futuro (quiero decir, debe tener una justificación detrás de la selección del subconjunto de entrenamiento en lugar de buscar en el conjunto de pruebas que en realidad, no tienes acceso a él). En tal caso, lo llamo eliminación atípica en lugar de reducir el muestreo.

Borhan Kazimipour
fuente
1
p(y|x)
-1

Hay un buen paquete en python (scikit learn)

http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

Puede submuestrear sus observaciones del conjunto de entrenamiento utilizando este paquete.

Taimur Islam
fuente
1
Hasta donde entiendo la pregunta, las distribuciones de entrenamiento / prueba son diferentes, lo que si no se tiene en cuenta conduciría a lo que se conoce como "Cambio de Covariable". ¡La submuestra simple usando la implementación "train_test_split" en scikit learn mencionado aquí no tendrá en cuenta las distribuciones durante la división! Por lo tanto, la respuesta no es relevante.
TwinPenguins