<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          還在當(dāng)調(diào)參俠?推薦這三個(gè)超參優(yōu)化庫【含示例代碼】

          共 5576字,需瀏覽 12分鐘

           ·

          2021-08-06 01:33


          導(dǎo)讀

          在傳統(tǒng)的算法建模過程中,影響算法性能的一個(gè)重要環(huán)節(jié)、也可能是最為耗時(shí)和無趣的一項(xiàng)工作就是算法的調(diào)參,即超參數(shù)優(yōu)化(Hyper-parameter Optimization,HPO),因此很多算法工程師都會(huì)調(diào)侃的自稱"調(diào)參俠"。近期在研究一些AutoML相關(guān)的論文和實(shí)現(xiàn),而在AutoML中的一個(gè)核心組件就是HPO。借此機(jī)會(huì),本文梳理總結(jié)Python中三種常見的可實(shí)現(xiàn)HPO的庫,并提供一個(gè)簡單的示例。


          HPO,全稱Hyper-parameter Optimization,即超參優(yōu)化。之所以做這項(xiàng)工作是出于機(jī)器學(xué)習(xí)領(lǐng)域的兩個(gè)基本事實(shí):

          • no free lunch。即天下沒有免費(fèi)午餐,用在機(jī)器學(xué)習(xí)領(lǐng)域是指沒有一種算法可以適用于所有的機(jī)器學(xué)習(xí)問題,換言之A算法可能在這個(gè)數(shù)據(jù)集上表現(xiàn)最優(yōu),但在另一個(gè)數(shù)據(jù)集上表現(xiàn)最好的則是另一個(gè)B算法。
          • 對(duì)于同一算法,不同的超參數(shù)可能對(duì)算法性能影響很大。例如線性模型中的正則化系數(shù)、決策樹模型中樹的最大深度等,這些都屬于模型擬合之外的參數(shù),需要認(rèn)為指定,故而稱之為超參數(shù)。


          正因如此,所以算法工程師們?cè)谔嵘惴ㄐ阅軙r(shí)常常需要對(duì)比多個(gè)模型,同時(shí)在各模型內(nèi)部又要調(diào)整多組超參,以期實(shí)現(xiàn)最優(yōu)效果。在這個(gè)超參調(diào)優(yōu)過程中,當(dāng)前的實(shí)現(xiàn)方式主要是如下三種:
          • 最為簡單也最為熟知的莫過于網(wǎng)格搜索,在sklearn中的實(shí)現(xiàn)是GridSearch,通過對(duì)各超參數(shù)提供所有可能的候選值,該算法會(huì)自動(dòng)暴力嘗試所有可能的超參組合,并給出最佳結(jié)果。該實(shí)現(xiàn)方法直觀易懂,但缺點(diǎn)也很明顯,那就是效率不高,而且只能接受離散取值
          • 與網(wǎng)格搜索類似、但不再暴力枚舉的一種方法是隨機(jī)搜索,其優(yōu)化過程其實(shí)也更為簡單:即對(duì)每個(gè)超參數(shù)均隨機(jī)選取一個(gè)候選值,而后組成一次隨機(jī)抽選的超參組合。最后返回所有隨機(jī)嘗試后的最優(yōu)組合。這種方法實(shí)現(xiàn)簡單,搜索次數(shù)可大可小,但卻往往能取得不錯(cuò)的效果。但所得到的最好結(jié)果可能不是最優(yōu)解。
          • 貝葉斯優(yōu)化。除了網(wǎng)格搜索和隨機(jī)搜索外,貝葉斯優(yōu)化可能是目前最為理想和高效的超參優(yōu)化(從其名字可以看出,這類方法跟貝葉斯大神有一定關(guān)系,大概是由于其中要用到的代理函數(shù)與貝葉斯后驗(yàn)概率有關(guān)吧)?;谪惾~斯優(yōu)化算法實(shí)現(xiàn)的HPO,其一般形式可抽象為如下SMBO的過程:

          《Bayesian Optimization Primer》


          其中,各符號(hào)及變量的含義如下:

          • f:目標(biāo)函數(shù),在機(jī)器學(xué)習(xí)場(chǎng)景中即為根據(jù)超參數(shù)組合xi得到評(píng)估指標(biāo)yi的過程

          • X:超參搜索空間,其中每個(gè)xi即為X中的一組取值;

          • yi:目標(biāo)函數(shù)的得分,在機(jī)器學(xué)習(xí)場(chǎng)景中即為評(píng)估指標(biāo)結(jié)果,例如accuracy_score

          • D:所有(xi, yi)組成的數(shù)據(jù)集

          • M:代理函數(shù),即要得到的由xi得到y(tǒng)i的映射方法。從機(jī)器學(xué)習(xí)的視角來理解,既然是由一組超參數(shù)(可理解為特征)擬合一個(gè)連續(xù)的得分結(jié)果(回歸目標(biāo)),所以可用一個(gè)回歸模型來實(shí)現(xiàn)。這里之所以稱之為代理函數(shù),則是因?yàn)檎G闆r下,應(yīng)該是真正的用對(duì)應(yīng)的算法模型+超參數(shù)進(jìn)行實(shí)際的訓(xùn)練和評(píng)估,得到真實(shí)的評(píng)估結(jié)果,而此時(shí)為了避免這種大計(jì)算量的過程(expensive),所以才選擇用一個(gè)簡單快速的函數(shù)加以擬合替代

          • S:采集函數(shù),即根據(jù)當(dāng)前得到的代理函數(shù)M和超參搜索空間X,如何獲取下一組可能帶來性能提升的超參組合。


          基于上述符號(hào)定義,SMBO過程如下:

          • 指定輸入?yún)?shù)f、X、M、S,給定一組初始的(xi, yi),作為初始訓(xùn)練集完成代理函數(shù)M的評(píng)估;

          • 根據(jù)采集函數(shù)S和代理函數(shù)M,得到當(dāng)前情況下可能獲得最優(yōu)得分的超參組合xi+1

          • 將新一組超參數(shù)帶入待優(yōu)化的機(jī)器學(xué)習(xí),得到真實(shí)的yi+1

          • 將最新數(shù)據(jù)(xi+1, yi+1)加入到數(shù)據(jù)集D中,重新擬合代理函數(shù)M

          • 如此迭代執(zhí)行T次,或者達(dá)到目標(biāo)效果結(jié)束


          這一優(yōu)化過程是逐一選取潛在的最優(yōu)超參數(shù),并將其結(jié)果加入到數(shù)據(jù)集中繼續(xù)完成代理函數(shù)的優(yōu)化過程,所以這也就是其稱之為Sequential的原因,代理函數(shù)M則呼應(yīng)model-based。而毫無疑問,這其中有兩個(gè)重要細(xì)節(jié)實(shí)現(xiàn):一個(gè)是代理函數(shù)M的選取和建模;另一個(gè)是采集函數(shù)S的設(shè)計(jì)。這兩個(gè)過程的差異,也決定了具體的貝葉斯優(yōu)化實(shí)現(xiàn)的不同。


          這里簡單介紹幾種主流的代理函數(shù)M的選?。?br>
          • 高斯過程,即將K個(gè)超參數(shù)到評(píng)分的映射關(guān)系抽象為K維聯(lián)合高斯分布,從而每次都根據(jù)數(shù)據(jù)集D來計(jì)算該聯(lián)合高斯分布的均值和方差即可。但這種方式的一個(gè)顯著缺點(diǎn)是僅適用于連續(xù)性超參,且一般僅在較低維度下適用;
          • TPE,tree-structured Parzen estimator,主要思想是用到核密度函數(shù)估計(jì)(KDE,kernel density estimator),會(huì)根據(jù)yi的取值高低將數(shù)據(jù)集劃分為兩個(gè)區(qū)域,從而在兩個(gè)區(qū)域分別用kde方法擬合其分布。最后的目標(biāo)就是盡可能的最大化高分的概率g(x)同時(shí)最小化低分的概率l(x)(實(shí)際用到的是最小化比值:l(x)/g(x));
          • Random Forest,即將代理函數(shù)M用一個(gè)隨機(jī)森林回歸模型加以擬合,其中每棵子樹均通過在數(shù)據(jù)集D的隨機(jī)子集進(jìn)行擬合確保隨機(jī)性。當(dāng)拿到一組新的超參組合時(shí),即可通過該隨機(jī)森林模型中每棵子樹的評(píng)分結(jié)果的均值作為衡量該組超參數(shù)的潛力。

          至于采集函數(shù)的選取,則也有不同的設(shè)計(jì),例如PI(Probability of improvement)和EI(Expected Improvement)等,這里不再展開。


          對(duì)于這三種代理函數(shù)的抽象實(shí)現(xiàn),Python中均有相應(yīng)的庫可直接調(diào)用。本文選取三個(gè)庫,分別對(duì)應(yīng)一種代理函數(shù)的貝葉斯優(yōu)化方法:

          • GP,對(duì)應(yīng)python庫bayes_opt

          • TPE,對(duì)應(yīng)python庫hyperopt

          • RandomForest,對(duì)應(yīng)python庫scikit-optimizer,簡稱skopt


          這里以sklearn中提供的經(jīng)典二分類數(shù)據(jù)集breast_cancer為例,給出三個(gè)優(yōu)化庫的基本實(shí)現(xiàn)方法:


          • 數(shù)據(jù)集加載和默認(rèn)參數(shù)隨機(jī)森林的baseline

          from sklearn.datasets import load_breast_cancerfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import cross_val_score, train_test_split
          X, y = load_breast_cancer(return_X_y=True)X_train, X_test, y_train, y_test = train_test_split(X, y)
          rf = RandomForestClassifier()rf.fit(X_train, y_train)rf.score(X_test, y_test)# 默認(rèn)參數(shù)RF得分:0.958041958041958


          • bayes_opt實(shí)現(xiàn)

          from bayes_opt import BayesianOptimization
          # bayes_opt中的目標(biāo)函數(shù)def fun_bo(n_estimators, max_depth, min_samples_split, min_samples_leaf): rf = RandomForestClassifier(n_estimators=int(n_estimators), max_depth=int(max_depth), min_samples_split=int(min_samples_split), min_samples_leaf=int(min_samples_leaf)) score = cross_val_score(rf, X_train, y_train) return score.mean()
          # 貝葉斯優(yōu)化中的搜索空間space_bo = { 'n_estimators': (10, 300), 'max_depth': (1, 21), 'min_samples_split': (2, 20), 'min_samples_leaf': (2, 20)}bo = BayesianOptimization( fun_bo, space_bo)bo.maximize() # 一鍵完成優(yōu)化
          # 得到最優(yōu)超參結(jié)果param = {k:int(v) for k, v in bo.max['params'].items()}rf_hp = RandomForestClassifier(**param)rf_hp.fit(X_train, y_train)rf_hp.score(X_test, y_test)# bayes_opt優(yōu)化得分:0.965034965034965


          • hyperopt實(shí)現(xiàn)

          from hyperopt import fmin, hp, tpe, Trials
          # hyperopt中的目標(biāo)函數(shù)def fun_hp(param): rf = RandomForestClassifier(**param, random_state=3) score = cross_val_score(rf, X_train, y_train) return 1-score.mean()
          # hyperopt中的搜索空間space_hp = { "n_estimators":hp.uniformint("n_estimators", 10, 300), "max_depth":hp.uniformint("max_depth", 1, 21), "min_samples_split":hp.uniformint("min_samples_split", 2, 20), "min_samples_leaf":hp.uniformint("min_samples_leaf", 2, 20)}
          # 記錄優(yōu)化過程,fmin實(shí)現(xiàn)一鍵優(yōu)化,采用優(yōu)化算法是tpetrials = Trials()param = fmin(fun_hp, space_hp, tpe.suggest, max_evals=100, trials=trials)
          param = {k:int(v) for k, v in param.items()} # 最優(yōu)超參數(shù)rf_hp = RandomForestClassifier(**res)rf_hp.fit(X_train, y_train)rf_hp.score(X_test, y_test)# hyperopt優(yōu)化得分:0.965034965034965


          • skopt實(shí)現(xiàn)

          from skopt import forest_minimize, space
          # skopt中的目標(biāo)函數(shù)def fun_sk(param): param = dict(zip(['n_estimators', 'max_depth', 'min_samples_split', 'min_samples_leaf'], param)) rf = RandomForestClassifier(**param) score = cross_val_score(rf, X_train, y_train) return 1 - score.mean()
          # skopt中的搜索空間space_sk = [ space.Integer(10, 300, name='n_estimators'), space.Integer(1, 21, name='max_depth'), space.Integer(2, 20, name='min_samples_split'), space.Integer(2, 20, name='min_samples_leaf')]
          # 采用RF進(jìn)行優(yōu)化,得到最優(yōu)超參結(jié)果res = forest_minimize(fun_sk, space_sk)param = dict(zip(['n_estimators', 'max_depth', 'min_samples_split', 'min_samples_leaf'], res.x))rf_hp = RandomForestClassifier(**param)rf_hp.fit(X_train, y_train)rf_hp.score(X_test, y_test)# skopt優(yōu)化得分:0.965034965034965


          在上述超參優(yōu)化過程中,由于所用數(shù)據(jù)集較小,所以在制定相應(yīng)的目標(biāo)函數(shù)時(shí)均采用交叉驗(yàn)證的方式以提高泛華性能。同時(shí),三種超參優(yōu)化方式所得到最優(yōu)優(yōu)化結(jié)果相同,這一方面源于數(shù)據(jù)集較小造成的,另一方面其本身也有一定的隨機(jī)性。但無論如何,三個(gè)優(yōu)化庫在具體使用上是相近的,在優(yōu)化效果方面也算相當(dāng)?shù)摹?br>



          相關(guān)閱讀:

          瀏覽 81
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产日韩视频 | 中文字幕无码不卡 | 国产三级片视频网站 | 四虎欧美性爱 | 成人中文字幕在线 |