Python機器學習庫SKLearn:數據集轉換之管道和特徵

4.1 管道和特徵:組合估計量

4.1.1 管道:鏈接估計

管道可以用於將多個估計器鏈接成一個。 這是有用的,因爲在處理數據中經常有固定的步驟序列,例如特徵選擇,歸一化和分類。 管道在這裏有兩個目的:
方便:您只需調用fit和預測一次您的數據,以適應一個完整的估計量序列。
聯合參數選擇:可以一次性在管線中的所有估計量的參數上進行網格搜索。
流水線中的所有估計器,除了最後一個,必須是變換器(即必須具有變換方法)。 最後一個估計器可以是任何類型(變換器,分類器等)。

4.1.1.1 用法

流水線是使用(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(steps=[('reduce_dim', PCA(copy=True, iterated_power='auto',
n_components=None, random_state=None, svd_solver='auto', tol=0.0,
whiten=False)), ('clf', SVC(C=1.0, cache_size=200, class_weight=None,
coef0=0.0, decision_function_shape=None, degree=3, gamma='auto',
kernel='rbf', max_iter=-1, probability=False, random_state=None,
shrinking=True, tol=0.001, verbose=False))])

效用函數make_pipeline是構造管道的簡寫; 它需要一個可變數量的估計器並返回一個管道,自動填充名稱:

from sklearn.pipeline import make_pipeline
from sklearn.naive_bayes import MultinomialNB
from sklearn.preprocessing import Binarizer
make_pipeline(Binarizer(), MultinomialNB()) 
輸出:Pipeline(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))
並在named_steps中作爲dict存在:

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)

設置參數:

pipe.set_params(clf__C=10) 
輸出:Pipeline(steps=[('reduce_dim', PCA(copy=True, iterated_power='auto',
    n_components=None, random_state=None, svd_solver='auto', tol=0.0,
    whiten=False)), ('clf', SVC(C=10, cache_size=200, class_weight=None,
    coef0=0.0, decision_function_shape=None, degree=3, gamma='auto',
    kernel='rbf', max_iter=-1, probability=False, random_state=None,
    shrinking=True, tol=0.001, verbose=False))])

這對於網格搜索尤爲重要:

>>> from sklearn.model_selection import GridSearchCV
>>> params = dict(reduce_dim__n_components=[2, 5, 10],
...               clf__C=[0.1, 10, 100])
>>> grid_search = GridSearchCV(pipe, param_grid=params)
單個步驟也可以替換爲參數,非最終步驟可以通過將其設置爲None:

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

4.1.2 FeatureUnion:複合特徵空間

FeatureUnion將多個轉換器對象組合成一個新的轉換器,結合了它們的輸出。 FeatureUnion獲取轉換器對象的列表。 在擬合期間,這些中的每一個獨立地擬合數據。 對於變換數據,變換器被並行應用,並且它們輸出的樣本向量端對端地連接成較大的向量。
FeatureUnion具有與Pipeline相同的目的 - 方便和聯合參數估計和驗證。
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,
    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)

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