PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享...

全文下载链接:http://tecdat.cn/?p=26219

该数据(查看文末了解数据获取方式)与银行机构的直接营销活动相关,营销活动基于电话。通常,需要与同一客户的多个联系人联系,以便访问产品(银行定期存款)是否会(“是”)或不会(“否”)订阅点击文末“阅读原文”获取完整代码数据

银行数据集

我们的数据集描述

y - 客户是否订阅了定期存款?(二进制:'是','否')

相关视频

我们的目标是选择最好的回归模型来让客户订阅或不订阅定期存款。我们将使用如下算法:

  • 线性回归

  • 随机森林回归

  • KNN近邻

  • 决策树

  • 高斯朴素贝叶斯

  • 支持向量机

选择最佳模型的决定将基于:

  • 准确性

  • 过采样

数据准备

在本节中,我们加载数据。我们的数据有 45211 个变量。

输入变量:
银行客户数据
1 - 年龄(数字)
2 - 工作:工作类型(分类:'行政'、'蓝领'、'企业家'、'女佣'、'管理'、'退休'、'自雇'、'服务'、'学生'、'技术员'、'失业'、'未知')
3 - 婚姻:婚姻状况(分类:'离婚'、'已婚'、'单身'、'不详';注:'离婚'指离婚或丧偶)。
4 - 教育(分类:'基础4年'、'基础6年'、'基础9年'、'高中'、'文盲'、'专业课程'、'大学学位'、'未知')
5 - 违约:是否有违约的信贷?(分类: '没有', '有', '未知')
6-住房:是否有住房贷款?(分类: '否', '是', '未知')
7 - 贷款:有个人贷款吗?
8 - contact: 联系通信类型(分类:'手机', '电话')。
9 - 月:最后一次联系的年份月份(分类:'一月', '二月', '三月', ..., '十一月', '十二月')
10 - day\_of\_week:最后一次联系的星期(分类:'mon', 'tue', 'wed', 'thu', 'fri')
11 - 持续时间:最后一次联系的持续时间,以秒为单位(数字)。
12 - 活动:在这个活动期间为这个客户进行的接触次数(数字,包括最后一次接触)。
13 - pdays: 在上次活动中最后一次与客户联系后的天数(数字,999表示之前没有与客户联系)。
14 - 以前:在这次活动之前,为这个客户进行的接触次数(数字)。
15 - 结果:上次营销活动的结果(分类:"失败"、"不存在"、"成功")。
社会和经济背景属性
16 - emp.var.rate:就业变化率--季度指标(数值)。
17 - cons.price.idx:消费者价格指数--月度指标(数值)。
18 - cons.conf.idx:消费者信心指数--月度指标(数字)。
19 - euribor3m:银行3个月利率--每日指标(数值)
20 - nr.employed: 雇员人数 - 季度指标(数字)

输出变量(所需目标):

  • y -  客户是否认购了定期存款?(二进制: '是', '否')

data.head(5)

5b178a7a51efb9a1e64c75e026bf03b9.png

我们的下一步是查看变量的形式以及是否存在缺失值的问题。

df1 = data.dtypes
df1

1c31acbefbbc9dad1088884e7663caaf.png

df2 = data.isnull().sum() 
df2

d5ae310b309b36b2aaa70ddc403bb5ac.png

我们的下一步是计算所有变量的值。

data\['y'\].value_counts()

fa7875931bd3bf60ceb54768eade98f0.png

data\['job'\].value_counts()

e33353fc1c573ccc8c79a0e072284224.png

data\['marital'\].value_counts()

aeff5268f24d81d6dcd7f0f7514da264.png

data\['education'\].value_counts()

acb49df7172a289b01c3f7256aa84ef6.png

data\['housing'\].value_counts()

f7813b83d0b521dcc96a5c70a9f274ce.png

data\['loan'\].value_counts()

c3582bd81f8cf4c44a081378df106eba.png

data\['contact'\].value_counts()

eba4c2675294c09ee3dc763f5cadf571.png

data\['month'\].value_counts()

edf9f834b7d473e8a09d2680ef1c8de6.png

data\['poutcome'\].value_counts()

627b9a2081da0f78cbaacb6c49773f99.png

描述性统计

数值总结

data.head(5)

18aead9770eaff6b142c7df1fe976656.png

改变因变量 y 的值。代替 no - 0 和代替 yes - 1。

data\['y'\] = data\['y'\].map({'no': 0, 'yes': 1})
data.columns

