中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Python 環(huán)境下的自動(dòng)化機(jī)器學(xué)習(xí)超參數(shù)調(diào)優(yōu)

2018-08-09    來(lái)源:raincent

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用
機(jī)器學(xué)習(xí)算法的性能高度依賴于超參數(shù)的選擇,對(duì)機(jī)器學(xué)習(xí)超參數(shù)進(jìn)行調(diào)優(yōu)是一項(xiàng)繁瑣但卻至關(guān)重要的任務(wù)。本文介紹了一個(gè)使用「Hyperopt」庫(kù)對(duì)梯度提升機(jī)(GBM)進(jìn)行貝葉斯超參數(shù)調(diào)優(yōu)的完整示例,并著重介紹了其實(shí)現(xiàn)過(guò)程。

由于機(jī)器學(xué)習(xí)算法的性能高度依賴于超參數(shù)的選擇,對(duì)機(jī)器學(xué)習(xí)超參數(shù)進(jìn)行調(diào)優(yōu)是一項(xiàng)繁瑣但至關(guān)重要的任務(wù)。手動(dòng)調(diào)優(yōu)占用了機(jī)器學(xué)習(xí)算法流程中一些關(guān)鍵步驟(如特征工程和結(jié)果解釋)的時(shí)間。網(wǎng)格搜索和隨機(jī)搜索則不會(huì)干涉這些步驟,但是需要大量的運(yùn)行時(shí)間,因?yàn)樗鼈兝速M(fèi)了時(shí)間去評(píng)估搜索空間中并不太可能找到最優(yōu)點(diǎn)的區(qū)域。如今越來(lái)越多的超參數(shù)調(diào)優(yōu)過(guò)程都是通過(guò)自動(dòng)化的方法完成的,它們旨在使用帶有策略的啟發(fā)式搜索(informed search)在更短的時(shí)間內(nèi)找到最優(yōu)超參數(shù),除了初始設(shè)置之外,并不需要額外的手動(dòng)操作。

貝葉斯優(yōu)化是一種基于模型的用于尋找函數(shù)最小值的方法。近段時(shí)間以來(lái),貝葉斯優(yōu)化開(kāi)始被用于機(jī)器學(xué)習(xí)超參數(shù)調(diào)優(yōu),結(jié)果表明,該方法在測(cè)試集上的表現(xiàn)更加優(yōu)異,但需要的迭代次數(shù)小于隨機(jī)搜索。此外,現(xiàn)在一些 Python 庫(kù)的出現(xiàn)使得對(duì)任意的機(jī)器學(xué)習(xí)模型實(shí)現(xiàn)貝葉斯超參數(shù)調(diào)優(yōu)變得更加簡(jiǎn)單。

本文將介紹一個(gè)使用「Hyperopt」庫(kù)對(duì)梯度提升機(jī)(GBM)進(jìn)行貝葉斯超參數(shù)調(diào)優(yōu)的完整示例。在本文作者早先的一篇文章中,他已經(jīng)對(duì)這個(gè)方法背后的概念進(jìn)行了概述,所以本文將著重介紹實(shí)現(xiàn)過(guò)程。和大多數(shù)機(jī)器學(xué)習(xí)的主題類似,讀者并不需要理解所有的細(xì)節(jié),但是了解基本的原理可以幫助讀者更有效地使用這項(xiàng)技術(shù)!

本文所有的代碼都可以以 Jupyter Notebook 的形式在 GitHub 上獲取(https://github.com/WillKoehrsen/hyperparameter-optimization)。

本文目錄:

貝葉斯優(yōu)化方法
優(yōu)化問(wèn)題的四個(gè)組成部分
目標(biāo)函數(shù)
域空間
優(yōu)化算法
結(jié)果的歷史數(shù)據(jù)
優(yōu)化
搜索結(jié)果
搜索結(jié)果的可視化
搜索的演化過(guò)程
繼續(xù)搜索
結(jié)語(yǔ)

貝葉斯優(yōu)化方法

簡(jiǎn)單地說(shuō),貝葉斯優(yōu)化通過(guò)基于過(guò)去對(duì)目標(biāo)的評(píng)估結(jié)果建立一個(gè)代理函數(shù)(概率模型)找到使得目標(biāo)函數(shù)最小的值。代理函數(shù)比目標(biāo)函數(shù)更易于優(yōu)化,因此下一個(gè)待評(píng)估的輸入值是通過(guò)對(duì)代理函數(shù)應(yīng)用某種標(biāo)準(zhǔn)(通常為預(yù)期提升)來(lái)選擇的。貝葉斯方法不同于隨機(jī)搜索或網(wǎng)格搜索,后兩者都使用了過(guò)去的評(píng)估結(jié)果來(lái)選擇接下來(lái)待評(píng)估的值。它們的思想是:通過(guò)根據(jù)過(guò)去表現(xiàn)良好的值選擇下一個(gè)輸入值來(lái)限制評(píng)價(jià)目標(biāo)函數(shù)的高昂開(kāi)銷(xiāo)。

對(duì)于超參數(shù)優(yōu)化來(lái)說(shuō),其目標(biāo)函數(shù)為使用一組超參數(shù)的機(jī)器學(xué)習(xí)模型的驗(yàn)證誤差。它的目標(biāo)是找出在驗(yàn)證集上產(chǎn)生最小誤差的超參數(shù),并希望將這些結(jié)果泛化到測(cè)試集上去。對(duì)目標(biāo)函數(shù)評(píng)估的開(kāi)銷(xiāo)是巨大的,因?yàn)樗枰?xùn)練帶有一組特定超參數(shù)的機(jī)器學(xué)習(xí)模型。理想情況下,我們希望找到這樣一方法,它既能探索搜索空間,又能限制耗時(shí)的超參數(shù)評(píng)估。貝葉斯超參數(shù)調(diào)優(yōu)使用一個(gè)不斷更新的概率模型,通過(guò)從過(guò)去的結(jié)果中進(jìn)行推理,使搜索過(guò)程「專注」于有可能達(dá)到最優(yōu)的超參數(shù)。

