? 超參數(shù)是估計(jì)器的參數(shù)中不能通過學(xué)習(xí)得到的參數(shù)。在scikit-learn中,他們作為參數(shù)傳遞給估計(jì)器不同類的構(gòu)造函數(shù)。典型的例子有支持向量分類器的參數(shù)C,kernel和gamma,Lasso的參數(shù)alpha等。
? 在超參數(shù)集中搜索以獲得最佳cross validation交叉驗(yàn)證分?jǐn)?shù)的方法是可實(shí)現(xiàn)并且推薦的。
? 當(dāng)構(gòu)建一個(gè)估計(jì)器是,任意參數(shù)的選取通過這種方式可能會(huì)獲得最佳參數(shù)。尤其是,要想知道參數(shù)名字和其對(duì)應(yīng)的當(dāng)前值,使用:
estimator.get_params()
? 搜索包括:
一些模型允許專業(yè)化,高效的參數(shù)搜索策略,outlined below。在scikit-learn中,兩種方法可用來抽樣搜索最佳參數(shù):對(duì)于給定值,GridSearchCV會(huì)計(jì)算所有參數(shù)的組合,而RandomizedSearchCV可以從具有指定分布的參數(shù)空間中抽樣出定量的參數(shù)候選。在描述這些工具后,會(huì)詳細(xì)介紹best practice在這兩種方法的應(yīng)用。
需要注意的是:盡管其它參數(shù)都設(shè)置為初始值,但一個(gè)小的參數(shù)集合仍會(huì)對(duì)模型預(yù)測或者計(jì)算效果有很大的影響。推薦閱讀估計(jì)器類的文檔,以了解各參數(shù)的含義,可能的話還可閱讀隨附文獻(xiàn)資料。
GridSearchCV提供的網(wǎng)格搜索,通過使用pram_grid參數(shù)指定參數(shù)候選值,窮盡的生成候選項(xiàng)。如下param_grid的例子:
param_grid = [
{'C': [1, 10, 100, 1000], 'kernel': ['linear']},
{'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
]
指定探索兩個(gè)網(wǎng)格:第一個(gè)是線性核和C值范圍為[1, 10, 100, 1000];第二個(gè)是RBF核,C值的交叉乘積范圍在[1, 10, 100, 1000]和gamma值范圍在[0.001, 0.0001]。
GridSearchCV實(shí)例實(shí)現(xiàn)常用估計(jì)器API:當(dāng)在數(shù)據(jù)集上“fitting”(擬合)并獲得所有可能的參數(shù)值組合評(píng)估,從而保留最好的組合。
例如:
? 盡管使用網(wǎng)格(grid)的參數(shù)設(shè)置是應(yīng)用最廣泛的參數(shù)優(yōu)化方法,其它的搜索方法有更多的優(yōu)良性質(zhì)。RamdomizedSeaarchCV執(zhí)行一個(gè)參數(shù)的隨機(jī)搜索,其中每一個(gè)設(shè)置都是從某個(gè)分布中抽取出可能的參數(shù)值。相較而言,該種方法有兩個(gè)主要的優(yōu)勢:
指定參數(shù)如何被抽樣是用字典形式,與指定GridSearchCV參數(shù)相類似。除此以外,運(yùn)行預(yù)算的成本,是樣本候選量或樣本迭代次數(shù),可以使用n_iter參數(shù)定義。對(duì)于每一個(gè)參數(shù),或者可能取值的分布或離散選項(xiàng)的列表(將被統(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ī)變量樣本)方法來采樣一個(gè)值,任何功能都可以被傳遞。對(duì)rvs函數(shù)的調(diào)用應(yīng)在連續(xù)調(diào)用時(shí)提供可能參數(shù)值的獨(dú)立隨機(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)。
對(duì)于連續(xù)參數(shù),例如上面提到的參數(shù)C,指定一個(gè)連續(xù)分布來充分利用隨機(jī)化是至關(guān)重要的。通過提高n_iter參數(shù)可以帶來更好的搜索結(jié)果。
一個(gè)連續(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)格搜索中鏡像以上示例,可以指定一個(gè)連續(xù)隨機(jī)變量,它是對(duì)數(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):
參數(shù)搜索的初始化是使用估計(jì)器的score函數(shù)來評(píng)估一個(gè)參數(shù)設(shè)置。sklearn.metrics.accuracy_score用于分類,sklearn.metrics.r2_score應(yīng)用于回歸。在一些應(yīng)用中,其它的評(píng)估函數(shù)更加適用(例如在樣本不平衡的分類中,精度評(píng)分往往是信息不足的)??梢越oGridSearchCV,RandomizedSearchCV的參數(shù)scoring指定其它的評(píng)分函數(shù),同時(shí)許多的交叉驗(yàn)證工具將在下文介紹。詳見評(píng)分參數(shù):定義模型評(píng)估規(guī)則。
GridSearchCV和RandomizedSearchCV允許給scoring指定具體參數(shù)。
多指標(biāo)評(píng)估可以通過字符串列表的形式預(yù)定義評(píng)分名稱或者以字典形式將評(píng)分名稱映射給評(píng)分函數(shù),或者預(yù)先定義評(píng)估名稱。詳見使用多指標(biāo)評(píng)估。
當(dāng)指定多指標(biāo)時(shí),參數(shù)refit必須被指定一個(gè)指標(biāo)(字符串),才可以調(diào)用best_params_,并在整個(gè)數(shù)據(jù)集上構(gòu)建best_estimator_的度量標(biāo)準(zhǔn)。當(dāng)設(shè)置refit = False時(shí),網(wǎng)格搜索不會(huì)refit模型。當(dāng)使用多指標(biāo)評(píng)估時(shí),使用refit的初始值None會(huì)報(bào)錯(cuò)。
詳見交叉值得分和GridSearchCV多指標(biāo)評(píng)價(jià)的實(shí)證研究。
GridSearchCV和RandomizedSearchCV許搜索復(fù)合或嵌套估計(jì)器的參數(shù),例如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)
通過評(píng)估各種參數(shù)設(shè)置,模型選擇可以看成是使用已標(biāo)記的數(shù)據(jù)“訓(xùn)練”的網(wǎng)格參數(shù) 。
當(dāng)評(píng)估模型結(jié)果時(shí),使用的樣本需是不被用來訓(xùn)練網(wǎng)格搜索的數(shù)據(jù):將數(shù)據(jù)拆分為開發(fā)集(GridSeaarchCV使用的數(shù)據(jù))和評(píng)估集來計(jì)算各指標(biāo)表現(xiàn)是推薦做法。
上述推薦做法可用train_test_split功能實(shí)現(xiàn)。
GridSearchCV和RandomizedSearchCV會(huì)獨(dú)立評(píng)估每一個(gè)參數(shù)設(shè)置。如果你的操作系統(tǒng)支持,計(jì)算過程可以同時(shí)運(yùn)行,需要設(shè)置參數(shù)n_jobs = -1。詳見函數(shù)簽名。
一些參數(shù)設(shè)置可能會(huì)導(dǎo)致不能fit一個(gè)或多個(gè)折疊的數(shù)據(jù)。如果不修改初始值,盡管某些參數(shù)可以被完全評(píng)估,但仍會(huì)引起整個(gè)網(wǎng)格搜索的失敗。設(shè)置error_socre=0(或者 =np.NaN)可以使整個(gè)流程對(duì)于類似失敗具有魯棒性,程序返回報(bào)警并把該折疊的分?jǐn)?shù)設(shè)為0(或者NaN),但會(huì)完成整個(gè)搜索。
一些模型可以根據(jù)一定范圍的參數(shù)值來fit(擬合)數(shù)據(jù),這與估計(jì)器fit(擬合)單個(gè)參數(shù)取值的效率一致。設(shè)置該參數(shù)的模型選擇可以用來執(zhí)行更有效率的交叉驗(yàn)證。
適應(yīng)該策略的最常見參數(shù)是編碼正則器強(qiáng)度的參數(shù)。在該例子中,計(jì)算的是規(guī)范化路徑的估計(jì)器。
如下是這些模型的列表:
模型 | 解釋 |
---|---|
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. 交叉驗(yàn)證的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交叉驗(yàn)證,使用LARS算法。 |
Linear_model_LogisticRegressionCV(*[, Cs, ...]) | Logistic Regression CV (aka logit, MaxEnt) classifier. 邏輯回歸交叉驗(yàn)證(aka logit, MaxEnt)分類器。 |
linear_model.MultiTaskElasticNetCV(*[, ...]) | Multi-task L1/L2 ElasticNet with built-in cross-validation. 內(nèi)置交叉驗(yàn)證的多任務(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)置交叉驗(yàn)證的嶺回歸。 |
linear_model.RidgeClassifierCV([alphas, ...]) | Ridge classifier with built-in cross-validation. 內(nèi)置交叉驗(yàn)證的嶺分類器 。 |
通過計(jì)算單個(gè)(不是許多)標(biāo)準(zhǔn)化路徑,一些模型可以提供最佳估計(jì)的標(biāo)準(zhǔn)化參數(shù)的信息理論閉合公式。
下面是收益于Akaike信息標(biāo)準(zhǔn)(AIC)或者貝葉斯信息標(biāo)準(zhǔn)(BIC)的模型列表,用于自動(dòng)模型選擇:
模型 | 解釋 |
---|---|
linear_model.LassoLarsIC([criterion, ...]) | Lasso模型fit Lars時(shí),模型選擇使用BIC或者AIC標(biāo)準(zhǔn)。 |
當(dāng)使用基于bagging 的集成方法時(shí),例如使用不同的采樣生成新的訓(xùn)練集,訓(xùn)練集中部分?jǐn)?shù)據(jù)仍然不被使用。對(duì)于集成算法中的每一個(gè)分類器,訓(xùn)練集中的不同數(shù)據(jù)會(huì)落到袋外。
不需要?jiǎng)澐烛?yàn)證集,就可以使用袋外數(shù)據(jù)估計(jì)泛化誤差。該估計(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(*[, ...]) | 梯度提升回歸 |
更多建議: