¿Cómo codificar características categóricas en sklearn?

Tengo un conjunto de datos con 41 características [de 0 a 40 columnas], de las cuales 7 son categóricas. Este conjunto categórico se divide en dos subconjuntos:

  • Un subconjunto de tipo de cadena (las características de columna 1, 2, 3)
  • Un subconjunto de tipo int, en forma binaria 0 o 1 (las características de columna 6, 11, 20, 21)

Además, las características de las columnas 1, 2 y 3 (de tipo cadena) tienen la cardinalidad 3, 66 y 11 respectivamente. En este contexto, tengo que codificarlos para usar el algoritmo de máquina de vectores de soporte. Este es el código que tengo:

import numpy as np import pandas as pd from sklearn import preprocessing from sklearn import feature_extraction df = pd.read_csv("train.csv") datanumpy = df.as_matrix() X = datanumpy[:, 0:40] # select columns 1 through 41 (the features) y = datanumpy[:, 41] # select column 42 (the labels) 

No sé si es mejor usar DictVectorizer() o OneHotEncoder() [por las razones que expuse anteriormente], y sobre todo de qué manera usarlas [en términos de código] con la matriz X que tengo. ¿O debería simplemente asignar un número a cada cardinalidad en el subconjunto del tipo de cadena (ya que tienen una alta cardinalidad y, por lo tanto, mi espacio de características boostá exponencialmente)?

EDITAR Con respecto al subconjunto del tipo int, supongo que la mejor opción es mantener las características de la columna como están (no pasarlas a ningún codificador). El problema persiste en el subconjunto del tipo de cadena con alta cardinalidad.

Esto es, con mucho, el más fácil:

  df = pd.get_dummies(df, drop_first=True) 

Si obtiene un desbordamiento de memoria o es demasiado lento, reduzca la cardinalidad:

 top = df[col].isin(df[col].value_counts().index[:10]) df.loc[~top, col] = "other" 

Según la documentación oficial de One Hot Encoder, debe aplicarse sobre el conjunto de datos combinado (Train and Test). De lo contrario, puede que no forme una encoding adecuada.

Y en cuanto al rendimiento, creo que One Hot Encoder es mucho mejor que DictVectorizer.

Puede usar el método de pandas .get_dummies() como lo sugiere @simon aquí arriba, o puede usar el equivalente de sklearn dado por OneHotEncoder .

Prefiero OneHotEncoder porque puede pasarle parámetros como las características categóricas que desea codificar y la cantidad de valores que debe mantener para cada característica (si no se indica, seleccionará automáticamente el número óptimo).

Si, para algunas características, la cardinalidad es demasiado grande, imponga n_values bajos. Si tiene suficiente memoria, no se preocupe, codifique todos los valores de sus funciones.

Supongo que para una cardinalidad de 66, si tiene una computadora básica, codificar todas las 66 características no llevará a un problema de memoria. El desbordamiento de memoria generalmente ocurre cuando, por ejemplo, tiene tantos valores para una función como la cantidad de muestras en su conjunto de datos (el caso de las ID que son únicas para cada muestra). Cuanto más grande sea el conjunto de datos, es más probable que tenga un problema de memoria.

 from sklearn.preprocessing import LabelEncoder, OneHotEncoder labelencoder_X = LabelEncoder() X[:, 0] = labelencoder_X.fit_transform(X[:, 0]) onehotencoder = OneHotEncoder(categorical_features = [0]) X = onehotencoder.fit_transform(X).toarray()