GBDT
创建日期 星期五 05 四月 2019
加法模型
加法模型 就是求和,也没啥特殊的;
这里的求和举个简单的例子就是带权累加求和;
其中是权值,
是参数
前项分布算法
我感觉这个就是一个贪心求解的过程,只不过求解的值的和变成了损失函数的值;
算法思路就是从前往后异步只学习一个奇函数及其系数,每次取最小值,逐步逼近优化目标函数;
负梯度拟合
向负梯度方向拟合,在GBDT中使用的地方就是,当你在一个位置需要计算损失函数的时候,用上述的前项分布算法,你其实可以吧每个损失函数的值来看做是
一个变量,而一个变量减小最快的地方是负梯度,因为梯度是增加最快的地方?
这样你就可以拟合出所有最小损失函数的和;
正则化
为了避免过拟合,我们要规定步长,就是类似要吧这个值分成多少个弱学习器来进行迭代学习,比如15 这个值你要学习多少次才结束;
损失函数
常见的
均方差损失(MSE)
计算均方差;
平均绝对误差
计算误差的绝对值之和;
交叉熵损失
基于交叉熵的损失
指数损失
exp(-Yf(X))
回归树(Regression Decision Tree)
回归树总体流程类似于分类树,区别在于,回归树的每一个节点都会得一个预测值,以年龄为例,该预测值等于属于这个节点的所有人年龄的平均值。分枝时穷举每一个feature的每个阈值找最好的分割点,但衡量最好的标准不再是最大熵,而是最小化平方误差。也就是被预测出错的人数越多,错的越离谱,平方误差就越大,通过最小化平方误差能够找到最可靠的分枝依据。分枝直到每个叶子节点上人的年龄都唯一或者达到预设的终止条件(如叶子个数上限),若最终叶子节点上人的年龄不唯一,则以该节点上所有人的平均年龄做为该叶子节点的预测年龄
GBDT分类算法
GBDT的分类算法从思想上和GBDT的回归算法没有区别,但是由于样本输出不是连续的值,而是离散的类别,导致我们无法直接从输出类别去拟合类别输出的误差。
为了解决这个问题,主要有两个方法,一个是用指数损失函数,此时GBDT退化为Adaboost算法。另一种方法是用类似于逻辑回归的对数似然损失函数的方法。也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失。本文仅讨论用对数似然损失函数的GBDT分类。而对于对数似然损失函数,我们又有二元分类和多元分类的区别。
对于二元GBDT,如果用类似于逻辑回归的对数似然损失函数,则损失函数为:
其中y∈{−1,+1}。则此时的负梯度误差为:
对于生成的决策树,我们各个叶子节点的最佳负梯度拟合值为:
由于上式比较难优化,我们一般使用近似值代替
除了负梯度计算和叶子节点的最佳负梯度拟合的线性搜索,二元GBDT分类和GBDT回归算法过程相同。
优缺点
优点:
预测精度高
适合低维数据
能处理非线性数据
可以灵活处理各种类型的数据,包括连续值和离散值。
在相对少的调参时间情况下,预测的准备率也可以比较高。这个是相对SVM来说的。
使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。
缺点:
由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行。
如果数据维度较高时会加大算法的计算复杂度
sklearn参数
loss:损失函数度量,有对数似然损失deviance和指数损失函数exponential两种,默认是deviance,即对数似然损失,如果使用指数损失函数,则相当于Adaboost模型。
criterion: 样本集的切分策略,决策树中也有这个参数,但是两个参数值不一样,这里的参数值主要有friedman_mse、mse和mae3个,分别对应friedman最小平方误差、最小平方误差和平均绝对值误差,friedman最小平方误差是最小平方误差的近似。
subsample:采样比例,这里的采样和bagging的采样不是一个概念,这里的采样是指选取多少比例的数据集利用决策树基模型去boosting,默认是1.0,即在全量数据集上利用决策树去boosting。
warm_start:“暖启动”,默认值是False,即关闭状态,如果打开则表示,使用先前调试好的模型,在该模型的基础上继续boosting,如果关闭,则表示在样本集上从新训练一个新的基模型,且在该模型的基础上进行boosting。
属性/对象
feature_importance_:特征重要性。
oob_improvement_:每一次迭代对应的loss提升量。oob_improvement_[0]表示第一次提升对应的loss提升量。
train_score_:表示在样本集上每次迭代以后的对应的损失函数值。
loss_:损失函数。
estimators_:基分类器个数。
方法
apply(X):将训练好的模型应用在数据集X上,并返回数据集X对应的叶指数。
decision_function(X):返回决策函数值(比如svm中的决策距离)
fit(X,Y):在数据集(X,Y)上训练模型。
get_parms():获取模型参数
predict(X):预测数据集X的结果。
predict_log_proba(X):预测数据集X的对数概率。
predict_proba(X):预测数据集X的概率值。
score(X,Y):输出数据集(X,Y)在模型上的准确率。
staged_decision_function(X):返回每个基分类器的决策函数值
staged_predict(X):返回每个基分类器的预测数据集X的结果。
staged_predict_proba(X):返回每个基分类器的预测数据集X的概率结果。