亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Python中4種超參自動(dòng)優(yōu)化算法的實(shí)現(xiàn)

 更新時(shí)間:2022年05月31日 10:52:16   作者:Python學(xué)習(xí)與數(shù)據(jù)挖掘  
要想模型效果好,每個(gè)算法工程師都應(yīng)該了解的流行超參數(shù)調(diào)優(yōu)技術(shù)。今天給大家總結(jié)超參自動(dòng)優(yōu)化方法:網(wǎng)格搜索、隨機(jī)搜索、貝葉斯優(yōu)化?和?Hyperband,感興趣的可以了解一下

大家好,要想模型效果好,每個(gè)算法工程師都應(yīng)該了解的流行超參數(shù)調(diào)優(yōu)技術(shù)。

今天我給大家總結(jié)超參自動(dòng)優(yōu)化方法:網(wǎng)格搜索、隨機(jī)搜索、貝葉斯優(yōu)化 和 Hyperband,并附有相關(guān)的樣例代碼供大家學(xué)習(xí)。

一、網(wǎng)格搜索(Grid Search)

網(wǎng)格搜索是暴力搜索,在給定超參搜索空間內(nèi),嘗試所有超參組合,最后搜索出最優(yōu)的超參組合。sklearn已實(shí)現(xiàn)該方法,使用樣例如下:

from sklearn import svm, datasets
from sklearn.model_selection import GridSearchCV
import pandas as pd

# 導(dǎo)入數(shù)據(jù)
iris = datasets.load_iris()
# 定義超參搜索空間
parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
# 初始化模型
svc = svm.SVC()
# 網(wǎng)格搜索
clf = GridSearchCV(estimator = svc,
                   param_grid = parameters,
                   scoring = 'accuracy',
                   n_jobs = -1,
                   cv = 5)
clf.fit(iris.data, iris.target)
返回:GridSearchCV(cv=5, estimator=SVC(), n_jobs=-1,
                   param_grid={'C': [1, 10], 'kernel': ('linear', 'rbf')},
                   scoring='accuracy')

# 打印結(jié)果
print('詳細(xì)結(jié)果:\n', pd.DataFrame.from_dict(clf.cv_results_))
print('最佳分類器:\n', clf.best_estimator_)
print('最佳分?jǐn)?shù):\n', clf.best_score_)
print('最佳參數(shù):\n', clf.best_params_).
返回:
詳細(xì)結(jié)果:
    mean_fit_time  std_fit_time  mean_score_time  std_score_time param_C  ... split3_test_score split4_test_score  mean_test_score  std_test_score  rank_test_score
0       0.000788      0.000394         0.000194        0.000389       1  ...          0.966667               1.0         0.980000        0.016330                1
1       0.000804      0.000402         0.000199        0.000399       1  ...          0.933333               1.0         0.966667        0.021082                4
2       0.000593      0.000484         0.000593        0.000484      10  ...          0.966667               1.0         0.973333        0.038873                3
3       0.000593      0.000484         0.000399        0.000489      10  ...          0.966667               1.0         0.980000        0.016330                1
[4 rows x 15 columns]
最佳分類器:
 SVC(C=1, kernel='linear')
最佳分?jǐn)?shù):
0.9800000000000001
最佳參數(shù):
 {'C': 1, 'kernel': 'linear'}

sklearn.model_selection.GridSearchCV[1]的重要參數(shù)說(shuō)明:

  • estimator: scikit-learn模型。
  • param_grid: 超參搜索空間,即超參數(shù)字典。
  • scoring: 在交叉驗(yàn)證中使用的評(píng)估策略。
  • n_jobs: 并行任務(wù)數(shù),-1為使用所有CPU。
  • cv: 決定采用幾折交叉驗(yàn)證。

二、隨機(jī)搜索(Randomized Search)

隨機(jī)搜索是在搜索空間中采樣出超參組合,然后選出采樣組合中最優(yōu)的超參組合。隨機(jī)搜索的好處如下圖所示:

圖1: 網(wǎng)格搜索和隨機(jī)搜索的對(duì)比

解釋圖1,如果目前我們要搜索兩個(gè)參數(shù),但參數(shù)A重要而另一個(gè)參數(shù)B并沒(méi)有想象中重要,網(wǎng)格搜索9個(gè)參數(shù)組合(A, B),而由于模型更依賴于重要參數(shù)A,所以只有3個(gè)參數(shù)值是真正參與到最優(yōu)參數(shù)的搜索工作中。反觀隨機(jī)搜索,隨機(jī)采樣9種超參組合,在重要參數(shù)A上會(huì)有9個(gè)參數(shù)值參與到搜索工作中,所以,在某些參數(shù)對(duì)模型影響較小時(shí),使用隨機(jī)搜索能讓我們有更多的探索空間

