唐宇迪《python数据分析与机器学习实战》学习笔记
24Xgboost集成算法
1.Xgboost的原理、推导及求解实例
xgboost可以与决策树结合起来,之前用决策树都是做分类任务,但其实可以做一些回归任务。
叶子节点可以结合权重项,正代表要玩游戏,负数代表不愿意玩。单棵树表达效果不太好,所以采用集成用多棵树(弱分类器)叠加评分值去评估。
每增加一颗树肯定是希望表达效果变好,所以可看成提升的算法。下列最开始0树预测值为0,接着加一颗树结果表达如下,每次加树前面模型保持不变,以前者为基础重新形成一棵树。
之前讲的决策树有惩罚项限制叶子节点个数避免过拟合,这里也要限制,惩罚项如下,树的个数(T)越多惩罚力度越大前面还有个惩罚力度®,后面加w参数的L2惩罚。
下图第一个式:所有样本预测与真实的差异总和+每个数的正则化惩罚项总和。
第二式:拆分成(原来的t-1棵树+新树),constant代表产生的常数项。
变换后发现了残差,假设去预测1000,1号树结果950差50,那么2号树就去预测这个差(50),可能得到30,那么3号数就把两者看为一体980差20,接着去预测这20…,最终结果就是所有树结果累加。 反复加树优化,其实就是让这个残差值尽可能小。
算法求解 :用提取出的目标函数用泰勒展开近似变化,gi表示一阶导,hi表示二阶导。x表示前面所有建立的模型,在构造新模型时相当于固定值不会变相当于一个常数值了,干脆跟后面的constant结合了。
继续做一些变换化简,遍历对象由样本(i~n)的转换为叶子节点(j-T)。遍历样本=遍历叶子节点,但是后者更加方便。
用G表示所有样本一阶导(g)的累加和,用H表示二阶导(h)的累加和。
对于目标函数想让值最小,就要对其求偏导,并让偏导=0,求出w再代回原式。(G、H在你指定好损失函数后还是很好求的)
有了目标函数后,计算方式如下例:
之前决策树的衡量标准是熵值或基尼系数,这里则用我们推导出的目标函数去衡量,切分时对比一下切割前后的目标函数值变化再决定是否切。
Xgboost的安装 :这里我直接在cmd里面用pip安装的,国外下载太慢所以还加了一个镜像网站
pip install xgboost -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
2.Xgboost案例实战
这里使用的数据为印度的糖尿病人数据集进行分类,原始数据如下。
开始训练模型并预测,计算精度值。
#导入要用的模块
import xgboost
from numpy import loadtxt
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
#导入数据
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
# 分割出x、y
X = dataset[:,0:8]
Y = dataset[:,8]
#将x、y分割为训练集、测试集
seed = 7
test_size = 0.33 #训练集占