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

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

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

基于 XGBoost 对 Santander 银行用户购买行为进行预测相关推荐

  1. 基于XGBoost的用户流失预测

    基于XGBoost的用户流失预测 小P:小H,我怎么能知道哪些用户有可能会流失呢?我这里有一份数据,你帮忙看看哪些字段更有助于寻找流失用户 小H:我只需要告诉你哪些特征更重要是吗? 小P:对对- 小H ...

  2. python数据分析可视化实例_Python数据分析及可视化实例之基于Kmean分析RFM进行用户关怀...

    系列文章总目录:Python数据分析及可视化实例目录 数据集下载 Python数据分析及可视化实例之全国各城市房价分析(含数据采集) Python数据分析及可视化实例之帝都房价预测 Python数据分 ...

  3. 基于Tensorflow的神经网络解决用户流失概率问题

    沙韬伟,苏宁易购高级算法工程师. 曾任职于Hewlett-Packard.滴滴出行. 数据学院特邀讲师. 主要研究方向包括风控.推荐和半监督学习.目前专注于基于深度学习及集成模型下的用户行为模式的识别 ...

  4. 银行用户画像建设步骤

    银行用户画像建设步骤: 依据银行的业务需求及数据状况,银行用户画像建设工作大致划分为以下步骤: 1.制定用户标签体系:根据业务需求制定用户标签体系框架,逐步丰富标签内容.初期可采用"框架完整 ...

  5. 基于多模型融合的用户画像分析统计方法研究

    摘  要 随着信息技术的快速发展和大数据技术的广泛应用,企业的营销和产品的设计,对精细化.精准化的要求越来越高.主流的电商平台.搜索引擎以及短视频平台均推出了基于用户画像的个性化推荐服务,这其中相当一 ...

  6. 电商平台用户购买行为真实度的检测方法及系统

    1引言 1.1课题背景及意义 现电商网站,商家为了吸引更多客户,有进行假买的现象.一般由假买手,在商家店铺自己垫资拍下商品.商家接单后,将商品快递给假买手.假买手将商品寄回给商家.商家返还假买手垫资购 ...

  7. 评分卡模型(二)基于评分卡模型的用户付费预测

    评分卡模型(二)基于评分卡模型的用户付费预测 小P:小H,这个评分卡是个好东西啊,那我这想要预测付费用户,能用它吗 小H:尽管用- (本想继续薅流失预测的,但想了想这样显得我的业务太单调了,所以就改成 ...

  8. 外文翻译:Study on Key Technology of Power Users Credit Rating Evaluation Ba(基于大数据的电力用户信用评级评估关键技术研究)

    (博文并非完整版,图片并未能加载,完整版参见 外文翻译:基于大数据的电力用户信用评级评估关键技术研究) ABSTRACT Electricity power supply company has en ...

  9. 基于jsp+servlet的银行管理系统(eclipse控制台和mysql数据库交互)。

    简易图书管理系统(主要是jsp+servlet的练习),基于jsp+servlet的图书管理系统 基于jsp+servlet的银行管理系统(jsp+servlet和mysql交互). 基于jsp+se ...

最新文章

  1. 大哥你怕是没听过:头上没毛,代码不牢!
  2. 有关Ajax实现的两种方法
  3. Chapter08 数据库编程
  4. pause容器作用_Kubernetes pod里一个特殊的容器:pause-amd64
  5. 天天生鲜项目——用户收货地址页
  6. DIY_实现光敏电阻传感器简单控制LED
  7. docker中DVWA的安装
  8. Fresher的烦恼
  9. 轻蜗牛直租平台-业务背景介绍
  10. JAVA 基本数据结构--数组、链表、ArrayList、Linkedlist、hashmap、hashtab
  11. 这四个原因会导致域名解析错误
  12. PID控制算法实践应用(一):PID算法的离散化
  13. tensorflow的early stopping模型保存方式
  14. PIARC:各国道路设计标准的最新进展(英) (附下载)
  15. 白帽子讲web安全PDF完整版
  16. 解决升级U910_64后不能看SOPCAST等无法正常运行某些32位程序的方法
  17. java的运行机制与jdk和jre的区别
  18. Access Control
  19. 无盘服务器镜像包缓存设多少,无盘服务器16g缓存设置
  20. Spring MVC JSP 表单标签教程

热门文章

  1. HttpClient4.5.2 使用cookie保持会话——连接池的实现结束篇(4)
  2. codis codis-ha主从切换后服务器标记为offline
  3. 我去过细节印象最深的酒店
  4. Nginx进行流量copy到测试环境
  5. 我的596升级到Windows Mobile 6了
  6. 定制控件消息处理函数
  7. C++中函数作为参数传递给其他函数
  8. pycharm + python36 + opencv + opencv_contrib库的安装
  9. 静态库.a和动态库.so的制作
  10. python处理excel的方法有哪些_Python操作Excel简单方法