您的位置:首页 > 编程语言 > Python开发

数据比赛大杀器:Python树形模型集成库Xgboost&LightGBM

2018-01-07 00:01 225 查看
以下内容是个人学习笔记,图片及调参内容参考自寒小阳老师讲义。

sklearn库:中小型数据集;Xgboost/LightGBM库:工业界大型数据,可以分布式部署。

工业界非常喜欢树形模型原因:(1)可解释性好,和人的判断非常相似,可以顺着树的路径找出做决策的方式,出问题容易debug。(2)树形模型不需要做幅度缩放,树分裂时不受各个特征变化幅度的影响(衡量各个特征时,熵/Gini index的计算与各个特征的变化幅度取值无关)。(3)各种由树形模型集成的模型精准度也很高。

Random Forest学习时,每一棵树的生成:随机选择利用部分样本点,随机选择部分特征,并行生成很多棵树后,分类问题:投票,回归问题:平均(Bagging)。

Random Forest效果受限于每一棵决策树可以学习到的程度,可以控制过拟合,但有时拟合程度不一定精确。

GBDT是一个很容易overfitting的模型;为了控制过拟合,同时又能得到比较高的精确度,对GBDT进行改进,引入Bagging的机制,在GBDT串行生成过程引入随机采样。



LightGBM文档:https://lightgbm.readthedocs.io/en/latest/Installation-Guide.html

Xgboost文档:http://xgboost.readthedocs.io/en/latest/model.html

Xgboost里3类参数:通用参数,集成参数,任务参数

通用参数(general parameters):最上层参数,用什么模型搭建

(1)booster[default=gbtree] 串行学习过程,基模型是什么

gbtree,gblinear

(2)silent[default=0] 信息是否输出

(3)nthread[default=max] 跑xgboost的最大线程数,默认最大线程数

(4)num_pbuffer[无需手动调]

(5)num_feature[无需手动调]

集成参数/增强参数(booster parameters):模型集成时,每一个基模型的参数,各基模型融合时的参数

(1)eta[default=0.3] 取值[0,1],看成学习率,串行修正偏差学习基模型的作用幅度,即为防止过拟合,更新过程中用到的收缩步长;在每次提升计算之后,算法会直接获得新特征的权重,eta通过缩减特征的权重,使提升计算过程更保守

(2)gamma[default=0,alias:nin_split_loss] 取值[0,∞∞],为了防止过拟合,限制树的叶子结点进一步分裂时,损失函数应该减少的最小值,即如果某个叶子结点分裂前后,损失函数变化太小,就预剪枝不分裂该叶结点,这个值取值越大,算法越保守

(3)max_depth[default=6] 取值[1,∞∞],经验设定取值[4,8]的树的最大深度,这个值取值越大,算法越保守

(4)min_child_weight[default=1] 取值[0,∞∞],最小孩子的权重,为了防止过拟合,设定叶节点分裂时最少应该包含的样本数,这个值取值越大,算法越保守

(5)max_delta_step[default=0] 取值[0,∞∞],(如果该值为0,就是没有限制;如果设为一个正数,可以使每一步更新更加保守通常情况下这一参数是不需要设置的,但是在logistic回归的训练集中类极端不平衡的情况下,将这一参数的设置很有用,将该参数设为1-10可以控制每一步更新)

(6)subsample[default=1] 取值(0,1],经验设定取值[0.6,0.9],基模型生成过程,单个模型用到的取样样本/随机部分样本

(如,决策树生长时,不会用到全量的样本,按比例抽取一部分样本用于某棵树的生成,树每一层增长分裂选特征时,可以用全量数据样本去选最好的分裂特征,也可用采样的部分数据样本去选最好的分裂特征

(7)colsample_bylevel[default=1] 取值(0,1],经验设定取值[0.6,0.9],每个基模型生成过程用到的列方向取样数据,即取样特征列/随机部分特征

(8)colsample_bytree[default=1] 取值(0,1],经验设定取值[0.6,0.9],构建每个基模型的过程中,单个基模型整体用到的采样样本

(9)lambda[default=1,alias:reg_lambda] L2正则化项权重(gblinear)

(10)alpha[default=0,alias:reg_alpha] L1正则化项权重(gblinear)

(11)tree_method[default=’auto’] 取值’auto’,’exact’,’approx’,这个参数一般情况下不需要调。串行的树,在树分裂时,xgboost package里做了一些并行处理。‘exact’是扫描全量特征进行选择分裂,’approx’是利用histogram的方式做近似构造特征,这种近似可以加速高维数据(数据特征维度上千)的建模,但是有可能会牺牲一定的精度

(12)scale_pos_weight[default=1] 负样本数/正样本数=>样本比例,将样本比例传入,调节正负样本类别不平衡建模问题

任务参数(task parameters):当前任务、场景相关,当前解决的是什么样的一个任务——回归问题、分类问题

(1)objective[default=reg:linear] 模型优化学习过程,需要最小化的损失函数

内置取值如下列表(高级用法——自己定义损失函数):

“reg:linear” –线性回归

“reg:logistic” –逻辑回归

“binary:logistic” –二分类的逻辑回归,返回预测的概率(不是类别)

“binary:logitraw” –输出归一化前的得分,11+e−θTz11+e−θTz里的zz

“multi:softmax” –设定XGBoost做多分类,你需要同时设定num_class(类别数)的值

“multi:softprob” –输出维度为ndata * nclass的概率矩阵

(2)eval_metric[ 默认是根据 损失函数/目标函数 自动选定的 ] 评估最后学习到的模型对任务处理的好坏(如,分类问题中,学习到的模型对测试集、训练集样本的分类正确率)

“rmse”–均方误差

“mae”–绝对平均误差(不可导)

“logloss”–对数似然损失(分类问题二元交叉熵损失)

“error”–二分类的错误率

“error@t”: 通过提供t为阈值(而不是0.5),计算错误率

“auc”–ROC曲线下方的面积(排序问题)

https://en.wikipedia.org/wiki/Receiver_operating_characteristic#Area_under_curve

(3)seed[default=0] 随机种子
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: