gpt4 book ai didi

python - 使用 SimpleImputer 和 OneHotEncoder 的管道 - 如何正确执行?

转载 作者:行者123 更新时间:2023-12-05 02:35:32 27 4
gpt4 key购买 nike

我面临着创建管道来估算 (SI) 类别变量(例如颜色)然后 onehotencode (OHE) 2 个变量(例如颜色和星期几)的挑战。颜色用于 2 个步骤。

我想将 SI 和 OHE 放在 1 个 ColumnTransformer 中。我刚刚了解到 SI 和 OHE 并行运行,这意味着 OHE 不会对估算颜色进行编码(即 OHE 是原始的未估算颜色。)

然后我尝试了:

si = SimpleImputer(strategy='mean', add_indicator=True)
ohe = OneHotEncoder(sparse=False,drop='first')

ctsi = ColumnTransformer(transformers=[('si',si,['colour'])],remainder='passthrough')
ctohe = ColumnTransformer(transformers=[('ohe',ohe,['colour','dayofweek'])],remainder='passthrough')

pl = Pipeline([('ctsi',ctsi),('ctohe',ctohe)])

outfit = pl.fit_transform(X,y)

我得到错误:

ValueError: Specifying the columns using strings is only supported for pandas DataFrames

我相信这是因为列名颜色已被 SI 删除。当我将 OHE 列更改为 int 列表时:

ctohe = ColumnTransformer(transformers=[('ohe',ohe,[0,1])],remainder='passthrough')

它通过了。我只是在测试处理过程,显然,列不正确。

所以我在这里面临的挑战是,考虑到我想要完成的事情,这可能吗?我该怎么做?

非常感谢!

最佳答案

其实,我同意你的推理。问题是由以下事实给出的 ColumnTransformer忘记了转换后的列名,实际上 - 引用 the answer in here - ColumnTransformer的预期用途是处理并行 应用的转换。这也在 doc 中指定我认为通过这句话:

This estimator allows different columns or column subsets of the input to be transformed separately. [...] This is useful for heterogeneous or columnar data, to combine several feature extraction mechanisms or transformations into a single transformer.

我想对此的一种解决方案可能是对列进行自定义重命名,将可调用传递给columns ColumnTransformer的一部分的 transformers元组 (name, transformer, columns) (文档后面的符号)根据您的需要(实际上,如果您将可调用对象传递给管道中的第二个 ColumnTransformer 实例,我想这会起作用)。编辑:我不得不以某种方式撤回我写的东西,我实际上不确定将可调用项传递给列是否可以满足您的需要,因为您的问题并没有真正解决列选择本身,而是通过字符串列名称进行列选择,为此您需要一个 DataFrame(并且仅作用于列选择器的 imo 不会解决此类问题)。

相反,您可能更好地需要一个转换器,以某种方式更改列名称​​在插补之后在单热编码之前(仍然假设设置不是当 ColumnTransformer 的不同实例必须在 Pipeline 中按顺序转换相同的变量时是理想的)作用于 DataFrame。

其实几个月前,以下https://github.com/scikit-learn/scikit-learn/pull/21078被合并;我怀疑它不在最新版本中,因为通过升级 sklearn我无法让它工作。无论如何,IMO, future 它可能会在类似情况下缓解,因为它添加了 get_feature_names_out()SimpleImputerget_feature_names_out()反过来在处理列名时非常有用。

一般来说,我也会建议the same post linked above了解更多详情。

最后,这是我可以得到的一个天真的例子;它不可扩展(我试图利用 feature_names_in_ 适合的 SimpleImputer 实例的属性来获得更具可扩展性的东西,但没有得到一致的结果)但希望能给出一些提示。

import numpy as np
import pandas as pd
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
from sklearn.base import BaseEstimator, TransformerMixin

X = pd.DataFrame({'city': ['London', 'London', 'Paris', np.NaN],
'title': ['His Last Bow', 'How Watson Learned the Trick', 'A Moveable Feast', 'The Grapes of Wrath'],
'expert_rating': [5, 3, 4, 5],
'user_rating': [4, 5, 4, 3]})

ct_1 = ColumnTransformer([('si', SimpleImputer(strategy='most_frequent'), ['city'])],
remainder='passthrough')
ct_2 = ColumnTransformer([('ohe', OneHotEncoder(), ['city'])], remainder='passthrough', verbose_feature_names_out=True)

class ColumnExtractor(BaseEstimator, TransformerMixin):
def __init__(self, columns):
self.columns = columns

def transform(self, X, *_):
return pd.DataFrame(X, columns=self.columns)

def fit(self, *_):
return self

pipe = Pipeline([
('ct_1', ct_1),
('ce', ColumnExtractor(['city', 'title', 'expert_rating', 'user_rating'])),
('ct_2', ct_2)
])

pipe.fit_transform(X)

关于python - 使用 SimpleImputer 和 OneHotEncoder 的管道 - 如何正确执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70533682/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com