scikit-learn 調(diào)整估計器的超參數(shù)

2023-02-20 14:14 更新

? 超參數(shù)是估計器的參數(shù)中不能通過學(xué)習(xí)得到的參數(shù)。在scikit-learn中,他們作為參數(shù)傳遞給估計器不同類的構(gòu)造函數(shù)。典型的例子有支持向量分類器的參數(shù)C,kernel和gamma,Lasso的參數(shù)alpha等。

? 在超參數(shù)集中搜索以獲得最佳cross validation交叉驗證分?jǐn)?shù)的方法是可實現(xiàn)并且推薦的。

? 當(dāng)構(gòu)建一個估計器是,任意參數(shù)的選取通過這種方式可能會獲得最佳參數(shù)。尤其是,要想知道參數(shù)名字和其對應(yīng)的當(dāng)前值,使用:

estimator.get_params() 

? 搜索包括:

  • 一個估計器(回歸或分類,如sklearn.svm.SVC());
  • 一個參數(shù)空間;
  • 一個搜索的方法或可選參數(shù)集;
  • 一個交叉驗證的方案;
  • 一個評分函數(shù)。

一些模型允許專業(yè)化,高效的參數(shù)搜索策略,outlined below。在scikit-learn中,兩種方法可用來抽樣搜索最佳參數(shù):對于給定值,GridSearchCV會計算所有參數(shù)的組合,而RandomizedSearchCV可以從具有指定分布的參數(shù)空間中抽樣出定量的參數(shù)候選。在描述這些工具后,會詳細(xì)介紹best practice在這兩種方法的應(yīng)用。

需要注意的是:盡管其它參數(shù)都設(shè)置為初始值,但一個小的參數(shù)集合仍會對模型預(yù)測或者計算效果有很大的影響。推薦閱讀估計器類的文檔,以了解各參數(shù)的含義,可能的話還可閱讀隨附文獻(xiàn)資料。

3.2.1 窮盡的網(wǎng)格搜索

GridSearchCV提供的網(wǎng)格搜索,通過使用pram_grid參數(shù)指定參數(shù)候選值,窮盡的生成候選項。如下param_grid的例子:

param_grid = [
  {'C': [1, 10, 100, 1000], 'kernel': ['linear']},
  {'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
 ] 

指定探索兩個網(wǎng)格:第一個是線性核和C值范圍為[1, 10, 100, 1000];第二個是RBF核,C值的交叉乘積范圍在[1, 10, 100, 1000]和gamma值范圍在[0.001, 0.0001]。

GridSearchCV實例實現(xiàn)常用估計器API:當(dāng)在數(shù)據(jù)集上“fitting”(擬合)并獲得所有可能的參數(shù)值組合評估,從而保留最好的組合。

例如:

3.2.2 隨機(jī)參數(shù)優(yōu)化

? 盡管使用網(wǎng)格(grid)的參數(shù)設(shè)置是應(yīng)用最廣泛的參數(shù)優(yōu)化方法,其它的搜索方法有更多的優(yōu)良性質(zhì)。RamdomizedSeaarchCV執(zhí)行一個參數(shù)的隨機(jī)搜索,其中每一個設(shè)置都是從某個分布中抽取出可能的參數(shù)值。相較而言,該種方法有兩個主要的優(yōu)勢:

  • 運(yùn)行成本與參數(shù)個數(shù)和其可能的取值相獨立。
  • 添加參數(shù)不影響表現(xiàn),也不影響效率。

指定參數(shù)如何被抽樣是用字典形式,與指定GridSearchCV參數(shù)相類似。除此以外,運(yùn)行預(yù)算的成本,是樣本候選量或樣本迭代次數(shù),可以使用n_iter參數(shù)定義。對于每一個參數(shù),或者可能取值的分布或離散選項的列表(將被統(tǒng)一采樣)可以被指定:

{'C': scipy.stats.expon(scale=100), 'gamma': scipy.stats.expon(scale=.1),
  'kernel': ['rbf'], 'class_weight':['balanced', None]} 

該示例使用scipy.stats模塊,該模塊包含很多采樣參數(shù)分布,例如expon,gamma,uniform或者randint。

整體而言,通過提供rvs(隨機(jī)變量樣本)方法來采樣一個值,任何功能都可以被傳遞。對rvs函數(shù)的調(diào)用應(yīng)在連續(xù)調(diào)用時提供可能參數(shù)值的獨立隨機(jī)樣本。

警告:scipy0.16之前的版本不允許指定隨機(jī)狀態(tài),而是使用全局numpy隨機(jī)狀態(tài),可以通過np.random.seed或no.random.set_state設(shè)置種子。但是,從scikit-learn0.18開始,如果scipy>=0.16,sklearn.model_selection模塊可以設(shè)置隨機(jī)狀態(tài)。

對于連續(xù)參數(shù),例如上面提到的參數(shù)C,指定一個連續(xù)分布來充分利用隨機(jī)化是至關(guān)重要的。通過提高n_iter參數(shù)可以帶來更好的搜索結(jié)果。

一個連續(xù)的log-uniform隨機(jī)變量可以通過loguniform使用。它是log-spaced參數(shù)的連續(xù)版。例如指定參數(shù)C,可以使用loguniform(1, 100)而不是[1, 10, 100]或者np.logspace(0, 2, num = 1000)。 它是SciPy's stats.reciprocal的別名。

在網(wǎng)格搜索中鏡像以上示例,可以指定一個連續(xù)隨機(jī)變量,它是對數(shù)-均勻分布,介于1e0和1e3之間:

from sklearn.utils.fixes import loguniform
{'C': loguniform(1e0, 1e3),
 'gamma': loguniform(1e-4, 1e-3),
 'kernel': ['rbf'],
 'class_weight':['balanced', None]} 

例如:

參考文獻(xiàn):

  • Bergstra, J. and Bengio, Y., Random search for hyper-parameter optimization, The Journal of Machine Learning Research (2012)

3.2.3 參數(shù)搜索技巧

3.2.3.1 指定目標(biāo)度量

參數(shù)搜索的初始化是使用估計器的score函數(shù)來評估一個參數(shù)設(shè)置。sklearn.metrics.accuracy_score用于分類,sklearn.metrics.r2_score應(yīng)用于回歸。在一些應(yīng)用中,其它的評估函數(shù)更加適用(例如在樣本不平衡的分類中,精度評分往往是信息不足的)??梢越oGridSearchCV,RandomizedSearchCV的參數(shù)scoring指定其它的評分函數(shù),同時許多的交叉驗證工具將在下文介紹。詳見評分參數(shù):定義模型評估規(guī)則。

3.2.3.2 指定多指標(biāo)評估

GridSearchCV和RandomizedSearchCV允許給scoring指定具體參數(shù)。

多指標(biāo)評估可以通過字符串列表的形式預(yù)定義評分名稱或者以字典形式將評分名稱映射給評分函數(shù),或者預(yù)先定義評估名稱。詳見使用多指標(biāo)評估。

當(dāng)指定多指標(biāo)時,參數(shù)refit必須被指定一個指標(biāo)(字符串),才可以調(diào)用best_params_,并在整個數(shù)據(jù)集上構(gòu)建best_estimator_的度量標(biāo)準(zhǔn)。當(dāng)設(shè)置refit = False時,網(wǎng)格搜索不會refit模型。當(dāng)使用多指標(biāo)評估時,使用refit的初始值None會報錯。

詳見交叉值得分和GridSearchCV多指標(biāo)評價的實證研究。

3.2.3.3 復(fù)合估計和參數(shù)空間

GridSearchCVRandomizedSearchCV許搜索復(fù)合或嵌套估計器的參數(shù),例如Pipeline,ColumnTransFormer,VotingClassifier或者CalibratedClassifierCV,均使用__語法設(shè)置。

>>> 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。如果元估計器用估計器的集合所構(gòu)建,如pipeline.Pipelins,然后指向估計器的名稱,詳見Nested parameters。在實例中,會用不同級別的嵌套:

>>> 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 模型選擇:開發(fā)和評估

通過評估各種參數(shù)設(shè)置,模型選擇可以看成是使用已標(biāo)記的數(shù)據(jù)“訓(xùn)練”的網(wǎng)格參數(shù) 。

當(dāng)評估模型結(jié)果時,使用的樣本需是不被用來訓(xùn)練網(wǎng)格搜索的數(shù)據(jù):將數(shù)據(jù)拆分為開發(fā)集(GridSeaarchCV使用的數(shù)據(jù))和評估集來計算各指標(biāo)表現(xiàn)是推薦做法。

上述推薦做法可用train_test_split功能實現(xiàn)。

3.2.3.5 并行機(jī)制

GridSearchCVRandomizedSearchCV會獨立評估每一個參數(shù)設(shè)置。如果你的操作系統(tǒng)支持,計算過程可以同時運(yùn)行,需要設(shè)置參數(shù)n_jobs = -1。詳見函數(shù)簽名。

3.2.3.6 對失敗的魯棒性

一些參數(shù)設(shè)置可能會導(dǎo)致不能fit一個或多個折疊的數(shù)據(jù)。如果不修改初始值,盡管某些參數(shù)可以被完全評估,但仍會引起整個網(wǎng)格搜索的失敗。設(shè)置error_socre=0(或者 =np.NaN)可以使整個流程對于類似失敗具有魯棒性,程序返回報警并把該折疊的分?jǐn)?shù)設(shè)為0(或者NaN),但會完成整個搜索。