同樣地,sklearn實(shí)現(xiàn)了隨機(jī)搜索,樣例代碼如下:

from sklearn import svm, datasets
from sklearn.model_selection import RandomizedSearchCV
import pandas as pd
from scipy.stats import uniform


# 導(dǎo)入數(shù)據(jù)
iris = datasets.load_iris()
# 定義超參搜索空間
distributions = {'kernel':['linear', 'rbf'], 'C':uniform(loc=1, scale=9)}
# 初始化模型
svc = svm.SVC()
# 網(wǎng)格搜索
clf = RandomizedSearchCV(estimator = svc,
                         param_distributions = distributions,
                         n_iter = 4,
                         scoring = 'accuracy',
                         cv = 5,
                         n_jobs = -1,
                         random_state = 2021)
clf.fit(iris.data, iris.target)
返回:RandomizedSearchCV(cv=5, estimator=SVC(), n_iter=4, n_jobs=-1,
                         param_distributions={'C': <scipy.stats._distn_infrastructure.rv_frozen object at 0x000001F372F9A190>,
                                              'kernel': ['linear', 'rbf']},
                         random_state=2021, scoring='accuracy')


# 打印結(jié)果
print('詳細(xì)結(jié)果:\n', pd.DataFrame.from_dict(clf.cv_results_))
print('最佳分類器:\n', clf.best_estimator_)
print('最佳分?jǐn)?shù):\n', clf.best_score_)
print('最佳參數(shù):\n', clf.best_params_)
返回:
詳細(xì)結(jié)果:
    mean_fit_time  std_fit_time  mean_score_time  std_score_time  param_C  ... split3_test_score split4_test_score  mean_test_score  std_test_score  rank_test_score
0       0.000598      0.000489         0.000200        0.000400   6.4538  ...          0.966667               1.0         0.986667        0.016330                1
1       0.000997      0.000002         0.000000        0.000000  4.99782  ...          0.966667               1.0         0.980000        0.026667                3
2       0.000798      0.000399         0.000399        0.000488  3.81406  ...          0.966667               1.0         0.980000        0.016330                3
3       0.000598      0.000488         0.000200        0.000399  5.36286  ...          0.966667               1.0         0.986667        0.016330                1
[4 rows x 15 columns]
最佳分類器:
 SVC(C=6.453804509266643)
最佳分?jǐn)?shù):
0.9866666666666667
最佳參數(shù):
 {'C': 6.453804509266643, 'kernel': 'rbf'}

相比于網(wǎng)格搜索,sklearn隨機(jī)搜索中主要改變的參數(shù)是param_distributions,負(fù)責(zé)提供超參值分布范圍。

三、貝葉斯優(yōu)化(Bayesian Optimization)

我寫本文的目的主要是沖著貝葉斯優(yōu)化來(lái)的,一直有所耳聞卻未深入了解,所以我就來(lái)查漏補(bǔ)缺了。以下內(nèi)容主要基于Duane Rich在《How does Bayesian optimization work?》的回答。

調(diào)優(yōu)的目的是要找到一組最優(yōu)的超參組合,能使目標(biāo)函數(shù)f達(dá)到全局最小值。

舉個(gè)例子,若學(xué)習(xí)率設(shè)置過(guò)大,模型可能會(huì)在代價(jià)函數(shù)的全局最優(yōu)點(diǎn)附近不斷來(lái)回震蕩,甚至跳出全局最優(yōu)點(diǎn),而設(shè)置過(guò)小,又可能會(huì)陷入局部最優(yōu),因此調(diào)學(xué)習(xí)率這一參數(shù),是為了讓模型能收斂到代價(jià)函數(shù)的全局最小值??墒窃跈C(jī)器學(xué)習(xí)中,目標(biāo)函數(shù) 常是被稱作expensive blackbox function,計(jì)算開(kāi)銷大且不一定為凸函數(shù)。為此,貝葉斯優(yōu)化出現(xiàn)了,它特別適合針對(duì)expensive blackbox function找到全局最優(yōu)。

假設(shè)我們的真實(shí)的目標(biāo)函數(shù) 長(zhǎng)下圖這樣:

圖2: 目標(biāo)函數(shù)f(x)

