ColumnTransformer
De cara al futuro, cuando se invoca el método .fit_transform(X)
en un objeto Pipeline
, este aplica cada transformador al conjunto completo de características en X
. Sin embargo, este comportamiento puede no ser siempre el deseado.
Por ejemplo, es posible que no se desee codificar valores numéricos o que se necesite aplicar diferentes transformadores a columnas específicas — como utilizar OrdinalEncoder
para características ordinales y OneHotEncoder
para características nominales.
El ColumnTransformer
resuelve este problema al permitir que cada columna sea tratada por separado. Para crear un ColumnTransformer
, se puede utilizar la función make_column_transformer
del módulo sklearn.compose
.
La función toma como argumentos tuplas con el transformador y la lista de columnas a las que se debe aplicar dicho transformador.
Por ejemplo, se puede crear un ColumnTransformer
que aplique el OrdinalEncoder
solo a la columna 'education'
y el OneHotEncoder
solo a la columna 'gender'
.
ct = make_column_transformer(
(OrdinalEncoder(), ['education']),
(OneHotEncoder(), ['gender']), remainder='passthrough'
)
El argumento remainder
especifica la acción a tomar con las columnas no mencionadas en make_column_transformer
(en este caso, columnas distintas de 'gender'
y 'education'
).
Por defecto, está configurado como 'drop'
, lo que significa que cualquier columna no mencionada será eliminada del conjunto de datos. Para incluir estas columnas sin modificar en la salida, establezca remainder
en 'passthrough'
.
Por ejemplo, considere el archivo exams.csv
. Contiene varias columnas nominales ('gender'
, 'race/ethnicity'
, 'lunch'
, 'test preparation course'
) y una columna ordinal, 'parental level of education'
.
12345import pandas as pd df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/a65bbc96-309e-4df9-a790-a1eb8c815a1c/exams.csv') print(df.head())
Utilizando ColumnTransformer
, los datos nominales pueden transformarse con OneHotEncoder
y los datos ordinales con OrdinalEncoder
en un solo paso.
123456789101112131415import pandas as pd from sklearn.compose import make_column_transformer from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/a65bbc96-309e-4df9-a790-a1eb8c815a1c/exams.csv') # Ordered categories of parental level of education for OrdinalEncoder edu_categories = ['high school', 'some high school', 'some college', "associate's degree", "bachelor's degree", "master's degree"] # Making a column transformer ct = make_column_transformer( (OrdinalEncoder(categories=[edu_categories]), ['parental level of education']), (OneHotEncoder(), ['gender', 'race/ethnicity', 'lunch', 'test preparation course']), remainder='passthrough' ) print(ct.fit_transform(df))
El ColumnTransformer
es en sí mismo un transformador, por lo que proporciona los métodos estándar .fit()
, .fit_transform()
y .transform()
.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Awesome!
Completion rate improved to 3.13
ColumnTransformer
Desliza para mostrar el menú
De cara al futuro, cuando se invoca el método .fit_transform(X)
en un objeto Pipeline
, este aplica cada transformador al conjunto completo de características en X
. Sin embargo, este comportamiento puede no ser siempre el deseado.
Por ejemplo, es posible que no se desee codificar valores numéricos o que se necesite aplicar diferentes transformadores a columnas específicas — como utilizar OrdinalEncoder
para características ordinales y OneHotEncoder
para características nominales.
El ColumnTransformer
resuelve este problema al permitir que cada columna sea tratada por separado. Para crear un ColumnTransformer
, se puede utilizar la función make_column_transformer
del módulo sklearn.compose
.
La función toma como argumentos tuplas con el transformador y la lista de columnas a las que se debe aplicar dicho transformador.
Por ejemplo, se puede crear un ColumnTransformer
que aplique el OrdinalEncoder
solo a la columna 'education'
y el OneHotEncoder
solo a la columna 'gender'
.
ct = make_column_transformer(
(OrdinalEncoder(), ['education']),
(OneHotEncoder(), ['gender']), remainder='passthrough'
)
El argumento remainder
especifica la acción a tomar con las columnas no mencionadas en make_column_transformer
(en este caso, columnas distintas de 'gender'
y 'education'
).
Por defecto, está configurado como 'drop'
, lo que significa que cualquier columna no mencionada será eliminada del conjunto de datos. Para incluir estas columnas sin modificar en la salida, establezca remainder
en 'passthrough'
.
Por ejemplo, considere el archivo exams.csv
. Contiene varias columnas nominales ('gender'
, 'race/ethnicity'
, 'lunch'
, 'test preparation course'
) y una columna ordinal, 'parental level of education'
.
12345import pandas as pd df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/a65bbc96-309e-4df9-a790-a1eb8c815a1c/exams.csv') print(df.head())
Utilizando ColumnTransformer
, los datos nominales pueden transformarse con OneHotEncoder
y los datos ordinales con OrdinalEncoder
en un solo paso.
123456789101112131415import pandas as pd from sklearn.compose import make_column_transformer from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/a65bbc96-309e-4df9-a790-a1eb8c815a1c/exams.csv') # Ordered categories of parental level of education for OrdinalEncoder edu_categories = ['high school', 'some high school', 'some college', "associate's degree", "bachelor's degree", "master's degree"] # Making a column transformer ct = make_column_transformer( (OrdinalEncoder(categories=[edu_categories]), ['parental level of education']), (OneHotEncoder(), ['gender', 'race/ethnicity', 'lunch', 'test preparation course']), remainder='passthrough' ) print(ct.fit_transform(df))
El ColumnTransformer
es en sí mismo un transformador, por lo que proporciona los métodos estándar .fit()
, .fit_transform()
y .transform()
.
¡Gracias por tus comentarios!