基于 XGBoost 对 Santander 银行用户购买行为进行预测

Santander Product Recommendation 是我去年做的一个数据挖掘 project,简单来说就是,给了一定量的数据,用合适的算法对这些数据进行建模分析,给出预测,从而挖掘出有价值的信息。这也是目前互联网金融公司重点关注的工作内容之一,由于最近在准备面试,回顾之前做过的项目,想重点总结一下这个项目。


项目简介

Santander 银行成立于西班牙,也称作西班牙国际银行,是西班牙最大银行、欧元区最大银行,在美国街头也是随处可见。关于这个产品推荐项目,Santander 官方发布在 Kaggle 上,给出了 2.29G 的数据集,有 48 个 column,其中包括用户个人资料和历史购买产品记录。我们要基于这些数据来预测新用户在未来可能的购买行为,从而帮助 Santander 构建一个高效的产品推荐系统。


数据初探

首先需要对数据集进行清洗,之前在专栏里也记录过相关的步骤:

  1. Kaggle 数据清洗挑战 Day 1 - 手把手教你五步处理缺失值
  2. Kaggle 数据清洗挑战 Day 2 - 数据缩放及标准化处理
  3. Kaggle 数据清洗挑战 Day 3 - 快速解析日期(date)数据
  4. Kaggle 数据清洗挑战 Day 4 - 字符编码(Character Encoding)处理
  5. Kaggle 数据清洗挑战 Day 5 - 处理不一致数据

详细内容不再赘述,只记录一下特殊的点,例如:有一个 column 叫做 renta,代表该用户的家庭总收入 (gross income of household),其中一些用户的 renta 数据是缺失的,那么就需要我们去填充,对于这个指标,用 renta 的中位数来填补就比用平均数合理得多,因为可以排除贫富差距过大带来的误差。

数据清洗完成后,就可以借助各种工具包进行分析了。

上面是 Santander 用户的年龄分布图,我们发现有两个波峰,大量用户分布在 20~30 和 40~50 这两个年龄段之间。

上图左侧列出的是各种产品的代号,我们发现同一个群体会倾向于选择相同产品,这也是我们做大多数数据挖掘工作的基础。


算法介绍

该项目是基于 XGBoost 算法的,XGBoost 是改进自 GBDT (Gradient Boosting Decision Tree) 的,下面简单介绍一下这个算法的原理。Gradient Boosting 是一种机器学习策略,具体来说就是我们先建立一些简单的小模型,也就是 model tree,这些决策树是非常浅的,所以它们给出的结果的准确度也比较低。但把它们结合起来就可以得到一个高级的决策树,这里体现了 boosting 的概念。在每一层的决策中,给出一个得分,最后得到一个总分,来给出最终判断结果。

下面这个图片简单呈现了决策树的工作原理:

决策树工作原理

相比于神经网络,决策树的工作过程更加清晰,我们可以看到它是如何得到最终的结果的。

关于 GBDT 算法的原理之后会再写一篇文章来详细介绍,XGBoost 相比于 GBDT 更加复杂,做了很多细节改进,包括损失函数、正则化、稀疏感知算法、并行化算法设计等等。XGBoost 近几年在各种竞赛中也频频被大神们选中,并取得很好的结果。

XGBoost 相比于 GBDT 的改进点有很多,其中重要的几个为(基于网上大神们的总结再做二次总结):

1. 传统 GBDT 以 CART 作为基分类器,XGBoost 还支持线性分类器,这个时候 XGBoost 相当于带 L1 和 L2 正则化项的逻辑斯蒂回归(Logistic Regression)或者线性回归(Linear Regression)。
2. 传统 GBDT 在优化时只用到一阶导数信息,XGBoost 则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。
3. XGBoost 在代价函数里加入了正则项,用于控制模型的复杂度。
4. Shrinkage(缩减),相当于学习速率(XGBoost 中的 eta)。XGBoost 在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把 eta 设置得小一点,然后迭代次数设置得大一点。
5. 列抽样(Column Subsampling)。XGBoost 借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是 XGBoost 异于传统 GBDT 的一个特性。
6. 可以处理稀疏、缺失数据。对于特征的值有缺失的样本,XGBoost 可以自动学习出它的分裂方向。
7. XGBoost 工具支持并行。特征列排序后以块的形式存储在内存中,在迭代中可以重复使用;虽然 boosting 算法迭代必须串行,但 XGBoost 的并行是基于特征列的。决策树的学习最耗时的一个步骤就是对特征值进行排序(因为要确定最佳分割点),XGBoost 在训练之前,预先对数据进行了排序,然后保存为块结构,后面的迭代中重复使用这个结构,大大减小计算量。这个块结构使并行成为可能,在进行节点分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以多线程进行。

XGBoost 基于 block 结构的存储形式,实现了并行计算,尤其对于这个包含 48 个 column 的数据集,大大提高了速度。


特征工程

所谓机器学习,就是让机器对大量的数据进行学习分析,然后给出有用的结论和预测结果。而这个学习过程中很重要的一个部分就是特征工程,即把原始数据转变为模型的训练数据的过程,以获取更好的训练数据特征。一般来说,特征工程包括特征构建、特征生成、特征选择三个部分。

特征构建是指从原始数据中,人工找出一些对后续数据挖掘有意义的特征,需要花时间去观察原始数据,对实战经验的要求较高。属性分割和结合是特征构建的常用方法,可以将一个属性分割成多个特征,也可以组合几个不同的属性成新的特征。

特征生成和特征构建有一些相似,但也存在区别。比如通过主成分分析对原始数据进行降维,那么降维后,每个主成分就代表一个新的特征。

通俗来讲,特征构建和特征生成都是想办法来生成新的特征,以用来让机器学习。

由于该项目中数据集的 column 都很简单,没有进行新的特征构建和生成,只用到了特征选择,提取了一些显著性比较高的特征,去除掉对结果影响较小的特征。

我们看到选取的特征有两种,一种是 numeric,另一种是 categrical,具体项目中有许多 column 的值是非数字的,这就需要我们使用工具来对其进行转化,关于这个步骤我在以前的文章中也有写过 —— 《数据预处理之将类别数据数字化的方法 —— LabelEncoder VS OneHotEncoder》。

全部准备就绪后,就要使用 cross validation 进行调参啦。关于 XGBoost 中的参数介绍,可以查看官方文档

我用到的 parameter 有:

num_round = 500
early_stop = 10
xgb_params = {
    'booster': 'gbtree',
    'max_depth': 2, 
    'learning_rate': 0.03,
    'nthread': 4,
    'objective': 'multi:softprob',
    'num_class': 15,
    'silent': 1,
    'eval_metric': 'mlogloss',
    'seed': 500,
}

booster:基学习器类型,有两种选择,分别是树模型(gbtree)和线性模型(linear models),此处选择的是树模型;

max_depth:树的最大深度,控制树的复杂度,可以用来避免过拟合,max_depth 越大,模型能学到的样本也越具体;

learning_rate:学习速率;

nthread:控制并发执行的个数,即在几个核上运行,如果不设置,即默认开启计算机全部的核;

objective:定义需要被最小化的损失函数,这里选择的是 multi:softprob,设置 XGBoost 进行多类别分类,返回的是数据属于每个类别的概率,然后需要多设置一个 num_class;

num_class:即上述多类别分类中的类别数目;

eval_metric:设置评估函数,这里选择的是 mlogloss,即 Multiclass logloss;

seed:随机数的种子,用于调参。


提交预测

做完 cross validation 得到合适的参数后,就可以进行结果预测了。根据预测的概率大小,提交每个用户未来可能购买的产品,按概率进行排序,可以设置循环的次数决定输出的产品数目。最后的预测结果保存在 csv 文件中,如下:

欢迎关注我的知乎专栏【数据池塘】,专注于分享机器学习、数据挖掘相关内容:https://zhuanlan.zhihu.com/datapool

 

⬇️ 扫描下方二维码关注公众号【数据池塘】 ⬇️

回复【算法】,获取最全面的机器学习算法网络图:

  • 1
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风控大鱼

如果帮到了您,请我喝杯咖啡吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值