xgboost安装与原理

1、xgboost库的安装

先在网址https://www.lfd.uci.edu/~gohlke/pythonlibs/#xgboost 中下载whl文件,注意一定要下载跟自己当前安装Python版本一致的whl文件

比如我是Python3.6,64位操作系统,所以要安装xgboost-0.72-cp36-cp36m-win_amd64.whl。

然后将它放到conda文件夹下,用anaconda prompt切换到该路径下,使用pip install xgboost-0.72-cp36-cp36m-win_amd64.whl安装文件就可以了。

2、原理说明

说明:监督学习与非监督学习

监督学习是根据带标签的数据进行数据学习。所谓监督学习,就是两步,一是定出模型确定参数,二是根据训练数据找出最佳的参数值,所谓最佳,从应用角度看,就是最大程度地吸收了10万条训练数据中的知识。

如何寻找最佳参数?

确定目标函数,根据目标函数的值确定预测模型的好坏,但是存在的问题是:1)预测样本中有错误值;2)样本中可能含有极端值。比如说我们对60岁以上年纪的人的数据预测模型去预测6岁孩子的数据,结果自然是不具有参考性的。那么,如何使得参数最优呢?

那就是正则化。

所谓正则化就是对参数施加一定的控制,防止参数走向极端。以上面的例子来说,假如10万条数据中,得癌症的病人都是60岁以上老人,没得癌症的病人都是30岁以下年轻人,检查结果中有一项是骨质密度,通常,老人骨质密度低,年轻人骨质密度高。那么我们学习到的模型很可能是这样的,对骨质密度这项对应的参数θ_j设的非常大,其他的参数都非常小,简单讲,模型倾向于就用这一项检查结果去判断病人是否得癌症,因为这样会让目标函数最小。

常用的正则化就是L2正则,也就是所有参数的平方和。我们希望这个和尽可能小的同时,模型对训练数据有尽可能好的预测。

最后,我们将L2正则项加到最初的目标函数上,就得出了最终的目标函数:
obj = ∑_i(sigmoid(∑_j θ_j*x_ij) - y_i)^2 + ∑_j(θ_j^2)

能使这个函数值最小的那组参数就是我们要找的最佳参数。这个obj包含的两项分别称为损失函数和正则项
这里的正则项,本质上是用来控制模型的复杂度。

Xgboost就是一个监督模型,可以用于分类和回归,其结构就是一堆CART树,即将每棵树的预测值加到一起作为最终的预测值,可谓简单粗暴。
CART树与决策树的区别:CART可以用于分类和回归。https://blog.csdn.net/lzzdflg/article/details/78649925
CART是在给定输入随机变量X条件下输出随机变量Y的条件概率分布,与ID3和C4.5的决策树所不同的是,ID3和C4.5生成的决策树可以是多叉的,每个节点下的叉树由该节点特征的取值种类而定,比如特征年龄分为(青年,中年,老年),那么改节点下可分为3叉。而CART为假设决策树为二叉树,内部结点特征取值为”是”和”否”。左分支取值为”是”,有分支取值为”否”。这样的决策树等价于递归地二分每一个特征,将输入空间划分为有限个单元,并在这些单元上预测概率分布,也就是在输入给定的条件下输出条件概率分布。
通常目标函数包含两部分:训练误差和正则化
obj(θ)=L(θ)+Ω(θ)obj(θ)=L(θ)+Ω(θ)

其中L是损失函数,度量模型预测与真实值的误差。常用的损失函数:
预测问题的平方损失函数:
L(θ)=Σi(yiyi^)2L(θ)=Σi(yi−yi^)2

logistic 损失:
L(θ)=Σi[yiln(1+eyi^)+(1yi)ln(1+eyi^)]L(θ)=Σi[yiln(1+e−yi^)+(1−yi)ln(1+eyi^)]

ΩΩ是正则化项,度量模型的复杂度,避免过拟合,常用的正则化有L1 和L2正则化。

假设有两颗回归树,则两棵树融合后的预测结果如上图。
用公式表示为:

yi^=ΣKk=1fk(xi),fkFyi^=Σk=1Kfk(xi),fk∈F

其中, K 是树的个数, fk(xi)fk(xi)是第k棵树对于输入 xixi 输出的得分, fkfk是相应函数, FF 是相应函数空间。
则目标函数为:

obj(θ)=Σnil(yi,yi^)+ΣKk=1Ω(fk)obj(θ)=Σinl(yi,yi^)+Σk=1KΩ(fk)

函数ll描述yiyi , yi^yi^之间的距离。
常用的模型融合方法是Random Foreast和Boosting Tree,这两种方法构造树的方式不同。Tree Ensemble中,模型的参数是什么呢?其实就是指树的结构和叶子节点上面分数的预测。如何求参数?定义目标函数,通过优化目标函数进行求解。

xgboost进一步理解
传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。XGBoost对于确实值能预先学习一个默认的分裂方向
xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
我:
可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。

 

posted @ 2018-07-10 15:35  我不是小鲁班  阅读(2417)  评论(0编辑  收藏  举报