manejar demasiadas funciones categóricas usando scikit-learn

Soy bastante nuevo en scikit-learn y estoy tratando de usar este paquete para hacer predicciones sobre los datos de ingresos. Tal vez sea una pregunta duplicada, ya que vi otra publicación sobre esto, pero estoy buscando un ejemplo fácil para entender lo que se espera de los estimadores de scikit-learn.

Los datos que tengo son de la siguiente estructura, donde muchas características son categóricas (por ejemplo: clase de trabajo, educación …)

age: continuous. workclass: Private, Self-emp-not-inc, Self-emp-inc, Federal-gov, Local-gov, State-gov, Without-pay, Never-worked. fnlwgt: continuous. education: Bachelors, Some-college, 11th, HS-grad, Prof-school, Assoc-acdm, Assoc-voc, 9th, 7th-8th, 12th, Masters, 1st-4th, 10th, Doctorate, 5th-6th, Preschool. education-num: continuous. marital-status: Married-civ-spouse, Divorced, Never-married, Separated, Widowed, Married-spouse-absent, Married-AF-spouse. occupation: Tech-support, Craft-repair, Other-service, Sales, Exec-managerial, Prof-specialty, Handlers-cleaners, Machine-op-inspct, Adm-clerical, Farming-fishing, Transport-moving, Priv-house-serv, Protective-serv, Armed-Forces. relationship: Wife, Own-child, Husband, Not-in-family, Other-relative, Unmarried. race: White, Asian-Pac-Islander, Amer-Indian-Eskimo, Other, Black. sex: Female, Male. capital-gain: continuous. capital-loss: continuous. hours-per-week: continuous. native-country: United-States, Cambodia, England, Puerto-Rico, Canada, Germany, Outlying-US(Guam-USVI-etc), India, Japan, Greece, South, China, Cuba, Iran, Honduras, Philippines, Italy, Poland, Jamaica, Vietnam, Mexico, Portugal, Ireland, France, Dominican-Republic, Laos, Ecuador, Taiwan, Haiti, Columbia, Hungary, Guatemala, Nicaragua, Scotland, Thailand, Yugoslavia, El-Salvador, Trinadad&Tobago, Peru, Hong, Holand-Netherlands. 

Ejemplos de registros:

 38 Private 215646 HS-grad 9 Divorced Handlers-cleaners Not-in-family White Male 0 0 40 United-States <=50K 53 Private 234721 11th 7 Married-civ-spouse Handlers-cleaners Husband Black Male 0 0 40 United-States 50K 

Estoy teniendo dificultades para manejar las características categóricas, ya que la mayoría de los modelos en sckit-learn esperan que todas las características sean números. Proporcionan algunas clases para transformar / codificar tales características (como Onehotencoder, DictVectorizer) pero no puedo encontrar una forma de usarlas en mis datos. Sé que hay muchos pasos involucrados aquí antes de codificarlos completamente en números, pero me pregunto si alguien sabe de una manera más simple y eficiente (ya que hay muchas de esas características) que se puede entender con un ejemplo. Sé vagamente que DictVectorizer es el camino a seguir, pero necesito ayuda sobre cómo proceder aquí.

Aquí hay un código de ejemplo usando DictVectorizer . Primero, vamos a configurar algunos datos en el shell de Python. Os dejo leyendo de un archivo a vosotros.

 >>> features = ["age", "workclass", "fnlwgt", "education", "education-num", "marital-status", "occupation", ... "relationship", "race", "sex", "capital-gain", "capital-loss", "hours-per-week", "native-country"] >>> input_text = """38 Private 215646 HS-grad 9 Divorced Handlers-cleaners Not-in-family White Male 0 0 40 United-States <=50K ... 53 Private 234721 11th 7 Married-civ-spouse Handlers-cleaners Husband Black Male 0 0 40 United-States <=50K ... 30 State-gov 141297 Bachelors 13 Married-civ-spouse Prof-specialty Husband Asian-Pac-Islander Male 0 0 40 India >50K ... """ 

Ahora, analice estos:

 >>> for ln in input_text.splitlines(): ... values = ln.split() ... y.append(values[-1]) ... d = dict(zip(features, values[:-1])) ... samples.append(d) 

¿Qué tenemos ahora? Vamos a revisar:

 >>> from pprint import pprint >>> pprint(samples[0]) {'age': '38', 'capital-gain': '0', 'capital-loss': '0', 'education': 'HS-grad', 'education-num': '9', 'fnlwgt': '215646', 'hours-per-week': '40', 'marital-status': 'Divorced', 'native-country': 'United-States', 'occupation': 'Handlers-cleaners', 'race': 'White', 'relationship': 'Not-in-family', 'sex': 'Male', 'workclass': 'Private'} >>> print(y) ['<=50K', '<=50K', '>50K'] 

Estas samples están listas para DictVectorizer , así que DictVectorizer :

 >>> from sklearn.feature_extraction import DictVectorizer >>> dv = DictVectorizer() >>> X = dv.fit_transform(samples) >>> X <3x29 sparse matrix of type '' with 42 stored elements in Compressed Sparse Row format> 

Además, tiene X e y que se pueden pasar a un estimador, siempre que sea compatible con matrices dispersas. (De lo contrario, pase sparse=False al constructor DictVectorizer ).

Las muestras de prueba también pueden pasarse a DictVectorizer.transform ; Si hay combinaciones de características / valores en el conjunto de pruebas que no se producen en el conjunto de entrenamiento, éstas simplemente serán ignoradas (porque el modelo aprendido no puede hacer nada sensible con ellas de todos modos).