2019-01-14修改部分文字内容,增强理解
2019-01-17修改章节4.提升树算法与负梯度拟合,章节5.梯度提升回归树算法,更改公式、加注释使其更加容易理解
增加章节2.GBDT优缺点,6.梯度提升分类树算法
以决策树为基学习器的集成学习算法具有预测精度高的优势,树的集成算法主要有随机森林和GBDT。随机森林具有很好的抗过拟合特性,且决策树个数对预测偏差的影响较小,调参较为容易。GBDT(或MART、GTB、GBRT)梯度提升决策树是一种迭代决策树算法(多用于回归,也可用于分类),GBDT由多颗决策树组成,所有决策树结论累加起来做最终分类预测,是集成学习boosting家族中的一员。GBDT中的树都是回归树(非分类树),GBDT用来做回归预测,调整后也可用作分类,GBDT可发现多种有区分性的特征及特征组合
基于树的集成学习算法在模型训练结束后,可输出模型使用特征变量的相对重要度,理解哪些因素对预测有关键影响,在生物信息学、神经系统科学领域很重要
优点:
1)可灵活处理各种类型数据,包括连续型和离散型
2)在相对少的调参时间下,预测准确率也比较高。相对SVM
3)使用一些健壮损失函数,对异常值的鲁棒性非常强。比如Huber损失函数和Quantile分位数损失函数
缺点:
1)由于弱学习器间存在依赖关系,难以并行训练数据。不过可通过自采样的SGBT来达到部分并行
回归树的整体流程近似于分类树,但回归树的每个节点都有一个预测值(该节点所有样本目标变量的平均值,节点趋同方差最小),分枝时穷举每个feature的每个阈值找最优分割点(衡量标准不再是熵值/信息增益/基尼系数等,是最小化平方误差),通过最小化平方误差能找到最可靠的分枝依据,分枝直到每个叶节点上目标变量均相同或达到预设终止条件(如叶节点个数)
最小二乘回归树生成算法:
输入:训练数据集D
输出:回归树f(x)
在训练数据集D的输入空间中,递归的将每个区域划分为两个子区域并决定每个子区域输出,构建二叉回归树
提升树是迭代多颗回归树进行共同决策,当采用误差损失函数时,每一颗回归树学习的是之前所有树的结论与残差,拟合得到一个当前的残差(真实值-预测值)回归树。提升树是整个迭代过程中生成回归树的累加
范例:训练一个提升树预测年龄,训练集是4个人,A,B,C,D年龄分别是14,16,24,26。样本中有购物金额、上网时长、经常到百度知道提问等特征。提升树的过程如下:
其中预测值是回归树所有值累加
损失函数表
Huber损失函数是均方差和绝对值损失函数(前两种)的折中产物,对于Huber损失函数和分位数损失函数,主要用于健壮回归,可减少异常点对损失函数影响
损失函数表中的绝对值损失函数和Huber损失函数,每一步的优化不容易(损失函数的定义较为复杂),故Friedman提出梯度提升算法,每次建立模型都是在之前建立模型损失函数的梯度下降方向,利用最速下降的近似方法(即损失函数(一般是拟合程度+正则项)的负梯度在当前模型中的值)作为回归问题提升树算法的残差近似值,来进一步拟合一个回归树
GBDT分类算法的样本输出不是连续值,而是离散类别。可用两个方法解决,一是指数损失函数,此时GBDT退化为Adaboost算法;二是对数似然损失函数,用类别的预测概率值与真实概率值的差来拟合损失,针对对数损失函数,有二元分类和多元分类的区别
推荐GBDT树深度6(而决策树或随机森林需要将树深度设为15或更高)
boosting主要关注偏差,因此能基于泛化能力较弱的基学习器构建预测能力很强的集成。bagging主要关注方差,因此bagging在不剪枝决策树、神经网络的基学习器上效用更为明显。就机器学习而言,泛化误差可分为两部分,偏差(bias,预测值与真实值间的偏差程度,反映模型本身拟合能力)和方差(同等规模训练集的变动导致学习能力变化,variance,反映数据扰动的影响)
在训练模型时,泛化误差的两个部分都要考虑:
bagging:由于会并行训练很多不同分类器,目的是降低方差(variance),因为采用相互独立的基分类器较多,故每个基分类器目标是如何降低偏差(bias),所以采用深度很深甚至不剪枝决策树
boosting:每一步都在上轮基础上更加拟合原数据,故可保证偏差(bias),所以对每个基分类器就在于如何选择variance更小的分类器,即更简单分类器(深度很浅决策树)
1.使用不同类型自变量数据时,不需要做特征归一化/标准化/最大最小化
2.可输出特征变量的相对重要程度,作为特征选择方法
3.模型可解释性好
4.对数据字段缺失不敏感
5.能自动做多组特征变量间的interaction,具有良好的非线性性
6.容易平衡运行时效率和精度,如使用boosted tree做的在线预测模型在机器资源紧张时可截断参与预测的决策树数量从而提高预测效率
Friedman在GBM论文中提出的方法:特征j的全局重要度是通过j在单颗树中的重要度取平均值来衡量:
#feature_importances_属性的计算方法
def feature_importances_(self):
total_sum = np.zeros((self.n_features,),dtype=np.float64)
for tree in self.estimators_:
total_sum += tree.feature_importances_
importances = total_sum / len(self.estimators_)
return importances
#self.estimators_是算法构建出的决策树数组,tree.feature_importances_ 是单棵树的特征重要度向量
1.GBDT分类
每一棵树拟合当前模型损失函数的负梯度,构建新的树加入当前模型中形成新模型,下一棵树拟合新模型损失函数的负梯度
from sklearn.ensemble import GradientBoostingClassifier
GradientBoostingClassifier(criterion='friedman_mse', init=None, learning_rate=0.1, loss='deviance', max_depth=3, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=100, presort='auto', random_state=None, subsample=1.0, verbose=0, warm_start=False)
gbc = GradientBoostingClassifier()
gbc.fit(x_train,y_train)
y_pred_5=gbc.predict(X_test_new)
#probability of 1
y_pred_6=gbc.predict_proba(X_test_new)[:,1]
y_pred_6=gbc.predict_proba(X_test_new)[:,0]
2.GBDT回归
每一棵树拟合当前整个模型的残差,构建新树加入到当前模型中形成新模型,下一棵树拟合新模型残差
from sklearn import ensemble
clf = ensemble.GradientBoostingRegressor()
gbdt_model = clf.fit(X_train, y_train)
y_upper = gbdt_model.predict(x_test)
1.GBDT构建新特征思想
特征决定模型性能上限。用已有特征训练GBDT模型,然后用GBDT模型学习到的树构建新特征,并将这些新特征加入到原特征中一起训练模型。新特征向量长度等于GBDT模型所有回归树叶节点个数和
上图是混合模型结构,已有输入特征通过增强决策树进行转换,每个单独决策树的输出被视为稀疏线性分类器的输入特征(增强决策树被证明是非常强大的特征转换)。上图有两棵树(左树有三个叶子节点,右树有两个)最终特征即五维向量。对于输入x,假设落在左树第一个节点,编码[1,0,0],落在右树第二个节点则编码[0,1],所以整体的编码为[1,0,0,0,1],这类编码作为特征,输入到线性分类模型(LR or FM)中进行分类
2.GBDT与LR融合方案
CTR预估是互联网计算广告、推荐、搜索业务中的核心环节,给定一个用户、一个匹配到的候选商品、一个环境,预测该用户购买商品的可能性有多大。其中用的最多模型是LR广义线性模型(映射后的函数值即CTR预估值),LR线性模型容易并行化,但学习能力有限,需要大量特征工程预先分析出有效特征、特征组合,从而间接增强LR模型的非线性学习能力
在CTR预估中若为每个AD ID(广告ID)建GBDT树,相当于挖掘区分每个广告的特征。而对曝光不充分的样本(长尾样本部分),无法单独建树。综合方案为使用GBDT对非ID和ID分别建一类树
非ID类树:不以细粒度的ID建树(此类树作为base树),即以所有ID一起构建GBDT。即便曝光少的广告、广告主仍可以通过此类树得到有区分性的特征、特征组合
ID类树:以细粒度的ID建一类树(每个ID单独构建GBDT)用于发现曝光充分训练样本充足ID对应有区分性的特征、特征组合。以如下图为例,当一条样本x进来后,遍历两类树到叶子节点,得到特征作为LR模型输入
GBDT映射得到的特征空间维度:GBDT树有多少叶节点(一个叶节点对应一种有区分性特征、特征组合)通过GBDT得到的特征空间就有多大。通过GBDT转换得到的特征空间较低,假如Base树、ID树各N颗,特征空间维度最高为(N+N*广告数+N*广告主数+N*广告类目数)*叶节点个数。其中广告数、广告主数、广告类目数都是有限的(只有曝光度高的),同时参考Kaggle竞赛中树的数目N最多30,叶节点个数小于10,估算通过GBDT映射得到的特征空间维度并不高
通过实验发现GBDT+LR在曝光充分广告上确实有效果,但整体效果需要权衡优化各类树的使用。同时也可考虑将GBDT生成特征与LR原有特征结合起来使用
gbc=GradientBoostingClassifier(init=None,learning_rate=0.1,loss='deviance',max_depth=3,max_features=None,max_leaf_nodes=None,min_samples_leaf=1,min_samples_split=2,min_weight_fraction_leaf=0.0,n_estimators=100,random_state=None,subsample=1.0,verbose=0,warm_start=False)
#learning_rate:学习速率
#loss:损失函数,ls最小二乘法,deviance
#max_depth:每棵树深度(通常4-6)
#n_estimators:回归树数量
#max_features:在找到最佳分隔节点前对所有特征取样(需要有充足特征>30个)