随机森林:提供银行精准营销解决方案

原文地址:https://blog.csdn.net/weixin_34233679/article/details/88480912

本例是根据科赛网练习赛进行练手,学习巩固一下随机森林建模以及应用。

  • 赛题描述

本练习赛的数据,选自UCI机器学习库中的「银行营销数据集(Bank Marketing Data Set)」

这些数据与葡萄牙银行机构的营销活动相关。这些营销活动以电话为基础,一般,银行的客服人员需要联系客户至少一次,以此确认客户是否将认购该银行的产品(定期存款)。

因此,与该数据集对应的任务是「分类任务」,「分类目标」是预测客户是(' 1 ')或者否(' 0 ')购买该银行的产品。

  • 导入相关库
  1. from sklearn.ensemble import RandomForestClassifier
  2. from sklearn.model_selection import GridSearchCV
  3. from sklearn.model_selection import cross_val_score
  4. import matplotlib.pyplot as plt
  5. import pandas as pd
  6. import numpy as np
  • 查看数据集
  1. data = pd.read_csv('train_set.csv')
  2. data.head()
14645088-867458183d2ebee2.png

字段分别为表示为客户ID、年龄、职业、婚姻状况、受教育水平、是否有违约记录、每年账户的平均余额、是否有住房贷款、是否有个人贷款、与客户联系的沟通方式、最后一次联系的时间(几号)、最后一次联系的时间(月份)、最后一次联系的交流时长、在本次活动中,与该客户交流过的次数、距离上次活动最后一次联系该客户,过去了多久(999表示没有联系过)、在本次活动之前,与该客户交流过的次数、上一次活动的结果、预测客户是否会订购定期存款业务。
数据集没有缺失值,不需要填充。

  • 查看数据概述
data.describe()
14645088-08feb3f52b30964f.png

从表格可以看出,客户最大年龄为95,最小年龄为18,平均年龄为41。"在距离上次活动最后一次联系该客户,过去了多久"这个字段中最小为-1,最大为854,并没有999。可以推断,应该-1表示为没联系过。

由于最后一次联系的时间(几号)、最后一次联系的时间(月份)、距离上次活动最后一次联系该客户这个三个特征有重合,并且前两个字段无法说明距今时间长度,故删除前两个字段。然后将'job','marital','education','default','housing','loan','contact','poutcome'这些类别变量进行哑变量处理。

  1. data.drop(['ID','day','month'], axis=1, inplace=True)
  2. dummy = pd.get_dummies(data[['job','marital','education','default','housing','loan','contact','poutcome']])
  3. data = pd.concat([dummy, data], axis=1)
  4. data.drop(['job','marital','education','default','housing','loan','contact','poutcome'], inplace=True, axis=1)
  • 拆分数据集
  1. from sklearn.model_selection import train_test_split
  2. X = data[data.columns[:-1]]
  3. y = data.y
  4. Xtrain, Xtest, ytrian, ytest = train_test_split(X, y, test_size=0.3, random_state=90)
  • 确定随机森林数目
  1. scorel = []
  2. for i in range(0,200,10):
  3. rfc = RandomForestClassifier(n_estimators=i+1,
  4. n_jobs=-1,
  5. random_state=90)
  6. score = cross_val_score(rfc,Xtrain,ytrian,cv=10).mean()
  7. scorel.append(score)
  8. print(max(scorel),(scorel.index(max(scorel))*10)+1)
  9. plt.figure(figsize=[20,5])
  10. plt.plot(range(1,201,10),scorel)
  11. plt.show()

0.8969014833647764 181

14645088-60a6c2c5a445633a.png

通过10重交叉验证,绘制学习曲线,确定模型森林数目为181,最高得分为0.8969
但是我们并不知道最高得分确实在181还是在其附近,所以需在181范围再进行一次验证

  1. scorel = []
  2. for i in range(175,186):
  3. rfc = RandomForestClassifier(n_estimators=i,
  4. n_jobs=-1,
  5. random_state=90)
  6. score = cross_val_score(rfc,Xtrain,ytrian,cv=10).mean()
  7. scorel.append(score)
  8. print(max(scorel),([*range(175,186)][scorel.index(max(scorel))]))
  9. plt.figure(figsize=[20,5])
  10. plt.plot(range(175,186),scorel)
  11. plt.show()

0.8969014833647764 181

14645088-c9600f5126581471.png

很巧的是,181就是我们要找的最合适的森林数目。我们确定下来:n_estimators=181

  • 网格搜索法确定其他参数
  1. param_grid = {'max_depth':np.arange(1, 20, 1)}
  2. rfc = RandomForestClassifier(n_estimators=181
  3. ,random_state=90
  4. )
  5. GS = GridSearchCV(rfc,param_grid,cv=10)
  6. GS.fit(Xtrain,ytrian)
  7. GS.best_params_
  8. GS.best_score_

{'max_depth': 14} 0.8996106314542068
经过漫长的计算,终于得到了结果。可以看到在树的最大层数为14层时,得到了最高分:0.8996,较之前上升了0.0027。我们确定下来max_depth=14。

  1. param_grid = {'min_samples_leaf':np.arange(1, 20, 1)}
  2. rfc = RandomForestClassifier(n_estimators=181
  3. ,random_state=90
  4. )
  5. GS = GridSearchCV(rfc,param_grid,cv=10)
  6. GS.fit(Xtrain,ytrian)
  7. GS.best_params_
  8. GS.best_score_

{'min_samples_leaf': 7} 0.899046329213927
又经过了漫长的等待,我们计算出了最佳min_samples_leaf参数为7, 最佳得分为0.8990。但是得分却下降了0.0006。我们知道决策树和随机森林是天生过拟合的模型。调节参数(预剪枝)几乎都是为了防止模型过拟合,调节min_samples_leaf后,模型就会进入欠拟合状态。所以max_depth=14时,可能是我们的模型已经到达的极限了。想要提升模型准确度,可能需要再从特征工程上着手了,调节其他参数将不再有效。

  • 建立模型
  1. rfc = RandomForestClassifier(n_estimators=181, max_depth=14, random_state=90)
  2. rfc.fit(Xtrain, ytrian)
  3. rfc.score(Xtest, ytest)

0.9063981042654028
可以看出模型在测试集上的得分为0.906,结果还算不错。

  • 输出比赛结果
  1. data2 = pd.read_csv('test_set.csv')
  2. ID = data2.ID
  3. data2.drop(['ID','day','month'], axis=1, inplace=True)
  4. dummy = pd.get_dummies(data2[['job','marital','education','default','housing','loan','contact','poutcome']])
  5. data2= pd.concat([dummy, data2], axis=1)
  6. data2.drop(['job','marital','education','default','housing','loan','contact','poutcome'], axis=1, inplace=True)
  7. pred = rfc.predict_proba(data2)
  8. data3 = pd.DataFrame(pred, index=ID, columns=['pred0', 'pred'])
  9. data3.drop('pred0', axis=1, inplace=True)
  10. data3.to_csv('result.csv')

比赛结果要求字段为pred,表示预测客户订购定期存款业务的概率,部分结果如下图


14645088-2c1e45a0f29a25d0.png
      </div></div>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谁说2021届秋招算法岗一定要灰飞烟灭啦?

没错&#xff0c;这是一碗鸡汤&#xff0c;希望肝完这碗鸡汤的师弟师妹们就不要过度焦虑啦&#xff5e;理性上车&#xff0c;理性下车&#xff0c;希望萌新们都能遇到最适合自己的坑位2014年末入坑AI&#xff0c;一路见证了AI行业的快速起飞、爆炸、焦虑和冷却。小夕前几天在知…

论文浅尝 | 基于深度强化学习的远程监督数据集的降噪

论文链接&#xff1a;https://arxiv.org/pdf/1805.09927.pdf来源&#xff1a;ACL2018Motivation&#xff1a;远程监督是以一种生成关系抽取训练样本的方法&#xff0c;无需人工标注数据。但是远程监督引入了噪音&#xff0c;即存在很多的假正例。本文的出发点非常简单&#xff…

字符串匹配算法(AC自动机 Aho-Corasick)

文章目录1. 多模式串匹配2. 经典多模式串匹配--AC自动机2.1 AC自动机构建2.2 在AC自动机上匹配主串2.3 复杂度分析3. python包1. 多模式串匹配 前面学的BF、RK、BM、KMP都是单模式串匹配算法&#xff08;一个模式串&#xff0c;一个主串&#xff09;多模式串匹配&#xff0c;即…

Redis系列教程(五):Redis哨兵、复制、集群的设计原理,以及区别

前一篇文章高并发架构系列&#xff1a;Redis为什么是单线程、及高并发快的3大原因详解谈了Redis高并发快的3个原因&#xff0c;本篇主要谈Redis的高可用&#xff0c;两篇合起来就可以把redis的高并发和高可用搞清楚了。 谈到Redis服务器的高可用&#xff0c;如何保证备份的机器…

论文浅尝 | 区分概念和实例的知识图谱嵌入方法

链接&#xff1a;https://arxiv.org/pdf/1811.04588.pdf知识图谱的表示学习最近几年被广泛研究&#xff0c;表示学习的结果对知识图谱补全和信息抽取都有很大帮助。本文提出了一种新的区分概念和实例的知识图谱表示学习方法&#xff0c;将上下位关系与普通的关系做了区分&#…

写在校招季,谈谈机器学习岗的Offer选择问题

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 吴海波 现在校招开始的越来越早&#xff0c;今年的实习生招聘还是异常火爆&#xff0c;简历一堆&#xff0c;而且是越来越没有区分度&#xff0c;以前面个xgboost的论文细节&#xff0c;就能区分很多人&…

Redis系列教程(六):Redis缓存和MySQL数据一致性方案详解

需求起因 在高并发的业务场景下&#xff0c;数据库大多数情况都是用户并发访问最薄弱的环节。所以&#xff0c;就需要使用redis做一个缓冲操作&#xff0c;让请求先访问到redis&#xff0c;而不是直接访问MySQL等数据库。 这个业务场景&#xff0c;主要是解决读数据从Redis缓存…

贪心算法(Greedy Algorithm)之霍夫曼编码

文章目录1. 贪心算法2. 应用2.1 找零钱2.2 区间覆盖2.3 霍夫曼编码霍夫曼编码完整代码1. 贪心算法 我们希望在一定的限制条件下&#xff0c;获得一个最优解每次都在当前的标准下做出当下最优决策&#xff08;整体不一定最优&#xff09;&#xff0c;做出的决策不可以后悔&…

数据结构中基本查找算法总结

原文地址&#xff1a;https://www.cnblogs.com/xuzhp/p/4638937.html 基本查找算法 一、查找的基本概念 查找&#xff0c;也可称检索&#xff0c;是在大量的数据元素中找到某个特定的数据元素而进行的工作。查找是一种操作。 二、顺序查找 针对无序序列的一种最简单的查找方式…

领域应用 | 大众点评搜索基于知识图谱的深度学习排序实践

本文转载自公众号&#xff1a;美团技术团队。 本文介绍了大众点评搜索核心排序层模型的演化之路&#xff0c;包括结合知识图谱信息构建适合搜索场景的Listwise深度学习排序模型LambdaDNN以及特征工程实践和相关工具建设。1. 引言挑战与思路搜索是大众点评App上用户进行信息查…

KDD2020 | 揭秘Facebook搜索中的语义检索技术

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 江城编 | 可盐可甜兔子酱导读&#xff1a;今天分享一下 Facebook 发表在 KDD2020 的一篇关于社交网络搜索中的 embedding 检索问题的工作&#xff0c;干货很多&#xff0c;推荐一读。论文题目&#xff1…

Redis系列教程(八):分布式锁的由来、及Redis分布式锁的实现详解

在很多场景中&#xff0c;我们为了保证数据的最终一致性&#xff0c;需要很多的技术方案来支持&#xff0c;比如分布式事务、分布式锁等。那具体什么是分布式锁&#xff0c;分布式锁应用在哪些业务场景、如何来实现分布式锁呢&#xff1f;今天来探讨分布式锁这个话题。 什么是…

技术交流:老刘说NLP技术公众号开通

我有一个念想&#xff1a;在当今PR文章满天飞的背景下&#xff0c;我们能够保持人间清醒&#xff0c;对NLP技术有客观、公正的了解&#xff0c;并实事求是地进行技术实践和知识共享。老刘说NLP&#xff0c;将定期发布更多、更简单、更有趣的语言知识、想法、笔记&#xff0c;包…

POJ 2453 贪心应用

文章目录1. 题目1.1 题目链接1.2 题目大意1.3 解题思路2. Accepted 代码1. 题目 1.1 题目链接 http://poj.org/problem?id2453 1.2 题目大意 一个数x的二进制表示有n个1&#xff0c;求一个有相同个数1的二进制数&#xff08;比x大&#xff0c;且要最小的&#xff09; 1.3…

ICML2020 | 一行代码就能实现的测试集上分技巧

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 苏剑林编 | 夕小瑶在训练模型的时候&#xff0c;我们需要损失函数一直训练到0吗&#xff1f;显然不用。一般来说&#xff0c;我们是用训练集来训练模型&#xff0c;但希望的是验证集的损失越小越好&…

Redis系列教程(七):Redis并发竞争key的解决方案详解

Redis高并发的问题 Redis缓存的高性能有目共睹&#xff0c;应用的场景也是非常广泛&#xff0c;但是在高并发的场景下&#xff0c;也会出现问题&#xff1a; 高并发架构系列&#xff1a;Redis缓存和MySQL数据一致性方案详解 如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难…

技术动态 | 北京大学计算机所邹磊教授研究组开源面向 RDF 知识图谱的自然语言问答系统 gAnswer...

项目网站: http://ganswer.gstore-pku.com/代码地址: https://github.com/pkumod/gAnswerOpenKG发布地址: http://openkg.cn/tool/ganswer研究组主页: http://mod.icst.pku.edu.cn一、KBQA 任务简介基于知识库的自然语言问答 (Question Answering over Knowledge Base, KBQA) 主…

POJ 2287 田忌赛马(贪心)

文章目录1. 题目1.1 题目链接1.2 题目大意1.3 解题思路2. Accepted 代码1. 题目 1.1 题目链接 http://poj.org/problem?id2287 1.2 题目大意 双方各有n匹战斗力各异的马&#xff0c;分别派出来PK&#xff0c;假设对方先出牌&#xff0c;我方后出&#xff0c;求我方最多能胜…

Netty的实现原理、特点与优势、以及适用场景

高并发编程系列 高并发编程系列&#xff1a;NIO、BIO、AIO的区别&#xff0c;及NIO的应用和框架选型 高并发编程系列&#xff1a;ConcurrentHashMap的实现原理(JDK1.7和JDK1.8) 高并发编程系列&#xff1a;CountDownLatch、Semaphore等4大并发工具类详解 高并发编程系列&…

拒绝无脑吹!从ACL20看预训练缺陷

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 舒意恒、兔子酱以 BERT 为代表作的预训练模型的研究热度一直很高&#xff0c;到 0202 年了&#xff0c;预训练的研究依旧层出不穷&#xff0c;而且 ACL 2020 Best Paper 荣誉提名也选择了这一主题的研究…