一、 X-gboost模型总结整理
X-gboost 是将多个树模型(若分类器)集成一个强分类器。可用于分类问题,也可用于预测值问题,只是不同问题使用的树模型不一样:
分类问题: 决策树(C4.5,C5.0,CART)
预测问题:回归树(CART : 其实也可以与分类)
1.预测问题的适用场景:
(1) 可适用于影响预测值的多个因素中同时存在离散型特征(变量值为分类型值,比如:是、否是“新品”;排名段“1-5”,“6-10”),连续型特征变量(库存、售罄率等)。
对于回归问题:输入数据 为多个特征值(类似于回归中多个自变量)
样本划分为 (1)训练集(模型的训练【业务规则的学习】、最优参数的选择)
(2)*检验集(*评估模型的稳定性,预测误差)
(3) 测试集(模型的泛化能力检验)
(2) 对缺失值不敏感,可适用于稀疏型数据,因此一般将缺失值当做稀疏型矩阵
(3) 可以对特征变量的重要性进行排序判断,得到影响预测值的主要特变量
(4) 预测误差相对于普通单一模型低,因为X-gboost 将多个弱分类器集成为强分类器
常见用例:商品(商店)零售品销量、销额预测;房价预测等
2. 预测逻辑
实现预测基本流程
1 .首先从业务角度选取对各sku有影响的特征
-
对选取的特征值进行部分调整(有的变量需要适当调整,转换,例如:是否转化为哑变量;是否数据标准化;异常值处理)
-
划分训练集、测试集(对于销量、销额按照时间段划分)
-
将训练集影响销量的特征变量和销量实际值输入到X-gboost模型中训练:
(1)对重要特征的筛选:如果变量过多,样本较少,选择出重要的变量进行训练,可以避免模型过拟合
(2) 通常需要对最优参数进行选择(参数较多,分为通用参数、辅助参数和任务参数),例如叶子节点权重,树的深度 max_depth等(通常采用CV方法选择)
-
模型训练,可得到最优模型;使用最优模型去检验所训练的模型的预测误差
-
使用训练后的模型,输入预测时间的特征值进行预测
3.优点与缺点
xgboos是在GBDT(提升树模型)的基础上,在目标函数中引入了正则项。相比GBDT的优点有:
(1)xgboost在代价函数里自带加入了正则项,用于控制模型的复杂度;
(2)优化时,GBDT梯度下降一阶求导,xgboost是二阶泰勒级数展开, 梯度下降速度更快
(3)xgboost在进行节点的分裂时,支持各个特征多线程(并行)进行增益计算,因此算法更快,准确率也相对高一些;
(4) XGBoost生成CART树考虑了树的复杂度,GDBT未考虑,GDBT在树的剪枝步骤中考虑了树的复杂度, 因此能根更好避免过拟合
(5)借鉴了随机森林的做法,支持特征抽样、样本抽样,不仅防止过拟合,还能减少计算量
优点总结:
-
泛化能力强,因为考虑到复杂度,不易过拟合
-
对缺失值不敏感,xgBoosting能自动学习分裂方向
-
模型训练效率高;xgBoosting在每次迭代之后,为叶子结点分配学习速率,降低每棵树的权重,减少每棵树的影响,为后面提供更好的学习空间;
缺点总结:
-
由于参数过多,调参复杂度高
-
数据量大时,贪心法耗时遍历选择最优分割点占用内存大. 预排序方法空间消耗比较大,不仅要保存特征值,也要保存特征的排序索引,同时时间消耗也大,在遍历每个分裂点时都要计算分裂增益.而LightGBM方法采用histogram算法,占用的内存低,数据分割的复杂度更低,但是不能找到最精确的数据分割点;
其他常见的预测模型:
- 1.随机森林(RF): 是通过bagging集成的方法,进行有放回抽样,多数表决(分类)或简单平均(回归),Bagging的各分类器之间属于并列生成,不存在强依赖关系。【而xgboost中各树之间存在强依赖性,因为T+1棵数是在T棵树的基础上进一步减少误差预测】
随机森林的优点较多,简单总结:1、在数据集上表现良好,相对于其他算法有较大的优势(训练速度、预测准确度);2、能够处理很高维的数据,并且不用特征选择,而且在训练完后,给出特征的重要性;3、容易做成并行化方法。
RF的缺点:在噪声较大的分类或者回归问题容易过拟合。
- 2.LightGBM : 是在xgboost上基础上,改变了level-wise的分裂策略。而lightGBM采用了leaf-wise的策略,区别是xgboost对每一层所有节点做无差别分裂,可能有些节点的增益非常小,对结果影响不大,但是xgboost也进行了分裂,带来了务必要的开销。 leaft-wise的做法是在当前所有叶子节点中选择分裂收益最大的节点进行分裂,如此递归进行,很明显leaf-wise这种做法容易过拟合,因为容易陷入比较高的深度中,因此需要对最大深度做限制,从而避免过拟合。
相对于Xgboost的优势:
1)内存上优势:很明显,直方图算法的内存消耗为(#data* #features * 1Bytes)(因为对特征分桶后只需保存特征离散化之后的值),而xgboost的exact算法内存消耗为:(2 * #data * #features* 4Bytes),因为xgboost既要保存原始feature的值,也要保存这个值的顺序索引,这些值需要32位的浮点数来保存。
2)计算上的优势,预排序算法在选择好分裂特征计算分裂收益时需要遍历所有样本的特征值,时间为(#data),而直方图算法只需要遍历桶就行了,时间为(#bin)
3)直方图做差加速 ,一个子节点的直方图可以通过父节点的直方图减去兄弟节点的直方图得到,从而加速计算。
4)多线程优化,提高计算效率
二、 X-gboost 模型原理
参考:https://blog.csdn.net/weixin_41510260/article/details/95339201
参考:https://www.cnblogs.com/zongfa/p/9324684.html
参考:https://blog.csdn.net/sinat_26917383/article/details/52623754
XGBoost是一种boosting集成算法,而boosting算法思想是将多个弱分类器集成在一起形成一个强分类器。集成算法组成的模型具有更强的泛化能力(能推广适用于训练数据之外的数据,也具有较好的预测能力)
XGBoost是一种提升树模型,所以它是将许多树模型集成在一起,形成一个很强的分类器;如果做预测(回归)而所用到的树模型则是回归树(CART)模型;如果做分类用决策树。
回归树的样本输出是数值的形式,比如给某人发放房屋贷款的数额就是具体的数值,无法使用决策树中的信息增益、信息增益率、基尼系数来判定树的节点分裂了,而是预测误差,常用的有均方误差、对数误差等。而且节点不再是类别,是数值(预测值)
1. CART 回归树
[外链图片转存失败(img-p9ZYncAn-1569399749253)(C:\Users\lvdian\AppData\Roaming\Typora\typora-user-images\1569380845466.png)]
例如:通过输入用户年龄、性别进行判断用户是否喜欢玩游戏的得分值。由此得到一颗CART树模型。
[外链图片转存失败(img-cXH2jQJI-1569399749254)(C:\Users\lvdian\AppData\Roaming\Typora\typora-user-images\1569378460362.png)]
2. X-GBOOST 原理整理
x-gboost 训练过程中尽量保证预测(拟合)误差最小,但同时也考虑到模型的复杂度(因为复杂度影响着模型过拟合与欠拟合)。XGBoost并不是简单重复的将几个CART树进行组合。它是一种加法模型,将模型上次预测(由t-1棵树组合而成的模型)产生的误差作为参考进行下一棵树(第t棵树)的建立,每加入一棵树,并且将其损失函数不断降低,达到设定的阈值就终止树的加入。
1.预测的原理:由多棵cart树的预测值进行求和得到总的预测值,模型的最优模型的确定是通过损失风险最小
化(损失函数值最小)
[外链图片转存失败(img-OwhqJuka-1569399749255)(C:\Users\lvdian\AppData\Roaming\Typora\typora-user-images\1569379113088.png)]
[外链图片转存失败(img-JRJBAzN7-1569399749256)(C:\Users\lvdian\AppData\Roaming\Typora\typora-user-images\1569379608183.png)]
2. 损失函数的定义:
[外链图片转存失败(img-18MgUI9d-1569399749256)(C:\Users\lvdian\AppData\Roaming\Typora\typora-user-images\1569379354669.png)]
其中表示第i个样本的预测误差,一般误差可用均方误差、平均绝对误差,平方根误差等。
然后需要求上式最小值(2次最优化)即使用泰勒展开,分到cart树的每一个节点上。
3. 节点的最佳分割点的选择
同层级(树)之间的节点分割可以进行并行选择,因而可以提高效率;但不同树之间是串行计算,因为T+1棵树需要用到第T棵树的误差值、预测值。
[外链图片转存失败(img-65R4VU3t-1569399749257)(C:\Users\lvdian\AppData\Roaming\Typora\typora-user-images\1569380969837.png)]
Obj代表了当我们指定一个树的结构的时候,在目标上最多会减少多少,我们可以把它叫做结构分数,这个分数越小越好
对于每次扩展,我们依旧要枚举所有可能的方案。对于某个特定的分割,我们要计算出这个分割的左子树的导数和和右子数导数和之和(就是下图中的第一个红色方框),然后和划分前的进行比较(基于损失,看分割后的损失和分割前的损失有没有发生变化,变化了多少)。遍历所有分割,选择变化最大的作为最合适的分割。
-
每个叶子节点的得分值w的确定:是通过对损失函数最优化,通过泰勒展开确定到每个节点上的值
-
对稀疏数据(样本的部分特征值缺失)不敏感。
-
最终预测值可以非简单相加,可设定各科树之间的权重
-
可通过交叉验证来选择最优参数
-
可实现后剪枝
优点比较
Xgboost第一感觉就是防止过拟合+各种支持分布式/并行,所以一般传言这种大杀器效果好(集成学习的高配)+训练效率高(分布式),与深度学习相比,对样本量和特征数据类型要求没那么苛刻,适用范围广。
- XGBoost生成CART树考虑了树的复杂度,GDBT未考虑,GDBT在树的剪枝步骤中考虑了树的复杂度。
模型的可调节参数:https://blog.csdn.net/m_buddy/article/details/79337492
3. X-gboost 参数介绍
X-gboost 模型中参数较多,一般可将其分为3大类:通用参数、booster参数和任务参数。其中,通用参数主要负责宏观功能的控制,booster 参数控制模型每一步的迭代,学习目标参数则用来控制目标函数的种类和结果误差的度量方法。
参数类别 | 参数 | 设置参数说明 |
---|---|---|
booster | 选择每次迭代的模型 | |
通用参数 | silent | 是否打印执行信息 |
nthread | 设置并发执行信息 | |
eta | 学习速率 | |
min_child_weight | 最小叶子节点样本权重和 | |
max_depth | 树的最大深度 | |
max_leaf_nodes | 最大的节点或叶子的数量 | |
gamma | 节点分裂所需的最小损失函数下降值 | |
booster参数 | max_delta_step | 每棵树权重改变的最大步长 |
subsample | 每棵树随机采样的比例 | |
colsample_bytree | 每棵树随机采样的列数占比 | |
colsample_bylevel | 树每一级的每一次分裂,对列数的采样的占比 | |
alpha | L1正则的惩罚系数 | |
lambda | L2 正则的惩罚系数 | |
scale_pos_weight | 样本平衡系数 | |
objective | 损失函数 | |
学习目标参数 | eval_metric | 模型误差的度量方法 |
seed | 随机数种子 |
- 通用参数,一般类型通用参数决定在提升的过程中用哪种booster,常见的booster有树模型和线性模型。
(1) booster有两种选择:gbtree基于数的模型、gbline线性模型。其中,默认是gbtree。
(2) silent,当这个参数值为1的时候,静默模式开启,不会输出任何信息。一般这个参数保持默认的0,这样可以帮我们更好的理解模型。
(3) nthread这个参数用来进行多线程控制,应当输入系统的核数,默认值为最大可能的线程数,如果你希望使用cpu全部的核,就不要输入这个参数,算法会自动检测。
- booster参数,该参数的设置依赖于我们选择哪一种booster模型。
(1) eta,默认值是0.3,典型值是0.01-0.2。在更新决策树的叶子节点权重时,减少特征的权重,避免出现过拟合。eta 的值越大,则模型无法收敛的可能性越大,所以在模型拟合最初,一般将它设置得较小。
(2) min_child_weight,默认值是1。该参数决定最小叶子节点样本权重和,当它的值较大时,可以避免模型学习到局部的特殊样本,但如果这个值过高,会导致欠拟合。因此,这个参数需要用cv来调整。
(3) max_depth,默认值是6,典型值是 3-10。这个参数也是用来避免模型出现过拟合的。其值越大,模型深度越高,模型所学到的样本越具体。
(4) max_leaf_nodes,树上最大的节点或叶子的数量,可以代替max_depth的作用。如果生成的是二叉树,一个深度为n的树最多生成2n个叶子,如果定义了这个参数max_depth会被忽略。
(5) gamma,默认值是0,表示分裂节点所需要损失函数下降的最低程度。值设定得越大,模型越保守,在模型实现中需要调整。
(6) max_delta_step,默认值是0,表示对每棵决策树权重改变的最大步长限制。该值越大,算法越保守,通常不需要设置。
(7) subsample、colsample_bytree,默认值是1,典型值是0.5-1。这两个参数控制对于每棵树,随机采样的比例,减小这个参数的值算法会更加保守,避免过拟合,但是这个值设置的过小,它可能会导致欠拟合。
(8) colsample_bylevel,默认值是1。用来控制的每一级的每一次分裂,对列数的采样的占比。
(9) alpha、lambda,默认值均是 1,与正则项 Ridge 和 Lasso类似,控制模型复杂度减少过拟合且应用在很高维度的情况下,可以使得算法的速度更快。
(10) scale_pos_weight,默认值是1,主要针对样本不平衡问题,当设置为正值时,算法收敛的速度更快。
- 学习目标参数,该参数的设置决定着哪一种学习场景。主要根据模型的目标问题进行选择,针对分类问题、回归问题有不同的对应参数设置。
(1) objective,默认是reg:linear(线性回归)。该参数表示根据模型的目标问题定义的损失函数类型,最常用的值有:reg:linear、reg:logistic(逻辑回归)、binary:logistic(二元分类的逻辑回归输出概率)。
(2) eval_metric,默认值取决于objective参数的取值,为验证模型有效性的评价指标。对于回归问题,默认值是rmse(均方根误差),对于分类问题,默认是error(二元分类误差率)。典型值有:rmse;mae(平均绝对误差);logloss(负对数似然函数值);error;merror(多分类错误率);mlogloss(多分类损失函数);auc(ROC曲线下面积)等。
stic(逻辑回归)、binary:logistic(二元分类的逻辑回归输出概率)。
(2) eval_metric,默认值取决于objective参数的取值,为验证模型有效性的评价指标。对于回归问题,默认值是rmse(均方根误差),对于分类问题,默认是error(二元分类误差率)。典型值有:rmse;mae(平均绝对误差);logloss(负对数似然函数值);error;merror(多分类错误率);mlogloss(多分类损失函数);auc(ROC曲线下面积)等。
(3) seed,默认值是0。随机数的种子,设置它可以复现随机数据的结果,也可以用于调整参数。