注意: 目標(biāo)函數(shù) 的 是指超參數(shù),我們希望找到最優(yōu)的超參 去得到最小的 。為什么用虛線表示 呢?因?yàn)樗呛谙浜瘮?shù)(blackbox function)。

現(xiàn)在,我們?cè)趺凑业?全局最小值點(diǎn)呢?我們能不能先在 上隨機(jī)采樣10個(gè)點(diǎn),然后取它們的最小值呢?

圖3: 隨機(jī)采樣10個(gè)點(diǎn)的目標(biāo)函數(shù)f(x)

圖3里確實(shí)有個(gè)點(diǎn)挺靠近全局最優(yōu)點(diǎn)的,那是不是在它附近再采樣幾個(gè)點(diǎn),不斷重復(fù)就行了?沒(méi)那么簡(jiǎn)單,萬(wàn)一起始采樣點(diǎn)在局部最小值附近,那這種方法會(huì)很容易陷入局部最優(yōu)。關(guān)于“如何找到下一個(gè)合適的點(diǎn)”這個(gè)問(wèn)題,我們先放一放,因?yàn)槲覀兟┑粢粋€(gè)重點(diǎn):每次嘗試一種超參值 ,計(jì)算 的代價(jià)是昂貴的,為了減輕開(kāi)銷,貝葉斯優(yōu)化采用了代理模型(surrogate model),代理模型可以被看作是一個(gè)簡(jiǎn)單模型去擬合原本復(fù)雜且不好理解的模型,簡(jiǎn)單來(lái)說(shuō),就是 計(jì)算太昂貴了,我們就用代理模型去代替它。

貝葉斯優(yōu)化使用了**高斯過(guò)程(gasussian processes, GP)**去構(gòu)建代理模型,高斯過(guò)程的細(xì)節(jié)這里暫時(shí)不講,有興趣的小伙伴可以自行查閱資料了解?;诮o定的輸入和輸出,GP會(huì)推斷出一個(gè)模型(這里為代理模型)。假設(shè)我們從昂貴的 采樣了4個(gè)點(diǎn),然后我們把這4個(gè)點(diǎn)交給GP,它會(huì)返回一個(gè)代理模型,如下圖所示:

圖4: 目標(biāo)函數(shù)f(x)和代理模型

綠色實(shí)線就是GP猜的代理模型,綠色條帶是輸出分布的標(biāo)準(zhǔn)差(即為Uncertainty)。我們有了代理模型,后續(xù)我們?nèi)フ蚁乱粋€(gè)合適的超參值,就能帶入到計(jì)算開(kāi)銷相對(duì)較小的代理模型中,評(píng)估給定超參值的情況。

現(xiàn)在,我們來(lái)思考回之前提到的問(wèn)題:“如何找到下一個(gè)合適的點(diǎn)?”,這個(gè)問(wèn)題本質(zhì)是在問(wèn):“哪里有全局最小的點(diǎn)?”,為了解決這個(gè)問(wèn)題,我們要關(guān)注兩個(gè)地方:

(1) 已開(kāi)發(fā)區(qū)域: 在綠色實(shí)線上最低的超參點(diǎn)。因?yàn)楹芸赡芩浇嬖谌肿顑?yōu)點(diǎn)。

(2) 未探索區(qū)域: 綠色實(shí)線上還未被探索的區(qū)域。比如圖4,相比于0.15-0.25區(qū)間,0.65-0.75區(qū)間更具有探索價(jià)值(即該區(qū)間Uncertainty更大)。探索該區(qū)域有利于減少我們猜測(cè)的方差。

為了實(shí)現(xiàn)以上探索和開(kāi)發(fā)的平衡(exploration-exploitation trade-off),貝葉斯優(yōu)化使用了采集函數(shù)(acquisition function),它能平衡好全局最小值的探索和開(kāi)發(fā)。采集函數(shù)有很多選擇,其中最常見(jiàn)的是expectated of improvement(EI),我們先看一個(gè)utility function:

是目前觀察到的最小值, 是超參值,我們希望上述utility function輸出越大越好(即找到的 能獲得比當(dāng)前最小值還小),基于 ,EI采集函數(shù)如下所示:

具有最高的EI的超參值 會(huì)被選擇。EI有兩部分:

(1) 減少均值函數(shù) ,提高EI。

(2) 增加方差 ,提高EI。

所以EI的提高是建立在均值和方差的trade-off,也是exploration和exploitation的trade-off。

圖5: 采集函數(shù)A(x)