Python 環(huán)境下有一些貝葉斯優(yōu)化程序庫(kù),它們目標(biāo)函數(shù)的代理算法有所區(qū)別。在本文中,我們將使用「Hyperopt」庫(kù),它使用樹(shù)形 Parzen 評(píng)估器(TPE,https://papers.nips.cc/paper/4443-algorithms-for-hyper-parameter-optimization.pdf)作為搜索算法,其他的 Python 庫(kù)還包含「Spearmint」(高斯過(guò)程代理)和「SMAC」(隨即森林回歸)。目前在這個(gè)領(lǐng)域有大量有趣的研究,所以如果你對(duì)某一個(gè)庫(kù)不是很滿意,你可以試試其他的選項(xiàng)!針對(duì)某個(gè)問(wèn)題的通用結(jié)構(gòu)(本文將使用的結(jié)構(gòu))可以在各個(gè)庫(kù)間進(jìn)行轉(zhuǎn)換,其句法差異非常小。

優(yōu)化問(wèn)題的四個(gè)組成部分

貝葉斯優(yōu)化問(wèn)題有四個(gè)組成部分:

1. 目標(biāo)函數(shù):我們想要最小化的對(duì)象,這里指帶超參數(shù)的機(jī)器學(xué)習(xí)模型的驗(yàn)證誤差

2. 域空間:待搜索的超參數(shù)值

3. 優(yōu)化算法:構(gòu)造代理模型和選擇接下來(lái)要評(píng)估的超參數(shù)值的方法

4. 結(jié)果的歷史數(shù)據(jù):存儲(chǔ)下來(lái)的目標(biāo)函數(shù)評(píng)估結(jié)果,包含超參數(shù)和驗(yàn)證損失

通過(guò)以上四個(gè)步驟,我們可以對(duì)任意實(shí)值函數(shù)進(jìn)行優(yōu)化(找到最小值)。這是一個(gè)強(qiáng)大的抽象過(guò)程,除了機(jī)器學(xué)習(xí)超參數(shù)的調(diào)優(yōu),它還能幫我們解決其他許多問(wèn)題。

數(shù)據(jù)集

在本文的示例中,我們將使用 Caravan Insurance 數(shù)據(jù)集(https://www.kaggle.com/uciml/caravan-insurance-challenge),它的目標(biāo)是預(yù)測(cè)客戶是否會(huì)購(gòu)買(mǎi)一份保險(xiǎn)產(chǎn)品。這是一個(gè)監(jiān)督分類問(wèn)題,帶有 5800 個(gè)用于訓(xùn)練的觀測(cè)值和 4000 個(gè)測(cè)試點(diǎn)。由于這是一個(gè)不平衡的分類問(wèn)題,本文使用的評(píng)價(jià)性能的指標(biāo)是受試者工作特征曲線下的面積(ROC AUC),ROC AUC 的值越高越好,其值為 1 代表模型是完美的。數(shù)據(jù)集如下所示:

 

 

數(shù)據(jù)集(CARAVAN)是帶標(biāo)簽的

由于 Hyperopt 要做的是取最小值,我們將從目標(biāo)函數(shù)中返回「1-ROC AUC」,從而提高 ROC AUC。

梯度提升模型

在本文中,我們對(duì)梯度提升機(jī)(GBM)的細(xì)節(jié)知識(shí)不做過(guò)多探討,下面是我們需要理解的基本知識(shí):GBM 是一種基于使用依次訓(xùn)練的弱學(xué)習(xí)器(多為決策樹(shù))構(gòu)建強(qiáng)學(xué)習(xí)器的集成增強(qiáng)方法。GBM 中有許多超參數(shù),它們控制著整個(gè)集成結(jié)構(gòu)和單棵決策樹(shù)。我們?cè)谶@里使用的一種最有效的選擇決策樹(shù)數(shù)量的方法(稱為評(píng)估器)是早停止(early stopping)。LightGBM 提供了一種 Python 環(huán)境下的快速簡(jiǎn)單的 GBM 實(shí)現(xiàn)。

想了解更多 GBM 的細(xì)節(jié),這里有一篇高屋建瓴的文章:https://medium.com/mlreview/gradient-boosting-from-scratch-1e317ae4587d

一篇技術(shù)論文:https://brage.bibsys.no/xmlui/bitstream/handle/11250/2433761/16128_FULLTEXT.pdf

拋開(kāi)必要的背景知識(shí)不談,讓我們將用于超參數(shù)調(diào)優(yōu)的貝葉斯優(yōu)化問(wèn)題的四個(gè)組成部分一一列舉出來(lái)。

目標(biāo)函數(shù)

我們?cè)噲D最小化目標(biāo)函數(shù)。其輸入為一組值——在本例中為 GBM 的超參數(shù),輸出為需要最小化的實(shí)值——交叉驗(yàn)證損失。Hyperopt 將目標(biāo)函數(shù)作為黑盒處理,因?yàn)檫@個(gè)庫(kù)只關(guān)心輸入和輸出是什么。為了找到使損失最小的輸入值,該算法不需要知道目標(biāo)函數(shù)的內(nèi)部細(xì)節(jié)!從一個(gè)高度抽象的層次上說(shuō)(以偽代碼的形式),我們的目標(biāo)函數(shù)可以表示為:

 

 

