Tengo un problema de clasificación con datos categóricos y numéricos. El problema que enfrento es que mis datos categóricos no son fijos, eso significa que el nuevo candidato cuya etiqueta quiero predecir puede tener una nueva categoría que no se observó de antemano.
Por ejemplo, si mis datos categóricos sex
fueran female
, las únicas etiquetas posibles serían , male
y other
, sin importar qué. Sin embargo, mi variable categórica es city
que podría suceder que la persona que intento predecir tenga una ciudad nueva que mi clasificador nunca haya visto.
Me pregunto si hay una manera de hacer la clasificación en estos términos o si debería volver a hacer el entrenamiento considerando estos nuevos datos categóricos.
city
a un número basado en alguna función? Decity' = f(latitude, longitude)
esa manera, puede crear un nuevo valor para cualquier ciudadRespuestas:
Es muy buena pregunta; De hecho, este problema ha existido por un tiempo y todavía no he encontrado la solución perfecta. Sin embargo, estoy más que feliz de compartir mi experiencia:
Use otros métodos de codificación . Tal vez intente aprender más sobre otros métodos que son sólidos para este problema, al menos por el momento, como codificación basada en objetivos, hash (consulte algunas referencias a continuación). Si está con Python, hay un buen paquete que ofrece opciones de codificación mant. Es posible que se sorprenda al ver que otros métodos simples a menudo funcionan bien.
Vuelve a entrenar a tu modelo . Teóricamente, al aprender su tren / set debería haber tenido la misma distribución (principalmente esto se considera como distribución objetivo, pero también puede ser cierto respecto a las variables). Ahora que entran en juego nuevos elementos, su distribución de datos de prueba (invisible) ha cambiado. Entonces es mejor volver a capacitar al modelo para que esas nuevas ciudades sean contabilizadas.
Poner subcategorías recién agregadas (y las menos frecuentes) a otros . Si bien el punto anterior es cierto en teoría, es muy probable que la distribución de la prueba (de esa categoría en particular) no cambie drásticamente en la mayoría de los casos, por ejemplo, muy pocos ítems pasan a la parte superior de las categorías en el conjunto de entrenamiento. Quizás, como en su caso, puede tener 100 ciudades en la función de ciudad, y muy pocas nuevas aparecen con el tiempo. Lo que consideraría sería mirar el cuantil X-cuantil de esa categoría en particular, y poner los menos frecuentes en la subcategoría Otros . Asumiendo que su punto de datos recién agregado es solo pequeño, va mucho a los Otrosgrupo. Seguramente perderá un nivel de granularidad al hacer esto, pero una vez más, el punto de aprendizaje es que no solo su modelo aprende los datos de entrenamiento, sino lo más importante para poder generalizar muy bien los datos no vistos y si esas nuevas categorías agregadas son muy puntos de datos, agruparlos por completo en el grupo Otros no hará daño.
Otras soluciones recientes aún no maduras como Cat2Vec (tomado de Word2Vec de PNL) o Similarity Encoding . Estos son muy recientes, revise el documento para el primero y su github y un ejemplo (basado en Word2Vec) en Kaggle, y este documento para el segundo y su implementación . La idea del primero es convertir categorías a vectores. Por mucho que tenga que decir que realmente tiene sentido trabajar, pero no tengo experiencia en usarlo. Este último, llamado dirty_cat , parece bastante prometedor y fácil de usar. ¡No es claro si es robusto tener una categoría cardinal invisible en los datos de su prueba!
PD: Me gustaría agregar que la idea de ciudad a una ubicación geográfica dada en el primer comentario es realmente agradable y en realidad no es complicada, ya que son muchas API de Python, por ejemplo, de Google o AQUÍ que te permiten hacer eso. Pero se observa que esta es solo una forma de diseñar nuevas características y ciertamente no debe ser reemplazado por la característica de la ciudad en sí.
Referencias interesantes para verificar primero , segundo , tercero , cuarto (¡sin un orden en particular!)
Todos los puntos mencionados anteriormente son soluciones prácticas, concretamente teóricamente correctas, y seguramente están sujetas a más debates. Y estoy más que feliz de aprender más.
fuente
Lo más simple (que generalmente es un buen lugar para comenzar) es codificar de manera rápida sus ciudades donde cada ciudad se convierte en una característica única y tiene valores de 1 (la persona es de esa ciudad) o 0 (no de esa ciudad). Si aparece una nueva ciudad en un conjunto de prueba que no está presente en el conjunto de entrenamiento, esa persona solo tendrá 0 para todas las ciudades del conjunto de entrenamiento. Esto puede parecer extraño, pero, si esa ciudad no está en el conjunto de entrenamiento, entonces no debe colocarse peso sobre una persona de esa ciudad.
El siguiente paso sería algo similar a lo que sugirió Mohammad Athar y tener una idea de la proximidad geográfica a otras ciudades en su conjunto de entrenamiento. Eso va a ser mucho más complicado, así que dejaré que alguien más lo comente.
fuente
Deberías probar Vowpal Wabbit , que maneja características nuevas muy bonitas utilizando un truco de hashing y tasas de aprendizaje adaptativo.
No solo no se bloqueará cuando aparezcan nuevas funciones (en el tren o en el momento de la prueba), sino que también comenzará a actualizar sus pesos. Además de eso, es rápido y malvado. Sin embargo, solo implementa variantes del modelo lineal, por lo que está restringido en ese lado. Una herramienta muy poderosa para conocer
fuente