【處理流程00】管理流程神器Pipeline(管道)

1.整體把握:

Pipeline(管道)正如名字一樣,直觀上理解是用於對數據處理各個流程進行規範化統一管理的工具。

Pipeline 可以把多個評估器鏈接成一個。這個是很有用的,因爲處理數據的步驟一般都是固定的,例如特徵選擇、標準化和分類。

特點:
【1】便捷性和封裝性
你只要對數據調用 fitpredict一次來適配所有的一系列評估器。
【2】聯合的參數選擇
你可以一次 :ref:grid search <grid_search>管道中所有評估器的參數。
【3】安全性
訓練轉換器和預測器使用的是相同樣本,管道有助於防止來自測試數據的統計數據泄露到交叉驗證的訓練模型中。

2.用法介紹

2.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,...))])
2)自動命名評估器:
上面是手動指定評估器名稱的方法。還有一種自動填充評估器名稱的方法。
自動功能函數 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))])
這個例子相較於上一個就是沒有指定評估器名稱,但是其自動指定了。

2.2怎麼查找??

方法一:管道中的評估器作爲一個列表保存在 steps 屬性內(其實很直觀啊,用step這個詞強調過程步驟性):

>>> 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)

2.3評估器的參數怎麼訪問修改??

管道中的評估器參數可以通過 <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)

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

佔個位,緩存轉換器???


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

FeatureUnion 合併了多個轉換器對象形成一個新的轉換器,該轉換器合併了他們的輸出。一個 FeatureUnion 可以接收多個轉換器對象。在適配期間,每個轉換器都單獨的和數據適配。 對於轉換數據,轉換器可以併發使用,且輸出的樣本向量被連接成更大的向量。
FeatureUnion 功能與 Pipeline 一樣- 便捷性和聯合參數的估計和驗證。
可以結合:class:FeatureUnion 和 Pipeline 來創造出複雜模型。
(直觀上理解,可以理解爲多個流水線同時並行對數據操作,各個流水線工作互不影響)
(FeatureUnion無法檢查兩個轉換器是否可能產生相同的特徵,當特徵集不相交時,它只產生一個並集,並確保它們是調用者的責任。)

3.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,
    iterated_power='auto', n_components=None, random_state=None,
    svd_solver='auto', tol=0.0, whiten=False)), ('kernel_pca',
    KernelPCA(alpha=1.0, coef0=1, copy_X=True, degree=3,
    eigen_solver='auto', fit_inverse_transform=False, gamma=None,
    kernel='linear', kernel_params=None, max_iter=None, n_components=None,
    n_jobs=1, random_state=None, remove_zero_eig=False, tol=0))],
    transformer_weights=None)

像管道一樣,特徵聯合體有一個稱爲make_union的簡化構造函數,不需要顯式命名組件。像管道一樣,單個步驟可以使用set_params替換,並通過設置爲None來忽略:

>>> combined.set_params(kernel_pca=None) 
FeatureUnion(n_jobs=1, transformer_list=[('linear_pca', PCA(copy=True,
      iterated_power='auto', n_components=None, random_state=None,
      svd_solver='auto', tol=0.0, whiten=False)), ('kernel_pca', None)],
    transformer_weights=None)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章