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

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

2018-08-09    來源:raincent

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

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

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

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

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

本文目錄:

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

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

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

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

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

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

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

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

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

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

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

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

數(shù)據(jù)集

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

 

 

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

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

梯度提升模型

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

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

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

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

 

 

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

不同模型超參數(shù)調(diào)優(yōu)的目標(biāo)函數(shù)的基本結(jié)構(gòu)是相同的:函數(shù)接收超參數(shù)作為輸入,并返回使用這些超參數(shù)的交叉驗(yàn)證誤差。盡管本文的示例是針對 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ù)、一個訓(xùn)練集、交叉驗(yàn)證中使用的許多折,以及一些其它的參數(shù)。我們將評估器的數(shù)量(num_boost_round)設(shè)置為 10000,但是由于我們使用了「early_stopping_rounds」,當(dāng) 100 個評估器的驗(yàn)證得分沒有提高時訓(xùn)練會被停止,所以實(shí)際上使用的評估器不會達(dá)到這個數(shù)量。早停止是一種有效的選擇評估器數(shù)量的方法,而不是將其設(shè)置為另一個需要調(diào)優(yōu)的超參數(shù)!

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

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

域空間

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

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

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

 

 

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

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

 

 

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

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

 

 

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

 

 

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

 

 

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

choice:類別變量

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

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

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

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

 

 

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

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

現(xiàn)在已經(jīng)定義了域空間,我們可以從中提取一個樣本來查看典型樣本的形式。當(dāng)我們進(jìn)行采樣時,因?yàn)樽訕颖咀畛跏乔短椎,所以我們需要將它分配給頂層的關(guān)鍵字。這個操作是通過 Python 字典的「get」方法實(shí)現(xiàn)的,缺省值為 1.0。

 

 

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

優(yōu)化算法

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

 

 

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

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

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

 

 

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

 

 

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

 

 

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

優(yōu)化

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

 

 

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

結(jié)果

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

 

 

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

 

 

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

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

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

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

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

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

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

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

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

搜索結(jié)果可視化

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

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

 

 

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

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

 

 

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

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

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

搜索的演化過程

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

 

 

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

 

 

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

 

 

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

繼續(xù)搜索

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

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

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

結(jié)語

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

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

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

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

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

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

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

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