1. 什么是Treelink
Treelink是阿里集团内部的叫法,其学术上的名称是GBDT(Gradient Boosting Decision Tree,梯度提升决策树)。GBDT是“模型组合+决策树”相关算法的两个基本形式中的一个,另外一个是随机森林(Random Forest),相较于GBDT要简单一些。
1.1 决策树
应用最广的分类算法之一,模型学习的结果是一棵决策树,这棵决策树可以被表示成多个if-else的规则。决策树实际上是将空间用超平面进行划分的一种方法,每次分割的时候,都将当前的空间一分为二,比如说下面的决策树:
这样使得每一个叶子节点都是在空间中的一个不相交的区域。学习得到如上这棵决策树之后,当输入一个待分类的样本实例进行决策的时候,我们就可以根据这个样本的两个特征(x, y)的取值来把这个样本划分到某一个叶子节点,得到分类结果了,这就是决策树模型的分类过程,决策树的学习算法有ID3算法和C4.5算法等。
1.2 Boosting方法
Boosting是关于模型组合的一种思想(另一种重要的思想是Bagging)。Boosting算法总是一个迭代的过程,每一次新的训练都是为了改进上一次的结果。原始Boosting算法是在算法开始的时候,为每一个样本赋上一个权重值,初始的时候,大家都是一样重要的。在每一步训练中得到的模型,会使得数据点的估计有对有错,因此,在每一步结束后,增加分错的点的权重,减少分对的点的权重,这样使得某些点如果老是被分错,那么就会被“严重关注”,也就是被赋上一个很高的权重。那么,在进行了M次迭代之后,将会得到M个简单的分类器(basic learner),然后我们将它们组合起来(比如说可以对它们进行加权、或者让它们进行投票等),得到一个最终的模型。Boosting过程如图所示:
图中绿色的线表示目前取得的模型(由前m次得到的模型组合而成),虚线表示当前这次basic learner。每次分类的时候,模型会更关注分错的数据。图中红色和蓝色的点代表数据,点越大表示权重越高,当m=150的时候,获取的模型已经几乎能够将红色和蓝色的点区分开了。Boosting也可以用下面的公式来表示:
式中YM(X)为学习得到的最终模型。总之,Boosting算法的最大特点就是:“知错就改”!
1.3 Gradient Boosting
Gradient Boosting是一种Boosting的方法,其与传统的Boosting的区别是,每一次的计算是为了减少上一次的残差(residual),而为了消除残差,可以在残差减少的梯度(Gradient)方向上建立一个新的模型。所以说,在Gradient Boosting中,每个新的模型的建立是为了使得之前模型的残差往梯度方向减少,与传统Boosting对正确、错误样本进行加权有着很大的区别。
1.4 Treelink模型
Treelink不像决策树模型那样仅由一棵决策树构成,而是由多棵决策树构成,通常都是上百棵树,而且每棵树规模都较小(即树的深度会比较浅)。模型预测的时候,对于输入的一个样本实例,首先会赋予一个初值,然后会遍历每一棵决策树,每棵树都会对预测值进行调整修正,最后得到预测的结果:
F0是设置的初值, Ti是一棵一棵的决策树。对于不同的问题(回归问题或者分类问题)以及选择不同的损失函数,初值的设定是不同的。比如回归问题并且选择高斯损失函数,那么这个初值就是训练样本的目标的均值。
Treelink自然包含了boosting的思想:将一系列弱分类器组合起来,构成一个强分类器。它不要求每棵树学到太多的东西,每颗树都学一点点知识,然后将这些学到的知识累加起来构成一个强大的模型。
Treelink模型的学习过程,就是多颗决策树的构建过程。在树的构建过程中,最重要的就是寻找分裂点(某个特征的某个取值)。在Treelink算法我们通过损失函数的减小程度用来衡量特征分裂点的样本区分能力,Loss减小得越多,分裂点就越好。即以某个分裂点划分,把样本分成两部分,使得分裂后样本的损失函数值减小的最多。
Treelink训练:
1.估算初值;
2.按如下方式创建M棵树:
–更新全部样本估计值;
–随机选取一个样本子集;
–按如下方式创建J个叶子;
•对当前所有叶子
–更新估计值、计算梯度、最优划分点、最优增长量以及增益(损失函数减少量);
–选择增益最大的叶子及其划分点,进行分裂,同时分裂样本子集;
–将增长量刷新到叶子;
Treelink预测:
将目标估计值赋估值;
•对M棵树:
–根据输入数据的特征(x),按照决策树的路径查找到叶子节点;
–用叶子节点上的增长量更新目标估计值;
•输出结果;
例如,GBDT得到了三棵决策树,一个样本点在预测的时候,也会掉入3个叶子节点上,其增益分别为(假设为3分类的问题):
(0.5, 0.8, 0.1), (0.2, 0.6, 0.3), (0.4, 0.3, 0.3),
那么这样最终得到的分类为第二个,因为选择分类2的决策树是最多的。
2. Treelink二元分类性能测试
2.1 实验目的及数据准备
利用成交情况历史数据,通过treelink预测某个卖家的成交情况,即是否有成交,转化为二元分类问题。
数据格式: target feature1 feature2 … feature13,其中target只有两个值:0代表无成交,1代表有成交,0代表没有成交,每个sample由13个feature进行描述。在样本数据中,正例(target=1)样本数为23285,负例样本数为20430,比率为1.14:1。所有样本数据被分到训练集和测试集两个集合:训练集包括33715个样本,测试集包括10000个样本。
2.2 模型参数设置
测试环境利用MLLib 1.2.0工具包中的Treelink模块进行,主要工作是在训练过程中根据损失函数的下降趋势和预测准确率对treelink的各项参数进行调节,最终找到一个最优的参数组合。涉及到的配置文件包括:
mllib.conf:
[data]
filter=0
sparse=0
weighted=0
[model]
cross_validation=0
evaluation_type=3
variable_importance_analysis=1
cfile_name=
model_name=treelink
log_file=日志文件保存路径
model_file=模型文件保存路径
param_file=treelink配置文件保存路径
data_file=样本数据文件保存路径
result_file=分类结果文件保存路径
treelink.conf:
[treelink]
tree_count=500
max_leaf_count=4
max_tree_depth=4
loss_type=logistic
shrinkage=0.15
sample_rate=0.66
variable_sample_rate=0.8
split_balance=0
min_leaf_sample_count=5
discrete_separator_type=leave_one_out
fast_train=0
tree_count:决策树的个数,越大学习越充分,但太大也会造成过度拟合,而且也消耗训练和预测的时间。可以先选择比较大的树个数,然后观察训练过程中的损失减少趋势,损失减少比较平缓时,树个数就比较合适了。tree_count和shrinkage也有关系,shrinkage越大,学习越快,需要的树越少。
shrinkage:步长,代表学习的速度,越小表示学习越保守(慢),越大则表示学习越冒进(快)。通常可以把Shrinkage设小一点,把树的个数设大一点。
sample_rate:样本采样率,为了构造具有不同倾向性的模型,需要使用样本的子集来进行训练,过多的样本会造成更多的过拟合和局部极小问题。这个采样的比例一般选择50%-70%比较合适。
variable_sample_rate:特征采样率,是指从样本的所有特征中选取部分的特征来学习,而不使用全部特征。当发现训练出来的模型,某一两个特征非常强势,重要性很大,而造成其他特征基本学不到的时候,可以考虑设置一下把这个参数设置成<1的数。
loss_type:设置该参数的时候要格外注意,务必要使优化目标与损失函数保持一致,否则损失函数在训练过程中不但不减小,反而会增大。
其他参数的详细含义可以参见mlllib user manual。
2.3 实验结果
本次试验利用Lift,F_1和AUC三个指标对treelink模型的分类性能进行评估。
Lift:该指标衡量的是与不利用模型相比,模型的“预测”能力变好了多少。模型的lift(提升指数)越大,模型的运行效果更好。Lift=1表示模型没有任何提升。
F_1:是覆盖率与准确率的综合指标,随着precision和coverage的同时增大而增大,公式如下:
AUC:Area Under ROC Curve,其值等于ROC曲线下的面积,介于0.5到1之间。较大的AUC代表了较好的performance。关于AUC的计算有多种方法,本实验中采用的方法如下:
设正例样本数为M,负例样本数为N,样本数n=M+N。首先对score从大到小排序,然后令最大score对应的sample的rank为n,第二大score对应的sample的rank为n-1,以此类推。然后把所有的正例样本的rank值相加,再减去正例样本的score为最小的那M个值的情况。得到的就是所有样本中有多少正例样本的score大于负例样本的score,最后除以M×N。需要特别注意的地方是,在存在score相等的情况时,需要赋予相同的rank值,具体操作是把所有这些score相同的样本的rank取平均。
注:Lift,F_1,ROC曲线可以通过R语言环境机器学习包求得,AUC的计算没有找到常用工具,因此利用python编程实现。
模型评估结果:
AUC=0.9999,Lift=1.9994,F_1=0.9999
注:以上评估结果为经过长时间参数调整后treelink的分类性能,结果过于理想,目前尚不能判断是否出现过拟合,需在利用其它数据经过多次实验后方能验证。