<strike id="ca4is"><em id="ca4is"></em></strike>
  • <sup id="ca4is"></sup>
    • <s id="ca4is"><em id="ca4is"></em></s>
      <option id="ca4is"><cite id="ca4is"></cite></option>
    • 二維碼
      企資網

      掃一掃關注

      當前位置: 首頁 » 企資快報 » 服務 » 正文

      推薦這三個超參優化庫(附python代碼)

      放大字體  縮小字體 發布日期:2021-08-26 02:58:32    作者:媒體小英    瀏覽次數:18
      導讀

      在傳統的算法建模過程中,影響算法性能的一個重要環節、也可能是最為耗時和無趣的一項工作就是算法的調參,即超參數優化(Hyper-parameter Optimization,HPO),因此很多算法工程師都會調侃的自稱"調參俠"。近期在

      在傳統的算法建模過程中,影響算法性能的一個重要環節、也可能是最為耗時和無趣的一項工作就是算法的調參,即超參數優化(Hyper-parameter Optimization,HPO),因此很多算法工程師都會調侃的自稱"調參俠"。

      近期在研究一些AutoML相關的論文和實現,而在AutoML中的一個核心組件就是HPO。借此機會,本文梳理總結Python中三種常見的可實現HPO的庫,并提供一個簡單的示例。

      HPO,全稱Hyper-parameter Optimization,即超參優化。之所以做這項工作是出于機器學習領域的兩個基本事實:

      no free lunch。即天下沒有免費午餐,用在機器學習領域是指沒有一種算法可以適用于所有的機器學習問題,換言之A算法可能在這個數據集上表現最優,但在另一個數據集上表現最好的則是另一個B算法。

      對于同一算法,不同的超參數可能對算法性能影響很大。例如線性模型中的正則化系數、決策樹模型中樹的最大深度等,這些都屬于模型擬合之外的參數,需要認為指定,故而稱之為超參數。

      正因如此,所以算法工程師們在提升算法性能時常常需要對比多個模型,同時在各模型內部又要調整多組超參,以期實現最優效果。在這個超參調優過程中,當前的實現方式主要是如下三種:

      最為簡單也最為熟知的莫過于網格搜索,在sklearn中的實現是GridSearch,通過對各超參數提供所有可能的候選值,該算法會自動暴力嘗試所有可能的超參組合,并給出最佳結果。該實現方法直觀易懂,但缺點也很明顯,那就是效率不高,而且只能接受離散取值

      與網格搜索類似、但不再暴力枚舉的一種方法是隨機搜索,其優化過程其實也更為簡單:即對每個超參數均隨機選取一個候選值,而后組成一次隨機抽選的超參組合。最后返回所有隨機嘗試后的最優組合。這種方法實現簡單,搜索次數可大可小,但卻往往能取得不錯的效果。但所得到的最好結果可能不是最優解。

      貝葉斯優化。除了網格搜索和隨機搜索外,貝葉斯優化可能是目前最為理想和高效的超參優化(從其名字可以看出,這類方法跟貝葉斯大神有一定關系,大概是由于其中要用到的代理函數與貝葉斯后驗概率有關吧)。基于貝葉斯優化算法實現的HPO,其一般形式可抽象為如下SMBO的過程:

      《Bayesian Optimization Primer》

      其中,各符號及變量的含義如下:

      f:目標函數,在機器學習場景中即為根據超參數組合xi得到評估指標yi的過程

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

      yi:目標函數的得分,在機器學習場景中即為評估指標結果,例如accuracy_score

      D:所有(xi, yi)組成的數據集

      M:代理函數,即要得到的由xi得到yi的映射方法。從機器學習的視角來理解,既然是由一組超參數(可理解為特征)擬合一個連續的得分結果(回歸目標),所以可用一個回歸模型來實現。這里之所以稱之為代理函數,則是因為正常情況下,應該是真正的用對應的算法模型+超參數進行實際的訓練和評估,得到真實的評估結果,而此時為了避免這種大計算量的過程(expensive),所以才選擇用一個簡單快速的函數加以擬合替代

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

      基于上述符號定義,SMBO過程如下:

      指定輸入參數f、X、M、S,給定一組初始的(xi, yi),作為初始訓練集完成代理函數M的評估;

      根據采集函數S和代理函數M,得到當前情況下可能獲得最優得分的超參組合xi+1

      將新一組超參數帶入待優化的機器學習,得到真實的yi+1

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

      如此迭代執行T次,或者達到目標效果結束

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

      這里簡單介紹幾種主流的代理函數M的選取:

      高斯過程,即將K個超參數到評分的映射關系抽象為K維聯合高斯分布,從而每次都根據數據集D來計算該聯合高斯分布的均值和方差即可。但這種方式的一個顯著缺點是僅適用于連續性超參,且一般僅在較低維度下適用;

      TPE,tree-structured Parzen estimator,主要思想是用到核密度函數估計(KDE,kernel density estimator),會根據yi的取值高低將數據集劃分為兩個區域,從而在兩個區域分別用kde方法擬合其分布。最后的目標就是盡可能的最大化高分的概率g(x)同時最小化低分的概率l(x)(實際用到的是最小化比值:l(x)/g(x));

      Random Forest,即將代理函數M用一個隨機森林回歸模型加以擬合,其中每棵子樹均通過在數據集D的隨機子集進行擬合確保隨機性。當拿到一組新的超參組合時,即可通過該隨機森林模型中每棵子樹的評分結果的均值作為衡量該組超參數的潛力。

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

      對于這三種代理函數的抽象實現,Python中均有相應的庫可直接調用。本文選取三個庫,分別對應一種代理函數的貝葉斯優化方法:

      GP,對應python庫bayes_opt

      TPE,對應python庫hyperopt

      RandomForest,對應python庫scikit-optimizer,簡稱skopt

      這里以sklearn中提供的經典二分類數據集breast_cancer為例,給出三個優化庫的基本實現方法:

      數據集加載和默認參數隨機森林的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 = RandomForestClassifierrf.fit(X_train, y_train)rf.score(X_test, y_test)# 默認參數RF得分:0.958041958041958

      bayes_opt實現

      from bayes_opt import BayesianOptimization

      # bayes_opt中的目標函數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

      # 貝葉斯優化中的搜索空間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 # 一鍵完成優化

      # 得到最優超參結果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優化得分:0.965034965034965

      hyperopt實現

      from hyperopt import fmin, hp, tpe, Trials

      # hyperopt中的目標函數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)}

      # 記錄優化過程,fmin實現一鍵優化,采用優化算法是tpetrials = Trialsparam = fmin(fun_hp, space_hp, tpe.suggest, max_evals=100, trials=trials)

      param = {k:int(v) for k, v in param.items} # 最優超參數rf_hp = RandomForestClassifier(**res)rf_hp.fit(X_train, y_train)rf_hp.score(X_test, y_test)# hyperopt優化得分:0.965034965034965

      skopt實現

      from skopt import forest_minimize, space

      # skopt中的目標函數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進行優化,得到最優超參結果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優化得分:0.965034965034965

      在上述超參優化過程中,由于所用數據集較小,所以在制定相應的目標函數時均采用交叉驗證的方式以提高泛華性能。同時,三種超參優化方式所得到最優優化結果相同,這一方面源于數據集較小造成的,另一方面其本身也有一定的隨機性。但無論如何,三個優化庫在具體使用上是相近的,在優化效果方面也算相當的。

      Python 程序員深度學習的“四大名著”:



      這四本書著實很不錯!我們都知道現在機器學習、深度學習的資料太多了,面對海量資源,往往陷入到“無從下手”的困惑出境。而且并非所有的書籍都是優質資源,浪費大量的時間是得不償失的。給大家推薦這幾本好書并做簡單介紹。


      獲得方式:


      2.后臺回復關鍵詞:4books

      注:此處建議復制,不然容易打錯


      4books即可獲取

       
      (文/媒體小英)
      免責聲明
      本文僅代表作發布者:媒體小英個人觀點,本站未對其內容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內容,一經發現,立即刪除,需自行承擔相應責任。涉及到版權或其他問題,請及時聯系我們刪除處理郵件:weilaitui@qq.com。
       

      Copyright ? 2016 - 2025 - 企資網 48903.COM All Rights Reserved 粵公網安備 44030702000589號

      粵ICP備16078936號

      微信

      關注
      微信

      微信二維碼

      WAP二維碼

      客服

      聯系
      客服

      聯系客服:

      在線QQ: 303377504

      客服電話: 020-82301567

      E_mail郵箱: weilaitui@qq.com

      微信公眾號: weishitui

      客服001 客服002 客服003

      工作時間:

      周一至周五: 09:00 - 18:00

      反饋

      用戶
      反饋

      午夜久久久久久网站,99久久www免费,欧美日本日韩aⅴ在线视频,东京干手机福利视频
        <strike id="ca4is"><em id="ca4is"></em></strike>
      • <sup id="ca4is"></sup>
        • <s id="ca4is"><em id="ca4is"></em></s>
          <option id="ca4is"><cite id="ca4is"></cite></option>
          主站蜘蛛池模板: 亚洲av本道一区二区三区四区 | 日本一在线中文字幕天堂| 国产四虎免费精品视频| 丰满少妇高潮惨叫久久久| 精品久久久久久中文字幕无码软件| 好吊妞视频haodiaoniucom| 亚洲色图狠狠干| 手机在线看片国产| 亚洲国产韩国一区二区| 麻豆久久婷婷综合五月国产| 日韩AV高清无码| 午夜理伦三级播放| 99久热只有精品视频免费看| 欧美一区二区三区久久综| 国产亚洲一区二区手机在线观看 | 视频一区二区在线观看| 尤果圈3.2.6破解版| 亚洲电影在线免费观看| 黄色一级片日本| 学渣坐在学长的棒棒上写作业作文| 亚洲精品中文字幕无码蜜桃| 久草网在线视频| 成人性一级视频在线观看| 亚洲精品国产国语| 黑人大战亚洲人精品一区| 性做久久久久免费观看| 亚洲日本人成中文字幕| 青青草原1769久久免费播放| 女人张开腿让男桶喷水高潮| 亚洲午夜久久久影院伊人| 色吊丝av中文字幕| 在线a亚洲视频播放在线观看| 久久综合国产乱子伦精品免费| 精品国产第一国产综合精品| 国产精品日韩欧美一区二区三区| 久久久久久影视| 毛片高清视频在线看免费观看| 国产免费av一区二区三区| 99精品无人区乱码1区2区3区 | 国产毛片女人18水多| 三级网站在线免费观看|