0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎樣優(yōu)化CatBoost參數(shù)

zhKF_jqr_AI ? 來源:未知 ? 作者:胡薇 ? 2018-04-11 11:28 ? 次閱讀

CatBoost是由Yandex發(fā)布的梯度提升庫。在Yandex提供的基準(zhǔn)測(cè)試中,CatBoost的表現(xiàn)超過了XGBoost和LightGBM。許多Kaggle競(jìng)賽的優(yōu)勝者使用了XGBoost,因此CatBoost很值得考察一下。

快速示例

通過如下命令安裝CatBoost

pip install catboost

Windows 10/python 3.5上,一切工作良好。CatBoost的接口基本上和大部分sklearn分類器差不多,所以,如果你用過sklearn,那你使用CatBoost不會(huì)遇到什么麻煩。CatBoost可以處理缺失的特征以及類別特征,你只需告知分類器哪些維度是類別維度。

讓我們?cè)赨CI Repository Adult Dataset上做個(gè)快速的試驗(yàn)。這一數(shù)據(jù)集包含約32000個(gè)訓(xùn)練樣本,16000個(gè)測(cè)試樣本。其中有14個(gè)特征,包括類別和連續(xù)值,其中一些特征缺失。我們將使用pandas解析csv文件:

import pandas

import numpy as np

import catboost as cb

# 從csv文件讀取訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)

colnames = ['age','wc','fnlwgt','ed','ednum','ms','occ','rel','race','sex','cgain','closs','hpw','nc','label']

train_set = pandas.read_csv("adult.data.txt",header=None,names=colnames,na_values='?')

test_set = pandas.read_csv("adult.test.txt",header=None,names=colnames,na_values='?',skiprows=[0])

# 轉(zhuǎn)換類別欄為整數(shù)

category_cols = ['wc','ed','ms','occ','rel','race','sex','nc','label']

for header in category_cols:

train_set[header] = train_set[header].astype('category').cat.codes

test_set[header] = test_set[header].astype('category').cat.codes

# 將標(biāo)簽從數(shù)據(jù)集中分離

train_label = train_set['label']

train_set = train_set.drop('label', axis=1) # 移除標(biāo)簽

test_label = test_set['label']

test_set = test_set.drop('label', axis=1) # 移除標(biāo)簽

# 訓(xùn)練默認(rèn)分類器

clf = cb.CatBoostClassifier()

cat_dims = [train_set.columns.get_loc(i) for i in category_cols[:-1]]

clf.fit(train_set, np.ravel(train_label), cat_features=cat_dims)

res = clf.predict(test_set)

print('error:',1-np.mean(res==np.ravel(test_label)))

使用如下命令運(yùn)行這一試驗(yàn):

python cb_adult.py

20次運(yùn)行的平均錯(cuò)誤率是12.91%. 這比數(shù)據(jù)集列出的所有樣本分類結(jié)果都要好(列出的最好結(jié)果是樸素貝葉斯的14%錯(cuò)誤率)??紤]到我們還沒有進(jìn)行任何優(yōu)化,這個(gè)結(jié)果可不賴。

數(shù)據(jù)集中的類別特征都以字符串的形式表示。我們需要將其轉(zhuǎn)換為整數(shù),以便CatBoost使用。使用pandas,這很容易辦到。CatBoost看起來不能夠處理類別欄中的缺失特征,我們通過pandas修正了這一點(diǎn),直接將missing作為一個(gè)類別。CatBoost可以很好地處理連續(xù)值類型的缺失特征。

梯度提升介紹

CatBoost是一個(gè)梯度提升庫,我將在本節(jié)中簡(jiǎn)要地描述梯度提升是如何工作的。

“梯度提升”源于“提升”,或者說,通過組合弱模型以構(gòu)建強(qiáng)模型,從而提升弱模型的表現(xiàn)。梯度提升是提升的一個(gè)擴(kuò)展,其中疊加生成弱模型的過程規(guī)劃為基于一個(gè)目標(biāo)函數(shù)的梯度下降算法。梯度提升屬于監(jiān)督學(xué)習(xí)方法,這意味著它接受一個(gè)帶標(biāo)簽的訓(xùn)練實(shí)例集合作為輸入,構(gòu)建一個(gè)模型,該模型基于給定的特征,嘗試正確預(yù)測(cè)新的未見樣本的標(biāo)簽。

