【Scikit-Learn 中文文檔】Pipeline(管道)和 FeatureUnion(特徵聯合): 合併的評估器 - 數據集轉換 - 用戶指南 | ApacheCN

中文文檔: http://sklearn.apachecn.org/cn/stable/modules/pipeline.html

英文文檔: http://sklearn.apachecn.org/en/stable/modules/pipeline.html

官方文檔: http://scikit-learn.org/stable/

GitHub: https://github.com/apachecn/scikit-learn-doc-zh(覺得不錯麻煩給個 Star,我們一直在努力)

貢獻者: https://github.com/apachecn/scikit-learn-doc-zh#貢獻者

關於我們: http://www.apachecn.org/organization/209.html




4.1. Pipeline(管道)和 FeatureUnion(特徵聯合): 合併的評估器

4.1.1. Pipeline: 鏈式評估器

Pipeline 可以把多個評估器鏈接成一個。這個是很有用的,因爲處理數據的步驟一般都是固定的,例如特徵選擇、標準化和分類。
Pipeline 主要有兩個目的:
便捷性和封裝性
你只要對數據調用 ``fit``和 ``predict``一次來適配所有的一系列評估器。
聯合的參數選擇
你可以一次 :ref:`grid search <grid_search>`管道中所有評估器的參數。
安全性
訓練轉換器和預測器使用的是相同樣本,管道有助於防止來自測試數據的統計數據泄露到交叉驗證的訓練模型中。

管道中的所有評估器,除了最後一個評估器,管道的所有評估器必須是轉換器。 (例如,必須有 transform 方法). 最後一個評估器的類型不限(轉換器、分類器等等)

4.1.1.1. 用法

Pipeline 使用一系列 (key, value) 鍵值對來構建,其中 key 是你給這個步驟起的名字, value 是一個評估器對象:

>>>
>>> from sklearn.pipeline import Pipeline
>>> from sklearn.svm import SVC
>>> from sklearn.decomposition import PCA
>>> estimators = [('reduce_dim', PCA()), ('clf', SVC())]
>>> pipe = Pipeline(estimators)
>>> pipe 
Pipeline(memory=None,
         steps=[('reduce_dim', PCA(copy=True,...)),
                ('clf', SVC(C=1.0,...))])

功能函數 make_pipeline 是構建管道的縮寫; 它接收多個評估器並返回一個管道,自動填充評估器名:

>>>
>>> from sklearn.pipeline import make_pipeline
>>> from sklearn.naive_bayes import MultinomialNB
>>> from sklearn.preprocessing import Binarizer
>>> make_pipeline(Binarizer(), MultinomialNB()) 
Pipeline(memory=None,
         steps=[('binarizer', Binarizer(copy=True, threshold=0.0)),
                ('multinomialnb', MultinomialNB(alpha=1.0,
                                                class_prior=None,
                                                fit_prior=True))])

管道中的評估器作爲一個列表保存在 steps 屬性內:

>>>
>>> pipe.steps[0]
('reduce_dim', PCA(copy=True, iterated_power='auto', n_components=None, random_state=None,
  svd_solver='auto', tol=0.0, whiten=False))

並作爲 dict 保存在 named_steps:

>>>
>>> pipe.named_steps['reduce_dim']
PCA(copy=True, iterated_power='auto', n_components=None, random_state=None,
  svd_solver='auto', tol=0.0, whiten=False)

管道中的評估器參數可以通過 <estimator>__<parameter> 語義來訪問:

>>>
>>> pipe.set_params(clf__C=10) 
Pipeline(memory=None,
         steps=[('reduce_dim', PCA(copy=True, iterated_power='auto',...)),
                ('clf', SVC(C=10, cache_size=200, class_weight=None,...))])

named_steps 的屬性映射到多個值,在交互環境支持 tab 補全:

>>>
>>> pipe.named_steps.reduce_dim is pipe.named_steps['reduce_dim']
True

這對網格搜索尤其重要:

>>>
>>> from sklearn.model_selection import GridSearchCV
>>> param_grid = dict(reduce_dim__n_components=[2, 5, 10],
...                   clf__C=[0.1, 10, 100])
>>> grid_search = GridSearchCV(pipe, param_grid=param_grid)

單獨的步驟可以用多個參數替換,除了最後步驟,其他步驟都可以設置爲 None 來跳過

>>>
>>> from sklearn.linear_model import LogisticRegression
>>> param_grid = dict(reduce_dim=[None, PCA(5), PCA(10)],
...                   clf=[SVC(), LogisticRegression()],
...                   clf__C=[0.1, 10, 100])
>>> grid_search = GridSearchCV(pipe, param_grid=param_grid)

也可以參閱:

4.1.1.2. 注意點

對管道調用 fit 方法的效果跟依次對每個評估器調用 fit 方法一樣, 都是``transform`` 輸入並傳遞給下個步驟。 管道中最後一個評估器的所有方法,管道都有,例如,如果最後的評估器是一個分類器, Pipeline 可以當做分類器來用。如果最後一個評估器是轉換器,管道也一樣可以。

4.1.1.3. 緩存轉換器:避免重複計算

適配轉換器是很耗費計算資源的。設置了``memory`` 參數, Pipeline 將會在調用``fit``方法後緩存每個轉換器。 如果參數和輸入數據相同,這個特徵用於避免重複計算適配的轉換器。典型的例子是網格搜索轉換器,該轉化器只要適配一次就可以多次使用。

