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?
preprocessing
Pooja
fuente
fuente
Respuestas:
¡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:
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.
fuente
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.
fuente
¡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:
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!
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.
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.
fuente
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.
fuente