da4dbd4c30cbdf284686510c4f4196a3.png

对于我们的每个变量,我们绘制一个箱线图来查看是否有任何可见的异常值。

plt.figure(figsize=\[10,25\])
ax = plt.subplot(611)
sns.boxplot(data\['age'\],orient="v")

f96a4d272c2cade3f7b8d9034b731108.png

fa31b58e9d85ccc31bfe30e07eb07577.png

6dbb2bf29764ff91363c46f0b1018320.png

2a76f90de7196ffc73cf3866bf282ba8.png

d257368d916d829b83be423542162732.png

fe4489fb04bff51d823c5508410b9725.png

我们可以看到许多可见的异常值,尤其是在 balance 、 campaign 、 pdays 的情况下。在 pdays ,我们可以看到很多变量都在分位数范围之外。这个变量是一个特例,它被解码为 -1,这就是我们的图看起来像这样的原因。在表示变量之前的箱线图的情况下,它表示在此活动之前执行的联系数量,在这种情况下,我们还可以注意到许多超出分位数范围的值。

直方图

我们的下一步是查看连续变量的分布和直方图
我们可以看到没有一个变量具有正态分布。

plt.figure(figsize=\[10,20\])
plt.subplot(611)
g = sns.distplot(data\["age"\], color="r")

0202f212a92c4e9b0e2020afb7b67500.png

e00d4ddd816692f0b3c4684c2b14ce5d.png

19521ffa3a4e8447aaaac6dbe88a5e8b.png

78cc4cedc2d272c42c70569991242dc2.png

9c8696bbe556129ace6e00b99dace168.png

88ca14ca057b4e554af2f6f7b0f6c757.png

我们的下一步是查看因变量 y 与每个变量或连续变量之间的关系。

g = sns.FacetGrid(data, col='y',size=4)
g.map

aac45a270e1828e56d434660c548942b.png

30d190fde671b9f3b145658ea710f329.png

0c135eefda9bd9fe88127ba7c1269587.png

c7eaa4b178c453d5d8f75d4d639c4de1.png

589453e667f273408679d9e5181468bf.png

551fe256972f345e7e10110edede7e13.png

从这些变量中我们可以得到的最有趣的观察是,大多数说不的人年龄在20-40岁之间,在月底的第20天,大多数人也拒绝了这个提议。

分类总结

我们制作仅包含分类变量的数据子集,以便更轻松地绘制箱线图

data_categorical = data\[\['job','marital','education','default', 'housing','loan','month', 'y'\]\]

fa4c4f48cb03c84887c7fa54225e2138.png

bf157bffc0d96fa64b34902dfac92a68.png

a819e93d28176876a8616dd6f04acbc2.png

我们还查看了分类变量,看看是否有一些有趣的特征
从上面的条形图中可以看出,最有趣的结果来自变量:婚姻状况、教育和工作。
从代表婚姻状况的图表来看,大多数人都已婚。
正如我们在代表教育的图表上看到的那样 - 最大的是接受过中等教育的人数。
在约伯的情况下,我们可以看到大多数人都有蓝领和管理工作。

我们还想在马赛克图上查看我们的分类变量与 y 变量之间的关系。

plt.rcParams\['font.size'\] = 16.0

61ae7b7b248703c26dd23d55b0406aca.png

正如我们所见,大多数人都拒绝了该提议。就地位而言,已婚的人说“不”最多。

e04cb228525b5ff72de2db80e0ab3c26.png

在可变违约的情况下,大多数没有违约信用的人也拒绝了该提案。

1f0767646692397076d241c00a6cb85a.png

大多数有住房贷款的人也拒绝了该提议。

6056186caf923fbd156b94bd985510cd.png

大多数没有贷款的人拒绝了这个提议。


点击标题查阅往期内容

1b2fd0952c5494aedee9ce4b243cd69c.png

用PyTorch机器学习神经网络分类预测银行客户流失模型

outside_default.png

左右滑动查看更多

outside_default.png

01

21b2df24cc1dc454dabf94499ec092ab.png

02

2c0e556c270fe35e6a13f96a90380369.png

03

b0e6452b299b536d9cd797575c50f523.png

04

28505ad9284d712cc013bdd93b096b4f.png

数据挖掘

data.head(5)

f1b233235b4b4ac6e82bfcdf8bc934c7.png

我们想更深入地研究我们的变量,看看我们是否可以用它们做更多的事情。

我们的下一步是使用 WOE 分析。

finv, IV = datars(data,data.y)
IV

7b306900198e061b8f4e15a9e2feb370.png

基于对我们有用的 WOE 分析变量是:pdays、previous、job、housing、balance、month、duration、poutcome、contact。
在下一步中,我们决定根据 WOE 结果和变量的先前结果删除无用的列。
我们删除的其中一个列是 poutcome,尽管它的 WOE 很高,但我们决定删除它,因为从 prevois 分析中我们看到它有许多未知的观察结果。
在可变持续时间的情况下,我们也可以看到WOE相当大,甚至可以说这个结果有点可疑。我们决定根据 WOE 结果放弃它,因为我们的模型应该根据过去的数据说明是否建议给某个人打电话。
在可变接触的情况下,我们放弃了它,因为对我们来说,接触形式在我们的模型中没有用。
我们还删除了变量 day 因为它对我们没有用,因为这个变量代表天数,而该变量的 WOE 非常小。我们删除的最后一个变量是变量 pdays,尽管这个变量 WOE 的结果非常好,但它对我们来说并不是一个有用的变量。

我们分析中剩下的列:

857b22828a2055274a5c170cd3769598.png

特征选择和工程

要执行我们的算法,我们首先需要将字符串更改为二进制变量。

data = pd.get_dummies(data=data, columns = \['job', 'marital', 'education' , 'month'\], \prefix = \['job', 'marital', 'education' , 'month'\])

38ad9beeacaed8ba8cb676c8d536d242.png

我们更改了列的名称。

data.head(5)

af35ca81a36a00999be6ca4181e9ce98.png

创建虚拟变量后,我们进行了 Pearson 相关。

age = pearsonr(data\['age'\], data\['y'\])

e4ecf4989d94ed3e908d863f7538a6c4.png