memory 參數用於緩存轉換器。

memory 可以是包含要緩存的轉換器的目錄的字符串或一個 joblib.Memory 對象:

>>>
>>> from tempfile import mkdtemp
>>> from shutil import rmtree
>>> from sklearn.decomposition import PCA
>>> from sklearn.svm import SVC
>>> from sklearn.pipeline import Pipeline
>>> estimators = [('reduce_dim', PCA()), ('clf', SVC())]
>>> cachedir = mkdtemp()
>>> pipe = Pipeline(estimators, memory=cachedir)
>>> pipe 
Pipeline(...,
         steps=[('reduce_dim', PCA(copy=True,...)),
                ('clf', SVC(C=1.0,...))])
>>> # Clear the cache directory when you don't need it anymore
>>> rmtree(cachedir)

Warning

 

Side effect of caching transfomers

使用 Pipeline 而不開啓緩存功能,還是可以通過查看原始實例的,例如:

>>>
>>> from sklearn.datasets import load_digits
>>> digits = load_digits()
>>> pca1 = PCA()
>>> svm1 = SVC()
>>> pipe = Pipeline([('reduce_dim', pca1), ('clf', svm1)])
>>> pipe.fit(digits.data, digits.target)
... 
Pipeline(memory=None,
         steps=[('reduce_dim', PCA(...)), ('clf', SVC(...))])
>>> # The pca instance can be inspected directly
>>> print(pca1.components_) 
    [[ -1.77484909e-19  ... 4.07058917e-18]]

開啓緩存會在適配前觸發轉換器的克隆。因此,管道的轉換器實例不能被直接查看。 在下面例子中, 訪問 PCA 實例 pca2將會引發 AttributeError 因爲 pca2 是一個未適配的轉換器。 這時應該使用屬性 named_steps 來檢查管道的評估器:

>>>
>>> cachedir = mkdtemp()
>>> pca2 = PCA()
>>> svm2 = SVC()
>>> cached_pipe = Pipeline([('reduce_dim', pca2), ('clf', svm2)],
...                        memory=cachedir)
>>> cached_pipe.fit(digits.data, digits.target)
... 
 Pipeline(memory=...,
          steps=[('reduce_dim', PCA(...)), ('clf', SVC(...))])
>>> print(cached_pipe.named_steps['reduce_dim'].components_)
... 
    [[ -1.77484909e-19  ... 4.07058917e-18]]
>>> # Remove the cache directory
>>> rmtree(cachedir)

4.1.2. FeatureUnion(特徵聯合): 個特徵層面

FeatureUnion 合併了多個轉換器對象形成一個新的轉換器,該轉換器合併了他們的輸出。一個 FeatureUnion 可以接收多個轉換器對象。在適配期間,每個轉換器都單獨的和數據適配。 對於轉換數據,轉換器可以併發使用,且輸出的樣本向量被連接成更大的向量。

FeatureUnion 功能與 Pipeline 一樣- 便捷性和聯合參數的估計和驗證。

可以結合:class:FeatureUnion 和 Pipeline 來創造出複雜模型。

(一個 FeatureUnion 沒辦法檢查兩個轉換器是否會產出相同的特徵。它僅僅在特徵集合不相關時產生聯合並確認是調用者的職責。)

4.1.2.1. 用法

一個 FeatureUnion 是通過一系列 (key, value) 鍵值對來構建的,其中的 key 給轉換器指定的名字 (一個絕對的字符串; 他只是一個代號), value 是一個評估器對象:

>>>
>>> from sklearn.pipeline import FeatureUnion
>>> from sklearn.decomposition import PCA
>>> from sklearn.decomposition import KernelPCA
>>> estimators = [('linear_pca', PCA()), ('kernel_pca', KernelPCA())]
>>> combined = FeatureUnion(estimators)
>>> combined 
FeatureUnion(n_jobs=1,
             transformer_list=[('linear_pca', PCA(copy=True,...)),
                               ('kernel_pca', KernelPCA(alpha=1.0,...))],
             transformer_weights=None)

跟管道一樣,特徵聯合有一個精簡版的構造器叫做:func:make_union ,該構造器不需要顯式給每個組價起名字。

正如 Pipeline, 單獨的步驟可能用``set_params``替換 ,並設置爲 ``None``來跳過:

>>>
>>> combined.set_params(kernel_pca=None)
... 
FeatureUnion(n_jobs=1,
             transformer_list=[('linear_pca', PCA(copy=True,...)),
                               ('kernel_pca', None)],
             transformer_weights=None)



中文文檔: http://sklearn.apachecn.org/cn/stable/modules/pipeline.html

英文文檔: http://sklearn.apachecn.org/en/stable/modules/pipeline.html

官方文檔: http://scikit-learn.org/stable/

GitHub: https://github.com/apachecn/scikit-learn-doc-zh(覺得不錯麻煩給個 Star,我們一直在努力)

貢獻者: https://github.com/apachecn/scikit-learn-doc-zh#貢獻者

關於我們: http://www.apachecn.org/organization/209.html

有興趣的們也可以和我們一起來維護,持續更新中 。。。

機器學習交流羣: 629470233

發佈了29 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章