应用 ColumnTransformer 后,我遇到列顺序问题。如果运行以下代码:
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OrdinalEncoder
df = pd.DataFrame({
'FeatureA': [1.05, 0.5, 2.5],
'FeatureB': [0, -5, -15],
'CatFeatureA': ['feat1', 'feat2', 'feat3'],
'CatFeatureB': ['cat1', 'cat2', 'cat3'],
'FeatureC': [250, 125.5, 300]
})
transformer = ColumnTransformer(
[("drop", "drop", ["FeatureC"]),
("ordinal", OrdinalEncoder(), ["CatFeatureA", "CatFeatureB"])],
remainder="passthrough"
)
features = pd.DataFrame(columns=df.drop("FeatureC", axis=1).columns, index=df.index, data=transformer.fit_transform(df))
您会注意到输出是:
Out[70]:
FeatureA FeatureB CatFeatureA CatFeatureB
0 0.0 0.0 1.05 0.0
1 1.0 1.0 0.50 -5.0
2 2.0 2.0 2.50 -15.0
基本上,这些值与列不正确对齐:FeatureA 和 FeatureB 下的值实际上是 CatFeatureA 和 CatFeatureB 下应有的值,反之亦然。
如何确保值正确对齐?似乎用 OrdinalEncoder 编码的功能总是先行,但是我希望有一个更强大的方法,因为变压器将来可以扩展。
您的问题是由于使用或
remainder='passthrough'
。
ColumnTransformer
文档中明确指出的:
remainder{‘drop’, ‘passthrough’}或估计器,默认=‘drop’
[...]
请注意,使用此功能需要 DataFrame 列输入 拟合和变换具有相同的顺序
这里的情况并非如此。
transformer.get_feature_names_out()
array(['ordinal__CatFeatureA', 'ordinal__CatFeatureB',
'remainder__FeatureA', 'remainder__FeatureB'], dtype=object)
您可以使用:
features = pd.DataFrame(data=transformer.fit_transform(df),
index=df.index,
columns=transformer.get_feature_names_out(),
)
输出:
ordinal__CatFeatureA ordinal__CatFeatureB remainder__FeatureA remainder__FeatureB
0 0.0 0.0 1.05 0.0
1 1.0 1.0 0.50 -5.0
2 2.0 1.0 2.50 -15.0