[英]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.