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