Scikit-Learn: Categorical Variables

103 views
Skip to first unread message

Patricio Del Boca

unread,
Mar 16, 2015, 3:17:31 PM3/16/15
to sci...@googlegroups.com
Gente,

Estoy tratando de crear un clasificador usando Scikit-Learn. Idealmente quiero crear un RandomForest y un SVM para comparar resutados.

Mi dataset tiene fechas, booleans, muchas variables categoricas (estación, estado_pavimento, tipo_accidente, tipo_vehiculo, etc) y pocas numéricas. En R el uso de variables categoricas (factors) era bastante straight-forward.

Estoy teniendo problemas para preparar el input al clasificador dado que Scikit Learn recibe numpy arrays (y hasta ahora trabajaba con pandas DataFrames). He leido que existen métodos como OneHotEnconder y DictVectorizer para esta tarea.

Mi consulta concreta: Alguien conoce algún tutorial, workshop, libro, paper, blog, video, en donde se explique con detalle el uso de estos métodos? Algún tutorial donde se explique cómo trabajar con variables categoricas con Scikit-Learn?

Gracias!

P.D: Ya estoy leyendo la doc de scikit pero aún estoy teniendo problemas para entender.

--
Patricio Del Boca
Ingeniero en Sistemas de Información - CSM

Martín Gaitán

unread,
Mar 16, 2015, 5:22:57 PM3/16/15
to sci...@googlegroups.com
2015-03-16 16:17 GMT-03:00 Patricio Del Boca <patrici...@gmail.com>:
recibe numpy arrays (y hasta ahora trabajaba con pandas DataFrames).

no te sirve df.as_matrix() ? 

Rafael Carrascosa

unread,
Mar 16, 2015, 6:13:58 PM3/16/15
to sci...@googlegroups.com
Hola Pato,

No conozco tutorial, tuve la misma duda en su momento y no encontré nada bueno (si encontrás compartí), es como que "todo el mundo" asume que uno ya lo sabe (lo cual no es cierto y es una mala asumpción).
Te escribo algo de lo que entiendo del tema:

AFAIK: la forma estandar de códificar features categóricos es con 1-en-k (OneHotEnconder). Si tu feature vale rojo, verde y amarillo entonces
rojo -> 001
verde -> 010
amarillo -> 100

Cuando tenes 20 features categoricos cada sub-vector codificado con 1-en-k se concatena para formar un gran vector que codifica todos los features.

El otro caso clásico es codificar features que producen conjuntos de cosas (suena bag-of-words?). Ponele que tu feature es el conjunto de personas que fueron a una fiesta y las personas posibles son Tomas, Felix, Julián y Pancho ;) ;) ;) entonces:
{Tomas, Félix} -> 1100
{Tomas, Pancho} -> 1001
{Felix, Julian, Pancho -> 0111
etc.

Este tipo de codificación lo hace scikit-learn con CountVectorizer .

De nuevo AFAIK: Esos son los dos grandes tipos de encodeo de features categóricos. Todas las otras formas de codificar objectos raros que yo he visto (grafos, imágenes, etc) terminan decantando en uno de estos dos métodos (ie, hacen un truco mátematico para trabajar con categorias o sets de categorias).

Para reducir el boilerplate de codificar los features (entre otras cosas) hicimos featureforge[0] hace un año... es meterse en más quilombo pero soluciona varios problemas entre ellos el de la codificacion de features categóricos y features que son conjuntos.


Espero que sirva! Cualquier cosa pregunta por más, un abrazo!


Rafa





2015-03-16 16:17 GMT-03:00 Patricio Del Boca <patrici...@gmail.com>:

--
You received this message because you are subscribed to the Google Groups "SciPy Latin America" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scipyla+u...@googlegroups.com.
To post to this group, send email to sci...@googlegroups.com.
Visit this group at http://groups.google.com/group/scipyla.
For more options, visit https://groups.google.com/d/optout.

Patricio Del Boca

unread,
Mar 16, 2015, 7:31:28 PM3/16/15
to sci...@googlegroups.com
Gracias gente!

Mañana pruebo algunas implementaciones y vuelvo con feedback :)

Saludos,

Patricio Del Boca

unread,
Mar 17, 2015, 3:45:36 PM3/17/15
to sci...@googlegroups.com
Bueno,

Después de scrapear toda la Web y leer llegué a un par de conclusiones y quiero compartir. (Leer todos los puntos con un AFAIK adelante :P)
  •  Tal cual dijo Rafa en un par de mails, la forma de encarar Variables Categóricas es a través de 1-en-k (ver dos mails atrás)
  •  Hay varias formas de hacerlo, aquí un notebook de ejemplo, que me resultó muy util.
  •  La forma más facil es invocar al método get_dummies() de pandas. Ya viene pensado para ello por lo que detecta automáticamente variables categóricas y aplica la transformación correspondiente. Por cada <categoría> en una <columna>, crea una nueva columna: <feature>_<categoría> y la rellena con 0 y 1 correspondientemente.
  • Tomando como ejemplo una columna color, métodos como OneHotEncoder, en vez de crear una nueva columna por cada color, reemplazan en la columna original, los valores en texto por arrays booleanos (0. , 1. , 0.).
Las Dummies Variables no es un invento de scikit-learn ni de pandas. Es un término estadístico del que pueden leer acá. Por lo que leí también, causa problemas de Multicollinearity, pero según lo que se dice por la Web, no es problema para SVM.

Terminé utilizando la función de pandas para generar las features, ahora tengo que ver como volver a las "categorias" después de predecido. Pero eso lo veo otro día, por lo pronto ya pude correr los primeros experimentos.

Saludos,

Rafael Carrascosa

unread,
Mar 17, 2015, 3:53:36 PM3/17/15
to sci...@googlegroups.com
Gracias Pato por compartir el resultado!

Javier Burroni

unread,
Mar 17, 2015, 3:53:44 PM3/17/15
to sci...@googlegroups.com
Hola Patricio, 
la multicolinealidad la resolves facilmente si eliminas una de las variables dummies. (suponiendo que estas haciendo una regresión y tenés una constante). 
Lo que ocurre si no eliminas una variable es que esa variable categórica (expandida en sus dummies) va a ser equivalente a la constante que pusiste en tu modelo. 
" To be is to do " ( Socrates )
" To be or not to be " ( Shakespeare )
" To do is to be " ( Sartre )
" Do be do be do " ( Sinatra )
Reply all
Reply to author
Forward
0 new messages