Mi conjunto de entrenamiento contiene aproximadamente 50k entradas con las que hago un aprendizaje inicial. Semanalmente, se agregan ~ 5k entradas; pero la misma cantidad "desaparece" (ya que son los datos del usuario los que deben eliminarse después de un tiempo)
Por lo tanto, uso el aprendizaje en línea porque no tengo acceso al conjunto de datos completo en un momento posterior. Actualmente estoy usando uno SGDClassifier
que funciona, pero mi gran problema: aparecen nuevas categorías y ahora ya no puedo usar mi modelo, ya que no estaban en la inicial fit
.
¿Hay alguna manera con SGDClassifier
o algún otro modelo? ¿Aprendizaje profundo?
No importa si tengo que comenzar desde cero AHORA (es decir, usar algo diferente a SGDClassifier
), pero necesito algo que permita el aprendizaje en línea con nuevas etiquetas.
Respuestas:
Parece que no desea comenzar a reentrenar el modelo cada vez que aparece una nueva categoría de etiqueta. La forma más fácil de retener la información máxima de datos pasados sería entrenar un clasificador por categoría.
De esta manera, puede continuar entrenando cada clasificador de forma incremental ("en línea") con algo así como
SGDClassifier
sin tener que volver a entrenarlos. Cada vez que aparece una nueva categoría, agrega un nuevo clasificador binario solo para esa categoría. Luego selecciona la clase con la mayor probabilidad / puntaje entre el conjunto de clasificadores.Esto tampoco es muy diferente de lo que está haciendo hoy, porque
scikit's SDGClassifier
ya maneja el escenario multiclase al colocar múltiples clasificadores "Uno contra todos" debajo del capó.Si siguen apareciendo muchas categorías nuevas, por supuesto, este enfoque podría volverse un poco difícil de manejar.
fuente
warm_start
opción.Si las nuevas categorías llegan muy raramente, yo mismo prefiero la solución "uno contra todos" proporcionada por @oW_ . Para cada nueva categoría, entrena un nuevo modelo en X número de muestras de la nueva categoría (clase 1) y X número de muestras del resto de categorías (clase 0).
Sin embargo, si las nuevas categorías llegan con frecuencia y desea usar un solo modelo compartido , hay una manera de lograr esto usando redes neuronales.
En resumen, a la llegada de una nueva categoría, agregamos un nuevo nodo correspondiente a la capa softmax con pesos cero (o aleatorios), y mantenemos los pesos viejos intactos, luego entrenamos el modelo extendido con los nuevos datos. Aquí hay un boceto visual de la idea (dibujado por mí mismo):
Aquí hay una implementación para el escenario completo:
El modelo está entrenado en dos categorías,
Llega una nueva categoría,
Los formatos de modelo y destino se actualizan en consecuencia,
El modelo está entrenado en nuevos datos.
Código:
que salidas:
Debería explicar dos puntos con respecto a esta salida:
El rendimiento del modelo se reduce de
0.9275
a0.8925
simplemente agregando un nuevo nodo. Esto se debe a que la salida del nuevo nodo también se incluye para la selección de categoría. En la práctica, la salida del nuevo nodo debe incluirse solo después de que el modelo se haya entrenado en una muestra considerable. Por ejemplo, deberíamos alcanzar el pico de la primera de las dos primeras entradas[0.15, 0.30, 0.55]
, es decir, segunda clase, en esta etapa.El rendimiento del modelo extendido en dos categorías (antiguas)
0.88
es menor que el modelo anterior0.9275
. Esto es normal, porque ahora el modelo extendido quiere asignar una entrada a una de tres categorías en lugar de dos. También se espera esta disminución cuando seleccionamos entre tres clasificadores binarios en comparación con dos clasificadores binarios en el enfoque "uno contra todos".fuente
Tengo que decir que no he encontrado ninguna literatura sobre este tema. Que yo sepa, lo que pides es imposible. Debería ser consciente de esto, y el propietario del producto también debería serlo. La razón es que cualquier función de pérdida se basa en etiquetas conocidas, por lo que no hay forma de predecir una etiqueta que no esté en los datos de entrenamiento. Además, es ciencia ficción que un algoritmo de aprendizaje automático puede predecir algo para lo que no ha sido entrenado
Dicho esto, creo que puede haber una solución alternativa (permítanme señalar que esta es una opinión no basada en literatura formal). Si el clasificador es probabilístico, la salida es la probabilidad de que cada clase sea verdadera y la decisión es el problema más alto. Tal vez pueda establecer un umbral para esa probabilidad, de modo que el modelo prediga "desconocido" si todas las probabilidades están por debajo de ese umbral. Dejame darte un ejemplo.
Qué hacer con esos desconocidos depende de la lógica de negocio. Si son importantes, puede crear un grupo de ellos y volver a entrenar el modelo con los datos disponibles. Creo que puede hacer una especie de "aprendizaje de transferencia" desde el modelo entrenado cambiando la dimensión de la salida. Pero esto es algo que no he enfrentado, así que solo digo
Tenga en cuenta el
SGDClassifier
usoSVM
debajo, que no es un algoritmo probabilístico. Después de laSGDClassifier
documentación, puede modificar elloss
argumentomodified_huber
olog
para obtener resultados probabilísticos.fuente
Hay dos opciones:
Predecir la posibilidad de que un punto de datos pertenezca a un desconocido o
unk
categoría. Cualquier categoría nueva que aparezca en la transmisión debe predecirse comounk
. Esto es común en el procesamiento del lenguaje natural (PNL) porque siempre aparecen nuevos tokens de palabras en los flujos de palabras.Vuelva a entrenar el modelo cada vez que aparezca una nueva categoría.
Como mencionas
SGDClassifier
, supongo que estás usando scikit-learn. Scikit-learn no admite el aprendizaje en línea muy bien. Sería mejor cambiar un marco que sea más compatible con la transmisión y el aprendizaje en línea, como Spark .fuente