梯度提升可以使用許多不同種類的模型,但在實(shí)踐中幾乎總是使用決策樹。開始訓(xùn)練時(shí),構(gòu)建單棵決策樹預(yù)測(cè)標(biāo)簽。這第一棵決策樹將預(yù)測(cè)一些實(shí)例,但在另一些實(shí)例上會(huì)失敗。從真實(shí)標(biāo)簽(yi)減去預(yù)測(cè)標(biāo)簽(?i),將顯示預(yù)測(cè)是低估還是高估,這稱為殘差(ri)。

為了提升這一模型,我們可以構(gòu)建另一棵決策樹,不過這回將預(yù)測(cè)殘差而不是原始標(biāo)簽。這可以認(rèn)為是構(gòu)建另一個(gè)模型以糾正現(xiàn)有模型的錯(cuò)誤。添加新樹至模型后,做出新預(yù)測(cè),接著再次計(jì)算殘差。為了使用多棵樹做出預(yù)測(cè),直接讓給定實(shí)例通過每棵樹,并累加每棵樹的預(yù)測(cè)。通過構(gòu)建估計(jì)殘差的預(yù)測(cè)器,我們實(shí)際上最小化了真實(shí)標(biāo)簽和預(yù)測(cè)標(biāo)簽的方差的梯度:

如果我們不想使用方差,我們可以使用交叉熵之類的其他可微函數(shù),接著預(yù)測(cè)相應(yīng)的殘差。以上覆蓋了梯度提升的基礎(chǔ),但還有一些額外的術(shù)語,例如,正則化。你可以看下XGBoost是如何進(jìn)行正則化的。

分類調(diào)優(yōu)參數(shù)

上一節(jié)概覽了梯度提升如何工作的基礎(chǔ),本節(jié)中我將介紹CatBoost提供的一些調(diào)整預(yù)測(cè)的把手。你可以在文檔中找到更多參數(shù),但如果關(guān)注的是模型表現(xiàn)的話,并不需要調(diào)整更多參數(shù)。

還有一些隱秘的選項(xiàng),但使用以上這些參數(shù)效果已經(jīng)很好了。

參數(shù)搜索

這一步驟通常叫做網(wǎng)格搜索,基本上就是尋找能取得最高分?jǐn)?shù)的參數(shù)值。需要牢記的是我們不能用測(cè)試集來調(diào)優(yōu)參數(shù),否則我們會(huì)過擬合測(cè)試集。我們需要在訓(xùn)練集上做交叉驗(yàn)證(或者使用獨(dú)立的驗(yàn)證集),直到最后的精確度計(jì)算階段才能碰測(cè)試集。

這里我們不會(huì)做全網(wǎng)格搜索,因?yàn)樗袇?shù)組合的可能性實(shí)在太多了。我們將一小組參數(shù)一小組參數(shù)地做網(wǎng)格搜索,也就是局部搜索。

我們從默認(rèn)的參數(shù)設(shè)定開始,因?yàn)樗鼈円呀?jīng)相當(dāng)不錯(cuò)了。首先我們獨(dú)立優(yōu)化ctr_border_count、border_count、l2_leaf_reg。我們將記住最佳的設(shè)定,然后我們將同時(shí)對(duì)iterations和learning_rate進(jìn)行網(wǎng)格搜索,因?yàn)閮烧呤蔷o密耦合的。最后,我們將查找最佳depth。因?yàn)槲覀儾]有進(jìn)行全網(wǎng)格搜索,我們可能不會(huì)得到最優(yōu)設(shè)定,不過我們應(yīng)該能得到相當(dāng)接近最優(yōu)設(shè)定的結(jié)果。

我編寫了進(jìn)行網(wǎng)格搜索的代碼。開頭部分基本和“快速示例”中的代碼一樣,讀取數(shù)據(jù)集,轉(zhuǎn)換類別特征為整數(shù),并提取標(biāo)簽。

import pandas

import numpy as np

import catboost as cb

from sklearn.model_selection importKFold

from paramsearch import paramsearch

from itertools import product,chain

# 從csv文件讀取訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)

colnames = ['age','wc','fnlwgt','ed','ednum','ms','occ','rel','race','sex','cgain','closs','hpw','nc','label']

train_set = pandas.read_csv("adult.data.txt",header=None,names=colnames,na_values='?')

test_set = pandas.read_csv("adult.test.txt",header=None,names=colnames,na_values='?',skiprows=[0])