在對(duì)最終的模型進(jìn)行評(píng)價(jià)時(shí),我們需要注意的是,不要使用測(cè)試集上的損失,因?yàn)槲覀冎荒苁褂靡淮螠y(cè)試集。相對(duì)地,我們對(duì)驗(yàn)證集上的超參數(shù)進(jìn)行評(píng)估。此外,我們使用 K 折交叉驗(yàn)證而不是將數(shù)據(jù)劃分到一個(gè)獨(dú)立的驗(yàn)證集中,這種驗(yàn)證方法除了保留了有價(jià)值的訓(xùn)練數(shù)據(jù)外,還能讓我們?cè)跍y(cè)試集上獲得偏差更小的誤差估計(jì)。

不同模型超參數(shù)調(diào)優(yōu)的目標(biāo)函數(shù)的基本結(jié)構(gòu)是相同的:函數(shù)接收超參數(shù)作為輸入,并返回使用這些超參數(shù)的交叉驗(yàn)證誤差。盡管本文的示例是針對(duì) GBM 的,但該結(jié)構(gòu)同樣可以被應(yīng)用于其他的方法。

下圖為 GBM 的完整目標(biāo)函數(shù),該 GBM 使用帶早停止機(jī)制的 10 折交叉驗(yàn)證:

 

 

核心的代碼為「cv_results = lgb.cv(...)」。為了實(shí)現(xiàn)帶早停止的交叉驗(yàn)證,我們使用了 LightGBM 的函數(shù)「cv」,向該函數(shù)傳入的參數(shù)包含超參數(shù)、一個(gè)訓(xùn)練集、交叉驗(yàn)證中使用的許多折,以及一些其它的參數(shù)。我們將評(píng)估器的數(shù)量(num_boost_round)設(shè)置為 10000,但是由于我們使用了「early_stopping_rounds」,當(dāng) 100 個(gè)評(píng)估器的驗(yàn)證得分沒(méi)有提高時(shí)訓(xùn)練會(huì)被停止,所以實(shí)際上使用的評(píng)估器不會(huì)達(dá)到這個(gè)數(shù)量。早停止是一種有效的選擇評(píng)估器數(shù)量的方法,而不是將其設(shè)置為另一個(gè)需要調(diào)優(yōu)的超參數(shù)!

當(dāng)交叉驗(yàn)證完成后,我們將得到最高得分(ROC AUC)。之后,由于我們想要得到的是最小值,我們將采用「1-最高得分」。該值將在返回的字典數(shù)據(jù)結(jié)構(gòu)中作為「loss」關(guān)鍵字返回。

這個(gè)目標(biāo)函數(shù)實(shí)際上比它所需的結(jié)構(gòu)復(fù)雜一些,因?yàn)槲覀儗⒎祷匾粋(gè)值的字典。對(duì)于 Hyperopt 中的目標(biāo)函數(shù),我們可以返回一個(gè)單一的值(即損失),或者返回一個(gè)帶有最小值的關(guān)鍵字「loss」和「status」的字典。返回超參數(shù)的值使我們能夠查看每組超參數(shù)得到的損失。

域空間

域空間表示我們想要對(duì)每個(gè)超參數(shù)進(jìn)行評(píng)估的值的范圍。在每一輪搜索迭代中,貝葉斯優(yōu)化算法將從域空間中為每個(gè)超參數(shù)選定一個(gè)值。當(dāng)我們進(jìn)行隨機(jī)搜索或網(wǎng)格搜索時(shí),域空間就是一個(gè)網(wǎng)格。貝葉斯優(yōu)化中也是如此,只是這個(gè)域空間對(duì)每個(gè)超參數(shù)來(lái)說(shuō)是一個(gè)概率分布而不是離散的值。

然而,在貝葉斯優(yōu)化問(wèn)題中,確定域空間是最難的部分。如果有機(jī)器學(xué)習(xí)方法的相關(guān)經(jīng)驗(yàn),我們可以將更大的概率賦予我們認(rèn)為最佳值可能存在的點(diǎn),以此來(lái)啟發(fā)對(duì)超參數(shù)分布的選擇。但是,不同的數(shù)據(jù)集之間的最佳模型設(shè)定是不同的,并且具有高維度的問(wèn)題(大量的超參數(shù)),這會(huì)使我們很難弄清超參數(shù)之間的相互作用。在不確定最佳值的情況下,我們可以使用更大范圍的概率分布,通過(guò)貝葉斯算法進(jìn)行推理。

首先,我們應(yīng)該了解一個(gè) GBM 中所有的超參數(shù):

 

 

我不確定世界上是否真有人知道所有的這些超參數(shù)是如何相互作用的!而其中有一些超參數(shù)是不需要調(diào)優(yōu)(如「objective」和「random_state」)。我們將使用早停止方法找到最佳的評(píng)估器數(shù)量「n_estimators」。盡管如此,我們?nèi)匀恍枰獌?yōu)化 10 個(gè)超參數(shù)!當(dāng)我們第一次對(duì)一個(gè)模型進(jìn)行調(diào)優(yōu)時(shí),我通常創(chuàng)建一個(gè)以缺省值為中心的大范圍域空間,然后在接下來(lái)的搜索中對(duì)其進(jìn)行優(yōu)化。

舉個(gè)例子,我們不妨在 Hyperopt 中定義一個(gè)簡(jiǎn)單的域——一個(gè)離散均勻分布,其中離散點(diǎn)的數(shù)量為 GBM 中每棵決策樹(shù)的葉子結(jié)點(diǎn)數(shù):

 

 

這里使用的是一個(gè)離散均勻分布,因?yàn)槿~子結(jié)點(diǎn)的數(shù)量必須是一個(gè)整數(shù)(離散的)并且域中的每個(gè)值出現(xiàn)的概率是均等的(均勻)。

概率分布的另一種選項(xiàng)是對(duì)數(shù)均勻分布,在對(duì)數(shù)尺度上其值的分布是均勻的。我們將對(duì)學(xué)習(xí)率使用一個(gè)對(duì)數(shù)均勻分布(域空間從 0.005 到 0.2),因?yàn)樗闹低诓煌臄?shù)量級(jí)之間變化:

 

 

由于這是一個(gè)對(duì)數(shù)均勻分布,所以我們?cè)?exp(low)和 exp(high)之間繪制其值的示意圖。下面左側(cè)的示意圖顯示了離散均勻分布,右側(cè)的示意圖則顯示了對(duì)數(shù)均勻分布。它們是核密度估計(jì)示意圖,所以 y 軸坐標(biāo)為密度而不是計(jì)數(shù)。

 

 

現(xiàn)在讓我們定義整個(gè)域:

 

 

此處我們使用許多不同種類的域分布:

choice:類別變量

quniform:離散均勻分布(在整數(shù)空間上均勻分布)

uniform:連續(xù)均勻分布(在浮點(diǎn)數(shù)空間上均勻分布)

loguniform:連續(xù)對(duì)數(shù)均勻分布(在浮點(diǎn)數(shù)空間中的對(duì)數(shù)尺度上均勻分布)

當(dāng)定義提升(boosting)的類型時(shí),有一個(gè)要點(diǎn)需要我們注意:

 

 

