1. 介紹
?有人戲稱數(shù)據(jù)挖掘比賽為GBDT調(diào)參大賽朴摊,因為在很多比賽后期袋毙,大家都使用GBDT類的算法,特征類似砸烦,只有模型參數(shù)不同弃鸦,模型集成方法不同,最終大家的成績差別也很小幢痘。
?上篇《實戰(zhàn)人品預(yù)測之一_國內(nèi)大數(shù)據(jù)競賽平臺》唬格,介紹DataCastle平臺的“微額借款用戶人品預(yù)測大賽”比賽規(guī)則,以及一些初步的嘗試颜说。本篇說說最終獲勝的购岗,也是GDBT類算法中使用頻率最高的xgboost算法的使用和調(diào)參方法。
2. xgboost原理
?之前在《機器學習_集成算法》篇(http://www.reibang.com/p/3c8cca3e1ca2)中介紹過GBDT類的算法门粪,簡單回顧一下:
?Boosting算法不斷地使用同一算法(比如決策樹)建立新模型喊积,而新模型分配給上一次錯分樣本更大的權(quán)重,最終根據(jù)按成功度加權(quán)組合得到結(jié)果玄妈。由于引入了逐步改進的思想乾吻,重要屬性會被加權(quán)。
?Gradient Boosting Machine(GBM)梯度提升算法是目前比較流行的數(shù)據(jù)挖掘模型拟蜻,它通過求損失函數(shù)在梯度方向下降的方法绎签,層層改進,是泛化能力較強的算法瞭郑,常用于各種數(shù)據(jù)挖掘比賽之中辜御。常用的工具有XGBoost,LightGBM屈张,sklearn提供的?GradientBoostingClassifier等等擒权。GBM常把決策樹作為基模型,我們看到的GBDT梯度提升決策樹阁谆,指的就是該算法碳抄。
3. xgboost簡單使用
(1) 安裝庫
?xgboost是一個獨立的軟件包,需要單獨安裝
$ pip install xgboost
(2) 示例代碼
import xgboost as xgb
model = xgb.XGBClassifier()
model.fit(train_x, train_y)
model.score(test_x, test_y)
test_y = model.predict(test_x)
4. xgboost與sklearn
?xgboost提供了兩種接口场绿,一種是它自身的調(diào)用接口剖效,另一種與sklearn的調(diào)用方式一樣,上面的代碼使用的是sklearn調(diào)用方式,它讓用戶能很快從sklearn的GBDT轉(zhuǎn)到xgboost上璧尸。(不只xgboost咒林,很多數(shù)據(jù)挖掘庫都提供類似sklearn的調(diào)用方法)
?另外一個好處是,它能與sklearn的工具GridSearchCV結(jié)合爷光,實現(xiàn)自動調(diào)參垫竞,后面細說。
5. xgboost參數(shù)
?xgboost參數(shù)分為三類:boost參數(shù)蛀序,tree參數(shù)欢瞪,其它參數(shù)。
(1) Tree參數(shù)
?雖然xgboost也提供了linear作為弱分類器徐裸,但是大家一般都使用樹分類器遣鼓,這部分設(shè)置主要是控制樹的大小,避免過擬合重贺,具體參數(shù)是由實例的多少及分布密度決定的骑祟。
- max_depth:最大樹深(默認6,同sklearn中max_depth)
- max_leaf_nodes:樹上最大的節(jié)點或葉子的數(shù)量(同sklearn中max_ leaf_ nodes)
(2) Boost參數(shù)
- scale_pos_weight:正反例數(shù)據(jù)權(quán)重气笙,使用它就不再需要增加反例了曾我。
- early_stopping_rounds:多少輪內(nèi)無提高則停止。
- eta:學習率(默認0.3健民,同sklearn中l(wèi)earning_ rate)抒巢。
- min_child_weight:最小葉子節(jié)點樣本權(quán)重和(默認1,類似sklearn中min_child_leaf)秉犹。
- max_delta_step:每棵樹權(quán)重改變的最大步長(默認0蛉谜,為沒約束,一般不設(shè))崇堵。
- subsample:每棵樹所用到的子樣本占總樣本的比例(默認1型诚,一般用0.8,同sklearn中subsample)鸳劳。
- colsample_bytree:樹對特征采樣的比例(默認1狰贯,類似sklearn中max_features)。
- colsample_bylevel:每一級的每一次分裂赏廓,對列數(shù)的采樣的占比涵紊。
- lambda:權(quán)重的L2正則化項,避免過擬合幔摸,降低復雜度(默認1摸柄,不常用)
- alpha:權(quán)重的L1正則化項,避免過擬合既忆,降低復雜度(默認1)
- gamma:節(jié)點分裂所需的最小損失函數(shù)下降值(默認0)
(3) 其它參數(shù)
- booster:選擇分類器類型樹或線性(默認為gbtree驱负,一般不改)
- silent:是否打印輸出信息(默認為0嗦玖,輸出信息,一般不改)
- nthread:最大線程數(shù)(默認為CPU全部核跃脊,一般不改)
- seed:隨機種子宇挫,使用后隨機結(jié)果變得可復現(xiàn)(類似sklearn中random_ state)
- objective:損失函數(shù)
- eval_metric:有效數(shù)據(jù)的度量方法,有rmse, mae, logloss, auc等
6. 調(diào)參
?當我第一次用xgboost替代了sklearn的 gdbt時酪术,同樣是默認參數(shù)捞稿,在不調(diào)參的情況下拼缝,成績下降了0.05,主要是由于xgboost默認參數(shù)導致的彰亥,后來使用了冠軍的參數(shù)咧七,大概有0.02的提升。這說明調(diào)參是必須的任斋。
?調(diào)參總體來說就是在確定其它參數(shù)的情況下继阻,調(diào)某個參數(shù)。雖然這樣單獨調(diào)參會有一些問題废酷,比如組合特征后最佳參數(shù)可能變化瘟檩,但是除了窮舉和人對特征的理解以外,好像也沒什么別的辦法澈蟆。
?調(diào)參時注意先把學習率調(diào)到0.1以上墨辛,以加快運行速度,后期模型穩(wěn)定后再將值調(diào)低趴俘。
?sklearn提供了調(diào)參工具GridSearchCV睹簇,可與xgboost配合,簡單例程如下:
from sklearn import svm, datasets
from sklearn.model_selection import GridSearchCV
import xgboost as xgb
iris = datasets.load_iris()
parameters = {'max_depth':[4,5,6], 'min_child_weight':[4,5,6]}
model = xgb.XGBClassifier()
clf = GridSearchCV(model, parameters)
clf.fit(iris.data, iris.target)
print(clf.grid_scores_)
print(clf.best_params_)
print(clf.best_score_)
?調(diào)參先后也很重要寥闪,具體方法請見:
http://blog.csdn.net/han_xiaoyang/article/details/52665396
7. 總結(jié)
?通過本次實驗太惠,明顯看到xgboost好處,比如支持多線程疲憋,可調(diào)節(jié)正反例權(quán)重凿渊,自帶交叉驗證,處理缺省值缚柳,包含了很多預(yù)處理的工作埃脏。
?使用冠軍代碼做預(yù)測,沒加任何的特征處理和其它算法的情況下秋忙,迭代共進行了50000次剂癌,線上得分超過0.7,這個得分和比賽結(jié)束時的最高分0.734已經(jīng)差不太多了翰绊。每次打印出AUC值佩谷,能明顯看出它的進化過程:不斷迭代旁壮,直到收斂。從原理上看谐檀,該算法在基礎(chǔ)參數(shù)沒問題抡谐,在機器算力也足夠的情況下,應(yīng)該可以取得接近最佳的成績桐猬。
?擴展地看麦撵,增加錯誤權(quán)重,不斷迭代的集成算法溃肪,與多算法結(jié)合效果都不錯免胃,具體可以參考sklearn自帶工具AdaBoost。