【導(dǎo)讀】機(jī)器學(xué)習(xí)中,調(diào)參是一項(xiàng)繁瑣但至關(guān)重要的任務(wù),因?yàn)樗艽蟪潭壬嫌绊懥怂惴ǖ男阅堋J謩?dòng)調(diào)參十分耗時(shí),網(wǎng)格和隨機(jī)搜索不需要人力,但需要很長(zhǎng)的運(yùn)行時(shí)間。因此,誕生了許多自動(dòng)調(diào)整超參數(shù)的方法。貝葉斯優(yōu)化是一種用模型找到函數(shù)最小值方法,已經(jīng)應(yīng)用于機(jī)器學(xué)習(xí)問(wèn)題中的超參數(shù)搜索,這種方法性能好,同時(shí)比隨機(jī)搜索省時(shí)。此外,現(xiàn)在有許多Python庫(kù)可以實(shí)現(xiàn)貝葉斯超參數(shù)調(diào)整。本文將使用Hyperopt庫(kù)演示梯度提升機(jī)(Gradient Boosting Machine,GBM) 的貝葉斯超參數(shù)調(diào)整的完整示例。文章由貝葉斯優(yōu)化方法、優(yōu)化問(wèn)題的四個(gè)部分、目標(biāo)函數(shù)、域空間、優(yōu)化過(guò)程、及結(jié)果展示幾個(gè)部分組成。 作者|William Koehrsen 編譯|專知 整理|YIngying,李大囧 貝葉斯優(yōu)化方法 貝葉斯優(yōu)化通過(guò)基于目標(biāo)函數(shù)的過(guò)去評(píng)估結(jié)果建立替代函數(shù)(概率模型),來(lái)找到最小化目標(biāo)函數(shù)的值。貝葉斯方法與隨機(jī)或網(wǎng)格搜索的不同之處在于,它在嘗試下一組超參數(shù)時(shí),會(huì)參考之前的評(píng)估結(jié)果,因此可以省去很多無(wú)用功。 超參數(shù)的評(píng)估代價(jià)很大,因?yàn)樗笫褂么u(píng)估的超參數(shù)訓(xùn)練一遍模型,而許多深度學(xué)習(xí)模型動(dòng)則幾個(gè)小時(shí)幾天才能完成訓(xùn)練,并評(píng)估模型,因此耗費(fèi)巨大。貝葉斯調(diào)參發(fā)使用不斷更新的概率模型,通過(guò)推斷過(guò)去的結(jié)果來(lái)“集中”有希望的超參數(shù)。 Python中的選擇 Python中有幾個(gè)貝葉斯優(yōu)化庫(kù),它們目標(biāo)函數(shù)的替代函數(shù)不一樣。在本文中,我們將使用Hyperopt,它使用Tree Parzen Estimator(TPE)。其他Python庫(kù)包括Spearmint(高斯過(guò)程代理)和SMAC(隨機(jī)森林回歸)。 優(yōu)化問(wèn)題的四個(gè)部分 貝葉斯優(yōu)化問(wèn)題有四個(gè)部分:
數(shù)據(jù)集 在本例中,我們將使用Caravan Insurance數(shù)據(jù)集,其目標(biāo)是預(yù)測(cè)客戶是否購(gòu)買保險(xiǎn)單。 這是一個(gè)有監(jiān)督分類問(wèn)題,訓(xùn)練集和測(cè)試集的大小分別為5800和4000。評(píng)估性能的指標(biāo)是AUC(曲線下面積)評(píng)估準(zhǔn)則和ROC(receiver operating characteristic,以真陽(yáng)率和假陽(yáng)率為坐標(biāo)軸的曲線圖)曲線,ROC AUC越高表示模型越好。 數(shù)據(jù)集如下所示: 因?yàn)镠yperopt最小化目標(biāo)函數(shù),我們的目標(biāo)函數(shù)返回1-ROC AUC,從而提高ROC AUC。 梯度提升模型 梯度提升機(jī)(GBM)是一種基于使用弱學(xué)習(xí)器(如決策樹(shù))組合成強(qiáng)學(xué)習(xí)器的模型。 GBM中有許多超參數(shù)控制整個(gè)集合和單個(gè)決策樹(shù),如決策樹(shù)數(shù)量,決策樹(shù)深度等。簡(jiǎn)單了解了GBM,接下來(lái)我們介紹這個(gè)問(wèn)題對(duì)應(yīng)的優(yōu)化模型的四個(gè)部分。 目標(biāo)函數(shù) 目標(biāo)函數(shù)是需要我們最小化的。 它的輸入為一組超參數(shù),輸出需要最小化的值(交叉驗(yàn)證損失)。Hyperopt將目標(biāo)函數(shù)視為黑盒,只考慮它的輸入和輸出。 在這里,目標(biāo)函數(shù)定義為: def objective(hyperparameters): 我們?cè)u(píng)估的是超參數(shù)在驗(yàn)證集上的表現(xiàn),但我們不將數(shù)據(jù)集劃分成固定的驗(yàn)證集和訓(xùn)練集,而是使用K折交叉驗(yàn)證。使用10倍交叉驗(yàn)證和提前停止的梯度提升機(jī)的完整目標(biāo)函數(shù)如下所示。 import lightgbm as lgb 關(guān)鍵點(diǎn)是cvresults = lgb.cv(...)。為了實(shí)現(xiàn)提前停止的交叉驗(yàn)證,我們使用LightGBM函數(shù)cv,它輸入為超參數(shù),訓(xùn)練集,用于交叉驗(yàn)證的折數(shù)等。我們將迭代次數(shù)(numboostround)設(shè)置為10000,但實(shí)際上不會(huì)達(dá)到這個(gè)數(shù)字,因?yàn)槲覀兪褂胑arlystopping_rounds來(lái)停止訓(xùn)練,當(dāng)連續(xù)100輪迭代效果都沒(méi)有提升時(shí),則提前停止,并選擇模型。因此,迭代次數(shù)并不是我們需要設(shè)置的超參數(shù)。 一旦交叉驗(yàn)證完成,我們就會(huì)得到最好的分?jǐn)?shù)(ROC AUC),然后,因?yàn)槲覀冏钚』繕?biāo)函數(shù),所以計(jì)算1- ROC AUC,然后返回這個(gè)值。 域空間 域空間表示我們要為每個(gè)超參數(shù)計(jì)算的值的范圍。在搜索的每次迭代中,貝葉斯優(yōu)化算法將從域空間為每個(gè)超參數(shù)選擇一個(gè)值。當(dāng)我們進(jìn)行隨機(jī)或網(wǎng)格搜索時(shí),域空間是一個(gè)網(wǎng)格。在貝葉斯優(yōu)化中,想法是一樣的,但是不是按照順序(網(wǎng)格)或者隨機(jī)選擇一個(gè)超參數(shù),而是按照每個(gè)超參數(shù)的概率分布選擇。 而確定域空間是最困難的。如果我們有機(jī)器學(xué)習(xí)方法的經(jīng)驗(yàn),我們可以通過(guò)在我們認(rèn)為最佳值的位置放置更大的概率來(lái)使用它來(lái)告知我們對(duì)超參數(shù)分布的選擇。然而,不同數(shù)據(jù)集之間最佳模型不一樣,并且具有高維度問(wèn)題(許多超參數(shù)),超參數(shù)之間也會(huì)互相影響。在我們不確定最佳值的情況下,我們可以將范圍設(shè)定的大一點(diǎn),讓貝葉斯算法為我們做推理。 首先,我們看看GBM中的所有超參數(shù): import lgb 其中一些我們不需要調(diào)整(例如objective和randomstate),我們將使用提前停止來(lái)找到最好的n_estimators。 但是,我們還有10個(gè)超參數(shù)要優(yōu)化! 首次調(diào)整模型時(shí),我通常會(huì)創(chuàng)建一個(gè)以默認(rèn)值為中心的寬域空間,然后在后續(xù)搜索中對(duì)其進(jìn)行細(xì)化。 例如,讓我們?cè)贖yperopt中定義一個(gè)簡(jiǎn)單的域,這是GBM中每棵樹(shù)中葉子數(shù)量的離散均勻分布: from hyperopt import hp 這里選擇離散的均勻分布,因?yàn)槿~子的數(shù)量必須是整數(shù)(離散),并且域中的每個(gè)值都可能(均勻)。 另一種分布選擇是對(duì)數(shù)均勻,它在對(duì)數(shù)標(biāo)度上均勻分布值。 我們將使用對(duì)數(shù)統(tǒng)一(從0.005到0.2)來(lái)獲得學(xué)習(xí)率,因?yàn)樗趲讉€(gè)數(shù)量級(jí)上變化: # Learning rate log uniform distribution 下面分別繪制了均勻分布和對(duì)數(shù)均勻分布的圖。 這些是核密度估計(jì)圖,因此y軸是密度而不是計(jì)數(shù)! 現(xiàn)在,讓我們定義整個(gè)域: # Define the search space 這里我們使用了許多不同的域分發(fā)類型:
# boosting type domain 這里我們使用條件域,這意味著一個(gè)超參數(shù)的值取決于另一個(gè)超參數(shù)的值。 對(duì)于提升類型“goss”,gbm不能使用子采樣(僅選擇訓(xùn)練觀察的子樣本部分以在每次迭代時(shí)使用)。 因此,如果提升類型是“goss”,則子采樣率設(shè)置為1.0(無(wú)子采樣),否則為0.5-1.0。 這是使用嵌套域?qū)崿F(xiàn)的。 定義域空間之后,我們可以從中采樣查看樣本。 # Sample from the full space example 優(yōu)化算法 雖然這是貝葉斯優(yōu)化中概念上最難的部分,但在Hyperopt中創(chuàng)建優(yōu)化算法只需一行。 要使用Tree Parzen Estimator,代碼為: from hyperopt import tpe 在優(yōu)化時(shí),TPE算法根據(jù)過(guò)去的結(jié)果構(gòu)建概率模型,并通過(guò)最大化預(yù)期的改進(jìn)來(lái)決定下一組超參數(shù)以在目標(biāo)函數(shù)中進(jìn)行評(píng)估。 結(jié)果歷史 跟蹤結(jié)果并不是絕對(duì)必要的,因?yàn)镠yperopt將在內(nèi)部為算法執(zhí)行此操作。 但是,如果我們想知道幕后發(fā)生了什么,我們可以使用Trials對(duì)象來(lái)存儲(chǔ)基本的訓(xùn)練信息,還可以使用從目標(biāo)函數(shù)返回的字典(包括損失和范圍)。 制創(chuàng)建Trials對(duì)象也只要一行代碼: from hyperopt import Trials 為了監(jiān)控訓(xùn)練運(yùn)行進(jìn)度,可以將結(jié)果歷史寫入csv文件,防止程序意外中斷導(dǎo)致評(píng)估結(jié)果消失。 import csv 然后在目標(biāo)函數(shù)中我們可以在每次迭代時(shí)添加行寫入csv: # Write to the csv file ('a' means append) 優(yōu)化 一旦我們定義好了上述部分,就可以用fmin運(yùn)行優(yōu)化: from hyperopt import fmin 在每次迭代時(shí),算法從代理函數(shù)中選擇新的超參數(shù)值,該代理函數(shù)基于先前的結(jié)果構(gòu)建并在目標(biāo)函數(shù)中評(píng)估這些值。 這繼續(xù)用于目標(biāo)函數(shù)的MAX_EVALS評(píng)估,其中代理函數(shù)隨每個(gè)新結(jié)果不斷更新。 結(jié)果 從fmin返回的最佳對(duì)象包含在目標(biāo)函數(shù)上產(chǎn)生最低損失的超參數(shù): {'boosting_type': 'gbdt', 一旦我們有了這些超參數(shù),我們就可以使用它們來(lái)訓(xùn)練完整訓(xùn)練數(shù)據(jù)的模型,然后評(píng)估測(cè)試數(shù)據(jù)。 最終結(jié)果如下: The best model scores 0.72506 AUC ROC on the test set. 作為參考,500次隨機(jī)搜索迭代返回了一個(gè)模型,該模型在測(cè)試集上評(píng)分為0.7232 ROC AUC,在交叉驗(yàn)證中評(píng)分為0.76850。沒(méi)有優(yōu)化的默認(rèn)模型在測(cè)試集上評(píng)分為0.7143 ROC AUC。 在查看結(jié)果時(shí),請(qǐng)記住一些重要的注意事項(xiàng):
另一個(gè)重點(diǎn)是超參數(shù)優(yōu)化的效果將隨數(shù)據(jù)集的不同而不同。相對(duì)較小的數(shù)據(jù)集(訓(xùn)練集大小為6000),調(diào)整超參數(shù),最終得到的模型的提升并不大,但數(shù)據(jù)集更大時(shí),效果會(huì)很明顯。 因此,通過(guò)貝葉斯概率來(lái)優(yōu)化超參數(shù),我們可以:
可視化結(jié)果 繪制結(jié)果圖表是一種直觀的方式,可以了解超參數(shù)搜索過(guò)程中發(fā)生的情況。此外,通過(guò)將貝葉斯優(yōu)化與隨機(jī)搜索進(jìn)行比較,可以看出方法的不同之處。 首先,我們可以制作隨機(jī)搜索和貝葉斯優(yōu)化中采樣的learning_rate的核密度估計(jì)圖。作為參考,我們還可以顯示采樣分布。垂直虛線表示學(xué)習(xí)率的最佳值(根據(jù)交叉驗(yàn)證)。 我們將學(xué)習(xí)率定義為0.005到0.2之間的對(duì)數(shù)正態(tài),貝葉斯優(yōu)化結(jié)果看起來(lái)與采樣分布類似。 這告訴我們,我們定義的分布看起來(lái)適合于任務(wù),盡管最佳值比我們放置最大概率的值略高。 這可用于告訴域進(jìn)一步搜索。 另一個(gè)超參數(shù)是增強(qiáng)類型,在隨機(jī)搜索和貝葉斯優(yōu)化期間評(píng)估每種類型的條形圖。 由于隨機(jī)搜索不關(guān)注過(guò)去的結(jié)果,我們預(yù)計(jì)每種增強(qiáng)類型的使用次數(shù)大致相同。 根據(jù)貝葉斯算法,gdbt提升模型比dart或goss更有前途。 同樣,這可以幫助進(jìn)一步搜索,貝葉斯方法或網(wǎng)格搜索。 如果我們想要進(jìn)行更明智的網(wǎng)格搜索,我們可以使用這些結(jié)果來(lái)定義圍繞超參數(shù)最有希望的值的較小網(wǎng)格。 由于我們有它們,讓我們看看參考分布,隨機(jī)搜索和貝葉斯優(yōu)化中的所有數(shù)字超參數(shù)。 垂直線再次表示每次搜索的超參數(shù)的最佳值: ![]() 在大多數(shù)情況下(subsampleforbin除外),貝葉斯優(yōu)化搜索傾向于在超參數(shù)值附近集中(放置更多概率),從而產(chǎn)生交叉驗(yàn)證中的最低損失。這顯示了使用貝葉斯方法進(jìn)行超參數(shù)調(diào)整的基本思想:花費(fèi)更多時(shí)間來(lái)評(píng)估有希望的超參數(shù)值。 此處還有一些有趣的結(jié)果可能會(huì)幫助我們?cè)趯?lái)定義要搜索的域空間時(shí)。僅舉一個(gè)例子,看起來(lái)regalpha和reglambda應(yīng)該相互補(bǔ)充:如果一個(gè)是高(接近1.0),另一個(gè)應(yīng)該更低。不能保證這會(huì)解決問(wèn)題,但通過(guò)研究結(jié)果,我們可以獲得可能適用于未來(lái)機(jī)器學(xué)習(xí)問(wèn)題的見(jiàn)解! 搜索的演變 隨著優(yōu)化的進(jìn)展,我們期望貝葉斯方法關(guān)注超參數(shù)的更有希望的值:那些在交叉驗(yàn)證中產(chǎn)生最低誤差的值。我們可以繪制超參數(shù)與迭代的值,以查看是否存在明顯的趨勢(shì)。 ![]() 黑星表示最佳值。 colsamplebytree和learningrate會(huì)隨著時(shí)間的推移而減少,這可能會(huì)指導(dǎo)我們未來(lái)的搜索。 ![]() 最后,如果貝葉斯優(yōu)化工作正常,我們預(yù)計(jì)平均驗(yàn)證分?jǐn)?shù)會(huì)隨著時(shí)間的推移而增加(相反,損失減少): ![]() 來(lái)自貝葉斯超參數(shù)優(yōu)化的驗(yàn)證集上的分?jǐn)?shù)隨著時(shí)間的推移而增加,表明該方法正在嘗試“更好”的超參數(shù)值(應(yīng)該注意,僅根據(jù)驗(yàn)證集上的表現(xiàn)更好)。隨機(jī)搜索沒(méi)有顯示迭代的改進(jìn)。 繼續(xù)搜索 如果我們對(duì)模型的性能不滿意,我們可以繼續(xù)使用Hyperopt進(jìn)行搜索。我們只需要傳入相同的試驗(yàn)對(duì)象,算法將繼續(xù)搜索。 隨著算法的進(jìn)展,它會(huì)進(jìn)行更多的挖掘 - 挑選過(guò)去表現(xiàn)良好的價(jià)值 , 而不是探索 - 挑選新價(jià)值。因此,開(kāi)始完全不同的搜索可能是一個(gè)好主意,而不是從搜索停止的地方繼續(xù)開(kāi)始。如果來(lái)自第一次搜索的最佳超參數(shù)確實(shí)是“最優(yōu)的”,我們希望后續(xù)搜索專注于相同的值。 經(jīng)過(guò)另外500次訓(xùn)練后,最終模型在測(cè)試集上得分為0.72736 ROC AUC。 (我們實(shí)際上不應(yīng)該評(píng)估測(cè)試集上的第一個(gè)模型,而只依賴于驗(yàn)證分?jǐn)?shù)。理想情況下,測(cè)試集應(yīng)該只使用一次,以便在部署到新數(shù)據(jù)時(shí)獲得算法性能的度量)。同樣,由于數(shù)據(jù)集的小尺寸,這個(gè)問(wèn)題可能導(dǎo)致進(jìn)一步超參數(shù)優(yōu)化的收益遞減,并且最終會(huì)出現(xiàn)驗(yàn)證錯(cuò)誤的平臺(tái)(由于隱藏變量導(dǎo)致數(shù)據(jù)集上任何模型的性能存在固有限制未測(cè)量和噪聲數(shù)據(jù),稱為貝葉斯誤差。 結(jié)論 可以使用貝葉斯優(yōu)化來(lái)完成機(jī)器學(xué)習(xí)模型的超參數(shù)自動(dòng)調(diào)整。與隨機(jī)或網(wǎng)格搜索相比,貝葉斯優(yōu)化對(duì)目標(biāo)函數(shù)的評(píng)估較少,測(cè)試集上的更好的泛化性能。 在本文中,我們使用Hyperopt逐步完成了Python中的貝葉斯超參數(shù)優(yōu)化。除了網(wǎng)格和隨機(jī)搜索之外,我們還能夠提高梯度增強(qiáng)機(jī)的測(cè)試集性能,盡管我們需要謹(jǐn)慎對(duì)待訓(xùn)練數(shù)據(jù)的過(guò)度擬合。此外,我們通過(guò)可視化結(jié)果表看到隨機(jī)搜索與貝葉斯優(yōu)化的不同之處,這些圖表顯示貝葉斯方法對(duì)超參數(shù)值的概率更大,導(dǎo)致交叉驗(yàn)證損失更低。 使用優(yōu)化問(wèn)題的四個(gè)部分,我們可以使用Hyperopt來(lái)解決各種各樣的問(wèn)題。貝葉斯優(yōu)化的基本部分也適用于Python中實(shí)現(xiàn)不同算法的許多庫(kù)。從手動(dòng)切換到隨機(jī)或網(wǎng)格搜索只是一小步,但要將機(jī)器學(xué)習(xí)提升到新的水平,需要一些自動(dòng)形式的超參數(shù)調(diào)整。貝葉斯優(yōu)化是一種易于在Python中使用的方法,并且可以比隨機(jī)搜索返回更好的結(jié)果。 原文鏈接: https:///automated-machine-learning-hyperparameter-tuning-in-python-dfda59b72f8a |
|
來(lái)自: LibraryPKU > 《機(jī)器學(xué)習(xí)》