在這里,我們使用一個(gè)條件域,它意味著一個(gè)超參數(shù)的值依賴于另一個(gè)超參數(shù)的值。對(duì)于「goss」類型的提升算法,GBM 不能使用下采樣技術(shù)(選擇一個(gè)訓(xùn)練觀測(cè)數(shù)據(jù)的子樣本部分用于每輪迭代)。因此,如果提升的類型為「goss」,則下采樣率設(shè)置為 1.0(不使用下采樣),否則將其設(shè)置為 0.5-1.0。這個(gè)過(guò)程是使用嵌套域?qū)崿F(xiàn)的。

當(dāng)我們使用參數(shù)完全不同的機(jī)器學(xué)習(xí)模型時(shí),條件嵌套往往是很有用的。條件嵌套讓我們能根據(jù)「choice」的不同值使用不同的超參數(shù)集。

現(xiàn)在已經(jīng)定義了域空間,我們可以從中提取一個(gè)樣本來(lái)查看典型樣本的形式。當(dāng)我們進(jìn)行采樣時(shí),因?yàn)樽訕颖咀畛跏乔短椎模晕覀冃枰獙⑺峙浣o頂層的關(guān)鍵字。這個(gè)操作是通過(guò) Python 字典的「get」方法實(shí)現(xiàn)的,缺省值為 1.0。

 

 

重新分配嵌套的關(guān)鍵字是必要的,因?yàn)樘荻忍嵘龣C(jī)不能處理嵌套的超參數(shù)字典。

優(yōu)化算法

盡管從概念上來(lái)說(shuō),這是貝葉斯優(yōu)化最難的一部分,但在 Hyperopt 中創(chuàng)建優(yōu)化算法只需一行代碼。使用樹(shù)形 Parzen 評(píng)估器(Tree Parzen Estimation,以下簡(jiǎn)稱 TPE)的代碼如下:

 

 

這就是優(yōu)化算法的所有代碼!Hyperopt 目前只支持 TPE 和隨機(jī)搜索,盡管其 GitHub 主頁(yè)聲稱將會(huì)開(kāi)發(fā)其它方法。在優(yōu)化過(guò)程中,TPE 算法從過(guò)去的搜索結(jié)果中構(gòu)建出概率模型,并通過(guò)最大化預(yù)期提升(EI)來(lái)決定下一組目標(biāo)函數(shù)中待評(píng)估的超參數(shù)。

結(jié)果歷史數(shù)據(jù)

跟蹤這些結(jié)果并不是絕對(duì)必要的,因?yàn)?Hyperopt 會(huì)在內(nèi)部為算法執(zhí)行此操作。然而,如果我們想要知道這背后發(fā)生了什么,我們可以使用「Trials」對(duì)象,它將存儲(chǔ)基本的訓(xùn)練信息,還可以使用目標(biāo)函數(shù)返回的字典(包含損失「loss」和參數(shù)「params」)。創(chuàng)建一個(gè)「Trials」對(duì)象也僅需一行代碼:

 

 

另一個(gè)讓我們能夠監(jiān)控長(zhǎng)期訓(xùn)練進(jìn)度的做法是,在每輪迭代中向 csv 文件寫(xiě)入一行。這樣做將所有的搜索結(jié)果存儲(chǔ)到了磁盤(pán)上,以防意外情況發(fā)生使得我們丟失「Trails」對(duì)象(根據(jù)經(jīng)驗(yàn)來(lái)說(shuō))。我們可以使用「csv」庫(kù)做到這一點(diǎn)。在開(kāi)始訓(xùn)練之前,我們打開(kāi)一個(gè)新的 csv 文件并且寫(xiě)入文件頭(hearder):

 

 

然后在目標(biāo)函數(shù)中,我們可以添加幾行代碼,在每輪迭代中寫(xiě)入 csv 文件(完整的目標(biāo)函數(shù)可以在 notebook 中獲取。

 

 

寫(xiě)入 csv 文件意味著我們可以在訓(xùn)練時(shí)通過(guò)打開(kāi)文件來(lái)檢查進(jìn)度(不是在 Excel 文件中,因?yàn)?Excel 會(huì)在 Python 環(huán)境下導(dǎo)致錯(cuò)誤。在 bash 中使用「tail out_file.csv」操作來(lái)查看文件的最后一行。)

優(yōu)化

當(dāng)我們完成了上述四個(gè)部分的工作,我們可以通過(guò)「fmin」進(jìn)行優(yōu)化:

 

 

在每一輪迭代中,優(yōu)化算法從基于先前結(jié)果構(gòu)造的代理函數(shù)中選擇新的超參數(shù)值,并在目標(biāo)函數(shù)中對(duì)這些值進(jìn)行計(jì)算。接著,對(duì)目標(biāo)函數(shù)進(jìn)行「MAX_EVALS」評(píng)估,代理函數(shù)會(huì)不斷根據(jù)新的結(jié)果進(jìn)行更新。

結(jié)果