# 轉(zhuǎn)換類別欄為整數(shù)

category_cols = ['wc','ed','ms','occ','rel','race','sex','nc','label']

cat_dims = [train_set.columns.get_loc(i) for i in category_cols[:-1]]

for header in category_cols:

train_set[header] = train_set[header].astype('category').cat.codes

test_set[header] = test_set[header].astype('category').cat.codes

# 將標(biāo)簽從數(shù)據(jù)集中分離

train_label = train_set['label']

train_set = train_set.drop('label', axis=1)

test_label = test_set['label']

test_set = test_set.drop('label', axis=1)

然后是具體的參數(shù)搜索部分。我們首先指定將要進(jìn)行網(wǎng)格搜索的參數(shù),以及我們想要搜索的值。

params = {'depth':[3,1,2,6,4,5,7,8,9,10],

'iterations':[250,100,500,1000],

'learning_rate':[0.03,0.001,0.01,0.1,0.2,0.3],

'l2_leaf_reg':[3,1,5,10,100],

'border_count':[32,5,10,20,50,100,200],

'ctr_border_count':[50,5,10,20,100,200],

'thread_count':4}

然后我們定義進(jìn)行交叉驗(yàn)證的函數(shù)——這一函數(shù)接受指定參數(shù)的集合,在訓(xùn)練數(shù)據(jù)集上進(jìn)行n折驗(yàn)證,并返回每折的平均精確度。

# 這一函數(shù)基于catboostclassifier進(jìn)行3折交叉驗(yàn)證

def crossvaltest(params,train_set,train_label,cat_dims,n_splits=3):

kf = KFold(n_splits=n_splits,shuffle=True)

res = []

for train_index, test_index in kf.split(train_set):

train = train_set.iloc[train_index,:]

test = train_set.iloc[test_index,:]

labels = train_label.ix[train_index]

test_labels = train_label.ix[test_index]

clf = cb.CatBoostClassifier(**params)

clf.fit(train, np.ravel(labels), cat_features=cat_dims)

res.append(np.mean(clf.predict(test)==np.ravel(test_labels)))

return np.mean(res)

下面是實(shí)際調(diào)用網(wǎng)格搜索函數(shù)的代碼。我們使用itertools中的chain將多個(gè)迭代器組合為一個(gè)。我們首先搜索border_count,其他參數(shù)都保持默認(rèn)值。接著我們使用之前找到的最佳參數(shù)搜索ctr_border_count。然后我們同時(shí)對(duì)iterations和learning_rate進(jìn)行網(wǎng)格搜索(測(cè)試兩者的所有可能組合)。在此之后我們找到最佳深度。一旦我們測(cè)試了所有組合后,我們直接使用最佳參數(shù)調(diào)用catBoostClassifier。

# 這一函數(shù)在一些參數(shù)上進(jìn)行網(wǎng)格搜索

def catboost_param_tune(params,train_set,train_label,cat_dims=None,n_splits=3):

ps = paramsearch(params)

# 單獨(dú)搜索'border_count'、'l2_leaf_reg'等參數(shù),

# 但同時(shí)搜索'iterations'和'learning_rate'

for prms in chain(ps.grid_search(['border_count']),

ps.grid_search(['ctr_border_count']),

ps.grid_search(['l2_leaf_reg']),

ps.grid_search(['iterations','learning_rate']),

ps.grid_search(['depth'])):

res = crossvaltest(prms,train_set,train_label,cat_dims,n_splits)

# 保存交叉驗(yàn)證結(jié)果,這樣以后的迭代可以復(fù)用最佳參數(shù)

ps.register_result(res,prms)

print(res,prms,s'best:',ps.bestscore(),ps.bestparam())

return ps.bestparam()

bestparams = catboost_param_tune(params,train_set,train_label,cat_dims)

現(xiàn)在我們使用找到的最佳參數(shù)調(diào)用CatBoost:

# 使用調(diào)優(yōu)的參數(shù)訓(xùn)練分類器

clf = cb.CatBoostClassifier(**bestparams)

clf.fit(train_set, np.ravel(train_label), cat_features=cat_dims)

res = clf.predict(test_set)

print('error:',1-np.mean(res==np.ravel(test_label)))

