GBDT
模型的用户购买商品的预测 上述两篇博文讨论了题目内容并对题目进行了简单的剖析,包括绘制了用户每日(小时)的不同操作数的柱状图和大概率基于某个时间T
内用户对商品加购后并购买商品的预测并绘制柱状图。并对该数据集构建具有100
个特征的特征工程,确保数据特征的充分性。这篇博文将从机器学习模型GBDT
的角度出发,使用GBDT
模型对用户在12
月19
日是否购买商品进行预测。
GBDT
模型简介 GBDT
(梯度提升决策树)是一种基于Gradient Boosting
的策略训练出来的DT
模型。其核心思想是将提升过程建立在对“之前残差的负梯度表示”的回归拟合上,其结果是一组回归分类树组合(CART Tree Ensemble
): T 1 , ⋯ , T K T_1,\cdots,T_K T1,⋯,TK。其中 T j T_j Tj学习的是之前 j − 1 j-1 j−1 棵树预测结果的残差。通过建立每棵新的树不断的迭代过程,实现降低偏差的目的。
这种思想就好比准备考试前的复习,做完练习题之后,把做错的题目挑选出来,再做一次,然后把再做错的题目再一次地挑出来继续做,经过反复训练,就会在最终的考试中取得在自己水平下的最好成绩。
GBDT
每棵树生成的过程是一棵标准的回归树生成的过程,因此回归树中每个结点的分裂是一个自然选择的过程,而多层结点的结构则对特征进行了有效的自动组合,会比较高效的解决了特征选择和特征组合的问题。
这里我们采用sklearn.ensemble.GradientBoostingClassifier
来实现GBDT
分类器。
GBDT
模型的数据预处理经过特征构建之后,在对特征数据样本套用模型进行分类预测之前,还需要根据具体所采用的模型对数据进行二次预处理,下面讨论其中重要的几点:
经过特征构建所得的数据集正负样本({购买商品,未购买商品}
)比例约为 1:1200
,数据严重失衡,易导致模型训练失效。在这里,我们可通过 下采样 和 基于f1_score
的评价标准 来应对此问题。
若考虑对训练集中的负样本进行下采样。为避免随机采样的特征空间覆盖性不足,先对负样本进行k-means
聚类,然后在每个聚类上采用subsample
来获得全面的负样本采样,最后与正样本组成较为平衡的训练集。
在所构建的特征中,一些特征存在缺失值(如xx_diff_hours
),如果对于LR
模型的训练,采用移除缺失值特征的数据集;但对于GBDT
则将训练集的缺失值赋值为-1
的方式。
在进行k-means
和LR
时,需要对不同度量尺度的特征进行归一化处理,这里我们采用sklearn.preprocessing.StandardScaler()
实现。
GBDT
模型的调参过程 GBDT
在训练的过程中需要进行大量的参数调节工作,以期获得适合于当前数据任务的模型。在模型的训练过程中,参数调节(parameter tuning
)十分重要,一般可将集成学习模型的参数分为两大类:过程参数 和 基学习器参数。一般先调试过程参数(如GBDT
的基学习器个数n_estimators
等),然后再调试基学习器参数(如决策树的最大深度max_depth
等)。
下面讨论几个重要参数:
GBDT
类库boosting
框架参数: 对于GBDT
模型来说,其基学习器(决策树)采用entropy
、gini
等作为建树依据,对不同类别的划分具有强制作用。与LR
模型不同,这类的模型对于类别失衡不敏感。但是过量冗余的负样本会严重加大训练消耗,所以仍需要考虑在不影响模型训练的前提下对数据进行采样。
这里的learning_rate
和n_estimators
分别控制迭代的步长和最大迭代次数。所以,这两个参数应当一起调试,寻找最优的组合。
learning_rate
:如果设置太大模型就无法收敛,太小模型速度就会非常缓慢,一般情况会在[0.01,0.2]
之间变动。
learning_rate
:太小,容易欠拟合,n_estimators
太大,又容易过拟合。GBDT
设置大量基学习器是为了尽最大的努力降低偏差,所以 n_estimators
一般会设置得大一些,集成的方差就会越小,模型泛化能力越强,但规模越大导致计算开销越大,所以在保证泛化能力前提下取较合适的 n_estimators
值即可。
下图示为某次参数调节过程中验证集 f1_score
在不同learning_rate
的取值下随基学习数目 n_estimators
的变化曲线。过小的学习率导致拟合太慢;当迭代达到一定次数时,继续迭代对模型提升效果不大,据此可选择出一个合适的n_estimators
取值。
下图所示是固定学习率lr=0.05
、负正样本率为50
和树的最大深度为5
的前提下,数据的f1
值随着子树数量的变化函数曲线图。有图可见,在这种情况在子树个数在150
个左右,样本的f1
值趋于稳定,继续增大无助于模型性能的提升。
子采样比例,取值为(0,1]
,如果取值小于1
,则只有一部分样本会去做GBDT
的决策树拟合。选择小于1
的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]
之间如果是1.0
,即不使用子采样。
GBDT
类库boosting
框架参数 与AdaBoost
用于人脸检测的原理类似,GBDT
模型的每个基学习器是一个弱学习器,决策树的深度一般设置得比较小,以此来降低方差。之后在经过残差逼近迭代来降低偏差,从而形成强学习器。所以这里的 max_depth
参数值应设置得比较小。
下图示为某次参数调节过程中验证集f1_score
随max_depth
的变化曲线。
在GBDT
中,单个基学习器侧重于降低方差,其叶节点粒度应该比较粗,所以这两个参数应设置得较大,但同时要考虑到数据失衡的情况,所以又不能设置得过大。
下图示为某次参数调节过程中验证集 f1_score
随 min_samples_split
的变化曲线。
下图示为某次参数调节过程中验证集f1_score
随 min_samples_leaf
的变化曲线。
cut_off
控制着我们对结果的置信程度。下图示为某次参数调节过程中验证集 f1_score
随cut_off
的变化曲线,可以看出,当前参数设定下的训练器,取cut_off ~ [0.4,0.6]
比较合适,(p.s cut_off
分布较对称得出来的结果比较稳定)。
最后的预测结果生成了res_gbdt_k_means_subsample.csv
文件,其提交结果和排名如下图所示:
在采用集成学习模型GBDT
时,参数优化对模型效果的提升十分明显。总的来说,参数调节是为了找到最适合于当前数据分布下的模型,由于参数众多,要找到这样一个 全局最优 的参数组合在实践中往往做不到,一个合理的方法是采用贪心算法思想,先调整过程参数再调整基学习器参数,粗调与细调相结合,争取找到局部最优的参数组合,多次迭代此过程,使得局部最优的参数组合满足任务要求。但是最优参数的获取往往是一个NP
难问题,故而采用 启发式的贪婪搜索 是一个相对好的选择。
对于集成模型,我们将其参数分为 过程参数 和 基学习器参数 两种,根据其对模型性能影响大小的经验判断来依次对其进行优化,不断的迭代往复进行直到获得一个满足要求的参数组合(一般是 局部最优 )。注意在整个过程中对拟合程度的把握,防止欠拟合或者是过拟合,拟合程度可根据训练过程中的训练损失(Train loss
)、袋外估计(OOB
),验证过程中的f1
分数变化曲线等信息结合经验判断。
袋外估计(OOB
):误分个数占样本总数的比率作为GBDT
的OOB
误分率。
本文在构建特征工程后划分好的数据集中利用基于二分类的GBDT
模型并通过调节模型的参数使其不断的提升模型预测用户是否购买商品的精度,最后取得了一个相对不错的成绩。
下面是LR
的运行结果,成绩很低: