乐趣区

关于数据挖掘: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)

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

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

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

data['y'].value_counts()
data['job'].value_counts()
data['marital'].value_counts()
data['education'].value_counts()
data['housing'].value_counts()
data['loan'].value_counts()
data['contact'].value_counts()
data['month'].value_counts()
data['poutcome'].value_counts()

描述性统计

数值总结

data.head(5)

扭转因变量 y 的值。代替 no – 0 和代替 yes – 1。

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

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

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

咱们能够看到许多可见的异样值,尤其是在 balance、campaign、pdays 的状况下。在 pdays,咱们能够看到很多变量都在分位数范畴之外。这个变量是一个特例,它被解码为 -1,这就是咱们的图看起来像这样的起因。在示意变量之前的箱线图的状况下,它示意在此流动之前执行的分割数量,在这种状况下,咱们还能够留神到许多超出分位数范畴的值。

直方图

咱们的下一步是查看连续变量的散布和直方图
咱们能够看到没有一个变量具备正态分布。

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

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

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

从这些变量中咱们能够失去的最乏味的察看是,大多数说不的人年龄在 20-40 岁之间,在月底的第 20 天,大多数人也回绝了这个提议。

分类总结

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

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

咱们还查看了分类变量,看看是否有一些乏味的特色
从下面的条形图中能够看出,最乏味的后果来自变量:婚姻状况、教育和工作。
从代表婚姻状况的图表来看,大多数人都已婚。
正如咱们在代表教育的图表上看到的那样 – 最大的是承受过中等教育的人数。
在约伯的状况下,咱们能够看到大多数人都有蓝领和管理工作。

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

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

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

在可变守约的状况下,大多数没有守约信用的人也回绝了该提案。

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

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


点击题目查阅往期内容

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

左右滑动查看更多

01

02

03

04

数据挖掘

data.head(5)

咱们想更深刻地钻研咱们的变量,看看咱们是否能够用它们做更多的事件。

咱们的下一步是应用 WOE 剖析。

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

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

咱们剖析中剩下的列:

特征选择和工程

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

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

咱们更改了列的名称。

data.head(5)

创立虚构变量后,咱们进行了 Pearson 相干。

age = pearsonr(data['age'], data['y'])
sns.heatmap(corr

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

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

pylab.show()

穿插验证

通过所有筹备工作,咱们终于能够将数据集拆分为训练集和测试集。

算法的实现

逻辑回归

K=5
kf = KFold(n_splits=K, shuffle=True)

logreg = LogisticRegression()
 [[7872   93]
 [992   86]]
 [[7919   81]
 [956   86]]
 [[7952   60]
 [971   59]]
 [[7871   82]
 [1024   65]]
 [[7923   69]
 [975   75]]

决策树

dt2 = tree.DecisionTreeClassifier(random_state=1, max_depth=2)
 [[7988    0]
 [1055    0]]
 [[7986    0]
 [1056    0]]
 [[7920   30]
 [1061   31]]
 [[8021    0]
 [1021    0]]
 [[7938   39]
 [1039   26]]

随机森林

random_forest = RandomForestClassifier
 [[7812  183]
 [891  157]]
 [[7825  183]
 [870  164]]
 [[7774  184]
 [915  169]]
 [[7770  177]
 [912  183]]
 [[7818  196]
 [866  162]]

KNN 近邻

classifier = KNeighborsClassifier(n_neighbors =13,metric = 'minkowski' , p=2)

print("Mean accuracy:",accuracyknn/K)
print("The best AUC:", bestaucknn)
 [[7952   30]
 [1046   15]]
 [[7987   30]
 [1010   15]]
 [[7989   23]
 [1017   13]]
 [[7920   22]
 [1083   17]]
 [[7948   21]
 [1052   21]]

高斯奢侈贝叶斯

kf = KFold(n_splits=K, shuffle=True)

gaussian = GaussianNB()
 [[7340  690]
 [682  331]]
 [[7321  633]
 [699  389]]
 [[7291  672]
 [693  386]]
 [[7300  659]
 [714  369]]
 [[7327  689]
 [682  344]]
  

``````
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]})

咱们看到依据 AUC 值的最佳模型是奢侈贝叶斯咱们不应该太在意最低的 R2 分数,因为数据十分不均衡(很容易预测 y=0)。在混同矩阵中,咱们看到它预测了丑陋的价值真正值和负值。令咱们诧异的是,决策树的 AUC 约为 50%。

欠采样

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

gTrain, gValid = train_test_split

逻辑回归

predsTrain = logreg.predict(gTrainUrandom)
predsTrain = logreg.predict(gTrain20Urandom)
predsTrain = logreg.predict(gTrrandom)

决策树

  

print("Train AUC:", metrics.roc_auc_score(ygTrds))

随机森林

print("Train AUC:", metrics.roc_auc_score(ygTr, predsTrain),
      "Valid AUC:", metrics.roc_auc_score(ygVd, preds))

KNN 近邻

print("Train AUC:", metrics.roc_auc_score(ygTrm, predsTrain),
      "Valid AUC:", metrics.roc_auc_score(ygVal10, preds))

高斯奢侈贝叶斯

print("Train AUC:", metrics.roc_auc_score(ygTraom, predsTrain),
      "Valid AUC:", metrics.roc_auc_score(ygid, preds))

过采样

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

feates = datolist()
print(feures)
feaes.remove('y')
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))

决策树

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

随机森林

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

KNN 近邻

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

高斯奢侈贝叶斯

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

论断

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

数据获取

在上面公众号后盾回复“银行数 ”,可获取残缺数据。


本文摘选 PYTHON 银行机器学习: 回归、随机森林、KNN 近邻、决策树、高斯奢侈贝叶斯、反对向量机 SVM 剖析营销流动数据 ,点击“ 浏览原文”获取全文残缺材料。

点击题目查阅往期内容

用 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 神经网络分类

退出移动版