推荐系统总结(三)

基于GBDT模型的用户购买商品的预测

  上述两篇博文讨论了题目内容并对题目进行了简单的剖析,包括绘制了用户每日(小时)的不同操作数的柱状图和大概率基于某个时间T内用户对商品加购后并购买商品的预测并绘制柱状图。并对该数据集构建具有100个特征的特征工程,确保数据特征的充分性。这篇博文将从机器学习模型GBDT的角度出发,使用GBDT模型对用户在1219日是否购买商品进行预测。

1、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 j1 棵树预测结果的残差。通过建立每棵新的树不断的迭代过程,实现降低偏差的目的。

  这种思想就好比准备考试前的复习,做完练习题之后,把做错的题目挑选出来,再做一次,然后把再做错的题目再一次地挑出来继续做,经过反复训练,就会在最终的考试中取得在自己水平下的最好成绩。

  GBDT每棵树生成的过程是一棵标准的回归树生成的过程,因此回归树中每个结点的分裂是一个自然选择的过程,而多层结点的结构则对特征进行了有效的自动组合,会比较高效的解决了特征选择和特征组合的问题。

  这里我们采用sklearn.ensemble.GradientBoostingClassifier来实现GBDT分类器。

2、面向GBDT模型的数据预处理

  经过特征构建之后,在对特征数据样本套用模型进行分类预测之前,还需要根据具体所采用的模型对数据进行二次预处理,下面讨论其中重要的几点:

2.1 正负样本失衡问题

  经过特征构建所得的数据集正负样本({购买商品,未购买商品})比例约为 1:1200,数据严重失衡,易导致模型训练失效。在这里,我们可通过 下采样基于f1_score的评价标准 来应对此问题。

  若考虑对训练集中的负样本进行下采样。为避免随机采样的特征空间覆盖性不足,先对负样本进行k-means聚类,然后在每个聚类上采用subsample来获得全面的负样本采样,最后与正样本组成较为平衡的训练集。

2.2 缺失值问题

  在所构建的特征中,一些特征存在缺失值(如xx_diff_hours),如果对于LR模型的训练,采用移除缺失值特征的数据集;但对于GBDT则将训练集的缺失值赋值为-1的方式。

2.3 归一化问题

  在进行k-meansLR时,需要对不同度量尺度的特征进行归一化处理,这里我们采用sklearn.preprocessing.StandardScaler()实现。

3、GBDT模型的调参过程

  GBDT在训练的过程中需要进行大量的参数调节工作,以期获得适合于当前数据任务的模型。在模型的训练过程中,参数调节parameter tuning)十分重要,一般可将集成学习模型的参数分为两大类:过程参数基学习器参数。一般先调试过程参数(如GBDT的基学习器个数n_estimators等),然后再调试基学习器参数(如决策树的最大深度max_depth等)。

  下面讨论几个重要参数:

3.1 GBDT类库boosting框架参数:

3.1.1 N/P_ratio(负正样本比例)

  对于GBDT模型来说,其基学习器(决策树)采用entropygini等作为建树依据,对不同类别的划分具有强制作用。与LR模型不同,这类的模型对于类别失衡不敏感。但是过量冗余的负样本会严重加大训练消耗,所以仍需要考虑在不影响模型训练的前提下对数据进行采样。

  
推荐系统总结(三)_第1张图片

3.1.2 learning_rate(学习率)和 n_estimators(基学习器数目)

  这里的learning_raten_estimators 分别控制迭代的步长和最大迭代次数。所以,这两个参数应当一起调试,寻找最优的组合。

  learning_rate:如果设置太大模型就无法收敛,太小模型速度就会非常缓慢,一般情况会在[0.01,0.2]之间变动。

  learning_rate:太小,容易欠拟合,n_estimators太大,又容易过拟合。GBDT设置大量基学习器是为了尽最大的努力降低偏差,所以 n_estimators 一般会设置得大一些,集成的方差就会越小,模型泛化能力越强,但规模越大导致计算开销越大,所以在保证泛化能力前提下取较合适的 n_estimators 值即可。

  下图示为某次参数调节过程中验证集 f1_score 在不同learning_rate的取值下随基学习数目 n_estimators 的变化曲线。过小的学习率导致拟合太慢;当迭代达到一定次数时,继续迭代对模型提升效果不大,据此可选择出一个合适的n_estimators取值。

推荐系统总结(三)_第2张图片
  下图所示是固定学习率lr=0.05、负正样本率为50和树的最大深度为5的前提下,数据的f1值随着子树数量的变化函数曲线图。有图可见,在这种情况在子树个数在150个左右,样本的f1值趋于稳定,继续增大无助于模型性能的提升。
推荐系统总结(三)_第3张图片

3.1.3 subsample(子采样)

  子采样比例,取值为(0,1],如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间如果是1.0,即不使用子采样。

3.2 GBDT类库boosting框架参数

3.2.1 max_depth(决策树的深度)

  与AdaBoost用于人脸检测的原理类似,GBDT模型的每个基学习器是一个弱学习器,决策树的深度一般设置得比较小,以此来降低方差。之后在经过残差逼近迭代来降低偏差,从而形成强学习器。所以这里的 max_depth 参数值应设置得比较小。

  下图示为某次参数调节过程中验证集f1_scoremax_depth的变化曲线。

推荐系统总结(三)_第4张图片

3.2.2 min_samples_split(内部节点再划分所需最小样本数)和 min_samples_leaf (叶最小样本数,叶节点小于样本数,则会被减枝)

  在GBDT中,单个基学习器侧重于降低方差,其叶节点粒度应该比较粗,所以这两个参数应设置得较大,但同时要考虑到数据失衡的情况,所以又不能设置得过大。

  下图示为某次参数调节过程中验证集 f1_scoremin_samples_split 的变化曲线。
推荐系统总结(三)_第5张图片
  下图示为某次参数调节过程中验证集f1_scoremin_samples_leaf的变化曲线。

推荐系统总结(三)_第6张图片

3.2.3 cut_off(预测概率阈值)

  cut_off 控制着我们对结果的置信程度。下图示为某次参数调节过程中验证集 f1_scorecut_off的变化曲线,可以看出,当前参数设定下的训练器,取cut_off ~ [0.4,0.6]比较合适,(p.s cut_off分布较对称得出来的结果比较稳定)。
推荐系统总结(三)_第7张图片

4、GBDT模型预测结果

  最后的预测结果生成了res_gbdt_k_means_subsample.csv文件,其提交结果和排名如下图所示:
推荐系统总结(三)_第8张图片

5、调节参数总结

  在采用集成学习模型GBDT时,参数优化对模型效果的提升十分明显。总的来说,参数调节是为了找到最适合于当前数据分布下的模型,由于参数众多,要找到这样一个 全局最优 的参数组合在实践中往往做不到,一个合理的方法是采用贪心算法思想,先调整过程参数再调整基学习器参数,粗调与细调相结合,争取找到局部最优的参数组合,多次迭代此过程,使得局部最优的参数组合满足任务要求。但是最优参数的获取往往是一个NP难问题,故而采用 启发式的贪婪搜索 是一个相对好的选择。

  对于集成模型,我们将其参数分为 过程参数基学习器参数 两种,根据其对模型性能影响大小的经验判断来依次对其进行优化,不断的迭代往复进行直到获得一个满足要求的参数组合(一般是 局部最优 )。注意在整个过程中对拟合程度的把握,防止欠拟合或者是过拟合,拟合程度可根据训练过程中的训练损失(Train loss)、袋外估计(OOB),验证过程中的f1分数变化曲线等信息结合经验判断。

  袋外估计(OOB:误分个数占样本总数的比率作为GBDTOOB误分率。

推荐系统总结(三)_第9张图片

6、全文总结

  本文在构建特征工程后划分好的数据集中利用基于二分类的GBDT模型并通过调节模型的参数使其不断的提升模型预测用户是否购买商品的精度,最后取得了一个相对不错的成绩。

Appendix

  下面是LR的运行结果,成绩很低:

推荐系统总结(三)_第10张图片

推荐系统总结(三)_第11张图片

推荐系统总结(三)_第12张图片

推荐系统总结(三)_第13张图片

你可能感兴趣的:(推荐系统)