當前位置:
首頁 > 最新 > 使用網格搜索優化CatBoost參數

使用網格搜索優化CatBoost參數

作者:James Lyons

編譯:weakish

編者按:格里菲斯大學研究員James Lyons簡要地介紹了梯度提升的原理,並分享了使用CatBoost的經驗。

圖片來源:CatBoost官方推特賬號CatBoostML

CatBoost是由Yandex發布的梯度提升庫。在Yandex提供的基準測試中,CatBoost的表現超過了XGBoost和LightGBM。許多Kaggle競賽的優勝者使用了XGBoost,因此CatBoost很值得考察一下。

快速示例

通過如下命令安裝CatBoost

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

讓我們在UCI Repository Adult Dataset上做個快速的試驗。這一數據集包含約32000個訓練樣本,16000個測試樣本。其中有14個特徵,包括類別和連續值,其中一些特徵缺失。我們將使用解析csv文件:

使用如下命令運行這一試驗:

20次運行的平均錯誤率是12.91%. 這比數據集列出的所有樣本分類結果都要好(列出的最好結果是樸素貝葉斯的14%錯誤率)。考慮到我們還沒有進行任何優化,這個結果可不賴。

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

梯度提升介紹

CatBoost是一個梯度提升庫,我將在本節中簡要地描述梯度提升是如何工作的。

「梯度提升」源於「提升」,或者說,通過組合弱模型以構建強模型,從而提升弱模型的表現。梯度提升是提升的一個擴展,其中疊加生成弱模型的過程規劃為基於一個目標函數的梯度下降演算法。梯度提升屬於監督學習方法,這意味著它接受一個帶標籤的訓練實例集合作為輸入,構建一個模型,該模型基於給定的特徵,嘗試正確預測新的未見樣本的標籤。

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

為了提升這一模型,我們可以構建另一棵決策樹,不過這回將預測殘差而不是原始標籤。這可以認為是構建另一個模型以糾正現有模型的錯誤。添加新樹至模型後,做出新預測,接著再次計算殘差。為了使用多棵樹做出預測,直接讓給定實例通過每棵樹,並累加每棵樹的預測。通過構建估計殘差的預測器,我們實際上最小化了真實標籤和預測標籤的方差的梯度:

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

分類調優參數

上一節概覽了梯度提升如何工作的基礎,本節中我將介紹CatBoost提供的一些調整預測的把手。你可以在文檔中找到更多參數,但如果關注的是模型表現的話,並不需要調整更多參數。

還有一些隱秘的選項,但使用以上這些參數效果已經很好了。

參數搜索

這一步驟通常叫做網格搜索,基本上就是尋找能取得最高分數的參數值。需要牢記的是我們不能用測試集來調優參數,否則我們會過擬合測試集。我們需要在訓練集上做交叉驗證(或者使用獨立的驗證集),直到最後的精確度計算階段才能碰測試集。

這裡我們不會做全網格搜索,因為所有參數組合的可能性實在太多了。我們將一小組參數一小組參數地做網格搜索,也就是局部搜索。

我們從默認的參數設定開始,因為它們已經相當不錯了。首先我們獨立優化、、。我們將記住最佳的設定,然後我們將同時對和進行網格搜索,因為兩者是緊密耦合的。最後,我們將查找最佳。因為我們並沒有進行全網格搜索,我們可能不會得到最優設定,不過我們應該能得到相當接近最優設定的結果。

我編寫了進行網格搜索的代碼。開頭部分基本和「快速示例」中的代碼一樣,讀取數據集,轉換類別特徵為整數,並提取標籤。

然後是具體的參數搜索部分。我們首先指定將要進行網格搜索的參數,以及我們想要搜索的值。

然後我們定義進行交叉驗證的函數——這一函數接受指定參數的集合,在訓練數據集上進行n折驗證,並返回每折的平均精確度。

下面是實際調用網格搜索函數的代碼。我們使用中的將多個迭代器組合為一個。我們首先搜索,其他參數都保持默認值。接著我們使用之前找到的最佳參數搜索。然後我們同時對和進行網格搜索(測試兩者的所有可能組合)。在此之後我們找到最佳深度。一旦我們測試了所有組合後,我們直接使用最佳參數調用catBoostClassifier。

現在我們使用找到的最佳參數調用CatBoost:

調優參數後我們得到的最終分數實際上和調優之前一樣!看起來我做的調優沒能超越默認值。這體現了CatBoost分類器的質量,默認值是精心挑選的(至少就這一問題而言)。增加交叉驗證的n_splits,通過多次運行分類器減少得到的雜訊可能會有幫助,不過這樣的話網格搜索的耗時會更長。如果你想要測試更多參數或不同的組合,那麼上面的代碼很容易修改。

預防過擬合

CatBoost提供了預防過擬合的良好設施。如果你把iterations設得很高,分類器會使用許多樹創建最終的分類器,會有過擬合的風險。如果初始化的時候設置了use_best_model=True和eval_metric="Accuracy",接著設置eval_set(驗證集),那麼CatBoost不會使用所有迭代,它將返回在驗證集上達到最佳精確度的迭代。這和神經網路的及早停止(early stopping)很像。如果你碰到過擬合問題,試一下這個會是個好主意。不過我沒能在這一數據集上看到任何改善,大概是因為有這麼多訓練數據點,很難過擬合。

CatBoost集成

集成指組合某種基礎分類器的多個實例(或不同類型的分類器)為一個分類器。在CatBoost中,這意味著多次運行CatBoostClassify(比如10次),然後選擇10個分類器中最常見的預測作為最終分類標籤。一般而言,組成集成的每個分類器需要有一些差異——每個分類器犯的錯不相關時我們能得到最好的結果,也就是說,分類器儘可能地不一樣。

使用不同參數的CatBoost能給我們帶來一些多樣性。在網格搜索過程中,我們保存了我們測試的所有參數,以及相應的分數,這意味著,得到最佳的10個參數組合是一件輕而易舉的事情。一旦我們具備了10個最佳參數組合,我們直接構建分類器集成,並選取結果的眾數作為結果。對這一具體問題而言,我發現組合10個糟糕的參數設定,能夠改善原本糟糕的結果,但集成看起來在調優過的設定上起不了多少作用。不過,由於大多數kaggle競賽的冠軍使用集成,一般而言,使用集成明顯會有好處。

原文地址:https://effectiveml.com/using-grid-search-to-optimise-catboost-parameters.html


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 論智 的精彩文章:

MIT提出TbD網路,讓視覺問答模型更易於解釋同時保持高性能
Fran?ois Chollet:對於AI,我們究竟該擔憂什麼?

TAG:論智 |