sns.heatmap(corr

8764ab886a2fcd9c2e2e25bdc012ab93.png

我们选择了数字列来检查相关性。正如我们所看到的,没有相关性。

我们查看因变量和连续变量之间的关系。

pylab.show()

0ee9b8ba6ce01d925516c4cbaa151146.png

交叉验证

经过所有准备工作,我们终于可以将数据集拆分为训练集和测试集。

算法的实现

逻辑回归

K=5
kf = KFold(n_splits=K, shuffle=True)logreg = LogisticRegression()
\[\[7872   93\]\[ 992   86\]\]

df5155f215ac300ec2b9ecca702cf6b9.png

115da81d8528012fe717ce2a17b53ab8.png

\[\[7919   81\]\[ 956   86\]\]

7af6ef4133d949b85c9fcb1cf60d7bad.png

ab728d285d51c0ed00b82a9384afe011.png

\[\[7952   60\]\[ 971   59\]\]

4719710823c14a4999b4bf306ac533dd.png

5895efd8124636e14baffb0216f1153e.png

\[\[7871   82\]\[1024   65\]\]

234292370cbfc0013f1372f8f50618b5.png

52255a53394006eca54a447a80fcafc7.png

\[\[7923   69\]\[ 975   75\]\]

94344e0bc1bbbbca08b3155008560a4c.png

aa56bf01317a7df870b1f1e3ebdc463f.png

决策树

dt2 = tree.DecisionTreeClassifier(random\_state=1, max\_depth=2)
\[\[7988    0\]\[1055    0\]\]

b6284f1db5273017f36c675645bacccc.png

da80f3871c7b60db2f61b00eeadbf7dc.png

\[\[7986    0\]\[1056    0\]\]

28403b4ade8e10eb9d7f27440c99fcc9.png

b82ac0152c743fa254cd814803a375c6.png

\[\[7920   30\]\[1061   31\]\]

bffcf758215740abb14867ee9003d653.png

7460bb6432dbbe133f10770b580575dd.png

\[\[8021    0\]\[1021    0\]\]

701633b7dad1a4317524b99d57a184fd.png

12a9b7bef8f295a3c5050ef5ac7afa8b.png

\[\[7938   39\]\[1039   26\]\]

08969f9f6c80dd4b307967a6ec553fa8.png

1357556b0998e2358531793c3cf4d29c.png

随机森林

random_forest = RandomForestClassifier
\[\[7812  183\]\[ 891  157\]\]

18bab97e5fef5c743ae710dd7f43b4a7.png

7b71fc97cd435856ef3c5b3ad7296dbb.png

\[\[7825  183\]\[ 870  164\]\]

80215703035716ee74186e0c45338875.png

15cde263c3ca94e64cb5d903d2b430b8.png

\[\[7774  184\]\[ 915  169\]\]

db7672366ec2a3c79d54cf1ea7e07be3.png

69d7fc7cac34a66ee748df11a9a83c7e.png

\[\[7770  177\]\[ 912  183\]\]

5542f2a5b1b636d1da7eac80eeefcedb.png

30d194f413e29813f68903d49d7efd7b.png

\[\[7818  196\]\[ 866  162\]\]

345a15df9d3abd9fc001e57d997ff732.png

705a12bb8b9ec0c06473ad8e2b24fb30.png

KNN近邻

classifier = KNeighborsClassifier(n_neighbors =13,metric = 'minkowski' , p=2)print("Mean accuracy: ",accuracyknn/K)
print("The best AUC: ", bestaucknn)
\[\[7952   30\]\[1046   15\]\]

6bdbc724c6ba8dcc934df2db093f0f4a.png

f1f98478d7d4f6eabbb8990d6bc1b325.png

\[\[7987   30\]\[1010   15\]\]

af2cfffcb9e75aed13187c38f9a50afb.png

6f14818c4ff5e96e63d7450714f4518c.png

\[\[7989   23\]\[1017   13\]\]

06b06ec781ddaa49879d1fb868c65fec.png

c2401318c99795b66c1a3b062c8000c9.png

\[\[7920   22\]\[1083   17\]\]

c87d975310ce84d31ce0ffa9db5bbed4.png

7ac3ba4454785a5b2a8252272dbf127e.png

\[\[7948   21\]\[1052   21\]\]

039f28578116809e8eb2ec23d44ed484.png

04573c4664d30efd64df6efad6fe21ea.png

高斯朴素贝叶斯

kf = KFold(n_splits=K, shuffle=True)gaussian = GaussianNB()
\[\[7340  690\]\[ 682  331\]\]

dbffc4780722750cc88b25180b9afef9.png

a477f84bdfcca8dc54c8fdd360378660.png

\[\[7321  633\]\[ 699  389\]\]

5d35e2c7e58e147fe1011ceb1924827e.png

25787ab9e3a9d5c7a3e3d39e307afaa5.png

\[\[7291  672\]\[ 693  386\]\]

535a61649678848ddd063978b0c9d895.png

013a0808e3073ba211a890ee5ffe60c9.png

\[\[7300  659\]\[ 714  369\]\]

9ed1517d22bc6ec4d17940480398d8e7.png

9a81824e0f95667a2d557f189ae46bce.png

\[\[7327  689\]\[ 682  344\]\]

4981ffc7e92488a476a375ec3bde06b5.png

fd99586e764d81d680b7e44fc682249c.png

``````
models = pd.DataFrame({'Model': \['KNN', 'Logistic Regression', 'Naive Bayes', 'Decision Tree','Random Forest'\],'Score': \[ accuracyknn/K, accuracylogreg/K, accuracygnb/K, accuracydt/K, accuracyrf/K\],'BestAUC': \[bestaucknn,bestauclogreg,bestaucgnb,bestaucdt,bestaucrf\]})

1644c3e6be93c9976bc91f7744a416bb.png

我们看到根据 AUC 值的最佳模型是朴素贝叶斯我们不应该太在意最低的 R2 分数,因为数据非常不平衡(很容易预测 y=0)。在混淆矩阵中,我们看到它预测了漂亮的价值真正值和负值。令我们惊讶的是,决策树的 AUC 约为 50%。

欠采样

我们尝试对变量 y=0 进行欠采样

gTrain, gValid = train\_test\_split

b894acd963c2144b4e96969db6ca7932.png

逻辑回归

predsTrain = logreg.predict(gTrainUrandom)

9f3174df10aa2229ccf9c18826c417e5.png

predsTrain = logreg.predict(gTrain20Urandom)

88c91831ec7e0745cd8ab10d5b0d2ba9.png

predsTrain = logreg.predict(gTrrandom)

7cff9f678a09ff2640cd4c615e3ec4cd.png

决策树

print("Train AUC:", metrics.roc\_auc\_score(ygTrds))

2edeaed5188914e21d93aab181ce875b.png

随机森林

print("Train AUC:", metrics.roc\_auc\_score(ygTr, predsTrain),"Valid AUC:", metrics.roc\_auc\_score(ygVd, preds))

8ec9fd3d5789ba3e15f76555b5f89629.png

KNN近邻

print("Train AUC:", metrics.roc\_auc\_score(ygTrm, predsTrain),"Valid AUC:", metrics.roc\_auc\_score(ygVal10, preds))

7cd93ba79bf120151a687343f8f907ec.png

高斯朴素贝叶斯

print("Train AUC:", metrics.roc\_auc\_score(ygTraom, predsTrain),"Valid AUC:", metrics.roc\_auc\_score(ygid, preds))

916c4154f6692288e9c0f567c6c06185.png

过采样

我们尝试对变量 y=1 进行过采样

feates = datolist()
print(feures)
feaes.remove('y')

65d3061acddf3bf2f831e23a1c5f209b.png

print(gTrainOSM.shape)
(31945, 39)
``````
smt = SMOT
(32345, 39)
``````
smt = SMOT
(32595, 39)
``````
ygTrain10OSM=gTrain10OSM\['y'\]
gTrain10OSM=gTrain10OSM.drop(columns=\['y'\])

逻辑回归

print("Train AUC:", metrics.roc\_auc\_score(ygTrin10SM, predsTrain),"Valid AUC:", metrics.roc\_auc\_score(ygValid, preds))

ad49c9358c74d1ffcca5b530453f8bec.png

决策树

dt2.fit(,ygTranOS)
predsTrain = dtpreict(TrainOSM)
preds = dt2.predict(gValid)

a3304647d98dc9839b32cb47ad9c8db6.png

随机森林

random_forest.fit(rainOSM, ygTranOS)
predsTrain = random_forest.prect(gTraiOSM)
p

4c91ea63d1bc66efd76fb690267c56c4.png

KNN近邻

classifier.fit(granOSM, yTanOSM)
predsTrain = classifier.predict(gTaiSM)
preds = classifier.predict(Vaid)

00133836920d8889017270a65523d048.png

高斯朴素贝叶斯

gaussian.fit(gTriOM, ygrainM)
predsTrain = gaussian.predcti)

fe9eaa4397b65718fefd2db9d5fbd7b5.png

结论

我们看到欠采样和过采样变量 y 对 AUC 没有太大帮助。

数据获取

在下面公众号后台回复“银行数”,可获取完整数据。


e903db63f8cdc606395e140ae0132723.png

本文摘选PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据,点击“阅读原文”获取全文完整资料。

d6585383843693940f46092548cc2119.jpeg

本文中的银行数据分享到会员群,扫描下面二维码即可加群!

930a3eb610a905af56b0d28ce46b4696.png

点击标题查阅往期内容

用PyTorch机器学习神经网络分类预测银行客户流失模型

R语言用FNN-LSTM假近邻长短期记忆人工神经网络模型进行时间序列深度学习预测4个案例

Python中TensorFlow的长短期记忆神经网络(LSTM)、指数移动平均法预测股票市场和可视化

R语言KERAS用RNN、双向RNNS递归神经网络、LSTM分析预测温度时间序列、 IMDB电影评分情感

Python用Keras神经网络序列模型回归拟合预测、准确度检查和结果可视化

Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析

R语言中的神经网络预测时间序列:多层感知器(MLP)和极限学习机(ELM)数据分析报告

R语言深度学习:用keras神经网络回归模型预测时间序列数据

Matlab用深度学习长短期记忆(LSTM)神经网络对文本数据进行分类

R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)

MATLAB中用BP神经网络预测人体脂肪百分比数据

Python中用PyTorch机器学习神经网络分类预测银行客户流失模型

R语言实现CNN(卷积神经网络)模型进行回归数据分析

Python使用神经网络进行简单文本分类

R语言用神经网络改进Nelson-Siegel模型拟合收益率曲线分析

R语言基于递归神经网络RNN的温度时间序列预测

R语言神经网络模型预测车辆数量时间序列

R语言中的BP神经网络模型分析学生成绩

matlab使用长短期记忆(LSTM)神经网络对序列数据进行分类

R语言实现拟合神经网络预测和结果可视化

用R语言实现神经网络预测股票实例

使用PYTHON中KERAS的LSTM递归神经网络进行时间序列预测

python用于NLP的seq2seq模型实例:用Keras实现神经网络机器翻译

用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类

4503f7546f5a61fe40df07c1cb730548.png

a148a3a25f09f7154641bfd0a585925c.jpeg

4e056ddcfb6be93c9b15c1156369a3cd.png


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部