如何编写具有两个输入的 fit_transformer 并将其包含在 python sklearn 的管道中?

Posted

技术标签:

【中文标题】如何编写具有两个输入的 fit_transformer 并将其包含在 python sklearn 的管道中?【英文标题】:How to write a fit_transformer with two inputs and include it in a pipeline in python sklearn? 【发布时间】:2017-01-26 14:56:58 【问题描述】:

鉴于一些虚假数据:

X = pd.DataFrame( np.random.randint(1,10,28).reshape(14,2) )
y = pd.Series( np.repeat([0,1], [10,4]) ) # imbalanced with more 0s than 1s

我编写了一个 sklearn 拟合转换器,它对 y 的大部分进行欠采样以匹配少数标签的长度。我想在管道中使用它。

from sklearn.base import BaseEstimator, TransformerMixin

class UnderSampling(BaseEstimator, TransformerMixin):
    def fit(self, X, y): # I don't need fit to do anything
        return self

    def transform(self, X, y):
        is_pos = y == 1
        idx_pos = y[is_pos].index
        random.seed(random_state)
        idx_neg = random.sample(y[~is_pos].index, is_pos.sum())
        idx = sorted(list(idx_pos) + list(idx_neg))
        X_resampled = X.loc[idx]
        y_resampled = y.loc[idx]
        return X_resampled, y_resampled

    def fit_transform(self, X, y):
        return self.transform(X,y)

最不幸的是,我不能在管道中使用它。

from sklearn.pipeline import make_pipeline
us = UnderSampling()
rfc = RandomForestClassifier()
model = make_pipeline(us, rfc)
model.fit(X,y)

我怎样才能使这个管道工作?

【问题讨论】:

【参考方案1】:

您并不是要直接在类上调用估算器方法,而是要在类实例上调用它;这是因为估计器通常具有某种类型的存储状态(例如模型系数):

u = UnderSampling()
a,b = u.fit(X, y)
a,b = u.fit_transform(X, y)

【讨论】:

以上是关于如何编写具有两个输入的 fit_transformer 并将其包含在 python sklearn 的管道中?的主要内容,如果未能解决你的问题,请参考以下文章

用C语言编写程序,如何输入两个整数,并求和。

sklearn PCA fit_transform() 是不是居中输入变量?

fit_transform 中的错误:输入包含 NaN、无穷大或对于 dtype('float64') 而言太大的值

如何使用带有 countVectorizer.fit_transform() 的腌制分类器来标记数据

二次特征化器:使用 fit_transform 进行预处理

如何在具有多个数据帧列输入的 sklearn 管道中编写转换器