​1. 从“千人一面”到“千人千面”,银行推荐系统的智能迁徙

随着我国商业银行体系多元化格局逐步形成,客户的金融服务需求日趋精细化、专业化、个性化,针对不同客户实际的需求和特点,打造有针对性的精准推荐系统,成为摆在银行面前的重大课题。

当年,媒体业普遍挣扎于线上化转型,今日头条凭借着智能算法推荐技术,在巨头林立的资讯分发领域中异军突起。当下,为了提升营销的精准度,一些银行开始实践“今日头条模式”,构建一个高效的的产品推荐系统,更好地满足客户的个性化需求,实现获客和活客。

推荐系统的核心是推荐模型,对于银行来讲也是一个新事物,需要经历从0到1的全过程。今天,小麦特别给大家呈上完整的产品推荐模型的构建过程。

模型构建流程如下:

本案例使用Smartbi Mining产品完成。Smartbi Mining是一款用于预测性分析的产品,旨在为企业所做的决策提供预测性智能。无需编程技术,通过简便鼠标操作即可完成数据挖掘。

  1. 实施过程

数据探索

在实验中添加【数据源】节点,将客户基础信息数据profile表、历史产品持有信息log表、标签flag表读取进来,部分数据如图所示:

数据预处理

在工程实践中,我们得到的数据往往会存在有缺失值、重复值等,在使用之前需要进行数据预处理。数据预处理没有标准的流程,通常针对任务和数据集属性的不同而有所区别。数据预处理的常用流程为:去除唯一属性、处理缺失值、特征编码、数据标准化、正则化、特征选择、主成分分析等。

由于本案例存在3张不同的数据表,各表的数据情况及处理方式不同,因此对各表分开处理,处理完成后再合并成一张宽表。

Profile表

数据规范

导入数据后发现,由于数据记录方式问题,个别字段的取值规范不一,对数据处理存在干扰,因此先对数据进行规范统一。具体取值情况及处理方式如下:

• 年龄、帐龄

这2个字段为数值类型,由于数据记录方式不一致,导致数据读入后为字符串格式,因此使用【元数据编辑】节点,将年龄的数据类型由字符string转为整型integer;由于帐龄存在小数点,将帐龄的数据类型由字符string转为整型double。

• 客户类型

实际取值为1,2,3,4,P,null,由于记录标准不一致,导致数据读入后取值为1, 1.0, 2, 2.0, 3, 3.0, 4, 4.0, P, null的字符串形式。

使用【派生列】节点,【客户类型】字段只截取第一个字符即可。

数据异常处理

通过数据探索发现,年龄和地区代码字段存在异常情况,具体如下:

• 年龄

存在小于0或大于9000的异常情况,通过数据探索发现,异常情况存在一定的规律,因此根据发现的规律对异常值进行处理。

使用【派生列】节点,将年龄小于0的数值取反,将大于9000的数值减去9000,生成新的字段“年龄1”。

• 地区代码

实际取值为1-52,但存在小于0、大于8000甚至9000的取值,通过数据探索发现,异常情况存在一定的规律,因此根据发现的规律将异常值进行处理。

使用【派生列】节点,将地区代码小于0的数值除以10后取反,将大于9000的数值减去9000,将大于8000小于9000的数值根据公式100-(x-8000)/10调整,生成新的字段“地区代码1”。

数据异常情况处理完成后,由于部分字段虽然为数值型,但其含义并非存在数值含义,如地区代码,客户类型等字段,因此将这部分字段使用【元数据编辑】节点将其数据类型转为字符串string。

空值处理

一般来说,对空值的填充方法有多种,例如,用某个常数来填充或建立模型,根据数据的分布来填充一个更恰当的数值,例如根据其它变量对记录进行数据分箱,然后选择该记录所在分箱相应变量的均值或中位数,来填充缺失值。具体方法的选择根据业务及数据实际情况来确定。

特征工程

• 特征衍生

通过最近活跃日期与统计日期之间的月份差衍生出最近活跃标记,如果最近活跃日期为空,则将最近活跃标记设为-1,标记为不活跃,使用【派生列】节点完成衍生操作。

• 特征分段

由于后续需要对字符型字段进行编码,而当字段取值过多时会造成编码后特征空间变得庞大,因此将取值过多的字符型字段,如客户加入的渠道、客户所在地区、地区名称、地区代码,使用【派生列】节点进行分段。

• 特征删除

地址类型经统计发现取值全为1,因此通过【列选择】将该字段删除,并将上述处理过程中生成的不必要字段删除。

Log表

数据去重

统计发现log表存在196条重复值,使用【去除重复值】节点去重。

空值处理

数据探索发现log表中客户开办账户字段均存在大量空值,根据提供信息对客户开办账户字段使用【空值处理】节点,将所有空值填补为0。

