¿Cómo puedo hacer una clasificación con datos categóricos que no es fijo?

10

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 sexfueran female, las únicas etiquetas posibles serían , maley other, sin importar qué. Sin embargo, mi variable categórica es cityque 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.

Marisa
fuente
1
¿Puedes convertir citya un número basado en alguna función? De city' = f(latitude, longitude)esa manera, puede crear un nuevo valor para cualquier ciudad
Mohammad Athar
@MohammadAthar aquí ha dado la solución perfecta, ¡espero que OP lo vea!
Francesco Pegoraro

Respuestas:

11

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:

  • Evite la codificación en caliente tanto como sea posible (al contrario de lo que se sugirió anteriormente). El razonamiento es que no funcionará. Un modelo con funciones de codificación en caliente solo funciona cuando todos esos subniveles habían existido en los datos de entrenamiento. El modelo no podrá hacer predicciones, a menos que de alguna manera se modifique manualmente. Si busca, encontrará que muchas personas se encontraron con este problema al dividir sus datos en entrenamiento / prueba, y enfrentaron el problema de que algunos subniveles de una característica particular no estaban presentes en la división de entrenamiento y posteriormente no pudieron hacer predicciones en la prueba. Dicho a un lado, si tiene características cardinales muy altas (tal vez como su ciudad con, digamos, 200 nombres de ciudades), ¡esto aumentará la dimensionalidad de sus datos innecesariamente! Si por alguna razón necesita hacer una codificación en caliente, solo tenga esto en cuenta.
  • 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.

Pingüinos Gemelos
fuente
1
¿Qué pasa con la creación de agrupaciones de ciudades similares? Como si incluso tuviéramos una nueva ciudad, no es diferente de lo que ya tenemos, ¿podemos verificar con la ciudad más cercana?
Aditya
Placer Aditya. Esa es también otra excelente idea. No sé acerca de la nueva "Codificación de similitud", podría ser el caso de que estén haciendo exactamente lo mismo. Mira su tutorial. También una nota al margen de que hay que tener cuidado con la agrupación que se utilizará para los datos categóricos, como los modos k, después de todas sus distancias no tienen un significado similar al de los valores numéricos.
TwinPenguins
Gracias por tu gran respuesta. ¿Cómo podría hacer el reentrenamiento? Quiero decir, imagina que tengo un nuevo candidato y quiero predecir si él / ella es bueno o malo, ¿cómo podría volver a capacitar a mi modelo si no tengo su verdadera etiqueta que indique si es bueno o no? No veo la manera de incluir estos nuevos datos para hacer el reciclaje y me perderé el punto de predicción. ¿Me equivoco?
Marisa
De nada. Acerca del reciclaje: literalmente significa comenzar de nuevo, mezclar todos sus datos asegurándose de tener nuevos datos y comenzar a aprender nuevamente. El otro punto que mencionó es que no tiene la etiqueta verdadera para ese nuevo punto de datos en particular: esta es una historia muy diferente en sí misma. Lo que podría hacer para etiquetar este punto de datos es buscar ese punto de datos más similar y tomar la etiqueta desde allí como el algoritmo KNN muy simple.
TwinPenguins
4

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.

DJBunk
fuente
¡Comenzar de manera simple y crecer desde allí es un gran consejo!
Escachator
0

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

slymore
fuente