簡體   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