主要目标如下:
-
将
StandardScaler
应用于连续变量 -
将
LabelEncoder
和OnehotEncoder
应用于分类变量
需要缩放连续变量,但同时,几个分类变量也是整数类型的。应用StandardScaler
会导致不希望的效果。
另一侧,StandardScaler
将扩展基于整数的分类变量,这也不是我们想要的。
由于连续变量和分类变量混合在单个Pandas
数据框中,因此建议解决此类问题的建议工作流程是什么?
最好说明我的意思的最好示例是Kaggle自行车共享需求数据集,其中season
和weather
是整数分类变量
查看 sklearn_pandas.DataFrameMapper
meta-transformer。将其用作管道中的第一步,以执行列的数据工程操作:
mapper = DataFrameMapper(
[(continuous_col, StandardScaler()) for continuous_col in continuous_cols] +
[(categorical_col, LabelBinarizer()) for categorical_col in categorical_cols]
)
pipeline = Pipeline(
[("mapper", mapper),
("estimator", estimator)]
)
pipeline.fit_transform(df, df["y"])
另外,您应该使用sklearn.preprocessing.LabelBinarizer
而不是[LabelEncoder(), OneHotEncoder()]
的列表。
在scikit-learn中查看columntransformer
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler,LabelBinarizer
numeric_columns=list(X.select_dtypes('float64').columns)
categorical_columns=list(X.select_dtypes('int64').columns)
pipeline=ColumnTransformer([
('num',StandardScaler(),numeric_columns),
('cat',LabelBinarizer(),categorical_columns),
])
new_X=pipeline.fit_transform(X)