3.2.4 暴力參數(shù)搜索的替代方法

3.2.4.1 模型特定的交叉驗證

一些模型可以根據(jù)一定范圍的參數(shù)值來fit(擬合)數(shù)據(jù),這與估計器fit(擬合)單個參數(shù)取值的效率一致。設(shè)置該參數(shù)的模型選擇可以用來執(zhí)行更有效率的交叉驗證。

適應(yīng)該策略的最常見參數(shù)是編碼正則器強(qiáng)度的參數(shù)。在該例子中,計算的是規(guī)范化路徑的估計器。

如下是這些模型的列表:

模型 解釋
linear_model.ElasticNetCV(*[, l1_ratio, ...]) Elastic Net model with iterative fitting along a regularization path. 沿單一標(biāo)準(zhǔn)化路徑迭代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. 沿單一標(biāo)注化路徑迭代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. 內(nèi)置交叉驗證的多任務(wù)L1/L2 ElasticNet。
linear_model.MultiTaskLassoCV(*[, eps, ...]) Multi-task Lasso model trained with L1/L2 mixed-norm as regularizer. L1/L2混合標(biāo)準(zhǔn)作為正則化的多任務(wù)Lasso模型
linear_OrthogonalMatchingPursuitCV(*) Cross-validated Orthogonal Matching Pursuit model (OMP).
linear_model.RidgeCV([alphas, ...]) Ridge regression with built-in cross-validation. 內(nèi)置交叉驗證的嶺回歸。
linear_model.RidgeClassifierCV([alphas, ...]) Ridge classifier with built-in cross-validation. 內(nèi)置交叉驗證的嶺分類器 。

3.2.4.2 信息標(biāo)準(zhǔn)

通過計算單個(不是許多)標(biāo)準(zhǔn)化路徑,一些模型可以提供最佳估計的標(biāo)準(zhǔn)化參數(shù)的信息理論閉合公式。

下面是收益于Akaike信息標(biāo)準(zhǔn)(AIC)或者貝葉斯信息標(biāo)準(zhǔn)(BIC)的模型列表,用于自動模型選擇:

模型 解釋
linear_model.LassoLarsIC([criterion, ...]) Lasso模型fit Lars時,模型選擇使用BIC或者AIC標(biāo)準(zhǔn)。

3.2.4.3 袋外估計

當(dāng)使用基于bagging 的集成方法時,例如使用不同的采樣生成新的訓(xùn)練集,訓(xùn)練集中部分?jǐn)?shù)據(jù)仍然不被使用。對于集成算法中的每一個分類器,訓(xùn)練集中的不同數(shù)據(jù)會落到袋外。

不需要劃分驗證集,就可以使用袋外數(shù)據(jù)估計泛化誤差。該估計方式“免費(fèi)”提供,因此不需要額外數(shù)據(jù),可被用于模型選擇中。

以下類可以執(zhí)行該操作:

模型 解釋
ensemble.RandomForestClassifier([...]) 隨機(jī)森林分類器
ensemble.RandomForestRegressor([...]) 隨機(jī)森林回歸器
ensemble.ExtraTreesClassifier([...]) extra-trees分類器
ensemble.ExtraTreesRegressor([n_estimators, ...]) extra-tess回歸器
ensemble.GradientBoostingClassifier(*[, ...]) 梯度提升分類
ensemble.GradientBoostingRegressor(*[, ...]) 梯度提升回歸


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號