3.2 調整估計器的超參數?
? 超參數是估計器的參數中不能通過學習得到的參數。在scikit-learn中,他們作為參數傳遞給估計器不同類的構造函數。典型的例子有支持向量分類器的參數C,kernel和gamma,Lasso的參數alpha等。
? 在超參數集中搜索以獲得最佳cross validation交叉驗證分數的方法是可實現并且推薦的。
? 當構建一個估計器是,任意參數的選取通過這種方式可能會獲得最佳參數。尤其是,要想知道參數名字和其對應的當前值,使用:
estimator.get_params()
? 搜索包括:
一個估計器(回歸或分類,如sklearn.svm.SVC()); 一個參數空間; 一個搜索的方法或可選參數集; 一個交叉驗證的方案; 一個評分函數。
一些模型允許專業化,高效的參數搜索策略,outlined below。在scikit-learn中,兩種方法可用來抽樣搜索最佳參數:對于給定值,GridSearchCV會計算所有參數的組合,而RandomizedSearchCV可以從具有指定分布的參數空間中抽樣出定量的參數候選。在描述這些工具后,會詳細介紹best practice在這兩種方法的應用。
需要注意的是:盡管其它參數都設置為初始值,但一個小的參數集合仍會對模型預測或者計算效果有很大的影響。推薦閱讀估計器類的文檔,以了解各參數的含義,可能的話還可閱讀隨附文獻資料。
3.2.1 窮盡的網格搜索
GridSearchCV提供的網格搜索,通過使用pram_grid參數指定參數候選值,窮盡的生成候選項。如下param_grid的例子:
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值的交叉乘積范圍在[1, 10, 100, 1000]和gamma值范圍在[0.001, 0.0001]。
GridSearchCV實例實現常用估計器API:當在數據集上“fitting”(擬合)并獲得所有可能的參數值組合評估,從而保留最好的組合。
例如:
參見基于交叉驗證的網格搜索參數估計在數字數據集上計算網格搜索的例子。 參見用于文本特征提取和評估的示例管道網格搜索的耦合參數從帶有分類器(線性SVM訓練的SGD與彈性網絡或L2懲罰項相結合)的文本文檔特征提取器(n-gram計數向量化器和TF-IDF變換器 )使用一個管道。管道示例。 參見嵌套與非嵌套交叉驗證在鶯尾花(iris dataset)數據集上進行帶有交叉驗證的網格搜索。這是一個利用網格搜索來評估模型表現的最佳實例。 參見交叉值得分和GridSearchCV多指標評價的實證研究是一個利用網格搜索同時評估多參數的實例。 參見平衡模型復雜性和交叉驗證得分使用GridSearchCV的refit = callable的實例。這個例子展示該接口在確定“最佳”評估器如何添加一定靈活性。這個接口可以用于多參數評估。
3.2.2 隨機參數優化
? 盡管使用網格(grid)的參數設置是應用最廣泛的參數優化方法,其它的搜索方法有更多的優良性質。RamdomizedSeaarchCV執行一個參數的隨機搜索,其中每一個設置都是從某個分布中抽取出可能的參數值。相較而言,該種方法有兩個主要的優勢:
運行成本與參數個數和其可能的取值相獨立。 添加參數不影響表現,也不影響效率。
指定參數如何被抽樣是用字典形式,與指定GridSearchCV參數相類似。除此以外,運行預算的成本,是樣本候選量或樣本迭代次數,可以使用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(隨機變量樣本)方法來采樣一個值,任何功能都可以被傳遞。對rvs函數的調用應在連續調用時提供可能參數值的獨立隨機樣本。
警告:scipy0.16之前的版本不允許指定隨機狀態,而是使用全局numpy隨機狀態,可以通過np.random.seed或no.random.set_state設置種子。但是,從scikit-learn0.18開始,如果scipy>=0.16,sklearn.model_selection模塊可以設置隨機狀態。
對于連續參數,例如上面提到的參數C,指定一個連續分布來充分利用隨機化是至關重要的。通過提高n_iter參數可以帶來更好的搜索結果。
一個連續的log-uniform隨機變量可以通過loguniform使用。它是log-spaced參數的連續版。例如指定參數C,可以使用loguniform(1, 100)而不是[1, 10, 100]或者np.logspace(0, 2, num = 1000)。 它是SciPy's stats.reciprocal的別名。
在網格搜索中鏡像以上示例,可以指定一個連續隨機變量,它是對數-均勻分布,介于1e0和1e3之間:
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.2.3 參數搜索技巧
3.2.3.1 指定目標度量
參數搜索的初始化是使用估計器的score函數來評估一個參數設置。sklearn.metrics.accuracy_score用于分類,sklearn.metrics.r2_score應用于回歸。在一些應用中,其它的評估函數更加適用(例如在樣本不平衡的分類中,精度評分往往是信息不足的)。可以給GridSearchCV,RandomizedSearchCV的參數scoring指定其它的評分函數,同時許多的交叉驗證工具將在下文介紹。詳見評分參數:定義模型評估規則。
3.2.3.2 指定多指標評估
GridSearchCV和RandomizedSearchCV允許給scoring指定具體參數。
多指標評估可以通過字符串列表的形式預定義評分名稱或者以字典形式將評分名稱映射給評分函數,或者預先定義評估名稱。詳見使用多指標評估。
當指定多指標時,參數refit必須被指定一個指標(字符串),才可以調用best_params_,并在整個數據集上構建best_estimator_的度量標準。當設置refit = False時,網格搜索不會refit模型。當使用多指標評估時,使用refit的初始值None會報錯。
詳見交叉值得分和GridSearchCV多指標評價的實證研究。
3.2.3.3 復合估計和參數空間
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]})
>>> 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.2.3.4 模型選擇:開發和評估
通過評估各種參數設置,模型選擇可以看成是使用已標記的數據“訓練”的網格參數 。
當評估模型結果時,使用的樣本需是不被用來訓練網格搜索的數據:將數據拆分為開發集(GridSeaarchCV使用的數據)和評估集來計算各指標表現是推薦做法。
上述推薦做法可用train_test_split功能實現。
3.2.3.5 并行機制
GridSearchCV和RandomizedSearchCV會獨立評估每一個參數設置。如果你的操作系統支持,計算過程可以同時運行,需要設置參數n_jobs = -1。詳見函數簽名。
3.2.3.6 對失敗的魯棒性
一些參數設置可能會導致不能fit一個或多個折疊的數據。如果不修改初始值,盡管某些參數可以被完全評估,但仍會引起整個網格搜索的失敗。設置error_socre=0(或者 =np.NaN)可以使整個流程對于類似失敗具有魯棒性,程序返回報警并把該折疊的分數設為0(或者NaN),但會完成整個搜索。
3.2.4 暴力參數搜索的替代方法
3.2.4.1 模型特定的交叉驗證
一些模型可以根據一定范圍的參數值來fit(擬合)數據,這與估計器fit(擬合)單個參數取值的效率一致。設置該參數的模型選擇可以用來執行更有效率的交叉驗證。
適應該策略的最常見參數是編碼正則器強度的參數。在該例子中,計算的是規范化路徑的估計器。
如下是這些模型的列表:
模型 | 解釋 |
---|---|
linear_model.ElasticNetCV(*[, l1_ratio, ...]) | Elastic Net model with iterative fitting along a regularization path. 沿單一標準化路徑迭代fitting的Elastic Net模型。 |
linear_model.LarsCV(*[, fit_intercept, ...]) | Cross-validated Least Angle Regression model. 交叉驗證的Least Angle 回歸模型。 |
linear_model.LassoCV(*[, eps, n_alphas, ...]) | Lasso linear model with iterative fitting along a regularization path. 沿單一標注化路徑迭代fitting Lasso線性模型。 |
linear_model.LassoLarsCV(*[, fit_intercept, ...]) | Cross-validated Lasso, using the LARS algorithm. Lasso交叉驗證,使用LARS算法。 |
Linear_model_LogisticRegressionCV(*[, Cs, ...]) | Logistic Regression CV (aka logit, MaxEnt) classifier. 邏輯回歸交叉驗證(aka logit, MaxEnt)分類器。 |
linear_model.MultiTaskElasticNetCV(*[, ...]) | Multi-task L1/L2 ElasticNet with built-in cross-validation. 內置交叉驗證的多任務L1/L2 ElasticNet。 |
linear_model.MultiTaskLassoCV(*[, eps, ...]) | Multi-task Lasso model trained with L1/L2 mixed-norm as regularizer. L1/L2混合標準作為正則化的多任務Lasso模型 |
linear_OrthogonalMatchingPursuitCV(*) | Cross-validated Orthogonal Matching Pursuit model (OMP). |
linear_model.RidgeCV([alphas, ...]) | Ridge regression with built-in cross-validation. 內置交叉驗證的嶺回歸。 |
linear_model.RidgeClassifierCV([alphas, ...]) | Ridge classifier with built-in cross-validation. 內置交叉驗證的嶺分類器 。 |
3.2.4.2 信息標準
通過計算單個(不是許多)標準化路徑,一些模型可以提供最佳估計的標準化參數的信息理論閉合公式。
下面是收益于Akaike信息標準(AIC)或者貝葉斯信息標準(BIC)的模型列表,用于自動模型選擇:
模型 | 解釋 |
---|---|
linear_model.LassoLarsIC([criterion, ...]) | Lasso模型fit Lars時,模型選擇使用BIC或者AIC標準。 |
3.2.4.3 袋外估計
當使用基于bagging 的集成方法時,例如使用不同的采樣生成新的訓練集,訓練集中部分數據仍然不被使用。對于集成算法中的每一個分類器,訓練集中的不同數據會落到袋外。
不需要劃分驗證集,就可以使用袋外數據估計泛化誤差。該估計方式“免費”提供,因此不需要額外數據,可被用于模型選擇中。
以下類可以執行該操作:
模型 | 解釋 |
---|---|
ensemble.RandomForestClassifier([...]) | 隨機森林分類器 |
ensemble.RandomForestRegressor([...]) | 隨機森林回歸器 |
ensemble.ExtraTreesClassifier([...]) | extra-trees分類器 |
ensemble.ExtraTreesRegressor([n_estimators, ...]) | extra-tess回歸器 |
ensemble.GradientBoostingClassifier(*[, ...]) | 梯度提升分類 |
ensemble.GradientBoostingRegressor(*[, ...]) | 梯度提升回歸 |