param_grid = [ {'C': [1, 10, 100, 1000], 'kernel': ['linear']}, {'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']}, ]指定兩個網格搜索:一個是具有線性內核的網格,並且C值在[1、10、100、1000]中,另一個是具有RBF內核的網格,C值的交叉積(cross-product )在[1、10、100、1000]中,gamma值在[0.001、0.0001]中。GridSearchCV 實例實現估計器API:當將其「擬合」到一個數據集上時,所有可能的參數值組合都將被計算並保留最佳組合。關於數字數據集上的網格搜索計算示例,請參見使用交叉驗證網格搜索的參數估計。有關使用pipeline.Pipeline實例的帶分類器(這裡是一個使用彈性網(elastic net)和L2懲罰項的SGD訓練的線性支持向量機)的文本文檔特徵提取器(n-gram計數矢量器(count vectorizer)和TF-IDF轉換器)的網格搜索耦合參數示例,請參見文本特徵提取和評估的示例管道。有關在iris數據集上交叉驗證循環內網格搜索的示例,請參嵌套交叉驗證與非嵌套交叉驗證。這是使用網格搜索評估模型性能的最佳實踐。請參閱在cross_val_score和GridSearchCV上的多指標評估演示,以獲取同時評估多個指標的GridSearchCV示例。有關在GridSearchCV中使用 refit=callable 接口的示例,請參見平衡模型複雜性和交叉驗證分數。這個例子展示了在識別「最佳」估計器時這個接口如何增加一定的靈活性。此接口也可用於多指標評估。2. 隨機參數優化(Randomized Parameter Optimization)雖然使用參數設置網格是當前使用最廣泛的參數優化方法,但其他搜索方法具有更有利的特性。RandomizedSearchCV 實現對參數的隨機搜索,其中每個設置都從可能的參數值上的分布中進行採樣。與窮盡搜索相比,這有兩個主要好處:使用字典指定應該如何對參數進行採樣,這與為GridSearchCV指定參數非常相似。此外,計算預算,即抽樣候選值(sampled candidates)的數量或抽樣迭代(sampling iterations)次數,是使用n_iter 參數指定的。對於每個參數,可以指定可能值的分布或離散選擇列表(將統一採樣):{'C': scipy.stats.expon(scale=100), 'gamma': scipy.stats.expon(scale=.1), 'kernel': ['rbf'], 'class_weight':['balanced', None]}此示例使用scipy.stats模塊,該模塊包含許多採樣參數的有用分布,如expon, gamma, uniform 或 randint。原則上,可以傳遞任何提供rvs(random variate sample)方法來採樣值。對rvs 函數的調用應在連續調用時從可能的參數值中提供獨立的隨機樣本。scipy 0.16之前版本的scipy.stats中不允許指定隨機狀態。相反,它們使用全局numpy隨機狀態,可以通過 np.random.seed播種,也可以使用np.random.set_state設置。但是,從scikit-learn 0.18開始,sklearn.model_selection模塊設置用戶提供的隨機狀態(如果scipy>=0.16也可用)。對於連續參數,例如上面的C ,指定連續分布以充分利用隨機化是很重要的。這樣,增大n_iter值將使得搜索更精細。通過loguniform可以得到一個連續的log-uniform隨機變量。這是log-spaced參數的連續版本。例如,要在上面指定C ,可以使用loguniform(1, 100),而不是[1, 10, 100]或np.logspace(0, 2, num=1000)。這是SciPy's stats.reciprocal的別名。在上述網格搜索的示例中,我們可以指定一個連續的隨機變量,該變量在1e0和1e3之間呈log-uniformly分布:from sklearn.utils.fixes import loguniform{'C': loguniform(1e0, 1e3), 'gamma': loguniform(1e-4, 1e-3), 'kernel': ['rbf'], 'class_weight':['balanced', None]}比較用於超參數估計的隨機搜索和網格搜索 比較隨機搜索和網格搜索的使用和效率。Bergstra, J. and Bengio, Y., Random search for hyper-parameter optimization, The Journal of Machine Learning Research (2012)3. 參數搜索技巧3.1. 指定目標度量(objective metric)默認情況下,參數搜索使用估計器的score 函數來評估參數設置的性能。這些是用於分類的sklearn.metrics.accuracy_score和用於回歸的sklearn.metrics.r2_score。對於某些應用程式,其他評分函數更適合(例如在不平衡分類中,準確度評分(accuracy score)通常不具信息性(uninformative))。另一個評分函數可以通過scoring 參數指定給GridSearchCV、RandomizedSearchCV 和下面描述的許多專用交叉驗證工具。詳見 評分參數:定義模型評價規則。3.2. 指定多個評估指標GridSearchCV 和RandomizedSearchCV 允許為scoring 參數指定多個度量指標。多指標評分(Multimetric scoring)可以指定為預定義分數名稱的字符串列表,也可以指定將分數名稱映射到分數函數和/或預定義分數名稱的字典(dict)。有關詳細信息,請參見使用多指標評估。當指定多個度量指標時,refit 參數必須設置為在其中可以找到best_params_,並用於在整個數據集上構建best_estimator_ 的度量(字符串)。如果搜索不應該refit,請設置refit=False。將refit保留為默認值None 將在使用多個度量時導致錯誤。有關示例用法,請參見在cross_val_score和GridSearchCV上的多指標評估演示。3.3. 複合估計器(Composite estimators)與參數空間GridSearchCV 和RandomizedSearchCV 允許使用專用語法__搜索複合或嵌套估計器的參數,如Pipeline, ColumnTransformer, VotingClassifier 或者 CalibratedClassifierCV:>>> from sklearn.model_selection import GridSearchCV>>> from sklearn.calibration import CalibratedClassifierCV>>> from sklearn.ensemble import RandomForestClassifier>>> from sklearn.datasets import make_moons>>> X, y = make_moons()>>> calibrated_forest = CalibratedClassifierCV(... base_estimator=RandomForestClassifier(n_estimators=10))>>> param_grid = {... 'base_estimator__max_depth': [2, 4, 6, 8]}>>> search = GridSearchCV(calibrated_forest, param_grid, cv=5)>>> search.fit(X, y)GridSearchCV(cv=5, estimator=CalibratedClassifierCV(...), param_grid={'base_estimator__max_depth': [2, 4, 6, 8]})在本例中嵌套估計器的參數名是base_estimator。如果meta-estimator被構造為pipeline.Pipeline中估計器的集合,則引用估計器的名稱,請參見嵌套參數。實際上,可以有幾個層次的嵌套:>>> from sklearn.pipeline import Pipeline>>> from sklearn.feature_selection import SelectKBest>>> pipe = Pipeline([... ('select', SelectKBest()),... ('model', calibrated_forest)])>>> param_grid = {... 'select__k': [1, 2],... 'model__base_estimator__max_depth': [2, 4, 6, 8]}>>> search = GridSearchCV(pipe, param_grid, cv=5).fit(X, y)3.4. 模型選擇:開發與評估通過評估各種參數設置進行模型選擇可以看作是使用標記數據「訓練」網格參數的一種方法。在模型評估結果時,重要的是對網格搜索過程中未見過的保留樣本執行此操作:建議將數據拆分為開發集(development set)(將被送到GridSearchCV 的實例)和計算性能指標的評估集(evaluation set)。這可用train_test_split 工具函數來實現。3.5. 並行機制GridSearchCV和RandomizedSearchCV 獨立評估每個參數設置。如果您的作業系統支持並行,則可以使用關鍵字 n_jobs=-1並行運行計算。有關詳細信息,請參見函數籤名(function signature)。3.6. 對異常的魯棒性某些參數設置可能導致無法訓練一個或多個數據 folds 。默認情況下,將導致整個搜索失敗,即使某些參數設置可以被完全估計。設置error_score=0(或=np.NaN)將使該過程對此類失敗具有魯棒性,發出警告並將該fold的分數設置為0(或NaN),但可以完成搜索。4. 蠻力參數搜索的替代方法4.1. 模型特定交叉驗證一些模型可以擬合某一參數的一系列數據,其效率幾乎與對某個參數的單個值進行估計器擬合的效率相同。利用此功能執行更有效的交叉驗證,用於此參數的模型選擇。這個策略最常用的參數是編碼正則化器(regularizer)強度的參數。在這種情況下,我們說我們計算估計器的正則化路徑(regularization path)。4.2. 信息標準一些模型可以通過計算單個正則化路徑(而不是使用交叉驗證時的多個正則化路徑)來提供正則化參數最優估計的資訊理論閉式公式(information-theoretic closed-form formula)。以下是從 Akaike Information Criterion (AIC) 或 the Bayesian Information Criterion (BIC)中受益的模型列表,用於自動選擇模型:4.3. 袋外估計(Out of Bag Estimates)當使用基於bagging的集成方法(ensemble methods,即使用帶替換進行採樣生成新的訓練集)時,部分訓練集仍然未使用。對於集成(ensemble)中的每個分類器,忽略了訓練集的不同部分。被忽略的部分可用於估計泛化誤差,而無需依賴單獨的驗證集。這個估計是「免費」的,因為不需要額外的數據,並且可以用於模型選擇。☆☆☆為方便大家查閱,小編已將scikit-learn學習路線專欄文章統一整理到公眾號底部菜單欄,同步更新中,關注公眾號,點擊左下方「系列文章」,如圖:或點擊下方「閱讀原文」,進入scikit-learn專欄,即可查看系列文章。
歡迎大家和我一起沿著scikit-learn文檔這條路線,一起鞏固機器學習算法基礎。(添加微信:mthler,備註:sklearn學習,一起進【sklearn機器學習進步群】開啟打怪升級的學習之旅。)