注:log表产品是否开办,指统计日期当月是否办理,若该客户历史办理过该产品但当月未办理,则当月对应记录为0。

衍生变量

• Log记录数

统计每个客户的历史log记录数;使用【聚合】节点进行统计,并使用【JOIN】节点进行合并。

• 开办账户数

统计用户当月开办的账户数量;使用【派生列】节点进行衍生。

• 风险承担指数

根据对账户或业务的理解,评估客户的风险承担指数;使用【派生列】节点进行衍生。

Flag表

数据去重

统计发现flag表存在97条重复值,使用【去除重复值】节点去重。

衍生变量

Flag记录数及历史办理次数。

统计每个客户的历史flag记录数以及对信贷类产品的历史办理次数;使用【聚合】节点进行统计,并使用【JOIN】节点进行合并。

构建模型

本案例采用梯度提升决策树(Gradient Boosting Decision Tree, GBDT)模型。

DT是Decision Tree决策树,GB是Gradient Boosting,是一种机器学习策略,GBDT的含义就是用Gradient Boosting策略训练出来的DT模型。具体来说就是先建立一些简单的小模型,也就是决策树,这些决策树是非常浅的,所以它们给出的结果准确度也比较低。但把它们结合起来就可以得到一个高级的决策树,这里体现了boosting的概念。在每一层的决策中,给出一个得分,最后得到一个总分,由此得出最终判断结果。这种思想就像准备考试前的复习,先做一遍习题册,然后把做错的题目挑出来,再做一次,然后把做错的题目挑出来再做一次,经过反复多轮训练,取得最好成绩。

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

相比于神经网络,决策树的工作过程更加清晰,我们可以看到它是如何得到最终结果的。而GBDT通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。最终的总分类器是将每轮训练得到的弱分类器加权求和得到的(也就是加法模型)。

选择完算法后,就需要对算法进行调参。对于GBDT算法,常用于调整模型的参数有:

• 分裂特征的数量:对连续型(数值型)特征进行离散时的分箱数。该值越大,模型会计算出更多连续型特征分裂点且会找到更好的分裂点,但同时也会增加模型的计算量。

• 树的深度:树的最大深度。当模型达到该深度时停止分裂;可用于控制树的复杂度,避免过拟合;树的深度越大,模型能学到的样本也越具体,但同时也会增加模型的计算量且会导致过拟合。

• 最大迭代数:算法的最大迭代次数。达到最大迭代次数时则退出训练;该值越大,模型训练越充分,但会耗费更多时间。

• 学习率:收敛步长,决定了参数移动到最优值的速度快慢。如果学习率过大,很可能在算法迭代时错过最优值,如果学习率过小,即便算法迭代完成,可能也无法收敛到最优值。

• 子采样比例:对样本进行不放回采样的比例,取值范围为[0,1]。取值小于1时,代表不会使用全部样本去构建算法,这样做可减少模型方差,防止模型过拟合。

建模过程及本案例的参数如下:

本案例的评估结果如图所示,发现该模型的AUC取值为0.90056,说明该模型的效果是不错的。

生产预测

模型训练完成后,就可以进行结果预测了。通过【训练】节点将线下训练好的模型和生产需要的线上集数据连接起来就可以直接进行预测了。如下:

预测结果输出客户购买的概率probability,以及客户是否会购买的标签prediction。

另外,也可对输出的概率和标签进行统计查看分布。

  1. 客户管理数字化是银行发展的关键

当前,数字化以不可逆转的形势变革着商业社会,驱动着行业创新,不断创造出新的业务、产品和市场,并重新定义着客户管理的边界。

这需要银行更深层次地了解客户,懂得他们需要什么,清晰认识到客户所处的生命阶段、财富阶段,具体掌握客户的业务行为,由此科学地构建银行客户管理、运营和服务体系,利用好客户资源,为客户提供有针对性的产品服务,保障银行业务的良性发展和经营效益的持续提高。

©著作权归作者所有:来自51CTO博客作者mb5fc9ab16e1f65的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 成为大数据高手的活法-晚上复盘
  2. 带聚光灯的Excel数据查询,简单到没朋友
  3. TCP/IP之TCP报文简介
  4. spring boot 获得 http请求url中的参数
  5. 提高办公效率:Microsoft Excel 快速看数据
  6. JDBC【1】--初级增删改查
  7. 如何构建数字孪生城市治理的技术场景?ThingJS
  8. Python数据分析难吗?需要英语数学基础吗?
  9. 1.2 Ansible 基础概念

随机推荐

  1. golang 适合做web开发吗
  2. golang可以跨平台吗
  3. golang 是什么写的
  4. golang 开发效率高么
  5. golang 什么时候用锁
  6. golang如何设置时间
  7. golang主要开发什么?
  8. golang中什么是接口
  9. golang怎么导入包
  10. golang检查文件是否存在的方法