1. 介绍

 有人戏称数据挖掘比赛为GBDT调参大赛,因为在很多比赛后期,大家都使用GBDT类的算法,特征类似,只有模型参数不同,模型集成方法不同,最终大家的成绩差别也很小。
 上篇《实战人品预测之一_国内大数据竞赛平台》,介绍DataCastle平台的“微额借款用户人品预测大赛”比赛规则,以及一些初步的尝试。本篇说说最终获胜的,也是GDBT类算法中使用频率最高的xgboost算法的使用和调参方法。

2. xgboost原理

 之前在《机器学习_集成算法》篇(http://www.jianshu.com/p/3c8cca3e1ca2)中介绍过GBDT类的算法,简单回顾一下:
 Boosting算法不断地使用同一算法(比如决策树)建立新模型,而新模型分配给上一次错分样本更大的权重,最终根据按成功度加权组合得到结果。由于引入了逐步改进的思想,重要属性会被加权。
 Gradient Boosting Machine(GBM)梯度提升算法是目前比较流行的数据挖掘模型,它通过求损失函数在梯度方向下降的方法,层层改进,是泛化能力较强的算法,常用于各种数据挖掘比赛之中。常用的工具有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提供了两种接口,一种是它自身的调用接口,另一种与sklearn的调用方式一样,上面的代码使用的是sklearn调用方式,它让用户能很快从sklearn的GBDT转到xgboost上。(不只xgboost,很多数据挖掘库都提供类似sklearn的调用方法)
 另外一个好处是,它能与sklearn的工具GridSearchCV结合,实现自动调参,后面细说。

5. xgboost参数

 xgboost参数分为三类:boost参数,tree参数,其它参数。

(1) Tree参数

 虽然xgboost也提供了linear作为弱分类器,但是大家一般都使用树分类器,这部分设置主要是控制树的大小,避免过拟合,具体参数是由实例的多少及分布密度决定的。

  • max_depth:最大树深(默认6,同sklearn中max_depth)
  • max_leaf_nodes:树上最大的节点或叶子的数量(同sklearn中max_ leaf_ nodes)

(2) Boost参数

  • scale_pos_weight:正反例数据权重,使用它就不再需要增加反例了。
  • early_stopping_rounds:多少轮内无提高则停止。
  • eta:学习率(默认0.3,同sklearn中learning_ rate)。
  • min_child_weight:最小叶子节点样本权重和(默认1,类似sklearn中min_child_leaf)。
  • max_delta_step:每棵树权重改变的最大步长(默认0,为没约束,一般不设)。
  • subsample:每棵树所用到的子样本占总样本的比例(默认1,一般用0.8,同sklearn中subsample)。
  • colsample_bytree:树对特征采样的比例(默认1,类似sklearn中max_features)。
  • colsample_bylevel:每一级的每一次分裂,对列数的采样的占比。
  • lambda:权重的L2正则化项,避免过拟合,降低复杂度(默认1,不常用)
  • alpha:权重的L1正则化项,避免过拟合,降低复杂度(默认1)
  • gamma:节点分裂所需的最小损失函数下降值(默认0)

(3) 其它参数

  • booster:选择分类器类型树或线性(默认为gbtree,一般不改)
  • silent:是否打印输出信息(默认为0,输出信息,一般不改)
  • nthread:最大线程数(默认为CPU全部核,一般不改)
  • seed:随机种子,使用后随机结果变得可复现(类似sklearn中random_ state)
  • objective:损失函数
  • eval_metric:有效数据的度量方法,有rmse, mae, logloss, auc等

6. 调参

 当我第一次用xgboost替代了sklearn的 gdbt时,同样是默认参数,在不调参的情况下,成绩下降了0.05,主要是由于xgboost默认参数导致的,后来使用了冠军的参数,大概有0.02的提升。这说明调参是必须的。
 调参总体来说就是在确定其它参数的情况下,调某个参数。虽然这样单独调参会有一些问题,比如组合特征后最佳参数可能变化,但是除了穷举和人对特征的理解以外,好像也没什么别的办法。
 调参时注意先把学习率调到0.1以上,以加快运行速度,后期模型稳定后再将值调低。
 sklearn提供了调参工具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_)

 调参先后也很重要,具体方法请见:

http://blog.csdn.net/han_xiaoyang/article/details/52665396

7. 总结

 通过本次实验,明显看到xgboost好处,比如支持多线程,可调节正反例权重,自带交叉验证,处理缺省值,包含了很多预处理的工作。
 使用冠军代码做预测,没加任何的特征处理和其它算法的情况下,迭代共进行了50000次,线上得分超过0.7,这个得分和比赛结束时的最高分0.734已经差不太多了。每次打印出AUC值,能明显看出它的进化过程:不断迭代,直到收敛。从原理上看,该算法在基础参数没问题,在机器算力也足够的情况下,应该可以取得接近最佳的成绩。
 扩展地看,增加错误权重,不断迭代的集成算法,与多算法结合效果都不错,具体可以参考sklearn自带工具AdaBoost。


技术文章定时推送
请关注公众号:算法学习分享

posted on 2017-12-06 11:20  xieyan0811  阅读(42)  评论(0编辑  收藏  举报