貝葉斯優化引數

2021-08-29 23:42:01 字數 3477 閱讀 3367

[貝葉斯優化]

貝葉斯優化用於機器學習調參由j. snoek(2012)提出,主要思想是,給定優化的目標函式(廣義的函式,只需指定輸入和輸出即可,無需知道內部結構以及數學性質),通過不斷地新增樣本點來更新目標函式的後驗分布(高斯過程,直到後驗分布基本貼合於真實分布。簡單的說,就是考慮了上一次引數的資訊**,從而更好的調整當前的引數。

他與常規的網格搜尋或者隨機搜尋的區別是:

貝葉斯調參採用高斯過程,考慮之前的引數資訊,不斷地更新先驗;網格搜尋未考慮之前的引數資訊 

貝葉斯調參迭代次數少,速度快;網格搜尋速度慢,引數多時易導致維度**

貝葉斯調參針對非凸問題依然穩健;網格搜尋針對非凸問題易得到區域性優最

介紹貝葉斯優化調參,必須要從兩個部分講起:

高斯過程,用以擬合優化目標函式

貝葉斯優化,包括了「開採」和「勘探」,用以花最少的代價找到最優值

2.1 高斯過程

高斯過程可以用於非線性回歸、非線性分類、引數尋優等等。

2.3 缺點和不足

高斯過程核矩陣不好選
目前可以做貝葉斯優化的包非常多,光是python就有:

bayesianoptimization

bayesopt

skopt

本文使用bayesianoptimization為例,利用sklearn的隨機森林模型進行分類

安裝

pip install bayesian-optimization
前期準備

from sklearn.datasets import make_classification

from sklearn.ensemble import randomforestclassifier

from sklearn.cross_validation import cross_val_score

from bayes_opt import bayesianoptimization

產生隨機分類資料集,10個特徵, 2個類別

x, y = make_classification(n_samples=1000,n_features=10,n_classes=2)
我們先看看不調參的結果:

rf = randomforestclassifier()

print(np.mean(cross_val_score(rf, x, y, cv=20, scoring='roc_auc')))

>>> 0.965162

可以看到,不調參的話模型20此交叉驗證auc均值是0.965162,算是乙個不錯的模型,那麼如果用bayes調參結果會怎麼樣呢

我們先定義乙個目標函式,裡面放入我們希望優化的函式。比如此時,函式輸入為隨機森林的所有引數,輸出為模型交叉驗證5次的auc均值,作為我們的目標函式。因為bayes_opt庫只支援最大值,所以最後的輸出如果是越小越好,那麼需要在前面加上負號,以轉為最大值。由於bayes優化只能優化連續超引數,因此要加上int()轉為離散超引數。

def rf_cv(n_estimators, min_samples_split, max_features, max_depth):

val = cross_val_score(

randomforestclassifier(n_estimators=int(n_estimators),

min_samples_split=int(min_samples_split),

max_features=min(max_features, 0.999), # float

max_depth=int(max_depth),

random_state=2

),x, y, 'roc_auc', cv=5

).mean()

return val

然後我們就可以例項化乙個bayes優化物件了:

rf_bo = bayesianoptimization(

rf_cv,

)

裡面的第乙個引數是我們的優化目標函式,第二個引數是我們所需要輸入的超引數名稱,以及其範圍。超引數名稱必須和目標函式的輸入名稱一一對應。

完成上面兩步之後,我們就可以執行bayes優化了!

rf_bo.maximize()
完成的時候會不斷地輸出結果,如下圖所示:

等到程式結束,我們可以檢視當前最優的引數和結果:

rf_bo.res['max']

>>> ,

『max_val』: 0.9774079407940794}

上面bayes演算法得到的引數並不一定最優,當然我們會遇到一種情況,就是我們已經知道有一組或是幾組引數是非常好的了,我們想知道其附近有沒有更好的。這個操作相當於上文bayes優化中的explore操作,而bayes_opt庫給了我們實現此方法的函式:

rf_bo.explore(

)

這裡我們新增了三組較優的超引數,讓其在該引數基礎上進行explore,可能會得到更好的結果。

同時,我們還可以修改高斯過程的引數,高斯過程主要引數是核函式(kernel),還有其他引數可以參考sklearn.gaussianprocess

gp_param=

rf_bo.maximize(**gp_param)

最終我們的到引數如下:

,

'max_val': 0.9774079407940794}

執行交叉驗證測試一下:

rf = randomforestclassifier(max_depth=6, max_features=0.39517, min_samples_split=2, n_estimators=250)

np.mean(cross_val_score(rf, x, y, cv=20, scoring='roc_auc'))

>>> 0.9754953

得到最終結果是0.9755,比之前的0.9652提高了約0.01,做過kaggle的朋友都懂,這在後期已經是非常大的提高了!到後面想提高0.001都極其困難,因此bayes優化真的非常強大!

結束!reference

[1] j. snoek, h. larochelle, and r. p. adams, 「practical bayesianoptimization of machine learning algorithms,」 in advances in neural information processing systems, 2012, pp. 2951–2959.

[2] 高斯過程:

[3] 高斯過程:

[4] 高斯過程:

貝葉斯優化

中使用的bo演算法 小結如有錯誤,歡迎交流指正。貝葉斯優化是一種十分有效的全域性優化演算法,目標是找到全域性最優解.貝葉斯優化有效地解決了序貫決策理論中經典的機器智慧型問題 根據對未知目標函式 f 獲取的資訊,找到下乙個評估位置,從而最快地達到最優解。實際上就是一種超引數優化方式。出自 貝葉斯優化方...

貝葉斯優化

比如我們已知函式y f x 那我們想知道f x 的最大值,x argmax 我們使用高斯過程gp作為 函式去 f x 根據一些已有的一些初始 xi,yi 去fit乙個gp 根據已有的高斯過程,隨機取樣m個點,對這m點可以使用上一步的gp去 每個點的mean和std,得到每個點處的高斯分布,根據acq...

貝葉斯 01 初識貝葉斯

分割線 分割線 分割線 分割線 分割線 分割線 分割線 分割線 分割線 分割線 分割線 分割線 分割線 最先知道貝葉斯公式還是四年前的概率論和數理統計課上,時間也很久了,具體內容早已經忘記,不過畢竟曾經學過,重新看過還是得心應手的。大概用兩三篇的內容來介紹一下貝葉斯,以及機器學習中很重要的一部分 樸...