1.集成思想
能和决策树结合一起的,用决策树也可以做回归人物,
一个玩游戏,是否每一个人都分到一个叶子节点中,正数代表是的是愿意玩游戏,负数是不愿意玩游戏。
叶子节点与权重结合得到当前这个人得分值是多少,单个决策树太绝对啦,通常使用集成的方法,用两个树解决这个问题,第二棵树使用性别,结合两棵树得出这个人愿不愿玩这个游戏。
所谓的集成的思想,多个分类器,这些是弱分类器,把这些结合起来,当前的思想就是集成的方法。
2.基本原理
做回归任务的时候,叶子节点落在什么位置乘以权值
均方误差作为目标函数,损失值小比较好。通过损失值
现在手里很多样本,计算这些损失,在求一个平均,除以总数,相当于算一个期望值。这个期望值越小越好,什么样的值能使这越小越好。对于集成方法来说,每个棵树都考虑来。
第一棵树结束后,添加一个什么样的树,能保证结果好点,Xgboost是每次添加一个树效果提升的。
一颗添加一颗树,和上述公式一样的。假设有t棵树,t-1 轮模型,又加上新的函数后,效果会提升的,目标函数会下降。
如果一个叶子节点太多,过拟合越大,所以叶子节点不能太多,这里我们限制叶子节点的:
T树的个数,前面一个系数,惩罚力度;每个叶子节点都有一个权重值,所以对目标函数不仅预测预测值与真实值的差异,还要把这个
欧美噶(ft)加进去,一个总的目标函数是两部分(平方差和惩罚项)。
上述三个叶子节点,w的平方带入。
另外一个问题来啦,对每个树都要计算惩罚项的系数。
什么样的ft使得目标函数最小,接下来的计算很产生常数项。
3.目标函数的推导与实例
比如我们去银行借钱,我们能借钱1000,银行建立一个决策系统,这是我们的第一颗树,他们会借给我们950,一个残差50,添加二号树,弥补一号决策的失误,二号算了一个+30,三号树来啦,它会把1号和2号看做一个整体980,还差多少,它计算啦15,最终的结果的是980+30+15= 995,总体通过残差来优化一下,看看这个树怎么构造,使得残差变小。
当前的f(x)是上一个的状态,相当于是一个常数值,常数项对于我的优化求解是没有影响的,接下来怎么求解过程那?
化解展开,前面的公式也要处理,i到n 是对样本的遍历,所有的样本都会在叶子节点上,所以遍历叶子节点比较便利。
每个叶子节点都有一个权重项,权重乘以当前样本落在那个叶子节点上,和ft一个转换。现在对叶子节点遍历啦,当前叶子节点上有几个样本,然后每一个样本的一阶导和二阶导。
化简得。
什么样的G使得目标函数最小那,求偏导,然后得到
当你明确给定损失函数,才能得到G和H;算出往回带入,得到目标函数,有了这个目标函数比较好算一点啊。
还是那几个人,五个人,三个节点。
分数越小,结构越好。
对目标函数进行定义:
决策树引入熵值,评估,这里自身计算的系数可以,用作衡量标准。
用自已推出来的的值做评估,这里切一刀,哪里切一刀,决策树看信息增益,这里我们看目标函数:
基于这个目标函数,没切之前和切之后的损失值发生变化没有啊。
分割之前的分数减去分割之后的分数,就可以得到它的增益是多大的啦。分割之后的怎么算,有左右子树,看公式。
每切一刀,那个增益大就在那里切。
Xgboost 核心点其实就是在添加一个树的时候,前面树的模型不变,进行推导的过程,一步一步的推导,得出损失函数值是多少,利用损失函数值,建立一个模型,就是节点怎么切分,它怎么来的,怎计算的。
4.Xgboost的安装
安装之前把卫士和杀毒关闭。
pip install xgboost’’’’’’.whl
https://www.lfd.uci.edu/~gohlke/pythonlibs/#xgboost
5.实战演示
数据是糖尿病的数据集,要做一个分类任务。
前八行是特征,后一个是类别。
加上一个树的再测试
Eval_set就是加入一个,相当于测试似的.
Model.fit( ; ; 10次: 建立模型的时候,如果loss值没有下降就停止下来;使用评估标准;测试集;可以看当前的效果怎么样的)
这里每加一颗树,看到这样的过程,在42次的时候已经饱和啦。
Plot_importance 可以看一下当前模型的特征,这些特征的重要程度是多少。
参数调节
- 第一个是学习率比较低,一般在0.1下面。
- 这些都是树的参数
- 正则化的参数。
参数:
N_estimators 建立多少个;
Min_child_weight 叶子节点的最小系数;
Gmma 值叶子节点损失前面的系数;
Subsample 随机样本选择0.8 ,1.0表示不想随机;
Closample_bytree 随机特征的选择;
Objective 什么样的loss函数;
Nthread
scale_pos_weight[默认1] 在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。
Seed 随机种子
使用随机率
使用GridSearchCV 这个函数去遍历下什么样的学习率的效果。
KFold交叉验证