從「fmin」返回的最佳對(duì)象包含在目標(biāo)函數(shù)上產(chǎn)生最小損失的超參數(shù):

 

 

擁有這些超參數(shù)之后,我們可以使用它們?cè)谕暾挠?xùn)練數(shù)據(jù)上訓(xùn)練模型,然后對(duì)測(cè)試數(shù)據(jù)進(jìn)行評(píng)估(記住我們只能在評(píng)估最終的模型時(shí)使用一次測(cè)試集)。對(duì)于評(píng)估器的數(shù)量,我們可以使用在交叉驗(yàn)證中提前停止時(shí)返回最低損失的評(píng)估器數(shù)量。最終結(jié)果如下:

 

 

作為參考,500 輪隨機(jī)搜索返回一個(gè)在測(cè)試集上 ROC AUC 得分為 0.7232、在交叉驗(yàn)證中得分為 0.76850 的模型。一個(gè)沒(méi)有經(jīng)過(guò)優(yōu)化的缺省模型在測(cè)試集上的 ROC AUC 得分則為 0.7143.

當(dāng)我們查看結(jié)果時(shí),需要將以下幾點(diǎn)重要事項(xiàng)牢記于心:

•  最優(yōu)的超參數(shù)在交叉驗(yàn)證中表現(xiàn)最好,但并不一定在測(cè)試數(shù)據(jù)上表現(xiàn)最好。當(dāng)我們使用交叉驗(yàn)證時(shí),我們希望這些結(jié)果能夠泛化至測(cè)試數(shù)據(jù)上。

•  即使使用 10 折交叉驗(yàn)證,超參數(shù)調(diào)優(yōu)還是會(huì)對(duì)訓(xùn)練數(shù)據(jù)過(guò)度擬合。交叉驗(yàn)證取得的最佳得分遠(yuǎn)遠(yuǎn)高于在測(cè)試數(shù)據(jù)上的得分。

•  隨機(jī)搜索可能由于運(yùn)氣好而返回更好的超參數(shù)(重新運(yùn)行 notebook 就可能改變搜索結(jié)果)。貝葉斯優(yōu)化不能保證找到更好的超參數(shù),并且可能陷入目標(biāo)函數(shù)的局部最小值。

貝葉斯優(yōu)化雖然十分有效,但它并不能解決我們所有的調(diào)優(yōu)問(wèn)題。隨著搜索的進(jìn)行,該算法將從探索——嘗試新的超參數(shù)值,轉(zhuǎn)向開(kāi)發(fā)——利用使目標(biāo)函數(shù)損失最低的 超參數(shù)值。如果算法找到了目標(biāo)函數(shù)的一個(gè)局部最小值,它可能會(huì)專注于搜索局部最小值附近的超參數(shù)值,而不會(huì)嘗試域空間中相對(duì)于局部最小值較遠(yuǎn)的其他值。隨機(jī)搜索則不會(huì)受到這個(gè)問(wèn)題的影響,因?yàn)樗粫?huì)專注于搜索任何值!

另一個(gè)重點(diǎn)是,超參數(shù)優(yōu)化的效果將隨著數(shù)據(jù)集的變化而有所差異。本文使用的是一個(gè)相對(duì)較小的數(shù)據(jù)集(大約 6000 條訓(xùn)練觀測(cè)數(shù)據(jù)),因此對(duì)超參數(shù)進(jìn)行調(diào)優(yōu)的回報(bào)較小(獲取更多的數(shù)據(jù)將更好地利用時(shí)間!)考慮到所有這些注意事項(xiàng),在這種情況下,通過(guò)貝葉斯優(yōu)化我們可以得到:

•  在測(cè)試集上更好的性能
•  更少的超參數(shù)調(diào)優(yōu)迭代次數(shù)

貝葉斯方法可以(盡管不是經(jīng)常)獲得比隨機(jī)搜索更好的調(diào)優(yōu)結(jié)果。在接下來(lái)的幾節(jié)中,我們將查看貝葉斯超參數(shù)搜索的演化過(guò)程,并且將其與隨機(jī)搜索進(jìn)行對(duì)比,從而理解貝葉斯優(yōu)化的工作原理。

搜索結(jié)果可視化

將結(jié)果通過(guò)圖表繪制出來(lái)可以直觀地理解在超參數(shù)搜索過(guò)程中發(fā)生了什么。此外,將貝葉斯優(yōu)化和隨機(jī)搜索進(jìn)行對(duì)比有助于我們看到這些方法之間的差異。如果你想知道這些圖是如何繪制的,以及隨機(jī)搜索是如何實(shí)現(xiàn)的,請(qǐng)查閱項(xiàng)目 notebook。但是在這里我們將直接顯示結(jié)果。(請(qǐng)注意,實(shí)際的結(jié)果會(huì)隨著迭代次數(shù)增加而發(fā)生變化,所以如果你運(yùn)行了這個(gè) notebook,得到了不同的圖也無(wú)需驚訝。本節(jié)所有的圖像都是經(jīng)過(guò)了 500 輪迭代所得到的)。

