Mantener la misma variable ficticia en los datos de entrenamiento y pruebas.

Estoy construyendo un modelo de predicción en python con dos conjuntos de pruebas y entrenamiento separados. Los datos de entrenamiento contienen variables categóricas de tipo numérico, por ejemplo, código postal, [91521,23151,12355, …], y también variables categóricas de cadenas, por ejemplo, ciudad [‘Chicago’, ‘Nueva York’, ‘Los Ángeles’, …].

Para entrenar los datos, primero uso los ‘pd.get_dummies’ para obtener una variable ficticia de estas variables, y luego adapto el modelo con los datos de entrenamiento transformados.

Realizo la misma transformación en mis datos de prueba y predigo el resultado utilizando el modelo entrenado. Sin embargo, recibí el error ‘ValueError: El número de características del modelo debe coincidir con la entrada. El modelo n_features es 1487 y la entrada n_features es 1345 ‘ . La razón es porque hay menos variables ficticias en los datos de prueba porque tiene menos ‘ciudad’ y ‘código postal’.

¿Como puedó resolver esté problema? Por ejemplo, ‘OneHotEncoder’ solo codificará todas las variables categóricas de tipo numérico. ‘DictVectorizer ()’ solo codificará todas las variables categóricas de tipo de cadena. Busco en línea y veo algunas preguntas similares, pero ninguna de ellas realmente responde a mi pregunta.

Manejo de características categóricas utilizando scikit-learn

https://www.quora.com/If-the-training-dataset-has-more-variables-than-the-test-dataset-what-does-one-do

https://www.quora.com/What-is-the-best-way-to-do-a-binary-one-hot-one-of-K-coding-in-Python

También puede obtener las columnas que faltan y agregarlas al conjunto de datos de prueba:

# Get missing columns in the training test missing_cols = set( train.columns ) - set( test.columns ) # Add a missing column in test set with default value equal to 0 for c in missing_cols: test[c] = 0 # Ensure the order of column in the test set is in the same order than in train set test = test[train.columns] 

Este código también garantiza que se eliminará la columna resultante de la categoría en el conjunto de datos de prueba pero no presente en el conjunto de datos de capacitación

Suponga que tiene nombres de funciones idénticos en el conjunto de datos de prueba y de tren. Puede generar conjuntos de datos concatenados desde el tren y la prueba, obtener dummies desde el conjunto de datos concatenado y dividirlo para entrenar y probar nuevamente.

Puedes hacerlo de esta manera:

 import pandas as pd train = pd.DataFrame(data = [['a', 123, 'ab'], ['b', 234, 'bc']], columns=['col1', 'col2', 'col3']) test = pd.DataFrame(data = [['c', 345, 'ab'], ['b', 456, 'ab']], columns=['col1', 'col2', 'col3']) train_objs_num = len(train) dataset = pd.concat(objs=[train, test], axis=0) dataset_preprocessed = pd.get_dummies(dataset) train_preprocessed = dataset_preprocessed[:train_objs_num] test_preprocessed = dataset_preprocessed[train_objs_num:] 

En consecuencia, tiene el mismo número de funciones para el conjunto de datos de prueba y tren.

 train2,test2 = train.align(test, join='outer', axis=1, fill_value=0) 

train2 y test2 tienen las mismas columnas. Fill_value indica el valor a usar para las columnas que faltan.

Esta es una pregunta bastante antigua, pero si pretende utilizar la API de aprendizaje de scikit, puede usar la siguiente clase DummyEncoder: https://gist.github.com/psinger/ef4592492dc8edf101130f0bf32f5ff9

Lo que hace es que utiliza el tipo de categoría para especificar qué simulacros se deben crear, como también se detalla aquí: Creación ficticia en tramitación con diferentes niveles en el tren y el conjunto de pruebas