中文文檔: 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