构造一个神经网络对银行客户流失做一个分析

例子及数据集是某套教程(避嫌)里的内容,做下记录,个人认为,亲自实现代码可以增强学习效果。


情境:
某家银行发现进来他们的客户流失比较严重,处于业务需要,现在他们将收集的客户资料,希望通过分析得到未来一段时间内客户断掉跟这家银行的业务来往的可能性,从而做出适当的挽留措施。
现在他们收集了客户的ID、姓名、信用得分、地区位置、性别、年龄、业务往来时长、存款、购买的业务数、是否拥有信用卡、是否为活跃客户、估计年薪的各种情况。目的是将他们依据是否会断绝业务往来进行分类。

import pandas as pd
dataset = pd.read_csv('Churn_Modelling.csv')
x = dataset.iloc[:,3:-1].values
y = dataset.iloc[:,-1].values
'''
提取特征,及标签数据,也就是x、y。
这里去除了与客户流失无关的特征:ID、姓名(对于地理位置,我们做了保留,原因是不同地区政策,汇率什么的可能有所影响。)
'''

这里我们观察数据集可以发现,存在分类变量,需要进行转化,转化成可以进入模型的数据。

from sklearn.preprocessing import LabelEncoder,OneHotEncoder
le1 = LabelEncoder()
ohe = OneHotEncoder(categorical_features=[1])
x[:,1] = le1.fit_transform(x[:,1])
le2 = LabelEncoder()
x[:,2] = le2.fit_transform(x[:,2])
x = ohe.fit_transform(x).toarray()
x = x[:,1:]
#这里之所以去除我们经过OneHotEncoder处理的一列,原因是为了避免存在多重共线性的虚拟编码陷阱

变化后我们的数据:
在这里插入图片描述

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
x = sc.fit_transform(x)
'''
这里我们的特征缩放很有必要,对于年薪这一显著大于其他变量,可能会导致这个特征对模型最终的贡献度太高,而忽略了其他的特征的贡献。
'''
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.2,random_state = 0)
import keras
from keras.models import Sequential   #用于初始化神经网络
from keras.layers import Dense   #添加layer
classifier = Sequential()
classifier.add(Dense(units=6,activation='relu',kernel_initializer='uniform',input_dim = 11)) 
#添加第一层隐藏层(units)为6个(依据经验出发:取输入神经元个数与输出神经元个数的平均)并设置输入神经元个数(input_dim)为11个,并初始化每个输入的权重(随机)。
classifier.add(Dense(units=6,activation='relu',kernel_initializer='uniform'))  #设置第二层隐藏层
#这上面隐藏层的激活函数都是RULE(线性整流函数。隐藏层运用最多的激活函数)
classifier.add(Dense(units=1,activation='sigmoid',kernel_initializer='uniform')) 
 #设置输出层,激活函数为sigmoid
#编译我们的神经网络。优化方式设置为adam,评估水准为准确性
classifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])

上面的loss标识的是损失,如果我们是批量训练,则为损失的综合。计算损失后很多种,最常见的是:优化为最小二乘法,表示方式:在这里插入图片描述
在这里插入图片描述

#利用编译好的神经网络进行数据训练,以10个样本为一组,进行训练,循环200期
classifier.fit(x_train,y_train,batch_size=10,epochs=200)

运行的最终结果:
在这里插入图片描述
一路下来,损失大致一路减小下来,准确度逐渐提高。最终我们的模型在训练集的准确度大致为:84%。接下来我们将模型应该在测试集上,看看表现如何:

y_pre = classifier.predict(x_test)
y_pre = (y_pre > 0.5)
#上面这一句的作用是对于每个位于y_pre的元素进行比较,返回布尔值。
#使用混淆矩阵进行结果检测
from sklearn.metrics import confusion_matrix
score = confusion_matrix(y_test,y_pre)
print('模型在测试集上的表现(准确率):' + str((score[0,0]+score[1,1])/x_test.shape[0]))

最终输出为0.84,即我们模型在测试集上的准确度达到了84%。这个数据并没有偏离我们在训练集上得到的结果,反映了我们并不存在过度拟合的情况。准确度还是挺不错的。
以上就是本次文章的内容,欢迎指点。

猜你喜欢

转载自blog.csdn.net/weixin_43084928/article/details/82809566