圖5我們可以看到, 時(shí)EI最大,所以我們下一個(gè)超參值 應(yīng)該選1。

講到這里,我們來(lái)看下完整的貝葉斯優(yōu)化步驟是怎樣的:

圖6: 貝葉斯優(yōu)化-SMBO

SMBO是簡(jiǎn)潔版的貝葉斯優(yōu)化,偽代碼如圖6所示,具體如下:

(1) 準(zhǔn)備輸入: expensive blackbox function ,超參搜索空間 ,采樣數(shù)據(jù)集 (超參組合 ,對(duì)應(yīng) 輸出值),采集函數(shù) 和用數(shù)據(jù)集 擬合的代理模型M。

(2) 基于 和 ,采樣得到數(shù)據(jù)集 。

(3) 循環(huán)選 次參數(shù):

用當(dāng)前數(shù)據(jù)集 擬合代理模型 ,實(shí)現(xiàn)模型更新。

選擇使采集函數(shù) 最大的超參組合 。

將 帶入 中,得到輸出值 。(注意這里 的計(jì)算開(kāi)銷大)

將新的 加入到現(xiàn)有數(shù)據(jù)集 中。

目前,Hyperopt開(kāi)源代碼庫(kù)已實(shí)現(xiàn)基于**TPE(Tree-structured Parzen Estimator Approach)**的貝葉斯優(yōu)化,圖6我們能看到GP構(gòu)建的概率模型是 ,而TPE是 和 ,關(guān)于TPE和GP的對(duì)比討論,建議閱讀論文。TPE樣例代碼如下:

from sklearn import svm, datasets
from sklearn.model_selection import cross_val_score
from hyperopt import hp, fmin, tpe, space_eval
import pandas as pd

# 導(dǎo)入數(shù)據(jù)
iris = datasets.load_iris()

# step1: 定義目標(biāo)函數(shù)
def objective(params):
      # 初始化模型并交叉驗(yàn)證
      svc = svm.SVC(**params)
      cv_scores = cross_val_score(svc, iris.data, iris.target, cv=5)
      # 返回loss = 1 - accuracy (loss必須被最小化)
      loss = 1 - cv_scores.mean()
      return loss

# step2: 定義超參搜索空間
space = {'kernel':hp.choice('kernel', ['linear', 'rbf']),
         'C':hp.uniform('C', 1, 10)}

# step3: 在給定超參搜索空間下,最小化目標(biāo)函數(shù)
best = fmin(objective, space, algo=tpe.suggest, max_evals=100)
返回: best_loss: 0.013333333333333308(即accuracy為0.9866666666666667)

# step4: 打印結(jié)果
print(best)
返回:{'C': 6.136181888987526, 'kernel': 1}(PS:kernel為0-based index,這里1指rbf)

四、Hyperband

除了格子搜索、隨機(jī)搜索和貝葉斯優(yōu)化,還有其它自動(dòng)調(diào)參方式。例如Hyperband optimization,Hyperband本質(zhì)上是隨機(jī)搜索的一種變種,它使用早停策略和Sccessive Halving算法去分配資源,結(jié)果是Hyperband能評(píng)估更多的超參組合,同時(shí)在給定的資源預(yù)算下,比貝葉斯方法收斂更快,下圖展示了Hyperband的早停和資源分配:

圖7: Hyperband的超參選擇和評(píng)估

在Hyperband之后,還出現(xiàn)了BOHB,它混合了貝葉斯優(yōu)化和Hyperband。Hyperband和BOHB的開(kāi)源代碼可參考HpBandSter庫(kù),這里不展開(kāi)細(xì)講。

總結(jié)

上面我們用Iris鳶尾花數(shù)據(jù)集試了不同的超參自動(dòng)調(diào)優(yōu)方法,發(fā)現(xiàn)貝葉斯優(yōu)化和隨機(jī)搜索都比格子搜索好。從一些論文反映,貝葉斯優(yōu)化是更香的,但是貝葉斯優(yōu)化好像在實(shí)踐中用的不是那么多,網(wǎng)上也有很多分享者,像Nagesh Singh Chauhan,說(shuō)的那樣:

As a general rule of thumb, any time you want to optimize tuning hyperparameters, think Grid Search and Randomized Search! [10]

Hyperparameter Optimization for Machine Learning Models - Nagesh Singh Chauhan

