为什么 ColumnTransformer 在其变压器上不调用 fit?

dzi*_*iou 6 python scikit-learn

我已经定义了用于拟合一个分类特征“性别”的数据:

data = pd.DataFrame({
    'age': [25,19, 17],
    'sex': ['female', 'male', 'female'],
    'won_lottery': [False, True, False]
})
X = data[['age', 'sex']]
y = data['won_lottery']
Run Code Online (Sandbox Code Playgroud)

和用于转换分类特征的管道:

ohe = OneHotEncoder(handle_unknown='ignore')
cat_transformers = Pipeline([
    ('onehot', ohe)
])
Run Code Online (Sandbox Code Playgroud)

cat_transformers直接拟合数据时

cat_transformers.fit(X[['sex']], y)
print(ohe.get_feature_names())
Run Code Online (Sandbox Code Playgroud)

我能够获得OneHotEncoder实例创建的输出特征的名称:

['x0_female' 'x0_male']    
Run Code Online (Sandbox Code Playgroud)

但是,如果我封装cat_transformersColumnTransformer

preprocessor = ColumnTransformer(
    transformers=[
        ('cat', cat_transformers, ['sex'])
    ]
)
preprocessor.fit(X, y)
print(ohe.get_feature_names())
Run Code Online (Sandbox Code Playgroud)

它失败了

sklearn.exceptions.NotFittedError: This OneHotEncoder instance is not fitted yet. 
  Call 'fit' with appropriate arguments before using this method.
Run Code Online (Sandbox Code Playgroud)

我希望,在调用fit()上的ColumnTransformer原因,呼吁fit()其所有变压器。

为什么它不能这样工作?

dzi*_*iou 6

好的,我现在明白了。我正在安装一个实例OneHotEncoder并检查另一个实例的功能:

print(id(ohe))
print(id(preprocessor.named_transformers_['cat'].named_steps['onehot']))

2757198591872
2755226729104
Run Code Online (Sandbox Code Playgroud)

它看起来像是ColumnTranformer在安装之前克隆了它的变压器。

  • 我还在“ColumnTransformer”中使用了“OneHotEncoder”,我需要功能名称,但我也得到了“NotFittedError”。你的解决方法是什么?你知道为什么“ColumnTranformer”在拟合之前克隆它的变压器吗?我觉得很奇怪。从文档(https://scikit-learn.org/stable/modules/compose.html)中,“启用缓存会在安装之前触发变压器的克隆。”但我们不在这里缓存...... (4认同)
  • 我希望我们更接近了解如何获取功能名称 (2认同)
  • @hipoglucido 使用 `transformer_` 看到这个答案 /sf/answers/4412756841/ (2认同)