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)