以下内容是个人学习笔记,图片及调参内容参考自寒小阳老师讲义。
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] 负样本数/正样本数=>样本比例,将样本比例传入,调节正负样本类别不平衡建模问题。把逾期样本的设为1,利用scale_pos_weight参数,xgboost可以简单粗暴的放大标记为1的权重;scale_pos_weight里,pos即positive为正类,把逾期的标记成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] 随机种子