数据集:uci下载的某家银行电话营销与是否购买定期存储的数据。
模拟目标:知道客户数据,预测购买理财产品概率
我认为将电话营销的数据消除只保留基本属性可以模拟实际银行能够获取的数据。
电话营销数据代表一些对用户决定由影响但是获取难度较大的数据。比如说,买房、买车、小孩上学,这些数据银行不能立刻获得,或者获取成本较高。这里不使用这些数据参与预测。虽然预测准确度会降低,但是更符合实际情况。
然后定期存储是一种产品,可以当做一种理财,如果能对一种进行预测行进实现和验证,那么可以扩展到多种产品的预测
数据情况,见下表
Age | 年龄 |
Job | 工作 |
Marital | 婚姻情况 |
Education | 教育情况 |
Default | 违约情况 - no 无违约 yes 有违约 |
Balance | 账户余额 |
House | 是否买房子 - no 无房产 yes 有房子 |
Loan | 贷款 - no 无贷款 yes 有贷款 |
数据处理
数据清洗常规套路(空值检查,去重,去异常值)
由于数据集较好,基本不需要处理,但实现数据很有可能需要清洗,比如说,年龄缺失不能简单补0。
balance处理的尝试
1.balance的分布在较大值较少,需要处理
2.balance不处理
对数据one-hot encoding,对yes,no等2分类用0,1替换
处理之后数据为
使用lightgbm建模,参数如下
对测试集预测的结果左边为客户序号,predict为预测购买的可能性(推荐度),real为真是购买情况(0为未购买,1为已购买)
评价模型的好坏,对于少部分人购买(大部分预测都低于百分之50),很难用accurate去评价
举个例子,
真实情况是A类人购买率0.1,B类人购买率0.2,C类人购买率0.2。
即真实100个A, 100个 B, 100个 C 分别购买为10,20,20
2个模型经过训练对A,B,C,3类人的购买可能性预测为0.3 ,0.2, 0.1;0.15, 0.2, 0.2模型认为A,B,C三类人都不会购买。
accurate为预测正确人数/总人数
accurate(模型1)=accurate(模型2)=250(250没买东西,模型预测所有人都不会购买)/300=83%
如果用accurate去评价,模型1的性能是等于模型2的。
但是显然模型2更符合真实情况,所以这里不再使用accurate来作为标准。
这里使用的方法是,对预测值进行排序,如果预测准确,那么可能性高的人一定会多买产品。通过下图来衡量模型的好坏,红色为随机推荐,绿色为安概率排序后推荐。
如果绿线开始上升越快,说明模型效果越好。
这图除了来衡量模型好坏,也是一个有用的结论:
对一个人群范围,可以先通过模型排序,然后选取一定范围进行营销活动,提高转换率。
这里用1000的人来做标准,之后的模型也使用这个数据来做判断标准。排序前推荐1000人,购买率为104/1000=10.4%,排序后推荐1000人,购买率为270/1000=27%,差距最大点为1362。在推荐1362人是使用排序算法都购买人数和随意推荐差距最大。
特征值的重要程度如下图,可以看出账户余额和年龄是最重要的2个特征值
通过dnn和xgboost建模(具体见py代码)
3种建模的效果比较
1000人时,实际购买人数如下图
3种取现
结论分析在目前的参数设置来说 效果为xgboost>lightgbm>dnn
对比试验,之前的数据集是认为只有客户的基础属性,然后对客户的购买可能性做出预测。
现在增加电话营销的数据,来模拟一些营销数据(比如说发过几封推荐邮件)。
新增3个参数为
Duration:最后一次通话持续时间
Campaign:在这一次推广活动中,练习次数
Poutcome:之前的推广活动的结果,success为成功,failure为失败,unknown和other不是很清楚是什么属性
使用lightgbm建模结果如下
特征值的重要程度如下图,新增的特征值duration(持续通话时间)和campaign(联系次数)对预测有相当重要的影响。
对比没有这3个特征值时的预测(同样使用lightgbm)
这个对比说明了,在有效的特征值越多的情况下,预测越准确。