gpt4 book ai didi

python - 有没有办法在 sklearn 管道中链接 pd.cut FunctionTransformer?

转载 作者:行者123 更新时间:2023-12-04 15:25:08 28 4
gpt4 key购买 nike

我正在使用 sklearn 制作 DataFrame 预处理管道并链接各种类型的预处理步骤。

我想链接一个 SimpleImputer 转换器和一个 FunctionTransformer 应用 pd.qcut(或 pd.cut) 但我不断收到以下错误:

ValueError: Input array must be 1 dimensional

这是我的代码:

from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import FunctionTransformer

class FeatureSelector(BaseEstimator, TransformerMixin):
def __init__(self, features):
self._features = features

def fit(self, X, y=None):
return self

def transform(self, X, y=None):
return X[self._features]

fare_transformer = Pipeline([
('fare_selector', FeatureSelector(['Fare'])),
('fare_imputer', SimpleImputer(strategy='median')),
('fare_bands', FunctionTransformer(func=pd.qcut, kw_args={'q': 5}))
])

如果我简单地将 FeatureSelector 转换器和 FunctionTransformerpd.qcut 链接在一起并省略 SimpleImputer:

fare_transformer = Pipeline([
('fare_selector', FeatureSelector(['Fare'])),
('fare_bands', FunctionTransformer(func=pd.qcut, kw_args={'q': 5}))
])

我广泛搜索了 stackoverflow 和谷歌,但找不到解决此问题的方法。如有任何帮助,我们将不胜感激!

最佳答案

sklearn 已经有了这样的转换器,KBinsDiscretizer(要匹配pd.qcut,使用strategy='quantile')。它的主要区别在于它如何转换测试数据:FunctionTransformer 版本将“重新调整”分位数,而内置的KBinsDiscretizer 将保存分箱测试数据的分位数统计。正如 @m_power 在评论中指出的那样,它们在 bin 边缘附近以及转换数据的格式上也有所不同。

但要具体解决错误:这意味着您的函数 qcut 仅适用于一维数组,而 FunctionTransformer 发送整个数据帧。您可以围绕 qcut 定义一个薄包装器来完成这项工作,例如

def frame_qcut(X, y=None, q=10):
return X.apply(pd.qcut, axis=0, q=q)

(假设您将获得一个数据框。)

关于python - 有没有办法在 sklearn 管道中链接 pd.cut FunctionTransformer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62440192/

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