Saltar al contenido

¿Cuáles son los pros y los contras entre get_dummies (Pandas) y OneHotEncoder (Scikit-learn)?

Bienvenido a nuestra comunidad, ahora hallarás la resolución que buscas.

Solución:

Para el aprendizaje automático, casi definitivamente querrá usar sklearn.OneHotEncoder. Para otras tareas como análisis simples, es posible que pueda usar pd.get_dummiesque es un poco más conveniente.

Tenga en cuenta que sklearn.OneHotEncoder ha sido actualizado en la última versión para que acepta cadenas para variables categóricas, así como enteros.

El quid de esto es que el sklearn codificador crea una función que persiste y puede luego aplicarse a nuevos conjuntos de datos que usan las mismas variables categóricas, con resultados consistentes.

from sklearn.preprocessing import OneHotEncoder

# Create the encoder.
encoder = OneHotEncoder(handle_unknown="ignore")
encoder.fit(X_train)    # Assume for simplicity all features are categorical.

# Apply the encoder.
X_train = encoder.transform(X_train)
X_test = encoder.transform(X_test)

Observe cómo aplicamos el mismo codificador que creamos a través de X_train al nuevo conjunto de datos X_test.

Considere lo que sucede si X_test contiene diferentes niveles que X_train para una de sus variables. Por ejemplo, digamos X_train["color"] contiene solo "red" y "green"pero además de esos, X_test["color"] a veces contiene "blue".

si usamos pd.get_dummies, X_test terminará con un adicional "color_blue" columna que X_train no tiene, y la inconsistencia probablemente romperá nuestro código más adelante, especialmente si estamos alimentando X_test a una sklearn modelo en el que entrenamos X_train.

Y si queremos procesar los datos de esta manera en producción, donde recibimos un solo ejemplo a la vez, pd.get_dummies no será de utilidad.

Con sklearn.OneHotEncoder por otro lado, una vez que hemos creado el codificador, podemos reutilizarlo para producir la misma salida cada vez, con columnas solo para "red" y "green". Y podemos controlar explícitamente lo que sucede cuando se encuentra con el nuevo nivel "blue": si creemos que eso es imposible, entonces podemos decirle que arroje un error con handle_unknown="error"; de lo contrario, podemos decirle que continúe y simplemente establecer las columnas roja y verde en 0, con handle_unknown="ignore".

OneHotEncoder no puede procesar string valores directamente. Si sus características nominales son cadenas, primero debe convertirlas en números enteros.

pandas.get_dummies es un poco lo contrario. Por defecto, solo convierte string columnas en representación one-hot, a menos que se especifiquen columnas.

¿Por qué no simplemente almacenar en caché o guardar las columnas como variable col_list de los get_dummies resultantes y luego usar pd.reindex para alinear los conjuntos de datos de tren vs prueba… ejemplo:

df = pd.get_dummies(data)
col_list = df.columns.tolist()

new_df = pd.get_dummies(new_data)
new_df = new_df.reindex(columns=col_list).fillna(0.00) 

Comentarios y puntuaciones de la guía

Eres capaz de patrocinar nuestro quehacer fijando un comentario o puntuándolo te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *