機(jī)器學(xué)習(xí)調(diào)參之貝葉斯優(yōu)化

一械筛、簡(jiǎn)介

貝葉斯優(yōu)化用于機(jī)器學(xué)習(xí)調(diào)參稠诲,主要思想是侦鹏,給定優(yōu)化的目標(biāo)函數(shù)(廣義的函數(shù),只需指定輸入和輸出即可臀叙,無需知道內(nèi)部結(jié)構(gòu)以及數(shù)學(xué)性質(zhì))略水,通過不斷地添加樣本點(diǎn)來更新目標(biāo)函數(shù)的后驗(yàn)分布(高斯過程,直到后驗(yàn)分布基本貼合于真實(shí)分布。簡(jiǎn)單的說劝萤,就是考慮了上一次參數(shù)的信息渊涝,從而更好的調(diào)整當(dāng)前的參數(shù)。

與常規(guī)的網(wǎng)格搜索或者隨機(jī)搜索的區(qū)別是:

  • 貝葉斯調(diào)參采用高斯過程稳其,考慮之前的參數(shù)信息驶赏,不斷地更新先驗(yàn);網(wǎng)格搜索未考慮之前的參數(shù)信息
  • 貝葉斯調(diào)參迭代次數(shù)少既鞠,速度快煤傍;網(wǎng)格搜索速度慢,參數(shù)多時(shí)易導(dǎo)致維度爆炸
  • 貝葉斯調(diào)參針對(duì)非凸問題依然穩(wěn)健嘱蛋;網(wǎng)格搜索針對(duì)非凸問題易得到局部?jī)?yōu)最

二蚯姆、理論

介紹貝葉斯優(yōu)化調(diào)參,必須要從兩個(gè)部分講起:

  • 高斯過程洒敏,用以擬合優(yōu)化目標(biāo)函數(shù)
  • 貝葉斯優(yōu)化龄恋,包括了“開采”和“勘探”,用以花最少的代價(jià)找到最優(yōu)值
    高斯過程回歸講解學(xué)習(xí)參考

三凶伙、hyperopt

  • 安裝pip list hyperopt

  • hyperopt貝葉斯優(yōu)化包涵四個(gè)部分:

    • 目標(biāo)函數(shù):我們想要最小化的內(nèi)容郭毕,在這里,目標(biāo)函數(shù)是機(jī)器學(xué)習(xí)模型使用該組超參數(shù)在驗(yàn)證集上的損失函荣。

    • 域空間:要搜索的超參數(shù)的取值范圍

    • 優(yōu)化算法:構(gòu)造替代函數(shù)并選擇下一個(gè)超參數(shù)值進(jìn)行評(píng)估的方法显押。

    • 結(jié)果歷史記錄:來自目標(biāo)函數(shù)評(píng)估的存儲(chǔ)結(jié)果扳肛,包括超參數(shù)和驗(yàn)證集上的損失。

  • 示例
    本程序采用感知機(jī)乘碑,對(duì)iris數(shù)據(jù)進(jìn)行分類挖息。 分別采用感知機(jī)原始方法和經(jīng)過貝葉斯優(yōu)化方法。


#!/usr/bin/env python
# encoding: utf-8
'''
@author: Great
@file: hyper_opt.py
@desc: hyperopt
'''
from sklearn import datasets
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.linear_model import Perceptron
from sklearn.preprocessing import StandardScaler
iris = datasets.load_iris()
x = iris.data
y = iris.target
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=0)
std = StandardScaler()
std.fit(x_train)
std_x_train = std.transform(x_train)
std_x_test = std.transform(x_test)

ppn = Perceptron(n_iter=40,eta0=0.1,random_state=0)
ppn.fit(std_x_train,y_train)
y_pred = ppn.predict(std_x_test)
print(accuracy_score(y_test,y_pred))#0.82222

#hyperopt
#定義目標(biāo)函數(shù)(最小化目標(biāo)函數(shù)兽肤,添加負(fù)號(hào)的最大化accuracy_score,
def percept(args):
    ppn = Perceptron(n_iter=args["n_iter"],
                     eta0= args["eta0"],
                     random_state=0)
    ppn.fit(std_x_train,y_train)
    y_pred = ppn.predict(std_x_test)
    return -accuracy_score(y_test,y_pred)
#定義域空間
from hyperopt import hp
"""
choice:類別變量
quniform:離散均勻(整數(shù)間隔均勻)
uniform:連續(xù)均勻(間隔為一個(gè)浮點(diǎn)數(shù))
loguniform:連續(xù)對(duì)數(shù)均勻(對(duì)數(shù)下均勻分布)
"""
space = {
    "n_iter":hp.choice("n_iter",range(30,50)),
    "eta0":hp.uniform("eta0",0.05,0.5)
}
#優(yōu)化算法
from hyperopt import tpe, partial
"""
tpe優(yōu)化算法
partial指定搜索算法tpe的參數(shù)
"""
bayesopt = partial(tpe.suggest, n_startup_jobs=10)
#結(jié)果歷史
#from hyperopt import Trials
#bayes_trial = Trials()
#最小化目標(biāo)函數(shù)
from hyperopt import fmin
best = fmin(percept,space,bayesopt,max_evals=100)#,trials=bayes_trial)
print(best)
print(percept(best))
#{'eta0': 0.23191782419000273, 'n_iter': 18}
#-0.9777777777777777

四套腹、bayes_opt

  • 安裝 pip3 install bayesian-optimization
  • bayes_opt流程
    • 定義優(yōu)化函數(shù)
    • 定義優(yōu)化參數(shù)
    • 開始優(yōu)化
    • 顯示結(jié)果

*示例
本程序采用隨機(jī)森林對(duì)制作的二分類數(shù)據(jù)進(jìn)行分類。 分別采用原始隨機(jī)森林方法和經(jīng)過貝葉斯優(yōu)化的方法资铡。

#!/usr/bin/env python
# encoding: utf-8
'''
@author: Great
@desc: bayes_opt
'''
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
from bayes_opt import BayesianOptimization
import numpy as np
#data
x, y = make_classification(n_samples=1000, n_features=10, n_classes=2)
rf = RandomForestClassifier()
#不做優(yōu)化的結(jié)果
print(np.mean(cross_val_score(rf,x,y,scoring="accuracy",cv=20)))
#定義優(yōu)化參數(shù)
def rf_cv(n_estimators, min_samples_split, max_depth, max_features):
    val = cross_val_score(RandomForestClassifier(n_estimators=int(n_estimators),
                          min_samples_split=int(min_samples_split),
                          max_depth = int(max_depth),
                          max_features = min(max_features,0.999),
                          random_state = 2),
            x,y,scoring="accuracy",cv=5).mean()
    return val
#貝葉斯優(yōu)化
rf_bo = BayesianOptimization(rf_cv,
                             {
                                 "n_estimators":(10,250),
                                 "min_samples_split":(2,25),
                                 "max_features":(0.1,0.999),
                                 "max_depth":(5,15)
                             })
#開始優(yōu)化
num_iter = 25
init_points = 5
rf_bo.maximize(init_points=init_points,n_iter=num_iter)
#顯示優(yōu)化結(jié)果
rf_bo.res["max"]
#附近搜索(已經(jīng)有不錯(cuò)的參數(shù)值的時(shí)候)
rf_bo.explore(
    {'n_estimators': [10, 100, 200],
     'min_samples_split': [2, 10, 20],
     'max_features': [0.1, 0.5, 0.9],
     'max_depth': [5, 10, 15]
    })

#驗(yàn)證優(yōu)化后參數(shù)的結(jié)果
rf = RandomForestClassifier(max_depth=5, max_features=0.432, min_samples_split=2, n_estimators=190)
np.mean(cross_val_score(rf, x, y, cv=20, scoring='roc_auc'))

五电禀、參考

bayes_opt: https://www.cnblogs.com/yangruiGB2312/p/9374377.html
hyperopt: https://blog.csdn.net/linxid/article/details/81189154
高斯過程: http://www.360doc.com/content/17/0810/05/43535834_678049865.shtml
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市害驹,隨后出現(xiàn)的幾起案子鞭呕,更是在濱河造成了極大的恐慌,老刑警劉巖宛官,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葫松,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡底洗,警方通過查閱死者的電腦和手機(jī)腋么,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亥揖,“玉大人珊擂,你說我怎么就攤上這事》驯洌” “怎么了摧扇?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)挚歧。 經(jīng)常有香客問我扛稽,道長(zhǎng),這世上最難降的妖魔是什么滑负? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任在张,我火速辦了婚禮,結(jié)果婚禮上矮慕,老公的妹妹穿的比我還像新娘帮匾。我一直安慰自己,他們只是感情好痴鳄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布瘟斜。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哼转。 梳的紋絲不亂的頭發(fā)上明未,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天槽华,我揣著相機(jī)與錄音壹蔓,去河邊找鬼。 笑死猫态,一個(gè)胖子當(dāng)著我的面吹牛佣蓉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播亲雪,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼勇凭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了义辕?” 一聲冷哼從身側(cè)響起虾标,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灌砖,沒想到半個(gè)月后璧函,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡基显,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年蘸吓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撩幽。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡库继,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窜醉,到底是詐尸還是另有隱情宪萄,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布榨惰,位于F島的核電站拜英,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏读串。R本人自食惡果不足惜聊记,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恢暖。 院中可真熱鬧排监,春花似錦、人聲如沸杰捂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挨队,卻和暖如春谷暮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盛垦。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工湿弦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腾夯。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓颊埃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親蝶俱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子班利,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容