首先我們可以繪制隨機(jī)搜索和貝葉斯優(yōu)化中采樣得到的學(xué)習(xí)率「learning_rate」的核密度估計(jì)圖。作為參考,我們還可以顯示采樣的分布。垂直的虛線表示學(xué)習(xí)率最優(yōu)值(根據(jù)交叉驗(yàn)證得到)。

 

 

我們將學(xué)習(xí)率定義為 0.005 到 0.2 之間的對(duì)數(shù)正態(tài)分布形式,貝葉斯優(yōu)化的結(jié)果與采樣分布的結(jié)果看起來(lái)相類似。這說(shuō)明,我們定義的分布看上去很適合這個(gè)任務(wù),盡管最優(yōu)值比我們放置最大概率的位置略高。這個(gè)結(jié)果可以用于通知域空間進(jìn)一步搜索。

另一個(gè)超參數(shù)是提升類型,下圖為在隨機(jī)搜索和貝葉斯優(yōu)化的過(guò)程中對(duì)每種類型進(jìn)行評(píng)估的直方圖。由于隨機(jī)搜索不關(guān)心過(guò)去的搜索結(jié)果,我們預(yù)計(jì)每種提升類型的使用次數(shù)大致相同。

 

 

根據(jù)貝葉斯算法的評(píng)估結(jié)果直方圖,「gbdt」提升比「dart」或「goss」更有可能找到最優(yōu)值。同樣地,這有助于為進(jìn)一步搜索提供信息,無(wú)論是貝葉斯方法或網(wǎng)格搜索。如果我們想做一個(gè)更精確的網(wǎng)格搜索,我們可以用這些結(jié)果來(lái)定義一個(gè)更小的網(wǎng)格,集中在最有可能找到最優(yōu)超參數(shù)的值周?chē)?/p>

在大多數(shù)情況下(「subsample_for_bin」除外),貝葉斯優(yōu)化搜索傾向于專注搜索(設(shè)置更大的概率)能夠在交叉驗(yàn)證中得到最小損失的超參數(shù)值附近的值。這體現(xiàn)了使用貝葉斯方法進(jìn)行超參數(shù)調(diào)優(yōu)的基本思想:將更多的時(shí)間用于評(píng)估更有可能達(dá)到最優(yōu)的超參數(shù)值。

有些結(jié)果很有趣,可能會(huì)幫助我們以后定義一個(gè)用于搜索的域空間。舉例來(lái)說(shuō),「reg_alpha」和「reg_lambda」看起來(lái)是互補(bǔ)的:如果其中的一個(gè)值很高(接近于 1.0),另一個(gè)值則會(huì)變得較低。不能保證這一點(diǎn)在不同的問(wèn)題中都適用,但是通過(guò)研究這些結(jié)果,我們可以得到一些可能在未來(lái)的機(jī)器學(xué)習(xí)問(wèn)題中能夠用到的觀點(diǎn)!

搜索的演化過(guò)程

隨著優(yōu)化的推進(jìn),我們期望貝葉斯方法能夠?qū)W⒂诟邢M_(dá)到最優(yōu)超參數(shù)的值:那些在交叉驗(yàn)證中產(chǎn)生最低誤差的值。我們可以繪制超參數(shù)域迭代次數(shù)的關(guān)系圖,看看是否存在明顯的趨勢(shì)。

 

 

黑色的星星代表最優(yōu)值!竎olsample_bytree」和「learning_rate」隨著時(shí)間的推移而下降,這可以在未來(lái)的搜索中為我們提供指導(dǎo)。

 

 

最后,如果貝葉斯優(yōu)化有效,我們預(yù)計(jì)平均的驗(yàn)證分?jǐn)?shù)會(huì)隨著時(shí)間推移越來(lái)越高(相反,損失將會(huì)越來(lái)越小):

 

 

隨著時(shí)間的推移,貝葉斯超參數(shù)優(yōu)化的驗(yàn)證得分會(huì)越來(lái)越高,這說(shuō)明該方法正在嘗試「更好」的超參數(shù)值(值得注意的是,只是根據(jù)驗(yàn)證分?jǐn)?shù)說(shuō)明這些值是更好的)。隨機(jī)搜索并不會(huì)隨著迭代次數(shù)增加顯示出性能提升。

繼續(xù)搜索

如果我們對(duì)模型的性能不太滿意,可以使用 Hyperopt 從我們上次結(jié)束的地方繼續(xù)搜索。我們只需要傳入相同的「Trials」對(duì)象,算法就會(huì)繼續(xù)進(jìn)行搜索。

