原文地址: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()

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

  • 查看数据概述
data.describe()

从表格可以看出,客户最大年龄为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

通过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

很巧的是,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,表示预测客户订购定期存款业务的概率,部分结果如下图

      </div></div>

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

  1. 「二分类算法」提供银行精准营销解决方案(样本不平衡问题)

    项目背景 项目来源于Kesci平台:提供银行精准营销解决方案 项目简介 本练习赛的数据,选自UCI机器学习库中的「银行营销数据集(Bank Marketing Data Set)」 这些数据与葡萄牙银 ...

  2. kesci数据分类练习赛:提供银行精准营销解决方案(附源码)

    (kesci数据分类预测)提供银行精准营销解决方案练习赛 kesci的一个练习赛:https://www.kesci.com/home/competition/5c234c6626ba91002bfd ...

  3. 「二分类算法」提供银行精准营销解决方案 代码存档

    「二分类算法」提供银行精准营销解决方案 代码存档 参考文章: (1)「二分类算法」提供银行精准营销解决方案 代码存档 (2)https://www.cnblogs.com/starcrm/p/1180 ...

  4. 「二分类算法」提供银行精准营销解决方案(各个模型汇总分析)baseline

    完整代码见 Github:「二分类算法」提供银行精准营销解决方案 赛事详情 1.比赛页面:「二分类算法」提供银行精准营销解决方案 2.数据与测评算法 训练集下载链接 测试集下载链接 字段说明 测评算法 ...

  5. 「二分类算法」提供银行精准营销解决方案

    银行精准营销解决方案 营销活动以电话为基础,一般,银行的客服人员需要联系客户至少一次. 数据集中包含有客户年龄,职业婚姻,教育水平等信息,通过这些信息建模,预测客户是否将认购该银行的产品 一.数据和库 ...

  6. 「二分类算法」提供银行精准营销解决方案详解(随机森林)

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

  7. 银行精准营销的概念讲解

    我们都知道,银行精准营销是一种不错的数据库营销手段.博主本文就为大家详细介绍一下如何进行银行精准营销哦. 目前我国大部分银行委托外包公司制作银企对账单,但其弊病非常明显:容易外泄客户名单.对账单无故丢 ...

  8. 如何助力银行精准营销

    如何助力银行精准营销已经越来越成为一个重要的研究课题.小编本文就详细为大家分析一下银行精准营销各方面内容. 在中国,随着富裕人群的不断崛起,银行会对不同资产额的客户提供不同的服务,对于个性化的要求会越 ...

  9. 笔记︱精准营销解决方案以及营销组合评估

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 本笔记来源于CDA-DSC-L2R的课程.主要 ...

最新文章

  1. Power Designer使用技巧
  2. 模拟Sum函数(版本二)
  3. ProtoBuf协议
  4. easyUI的中文乱码问题
  5. 2022年全球及中国智慧消防栓行业与十四五投资建议与竞争策略研究报告
  6. Jquery 获取日期date()对象,jquerydate
  7. 测试反模式冰激凌模式的不足_单元测试反模式,完整列表
  8. 微信小程序的scroll-view组件
  9. JavaScript 回调函数中的 return false 问题
  10. potplayer 多个进程_什么是进程
  11. 【java】打印一个序列,第一项和第二项都是1,以后的每一项都是前面两项的和。
  12. Focus Stacking
  13. ki4so-发起一个史上最开源的sso项目
  14. 「转载」微服务分布式架构中,如何实现日志链路跟踪?
  15. 重构Webpack系列之一 ---- 概念篇
  16. 汇编语言程序设计实验报告
  17. Python正态性检验(最简单的方法)
  18. diy计算机工作站,DIY 篇一:TU100组装移动工作站
  19. codelite14中文语言包_CodeLite中文语言包
  20. mysql官方系在教程_MySQL系列教程(四)

热门文章

  1. 用软件模拟硬件连接透传云
  2. 在Android中访问内置SE和基于SE的卡模拟(一)
  3. edge java_在Windows 10上,Edge浏览器不支持插件,因此Java无法运行
  4. Net framework3.5装不上的解决办法
  5. 不同意安装条款就没法使用?新法规对APP霸王条款说“不”
  6. 火山PC高级选择夹开发教学博客
  7. 走近橄榄球运动·体育项目
  8. java 代码性能优化_Java代码性能优化的几个小技巧
  9. 大学专业分类及专业代码爬取
  10. Qt编译通过,运行时出现the process was ended forcefully问题的解决方案