調(diào)優(yōu)參數(shù)后我們得到的最終分?jǐn)?shù)實(shí)際上和調(diào)優(yōu)之前一樣!看起來我做的調(diào)優(yōu)沒能超越默認(rèn)值。這體現(xiàn)了CatBoost分類器的質(zhì)量,默認(rèn)值是精心挑選的(至少就這一問題而言)。增加交叉驗(yàn)證的n_splits,通過多次運(yùn)行分類器減少得到的噪聲可能會(huì)有幫助,不過這樣的話網(wǎng)格搜索的耗時(shí)會(huì)更長。如果你想要測(cè)試更多參數(shù)或不同的組合,那么上面的代碼很容易修改。

預(yù)防過擬合

CatBoost提供了預(yù)防過擬合的良好設(shè)施。如果你把iterations設(shè)得很高,分類器會(huì)使用許多樹創(chuàng)建最終的分類器,會(huì)有過擬合的風(fēng)險(xiǎn)。如果初始化的時(shí)候設(shè)置了use_best_model=True和eval_metric='Accuracy',接著設(shè)置eval_set(驗(yàn)證集),那么CatBoost不會(huì)使用所有迭代,它將返回在驗(yàn)證集上達(dá)到最佳精確度的迭代。這和神經(jīng)網(wǎng)絡(luò)的及早停止(early stopping)很像。如果你碰到過擬合問題,試一下這個(gè)會(huì)是個(gè)好主意。不過我沒能在這一數(shù)據(jù)集上看到任何改善,大概是因?yàn)橛羞@么多訓(xùn)練數(shù)據(jù)點(diǎn),很難過擬合。

CatBoost集成

集成指組合某種基礎(chǔ)分類器的多個(gè)實(shí)例(或不同類型的分類器)為一個(gè)分類器。在CatBoost中,這意味著多次運(yùn)行CatBoostClassify(比如10次),然后選擇10個(gè)分類器中最常見的預(yù)測(cè)作為最終分類標(biāo)簽。一般而言,組成集成的每個(gè)分類器需要有一些差異——每個(gè)分類器犯的錯(cuò)不相關(guān)時(shí)我們能得到最好的結(jié)果,也就是說,分類器盡可能地不一樣。

使用不同參數(shù)的CatBoost能給我們帶來一些多樣性。在網(wǎng)格搜索過程中,我們保存了我們測(cè)試的所有參數(shù),以及相應(yīng)的分?jǐn)?shù),這意味著,得到最佳的10個(gè)參數(shù)組合是一件輕而易舉的事情。一旦我們具備了10個(gè)最佳參數(shù)組合,我們直接構(gòu)建分類器集成,并選取結(jié)果的眾數(shù)作為結(jié)果。對(duì)這一具體問題而言,我發(fā)現(xiàn)組合10個(gè)糟糕的參數(shù)設(shè)定,能夠改善原本糟糕的結(jié)果,但集成看起來在調(diào)優(yōu)過的設(shè)定上起不了多少作用。不過,由于大多數(shù)kaggle競(jìng)賽的冠軍使用集成,一般而言,使用集成明顯會(huì)有好處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 參數(shù)
    +關(guān)注

    關(guān)注

    11

    文章

    1862

    瀏覽量

    32464
  • 分類器
    +關(guān)注

    關(guān)注

    0

    文章

    152

    瀏覽量

    13250

原文標(biāo)題:使用網(wǎng)格搜索優(yōu)化CatBoost參數(shù)

文章出處:【微信號(hào):jqr_AI,微信公眾號(hào):論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

    相關(guān)推薦

    PGA309溫漂是否可以通過設(shè)置參數(shù)軟件方式優(yōu)化,如何優(yōu)化?

    1.PGA309溫漂是否可以通過設(shè)置參數(shù)軟件方式優(yōu)化,如何優(yōu)化? 2.針對(duì)可編程放大器,是否有數(shù)字輸出的PGA系列產(chǎn)品?
    發(fā)表于 08-09 07:04

    WCDMA網(wǎng)絡(luò)無線參數(shù)優(yōu)化資料

    WCDMA網(wǎng)絡(luò)無線參數(shù)優(yōu)化資料WCDMA網(wǎng)絡(luò)無線參數(shù)優(yōu)化手冊(cè):無線參數(shù)調(diào)整的類型,無線能數(shù)調(diào)整的前提,無線
    發(fā)表于 09-18 15:06

    怎樣優(yōu)化設(shè)計(jì)金鹵燈電子鎮(zhèn)流器的Buck電路?

    什么是金鹵燈電子鎮(zhèn)流器?怎樣優(yōu)化設(shè)計(jì)Buck電路?
    發(fā)表于 04-20 07:09

    怎樣使用LED邊緣光源技術(shù)去優(yōu)化背光系統(tǒng)?

    怎樣使用LED邊緣光源技術(shù)去優(yōu)化背光系統(tǒng)?
    發(fā)表于 06-07 07:07

    FOA優(yōu)化算法整定PID控制器參數(shù)

    【Simulink】FOA優(yōu)化算法整定PID控制器參數(shù)(五)—— 一階帶時(shí)延的被控對(duì)象目錄【Simulink】FOA優(yōu)化算法整定PID控制器參數(shù)(五)—— 一階帶時(shí)延的被控對(duì)象0研究背
    發(fā)表于 08-30 06:46

    怎樣去計(jì)算電流環(huán)的Kp參數(shù)與Ki參數(shù)

    怎樣去計(jì)算電流環(huán)的Kp參數(shù)?怎樣去計(jì)算電流環(huán)的Ki參數(shù)?
    發(fā)表于 10-09 08:04

    電流環(huán)控制器的優(yōu)化過程是怎樣

    電流環(huán)控制器的優(yōu)化過程是怎樣的?轉(zhuǎn)速調(diào)節(jié)器的作用是什么?電流調(diào)節(jié)器的作用是什么?
    發(fā)表于 10-11 09:56

    果蠅優(yōu)化算法MATLAB實(shí)現(xiàn)過程是怎樣的?

    果蠅優(yōu)化算法MATLAB實(shí)現(xiàn)過程是怎樣的?
    發(fā)表于 11-22 07:48

    直線電機(jī)怎樣優(yōu)化它的速度環(huán),有什么標(biāo)準(zhǔn)?

    直線電機(jī)怎樣優(yōu)化它的速度環(huán),有什么標(biāo)準(zhǔn)
    發(fā)表于 12-15 07:35

    蟻群算法參數(shù)優(yōu)化

    針對(duì)蟻群算法運(yùn)行參數(shù)選取問題,提出一種利用粒子群優(yōu)化算法對(duì)蟻群算法的運(yùn)行參數(shù)進(jìn)行優(yōu)化選擇的方法。將蟻群算法的運(yùn)行參數(shù)作為粒子群的位置信息,在
    發(fā)表于 04-22 08:42 ?28次下載

    GSM系統(tǒng)—網(wǎng)絡(luò)維護(hù)優(yōu)化參數(shù)的提取

    GSM系統(tǒng)—網(wǎng)絡(luò)維護(hù)優(yōu)化參數(shù)的提取 優(yōu)化的若干參數(shù),并在對(duì)信令過程研究的基礎(chǔ)上,給出參數(shù)的提取方法。
    發(fā)表于 08-04 14:15 ?658次閱讀

    基于HDevelop的形狀匹配算法參數(shù)優(yōu)化研究

    基于HDevelop的形狀匹配算法參數(shù)優(yōu)化研究。
    發(fā)表于 05-13 15:51 ?0次下載

    電控噴油器關(guān)鍵參數(shù)優(yōu)化

    動(dòng)態(tài)響應(yīng)性能的影響規(guī)律進(jìn)行了研究,在此基礎(chǔ)上以各關(guān)鍵結(jié)構(gòu)參數(shù)作為設(shè)計(jì)變量,開啟滯后時(shí)間和落座滯后時(shí)間作為目標(biāo)函數(shù)建立了相應(yīng)的優(yōu)化模型,通過遺傳算法對(duì)這些結(jié)構(gòu)參數(shù)進(jìn)行了匹配優(yōu)化,并通過仿
    發(fā)表于 03-20 15:21 ?2次下載
    電控噴油器關(guān)鍵<b class='flag-5'>參數(shù)</b><b class='flag-5'>優(yōu)化</b>

    蘋果13的配置參數(shù)怎樣

    期待已久的iphone 13系列手機(jī)終于在9月15日凌晨1點(diǎn)正式發(fā)布了,那么,蘋果13的配置參數(shù)到底是怎樣的呢?
    的頭像 發(fā)表于 09-16 11:00 ?9077次閱讀

    壓敏電阻的參數(shù)怎樣的?

    壓敏電阻的參數(shù)怎樣的?|深圳比創(chuàng)達(dá)電子EMC
    的頭像 發(fā)表于 10-27 10:51 ?1513次閱讀

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品