為什么呢?我想原因是貝葉斯的開(kāi)銷太大了,前面有提到,在每次循環(huán)選超參值的時(shí)候,貝葉斯優(yōu)化都需要將 帶入昂貴的目標(biāo)函數(shù) 中,去得到輸出值y,當(dāng)目標(biāo)函數(shù)特別復(fù)雜時(shí),這種情況的評(píng)估開(kāi)銷是很大的,更何況隨著搜索空間和搜索次數(shù)的變大,計(jì)算會(huì)越發(fā)昂貴。

寫這篇文章的過(guò)程中,我主要學(xué)到了2點(diǎn),一是隨機(jī)搜索在某些時(shí)候會(huì)比格子搜索好,二是了解貝葉斯優(yōu)化的機(jī)理。這里,談?wù)勎冶荣惡蛡€(gè)人實(shí)踐中的體會(huì),我很少會(huì)花過(guò)多時(shí)間在超參的調(diào)優(yōu)上,因?yàn)樗鼛?lái)的收益是有限的,很多時(shí)候比起壓榨模型來(lái)說(shuō),思考和挖掘數(shù)據(jù)特征能帶來(lái)更多的收益,所以我想這也是為什么上面說(shuō):在任何想要調(diào)優(yōu)超參時(shí),先用格子搜索或隨機(jī)搜索吧。

以上就是詳解Python中4種超參自動(dòng)優(yōu)化算法的實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Python超參自動(dòng)優(yōu)化算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python數(shù)據(jù)結(jié)構(gòu)與算法中的隊(duì)列詳解(1)

    Python數(shù)據(jù)結(jié)構(gòu)與算法中的隊(duì)列詳解(1)

    這篇文章主要為大家詳細(xì)介紹了Python的隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 詳解Selenium如何使用input標(biāo)簽上傳文件完整流程

    詳解Selenium如何使用input標(biāo)簽上傳文件完整流程

    這篇文章主要介紹了詳解Selenium如何使用input標(biāo)簽上傳文件完整流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Numpy中np.dot與np.matmul的區(qū)別詳解

    Numpy中np.dot與np.matmul的區(qū)別詳解

    本文主要介紹了Numpy中np.dot與np.matmul的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 詳解Python nose單元測(cè)試框架的安裝與使用

    詳解Python nose單元測(cè)試框架的安裝與使用

    本篇文章主要介紹了詳解Python nose單元測(cè)試框架的安裝與使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • 關(guān)于python中的xpath解析定位

    關(guān)于python中的xpath解析定位

    這篇文章主要介紹了關(guān)于python中的xpath解析定位,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • python接口自動(dòng)化之使用token傳入到header消息頭中

    python接口自動(dòng)化之使用token傳入到header消息頭中

    這篇文章主要介紹了python接口自動(dòng)化之使用token傳入到header消息頭中問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python BeautifulSoup庫(kù)的安裝與使用

    python BeautifulSoup庫(kù)的安裝與使用

    這篇文章主要介紹了python BeautifulSoup庫(kù)的安裝與使用,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • Pycharm5個(gè)非常有用的方法技巧

    Pycharm5個(gè)非常有用的方法技巧

    這篇文章主要介紹了Pycharm5個(gè)非常有用的方法技巧,PyCharm?是一款非常強(qiáng)大的編寫?python?代碼的工具。掌握一些小技巧能成倍的提升寫代碼的效率,本篇介紹幾個(gè)經(jīng)常使用的小技巧,需要的小伙伴可以參考一下
    2022-07-07
  • django表單中的按鈕獲取數(shù)據(jù)的實(shí)例分析

    django表單中的按鈕獲取數(shù)據(jù)的實(shí)例分析

    在本篇文章里小編給大家詳解了關(guān)于django表單中的按鈕獲取數(shù)據(jù)的內(nèi)容,需要的朋友們可以參考下。
    2020-07-07
  • Python的Flask框架應(yīng)用程序?qū)崿F(xiàn)使用QQ賬號(hào)登錄的方法

    Python的Flask框架應(yīng)用程序?qū)崿F(xiàn)使用QQ賬號(hào)登錄的方法

    利用QQ開(kāi)放平臺(tái)的API使用QQ賬號(hào)登錄是現(xiàn)在很多網(wǎng)站都具備的功能,而對(duì)于Flask框架來(lái)說(shuō)則有Flask-OAuthlib這個(gè)現(xiàn)成的輪子,這里我們就來(lái)看一下Python的Flask框架應(yīng)用程序?qū)崿F(xiàn)使用QQ賬號(hào)登錄的方法
    2016-06-06

最新評(píng)論