隨著算法的運(yùn)行,它會(huì)進(jìn)行更多的「利用」操作——選用在過(guò)去表現(xiàn)得很好的值,進(jìn)行更少的「探索」操作——選用新的值。因此,與其從上次結(jié)束的地方開(kāi)始,還不如從頭開(kāi)始搜索。如果第一次搜索到的最佳超參數(shù)確實(shí)是「最優(yōu)值」,我們預(yù)計(jì)接下來(lái)的搜索會(huì)收斂到同樣的值上?紤]到這個(gè)高維度問(wèn)題,以及超參數(shù)之間復(fù)雜的相互作用,另一次搜索并不太可能產(chǎn)生一組類似的超參數(shù)。

再次進(jìn)行了 500 輪迭代的訓(xùn)練后,最終模型在測(cè)試集上的 ROC AUC 得分為 0.72736。(我們真的不應(yīng)該在測(cè)試集上對(duì)第一個(gè)模型進(jìn)行評(píng)估,并且僅僅以驗(yàn)證得分作為依據(jù)。理想情況下,測(cè)試集只應(yīng)使用一次,在將算法部署在新數(shù)據(jù)上時(shí)測(cè)試其性能)。同樣的,由于數(shù)據(jù)集規(guī)模較小,這個(gè)問(wèn)題可能會(huì)在未來(lái)的超參數(shù)優(yōu)化中得到逐漸減小的返回值,并且最終會(huì)在驗(yàn)證誤差上達(dá)到一個(gè)趨近于穩(wěn)定不變的值(數(shù)據(jù)集上任何模型的性能都有一個(gè)固有的限制,因?yàn)殡[藏的變量沒(méi)有被測(cè)量,并且有噪聲數(shù)據(jù),這被稱為貝葉斯誤差)。

結(jié)語(yǔ)

我們可以使用貝葉斯優(yōu)化完成機(jī)器學(xué)習(xí)模型的自動(dòng)超參數(shù)調(diào)優(yōu)。不同于隨機(jī)搜索方法,貝葉斯優(yōu)化通過(guò)啟發(fā)式方法選擇下一個(gè)超參數(shù),從而能夠花更多時(shí)間評(píng)估可能達(dá)到最優(yōu)的值。最終的結(jié)果可能是,與隨機(jī)搜索或網(wǎng)格搜索相比,貝葉斯優(yōu)化對(duì)于目標(biāo)函數(shù)評(píng)估的次數(shù)更少,并且在測(cè)試集上泛化的能力更強(qiáng)。

在本文中,我們使用 Hyperopt 一步一步地實(shí)現(xiàn)了 Python 環(huán)境下的貝葉斯超參數(shù)優(yōu)化。盡管對(duì)于訓(xùn)練數(shù)據(jù)的過(guò)擬合問(wèn)題需要多加小心,但我們提升了梯度提升機(jī)在測(cè)試集上的性能,超過(guò)了對(duì)比基線和隨機(jī)搜索方法。此外,我們還通過(guò)查看結(jié)果示意圖看到了隨機(jī)搜索和貝葉斯優(yōu)化的區(qū)別,該圖說(shuō)明了貝葉斯方法會(huì)將更大的概率賦予在交叉驗(yàn)證中獲得更低損失的超參數(shù)值。

通過(guò)利用最優(yōu)化問(wèn)題的四個(gè)組成部分,我們可以使用 Hyperopt 解決各種各樣的問(wèn)題。貝葉斯優(yōu)化的基本組成部分也適用于大量的實(shí)現(xiàn)其他算法的 Python 庫(kù)。從手動(dòng)調(diào)優(yōu)到隨機(jī)搜索或網(wǎng)格搜索只是一個(gè)小的進(jìn)步,但如果想要將你的機(jī)器學(xué)習(xí)技術(shù)提升到一個(gè)新的水平,則需要自動(dòng)化的超參數(shù)調(diào)優(yōu)。貝葉斯優(yōu)化是一種能夠在 Python 環(huán)境下使用的方法,并且能返回比隨機(jī)搜索更好的結(jié)果。希望你能滿懷信心地開(kāi)始將這種強(qiáng)大的技術(shù)應(yīng)用到自己的機(jī)器學(xué)習(xí)問(wèn)題中!

原文地址:https://towardsdatascience.com/automated-machine-learning-hyperparameter-tuning-in-python-dfda59b72f8a

標(biāo)簽: 代碼 搜索

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:GAN用于材料設(shè)計(jì):哈佛大學(xué)新研究登上Science

下一篇:一文詳解大規(guī)模數(shù)據(jù)計(jì)算處理原理及操作重點(diǎn)