繁体   English   中英

在 piepline 中使用特征选择和 ML model 时,如何确保 sklearn piepline 应用 fit_transform 方法?

[英]How to be sure that sklearn piepline applies fit_transform method when using feature selection and ML model in piepline?

假设我想使用 sklearn 管道应用几种特征选择方法。 下面提供了一个示例:

from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.feature_selection import VarianceThreshold
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split


X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

fs_pipeline = Pipeline([('vt', VarianceThreshold(0.01)),
                        ('kbest', SelectKBest(chi2, k=5)),
                        ])

X_new = fs_pipeline.fit_transform(X_train, y_train)

我使用fit_transform方法获得选定的特征。 如果我在管道上使用fit方法,我将得到管道 object。

现在,假设我想将 ML model 添加到管道中,如下所示:

from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.feature_selection import VarianceThreshold
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)


model = Pipeline([('vt', VarianceThreshold(0.01)),
                  ('kbest', SelectKBest(chi2, k=5)),
                  ('gbc', GradientBoostingClassifier(random_state=0))])


model.fit(X_train, y_train)
y_pred = model.predict(X_test)
accuracy_score(y_test, y_pred)

如果我在上面的代码中使用fit_transform方法( model.fit_transform(X_train, y_train) ),我得到错误:

AttributeError: 'GradientBoostingClassifier' object has no attribute 'transform'

所以。 我应该使用model.fit(X_train, y_train) 但是,我如何确定管道将fit_transform方法应用于特征选择步骤?

管道用于顺序数据转换(为此它需要多次调用.fit_transform() )。 您可以确定在管道的中间步骤(基本上在除最后一个步骤之外的所有步骤)上调用了.fit_transform() ,因为它是按设计工作的。

也就是说,当在 Pipeline 实例上调用.fit().fit_transform()时, .fit_transform()会在所有中间转换器上按顺序调用,但最后一个转换器除外,并且每次调用该方法的 output 作为参数传递给下一个调用. 在最后一步,根据管道本身调用的方法调用.fit().fit_transform() 实际上,在最后一步中,估计器通常比转换器更常用(就像GradientBoostingClassifier的情况一样)。

每当最后一步是由估计器而不是转换器组成时,如您的情况,您将无法在管道实例上调用.fit_transform() ,因为管道本身公开了最终估计器/转换器的相同方法,并且在考虑的情况下,估计器既不公开.transform()也不.fit_transform()

加起来,

  • 在最后一步中使用估计器的情况(您只能在管道上调用.fit() ); model.fit(X_train, y_train)含义如下:

     final_estimator.fit(transformer_n.fit_transform(transformer_n_minus_1.fit_transform(...transformer0.fit_transform(X_train, y_train))))

    在你的情况下变成

     gbc.fit(k_best.fit_transform(vt.fit_transform(X_train, y_train)))
  • 在最后一步使用变压器的情况(您可以在管道上调用.fit().fit_transform() ,但假设您正在调用.fit_transform() ); model.fit_transform(X_train, y_train)含义如下:

     final_estimator.fit_transform(transformer_n.fit_transform(transformer_n_minus_1.fit_transform(...transformer0.fit_transform(X_train, y_train))))

最后,这里是源代码中的参考: https://github.com/scikit-learn/scikit-learn/blob/baf0ea25d6dd034403370fea552b21a6776bef18/sklearn/pipeline.py#L351

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM