python - 为什么 ColumnTransformer 不在其转换器上调用 fit?

标签 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']

和转换分类特征的管道:

ohe = OneHotEncoder(handle_unknown='ignore')
cat_transformers = Pipeline([
    ('onehot', ohe)
])

直接用数据拟合cat_transformers

cat_transformers.fit(X[['sex']], y)
print(ohe.get_feature_names())

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

['x0_female' 'x0_male']    

但是,如果我将 cat_transformers 封装到 ColumnTransformer 中:

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

它失败了

sklearn.exceptions.NotFittedError: This OneHotEncoder instance is not fitted yet. 
  Call 'fit' with appropriate arguments before using this method.

我希望在 ColumnTransformer 上调用 fit() 会导致在其所有转换器上调用 fit()

为什么这样不行?

最佳答案

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

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

2757198591872
2755226729104

看起来 ColumnTranformer 在拟合之前克隆了它的转换器。

关于python - 为什么 ColumnTransformer 不在其转换器上调用 fit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56556148/

相关文章:

python - 创建 3 阶 numpy 数组

python - Django:如何读取嵌套的 url 正则表达式

python - JIT 编译函数中的任意精度算法

python - 使用 flask 棉花糖序列化几何

python - Scikit Learn SGDClassifier Partial_Fit 错误

python - 如何让Python决策树更容易理解?

python - 递归查找已更改的文件

python - 如何保存 CV 的多个模型的字典(并循环使用它们)

python - python/sklearn 中错误分类成本不平等

scikit-learn - 使用 Sklearn 的 graphviz 时未拟合错误