精华内容
下载资源
问答
  • 银行客户流失预测

    2017-07-19 21:45:00
    针对银行客户流失预测,主要流程分为:特征预处理、特征选择,分类模型选择与训练。主要工作如下: 1:特征预处理与选择 对性别进行哑变量处理; 对是否有****信息将布尔值转换01表示; 画出年龄直方图可以看出...

    针对银行客户流失预测,主要流程分为:特征预处理、特征选择,分类模型选择与训练。主要工作如下:

    1:特征预处理与选择

    对性别进行哑变量处理;

    对是否有****信息将布尔值转换01表示;

    画出年龄直方图可以看出大致呈正态分布,对年龄分段处理后缺失值采用插补方式;

    资产当前总额=存储类资产当前总额=本币存储当前总金额   月日均余额=存储类资产月日均余额=本币存储月日均余额  分别删除其中两项;

    针对*NUM,*DUR,*AMT,*BAL字段分别进行特征提取(SelectKBest)达到降维效果;

    最后整合数据,特征标准化处理最终为44个特征(StandardScaler)。

      2:分类模型选择与训练

    数据集划分:采用K折交叉验证,train_test_split自主切分数据集

    模型选择:采用了决策树,提升树(GBDT/XGBoost),SVM(libsvm)神经网络(多层感知器算法)分别训练模型

    3:对应python主要代码:

    • decisiontree.py

    from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score
    
    X_train,X_test,y_train,y_test=train_test_split(StS,y,test_size=0.4,random_state=0)
    clf = tree.DecisionTreeClassifier()
    clf = clf.fit(X_train, y_train)
    pre_labels = clf.predict(X_test)
    print('accuracy score:',accuracy_score(y_test,pre_labels,normalize=True))
    print('recall score:',recall_score(y_test,pre_labels))
    print('precision score:',precision_score(y_test,pre_labels))
    print('f1  score:',f1_score(y_test,pre_labels))
    • XGBoost.py
    import xgboost as xgb
    from sklearn.preprocessing import StandardScaler
    #记录程序运行时间
    import time
    start_time = time.time()
    from xgboost.sklearn import XGBClassifier
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score,classification_report,roc_auc_score
    bankChurn = pd.read_csv('D:/work/lost data and dictionary/test/bankChurn.csv')#原始数据
    bankChurn_data = pd.read_csv('D:/work/lost data and dictionary/test/bankChurn_data.csv')#预处理数据
    Y_train=bankChurn['CHUR0_CUST_I0D']#标签
    StS=StandardScaler().fit_transform(bankChurn_data)
    X_train,X_test,y_train,y_test=train_test_split(StS,Y_train,test_size=0.4,random_state=None)
    print(X_train.shape, X_test.shape)
    #模型参数设置
    xlf = xgb.XGBClassifier(max_depth=10,
                            learning_rate=0.1,
                            n_estimators=10,
                            silent=True,
                            objective='binary:logistic',
                            nthread=-1,
                            gamma=0,
                            min_child_weight=1,
                            max_delta_step=0,
                            subsample=0.85,
                            colsample_bytree=0.7,
                            colsample_bylevel=1,
                            reg_alpha=0,
                            reg_lambda=1,
                            scale_pos_weight=1,#这个值是因为类别十分不平衡。
                            seed=1440)
    
    xlf.fit(X_train, y_train, eval_metric='error', verbose = True, eval_set = [(X_test, y_test)],early_stopping_rounds=100)
    # 计算 auc 分数、预测
    preds = xlf.predict(X_test)
    pre_pro = xlf.predict_proba(X_test)[:,1]
    print('accuracy score:',accuracy_score(y_test,preds ,normalize=True))
    print('classification report:',classification_report(y_test,preds ))
    print('precision score:',precision_score(y_test,preds ))
    print('roc_auc_score:%f' % roc_auc_score(y_test,pre_pro))
    #输出运行时长
    cost_time = time.time()-start_time
    print("xgboost success!",'\n',"cost time:",cost_time,"(s)......")
    • libsvm.py

    import os
    os.chdir('C:\libsvm-2.81\python')
    from svmutil import *
    from sklearn.metrics import accuracy_score,classification_report
    y,x=svm_read_problem('bankchurnLibsvm.txt')#转换成libsvm格式
    # print(type(x))
    x=np.array(x)
    y=np.array(y)
    stratified_folder=StratifiedKFold(n_splits=4,random_state=0,shuffle=True)
    for train_index,test_index in stratified_folder.split(x,y):
        print('shuffled train index:',train_index)
        print('shuffled test index:', test_index)
        print('shuffled x_train:', x[train_index])
        print('shuffled x_test:', x[test_index])
        print('shuffled y_train:', y[train_index])
        print('shuffled y_test:', y[test_index])
        print('.......')
    y_train=list(y[train_index])
    y_test=list(y[test_index])
    x_train=list(x[train_index])
    x_test=list(x[test_index])
    m=svm_train( y_train,x_train,'-c 4  -g 2')
    p_label,p_acc,p_val=svm_predict(y_test,x_test,m)
    print('accuracy score:',accuracy_score(y_test,p_label ,normalize=True))
    print('classification report:',classification_report(y_test,p_label ))
    • BPtest

      import pandas as pd
      import numpy as np
      from sklearn.model_selection import cross_val_score
      from sklearn.neural_network import MLPClassifier
      from sklearn.metrics import accuracy_score,roc_auc_score
      from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score,classification_report
      bankChurn = pd.read_csv('D:/work/lost data and dictionary/test/bankChurn.csv')
      X_data = pd.read_csv('D:/work/lost data and dictionary/test/bankChurn_data.csv')
      X_data=X_data.values[:,:]
      Y_label=bankChurn['CHUR0_CUST_I0D']
      Y_label=Y_label.values[:]
      data=np.hstack((X_data,Y_label.reshape(Y_label.size,1)))##将样本集与标签合并
      np.random.shuffle(data)##混洗数据
      X=data[:,:-1]
      Y=data[:,-1]
      train_x=X[:-8620]
      test_x=X[-8620:]
      train_y=Y[:-8620]
      test_y=Y[-8620:]#数据5:5
      ######mlpclassifier_data():###多层感知机算法,BP算法
      classifier=MLPClassifier(hidden_layer_sizes=(30,),activation='logistic',max_iter=1000)
      clf=classifier.fit(train_x,train_y)
      train_score=classifier.score(train_x,train_y)
      test_score=classifier.score(test_x,test_y)
      print('train_score:',train_score)
      print('test_score:',test_score)
      ####得到其他分类效果####
      pre_labels = clf.predict(test_x)
      pre_pro = clf.predict_proba(test_x)[:,1]
      print('accuracy score:',accuracy_score(test_y,pre_labels,normalize=True))
      print('recall score:',recall_score(test_y,pre_labels))
      print('classification report:',classification_report(test_y,pre_labels))
      print('precision score:',precision_score(test_y,pre_labels))
      print('f1  score:',f1_score(test_y,pre_labels))
      print('roc_auc_score:%f' % roc_auc_score(test_y,pre_pro))

      运行结果比较:
        DT XGBoost Libsvm BP
      Accuracy 0.856 0.91 0.894 0.90
      Precision 0.86 0.89 0.84 0.88
      Recall 0.86 0.91 0.89 0.90
      F1 score 0.86 0.89 0.85 0.87

       

     

    转载于:https://www.cnblogs.com/xyd134/p/7208404.html

    展开全文
  • 客户流失预测模型 owNumber:行号 × CustomerID:用户编号 × Surname:用户姓名 × CreditScore:信用分数 Geography:用户所在国家/地区 × Gender:用户性别 Age:年龄 Tenure:当了本银行多少年用户 ...

    转自慕课

    import os
    
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
    
    #import tensorflow as tf
    
    
    
    import tensorflow.compat.v1 as tf
    
    tf.disable_v2_behavior()
    
    
    
    import pandas as pd
    
    import numpy as np
    
    from sklearn.utils import shuffle
    
    from sklearn.preprocessing import OneHotEncoder
    
    import matplotlib.pyplot  as plt
    
    from pylab import mpl
    
    mpl.rcParams['font.sans-serif'] = ['STZhongsong']    # 指定默认字体:解决plot不能显示中文问题
    
    
    
    
    
    '''
    
    客户流失预测模型
    
    owNumber:行号 ×
    
    CustomerID:用户编号 ×
    
    Surname:用户姓名 ×
    
    CreditScore:信用分数
    
    Geography:用户所在国家/地区 ×
    
    Gender:用户性别
    
    Age:年龄
    
    Tenure:当了本银行多少年用户
    
    Balance:存贷款情况
    
    NumOfProducts:使用产品数量
    
    HasCrCard:是否有本行信用卡
    
    IsActiveMember:是否活跃用户
    
    EstimatedSalary:估计收入
    
    Exited:是否已流失,这将作为我们的标签数据
    
    '''
    
    
    
    
    
    df = pd.read_csv("./data/select-data.csv")
    
    df_test = pd.read_csv("./data/scalar-test.csv")
    
    print("构建向量.........")
    
    # 构建向量
    
    train = []
    
    target = []
    
    for i in range(0, len(df["EstimatedSalary"])):#字段的行数,逐行读入
    
        mid = []
    
        mid.append(df["Geography"][i])
    
        mid.append(df["Gender"][i])
    
        mid.append(df["EB"][i])
    
        mid.append(df["Age"][i])
    
        mid.append(df["EstimatedSalary"][i])
    
        mid.append(df["NumOfProducts"][i])
    
        mid.append(df["CreditScore"][i])
    
        mid.append(df["Tenure"][i])
    
        mid.append(df["HasCrCard"][i])
    
        mid.append(df["IsActiveMember"][i])
    
        target.append(df["Exited"][i])#标签放入target,标签
    
        train.append(mid)#把mid赋值给train列表,作为输入条件
    
    train = np.array(train)
    
    target = np.array(target)#把列表转为数组,方便神经网络处理
    
    
    
    test = []
    
    test_target = []
    
    
    
    for i in range(0, len(df_test["EstimatedSalary"])):#测试样本,与训练样本同
    
        mid = []
    
        mid.append(df_test["Geography"][i])
    
        mid.append(df_test["Gender"][i])
    
        mid.append(df_test["EB"][i])
    
        mid.append(df_test["Age"][i])
    
        mid.append(df_test["EstimatedSalary"][i])
    
        mid.append(df_test["NumOfProducts"][i])
    
        mid.append(df_test["CreditScore"][i])
    
        mid.append(df_test["Tenure"][i])
    
        mid.append(df_test["HasCrCard"][i])
    
        mid.append(df_test["IsActiveMember"][i])
    
        test_target.append(df_test["Exited"][i])
    
        test.append(mid)
    
    test = np.array(test)
    
    test_target = np.array(test_target)
    
    # train = np.trunc(train * 100)
    
    
    
    # 随机打乱训练集与标签
    
    train, target = shuffle(train, target)#随机打乱训练样本集的顺序,以确保公正
    
    target = target.reshape(-1, 1)#数据规整
    
    test_target = test_target.reshape(-1, 1)
    
    
    
    # One-Hot编码,独热编码
    
    enc = OneHotEncoder()
    
    enc.fit(test_target)
    
    test_target = enc.transform(test_target).toarray()
    
    enc.fit(target)
    
    target = enc.transform(target).toarray()
    
    enc.fit(test_target)
    
    
    
    
    
    # 定义输入占位符,给读进来的数据分配存储空间 
    
    x = tf.placeholder(tf.float32, shape=(None, 10))
    
    # # 二分类问题 [0,1]
    
    y = tf.placeholder(tf.float32, shape=(None, 2))
    
    keep = tf.placeholder(tf.float32)
    
    
    
    # 定义网络结构,可以进行参数调bank
    
    # layer1第一个隐藏层
    
    var1 = tf.Variable(tf.truncated_normal([10, 256], stddev=0.1))#10个输入,256个神经元  截断:当权值初始化后,其值大于均值+2倍的方差的权值被删掉,重新用正态函数初始化
    
    bias1 = tf.Variable(tf.zeros([256]))#对偏置项做初始化为0
    
    hc1 = tf.add(tf.matmul(x, var1), bias1)#y=w*x+b全连接写法
    
    h1 = tf.sigmoid(hc1)#激活函数
    
    h1 = tf.nn.dropout(h1, keep_prob=keep)#防止过拟合
    
    
    
    # layer2
    
    var2 = tf.Variable(tf.truncated_normal([256, 256], stddev=0.1))#权重
    
    bias2 = tf.Variable(tf.zeros([256]))
    
    hc2 = tf.add(tf.matmul(h1, var2), bias2)
    
    h2 = tf.sigmoid(hc2)
    
    h2 = tf.nn.dropout(h2, keep_prob=keep)
    
    
    
    # layer3#输出层
    
    var3 = tf.Variable(tf.truncated_normal([256, 2], stddev=0.1))
    
    bias3 = tf.Variable(tf.zeros([2]))
    
    hc3 = tf.add(tf.matmul(h2, var3), bias3)
    
    h3 = tf.nn.softmax(hc3)#基于概率的输出函数,介于0-1之间,之和为1
    
    
    
    
    
    # 定义损失
    
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=h3, labels=y))#交叉熵函数
    
    tf.summary.scalar('loss', loss)
    
    
    
    # 定义正确率
    
    ac = tf.cast(tf.equal(tf.argmax(h3, 1), tf.argmax(y, 1)), tf.float32)#算出的值与实际值相比较
    
    acc = tf.reduce_mean(ac)
    
    tf.summary.scalar('accuracy', acc)
    
    
    
    # 定义优化器
    
    optimzer = tf.train.AdamOptimizer(1e-3).minimize(loss)#动态优化学习率
    
    
    
    merge_summary = tf.summary.merge_all()
    
    
    
    isTrain = 1
    
    
    
    # 定义训练
    
    print("正在训练.....")
    
    saver = tf.train.Saver(max_to_keep=1)
    
    
    
    with tf.Session() as sess:
    
        if isTrain:
    
            init_op = tf.global_variables_initializer()#初始化
    
            sess.run(init_op)
    
            summary_writer = tf.summary.FileWriter('./logs/', sess.graph)
    
            nepoch=[]
    
            trainacc=[]
    
            testacc=[]
    
            loss1=[]
    
            for i in range(0, 10001):
    
                 
    
                sess.run(optimzer, feed_dict={x: train, y: target, keep: 0.5})
    
                train_summary = sess.run(merge_summary, feed_dict={x: train, y: target, keep: 1})#调用梯度下降法训练网络
    
                summary_writer.add_summary(train_summary, i)
    
               
    
                if i % 50 == 0:#每迭代50次,记录显示一次训练样本的准确度、测试样本的准确度以及代价函数进行显示
    
                    accu = sess.run(acc, feed_dict={x: train, y: target, keep: 1})
    
                    accuT = sess.run(acc, feed_dict={x: test, y: test_target, keep: 1})
    
                    losss = sess.run(loss, feed_dict={x: train, y: target, keep: 1})
    
                   
    
                    print("epoch:" + str(i) + "   train_acc:" + str(accu) + "   test_acc:" + str(accuT) + "   loss:" + str(
    
                        losss))
    
          
    
                    nepoch.append(i)
    
                    trainacc.append(accu)
    
                    testacc.append(accuT)
    
                    loss1.append(losss)
    
               
    
            plt.title("BP神经网络训练性能曲线")
    
            plt.xlabel('训练次数')
    
            plt.ylabel('训练样本和检验样本的准确度')
    
            plt.plot(nepoch,trainacc,nepoch,testacc)
    
            plt.plot(nepoch,trainacc,nepoch,loss1)
    
            plt.show()
    
    
    
    saver.save(sess, './model/bank.ckpt', global_step=i)
    
    '''
    
        else:
    
            f = open("./result/NN-target.txt", "w")
    
            model_file = tf.train.latest_checkpoint('./NN-model/')
    
            saver.restore(sess, model_file)
    
            tar = sess.run(h3, feed_dict={x: test, y: test_target, keep: 1})
    
            tar = sess.run(tf.argmax(tar, 1))
    
            for i in range(0, len(tar)):
    
                f.write(str(tar[i]) + " ")
    
            f.close()
    
            print(tar)'''
    
    展开全文
  • 基于分类方法的银行客户流失预测

    千次阅读 2020-08-16 19:12:19
    技术栈:Excel、SPSS、SQL SERVER BI

    一、绪论

        近年来,随着支付宝、微信等第三方支付平台的流行和经济体制改革的深化,银行同业间的竞争出现了恶化的趋势,客户流失率的与日俱增也使得银行机构的经营变得紧张。其次,在“互联网+”盛行的21世纪,互联网金融服务与金融产品犹如雨后春笋般层出不穷,加速了客户对银行机构的忠实度和依赖性的降低,如何处理客户流失问题俨然成了摆在各大银行面前的一大挑战。

        本文在对某欧洲银行客户数据探索与预处理的基础上,利用决策树、关联规则、贝叶斯网络这三种分类技术建立数据挖掘模型,并通过对模型的解释和评估对比确定最佳模型。分析结果表明,三种模型对测试集的预测准确率较高,但决策树在该银行客户流失预测问题中的预测效果最准确稳定。论文重点在于利用分类挖掘技术对银行客户信息进行分析研究,深入、全面地挖掘客户的流失倾向,总结已流失客户和未流失客户的群体特征,并为该银行提供有针对性的建议,有助于银行对客户价值做出正确的判断,从而稳定存有客户,挽留潜在客户,发展新增客户,使银行在整体上提高效益,在激烈的同业竞争中发挥出最大的竞争优势。

    (一)研究背景

        随着市场竞争的加剧和银行规模经济效应的逐步下降,银行同业间的产品或服务差异越来越小,而对于银行来说,客户显然是最具有价值的资产和最大财富,越来越多的事实证明“以客户为中心”的银行往往能在市场中获得更大收益。

        银行客户流失是指客户不再继续办理原业务或者终止参与该银行的业务。近年来,国内金融改革的深入及民营银行的进入加速了银行的客户流失和忠实度下降,各银行间的客户争夺战愈演愈烈。为了能在激烈的同业间竞争中取胜,各大银行纷纷采取措施调整本行的产品或服务,一方面着眼于夯实客户基础,通过发展新客户来提高已有客户的保有量,另一方面也越来越注重已有客户活跃度的提高和客户流失率的降低。从客户成本角度分析,挽留一个已有客户、提高已有客户活跃度的成本远低于吸引一个新增客户的成本,且堵住漏洞比盲目发展更加重要,因此做好客户流失管理工作是现今银行行业的工作重心。[1]

    (二)研究意义

        在客户导向的时代,未来银行行业的竞争势必紧紧围绕着客户,如何提高客户的忠实度、提升客户价值,进而衍生本行利益已经成为银行最关注的问题之一,同时也将成为衡量银行竞争力的重要指标。此外,当下各国银行业普遍应用了数据管理系统,但在分析数据信息方面存在不足,缺乏专业的知识手段和工具,往往造成数据浪费,因而难以利用数据发现潜在的流失客户。[2]

        数据挖掘技术的诞生正是解决了缺乏信息分析专业工具这一难题。所谓数据挖掘,又称数据库中的知识发现,是指从海量数据中获取有效的、新颖的、潜在有用的、最终可理解的模式的过程,其应用领域十分广泛。在不断变化的市场需求和潜在进入者面前,数据挖掘技术可以根据企业需求为企业创建模型,帮助企业从大量的原始数据中抽取具有价值的商业信息,向企业直接提供知识。[3]

        对于银行业,利用数据挖掘技术中的分类方法建立预测客户流失模型来支持决策是最直接且较为理性的选择。本文通过对客户流失数据的探索与预处理来建立基于三种分类方法的客户流失模型,根据结果分析该银行客户流失情况及特征,预测潜在客户行为,并为该银行提供客户挽留及关怀的建议。

    二、数据描述

        本文数据来源于superdatascience官网某欧洲银行的数据,源数据样本总量共10000条,每一条对应一个客户的统计信息。数据集包含14个变量,分别为“编号”、“客户ID”、“姓名”、“信用分”、“国家”、“性别”、“年龄”、“使用该银行产品时长”、“存贷款情况”、“使用产品数量”、“是否有信用卡”、“是否为活跃客户”、“收入估计”、“是否已流失”。

    表 1源数据属性表

    属性名 变量类型 属性名 变量类型
    编号 离散型 使用该银行产品时长 连续型
    客户ID 离散型 存贷款情况 连续型
    姓名 离散型 使用产品数量 连续型
    信用分 连续型 是否有本行信用卡 离散型
    国家 离散型 是否活跃客户 离散型
    性别 离散型 收入估计 连续型
    年龄 连续型 是否已流失 离散型

        由表1可知,属性表中共有6个连续型变量,8个离散型变量,其中“是否已流失”是本文研究的目标变量,其余均为预测变量。为了深入探索数据,本文结合EXCEL数据透视表功能对各变量进行了描述性统计分析。

    (一)连续型变量分布情况

        图1-6分别展示了本文6个连续型变量的频数分布情况。由图可知,客户信用分总体趋向于正态分布,在[650,700]区间达到峰值,鲜有客户的信用分低于400;客户年龄趋向于右偏分布,且该银行42-52岁的客户数量最多,64岁以上的客户数量较少。

        从客户与该银行产品的关系来看,客户使用该银行产品的时长均匀分布在2-8年,约六成客户在该银行办理存贷款业务,且使用的银行产品数量均匀分布在1-2个,可见该银行的客户忠实度较高。但从峰值来看,使用该银行产品少于2年的客户数量最多,且存在约37%的客户未办理存贷款业务,由此可以推测该银行在新客户及存贷款业务办理方面的吸引力不够强,相关职能部门需要根据实际情况做出战略调整。

        此外,根据客户的收入估计分布图显示,该银行接待的客户收入分布跨度较大且不均匀,不存在显著的收入区间,即客户群体不集中。
    图片在这里插入图片描述

    (二)离散型变量分布情况

    在这里插入图片描述图片
        图7-8分别展示了“国家”、“性别”、“是否有本行信用卡”、“是否活跃客户”这四个离散型变量分布与客户流失情况。从图可以看出,该银行的法国客户数量显著高于另外两个国家,且其客户流失率最低,但银行的德国客户和西班牙客户总数少于法国客户数,同时德国客户的流失率约是另外两国客户流失率的两倍,这可能是由文化差异导致的。综上,该银行在法国最受欢迎,但以长期发展的角度来看,银行不该只局限在此,而应当及时采取修正措施,抓住其他国家的客源。

        从性别分布来看,该银行的男性客户数稍高于女性客户,但女性客户的流失率反而高于男性客户。此外,观察图9不难发现,拥有该银行信用卡的客户流失率远小于没有信用卡的流失率,但就目前来看,该银行拥有信用卡的客户较少,因此银行仍需要改进及宣传信用卡的办理业务。除了信用卡的持有对本行客户忠实度的影响很大,客户活跃程度的影响也相当重要。由图10可知,该银行的活跃客户与非活跃客户分布大体上是平均的,但活跃客户的流失率明显小于非活跃客户流失率。

    (三)目标变量分布情况

        通过描述性统计可知,在“是否已流失”变量中,样本总量为10000,其中已经流失的客户记录为2037条,未流失客户的记录为7963条。

    三、数据预处理

    (一)数据清洗

        由于本文的样本数据完整,因此数据清洗操作主要包括剔除无关变量和异常值处理。

    1.剔除无关变量

        由图11部分源数据所示,可唯一标识的编号、用户ID和姓名均不具有研究意义,属于无关变量且应当剔除,但考虑到后续导入SQL Server时数据表主键的选择,本文只剔除用户ID和姓名。
    图11 部分源数据
    图 11 部分源数据

    2.异常值处理

        由于样本数据量较大,故本文通过绘制连续型变量的箱线图判断是否存在异常值,如若存在,则根据变量的分布情况处理异常值。
    图片
        从图12-17可以看出,“信用分”、“年龄”、“使用银行产品数量”这三个变量存在异常值。信用低于400分属于异常值,年龄大于60岁属于异常值,使用银行产品数量为4的也属于异常值。由于“信用分”、“年龄”、“使用银行产品数量”对研究客户的流失情况具有重要意义,且含有异常值的记录较少,因此本文对异常值不做任何处理。

    (二)数据变换

    1.数据离散化

        与连续型变量相比,离散型变量的增加和减少不仅很容易实现,而且对异常值具有很强的容忍性,使得模型的迭代更加快速和稳定。鉴于此优势,本文对“信用分”、“年龄”、“存贷款情况”、“收入估计”进行数据离散化。以年龄为例,通过上文对年龄的描述性统计,将年龄划分为30岁以下、30-40岁、40-50岁、50-60岁、60-70岁、70-80岁、80-90岁、90岁以上这八组,并重新统计各分组样本数量。“信用分”、“存贷款情况”和“收入估计”的数据离散化操作与“年龄”变量近似,具体变量的数据离散化过程及结果如表2所示。

    表 2数据离散化结果

    属性名 数据离散化结果
    年龄 ①[ 18, 30] 共 1968条 ;②[30,40 ] 共4778条; ③[ 40,50] 共2752条;
    ④[ 50,60] 共931条; ⑤[ 60,70] 共393条; ⑥[ 70,80] 共139条;
    ⑦[ 80,90] 共13条; ⑧ [90,100] 共2条。
    信用分 ①[ 350,600 ] 共3066条; ②[ 600,650 ] 共 1903条; ③ [ 650,700] 共 1984条; ④ [ 700,750] 共 1550条; ⑤ [ 750,+ ∞ ] 共 1623条。
    存贷款情况 ①没有存贷款,共3617条;②( 0,50000] 共75条;
    ③ [50000,100000] 共1509条;④ [100000,150000] 共3830条;
    ⑤ [150000,200000] 共935条;⑥ [200000,+ ∞]共35条。
    收入估计 ①[ 0,40000 ] 共1955条; ②[ 40000,80000 ] 共2033条;
    ③ [ 80000,120000] 共2028条; ④ [ 120000,160000] 共1989条;
    ⑤ [ 160000,+ ∞ ] 共1994条。

    2.样本不平衡处理

        从上文对目标变量分布情况的描述可知,已流失客户样本量与未流失客户样本量的比例约为1:4。在样本失衡的情况下,所创建的挖掘模型将耗费绝大多数时间和“精力”用于拟合约80%的未流失客户样本,然而从本文的研究目标和意义来看,检测出已流失客户的样本更加重要。考虑到过采样比欠采样的结果更为稳定,本文最终采用过采样方法进行类别平衡,通过随机复制不含有异常值的已流失客户样本量,扩大少数类样本的数据规模。过采样后的样本类别比为1:1,样本数据量为15926。

    (三)特征选择

        数据集成过程中需要避免冗余问题,当一个属性能由另一个或另一组属性“导出”时,即具有强相关性时,我们应当考虑剔除该属性。为了去除不相关和冗余的特征,提高数据质量及数据泛化能力,本文通过SPSS软件对12个预测变量进行斯皮尔曼相关系数分析,结果如图18所示。观察特征变量相关关系表可知,各变量之间的相关关系较弱,因此可以将这10个变量作为预测变量。[4]
    图片
    图 18 特征变量相关关系表

    四、数据挖掘方法及模型创建

    (一)挖掘方法的选择

        银行客户流失情况是一个典型的二分类问题,已流失客户的分类挖掘对银行来说更具有价值。所谓分类,是按照事先定义好的分类类别,按照某种规则或者标准对数据进行类别归类,其中的规则或者标准就是我们根据数据挖掘模型提取的分类规则,通过分析规则,我们可以实现对未知的样本的预测,判断它们属于哪一个类别。基于发现银行客户流失规则的挖掘目标,本文采用决策树、贝叶斯网络、关联规则这三种分类方法进行挖掘模型创建,原因如下:(1)决策树以类似流程图的数据挖掘方式展示规则,易于操作且省时省力,最重要的是该方法对样本不平衡问题不敏感;(2)贝叶斯网络预测样本的过程简单快速,对于类别类的预测特征变量效果良好,符合本文的研究情况;(3)关联规则对数据要求较低,可以产生清晰有用的挖掘结果。

    (二)挖掘模型创建

        本研究的目的在于发现银行客户流失的规则,在创建完“Bank”数据源视图后,开始创建挖掘结构。首先设置编号作为键、是否已流失作为可预测部分、其余属性均作为输入部分,其次,由于样本已经完成数据预处理,因此设置所有属性的内容类型为discrete(离散型),并选择30%用于模型的测试。挖掘模型包括决策树、贝叶斯网络、关联规则这三种。

    五、数据挖掘过程及模型解释

    (一)决策树

        挖掘模型创建成功后,在不修改任一参数的情况下,模型的准确率为77.72%。为了提高模型预测的准确率,本文通过试错法不断比较不同成长参数下的模型拟合度,最终确定挖掘模型成长参数COMPLEXITY_PENALTY值0.7,此时模型预测概率为78.39%。此外,由于训练集中存在噪声或者孤立点,初始决策树的叶子节点呈现出复杂繁多的状态,因此需要通过剪枝来提高对未知类标号数据的分类准确性。

        本文所采取的后剪枝方法,是在生成决策树之后对树进行剪枝,通过删除某些结点的分支,从而剪掉一些内部节点,更改叶结点必须包含的最小样本数量可以达到剪枝的目的。对于银行客户流失决策树模型而言,当叶结点的最小样本量MINIMUM_SUPPORT为100时,模型的预测概率达到82.03%,比初始决策树的预测概率高出3.64%。

    1.决策树

        由于决策树形状庞大,图19只展示了模型的2-7级别,从根到叶结点的一条路径对应着一条规则。节点中蓝条、红条分别表示此节点中的事例“未流失”、“已流失”的比例,全部节点共11149个事例,其中包含5601个未流失客户和5548个已流失客户。由于生成的决策树模型对应的规则较多,本文只从模型中选取置信度超过85%的规则并加以解释,规则描述如下:

    表 3 决策树规则表

    序号 规则内容
    1 使用产品数量 =2 and 存贷款情况=0 and 性别=‘Male’ 的未流失客户支持度为 1 015/ 11149= 9.1 0 % ,置信度 1015/1089= 93.2%。
    2 使用产品数量 =2 and 存贷款情况=0 and 性别不等于’Male’ and 年龄不等于3 (40-50岁)的未流失客户支持度为654/11149= 5.87% ,置信度654/759=86.15%。
    3 使用产品数量 = 1 and 年龄=4 and 是否活跃客户=0 的已流失客户支持度为601/11149= 5.39% ,置信度为601/621=96.77%。
    4 使用产品数量 =1 and 年龄不等于4 and 年龄不等于3 and 是否活跃客户=1 and 国家不等于’Germany’ and 存贷款情况= 3 的未流失客户支持度为409/11149= 3.67% ,置信度为409/472=86.65%。
    5 使用产品数量 =1 and 年龄=3 and 国家=‘Germany’ 的已流失客户支持度为695/11149= 6.23% ,置信度为695/788=88.19%。
    6 使用产品数量 不等于2 and 使用产品数量不等于1 的已流失客户支持度为671/11149= 6.02% ,置信度为671/698=95.51%。
    7 使用产品数量 不等于2 and 使用产品数量不等于1 and 存贷款情况不等于0 的已流失客户支持度为475/11149= 4.26%, 置信度为475/478=98.54% 。
    8 当规则7中的 性别=‘Female’ 时,已流失客户支持度为268/11149=2.40%,置信度为268/270=98.87%。
    9 当规则7中的性别为 =‘Male’ 时,已流失客户的支持度为207/11149 = 1.86 % ,置信度为207/208=98.87% 。

    图片
    图 19 决策树2~7级别

        从上述9条典型规则的置信度来看,使用两个银行产品且没有存贷款的客户对本银行的忠实度很高,很少出现与本行终止业务合作的情况。而在只使用一个银行产品的客户群体中,当出现非活跃客户的年龄在50-60岁时,其流失率高达96.77%;当出现年龄不是50-60岁、存贷款在[50000,100000]区间内且不是德国人的活跃客户时,有86.65%的可能性会忠诚于本银行;当出现40-50岁的德国客户时,他放弃本银行产品或服务的概率是88.19%。此外,使用银行产品数量为三个或四个的客户群体需要引起银行的重视,该群体的客户流失率都超过95%,尤其是拥有存贷款情况的客户,其流失率高达98.87%。

        从支持度的角度来看,上述规则的支持度都不超过10%,可见与规则内容完全吻合的客户群体较少。其次,在11149个事例中,使用一个银行产品且年龄不是50-60岁的已流失客户群体最为庞大,支持度高达27.01%,且其它规则的支持度远低于该客户群体。

        综上所述,当客户所拥有的银行产品过多或过少时,会抑制本银行在客户流失率降低方面的努力,因此银行在借助客户流失模型制定修正方案时,两手都要抓,既要关注置信度高的规则,也要关注支持度高的规则。

    2.依赖关系网络

        依赖关系网络显示了模型中输入属性和可预测属性“是否已流失”之间的依赖关系。从图可知,在10个输入属性中,银行客户流失情况的依赖属性包括“性别”、“是否活跃客户”、“年龄”、“使用产品数量”、“存贷款情况”、“国家”这6个属性,其中“使用产品数量”与客户流失情况的依赖关系最强。因而要求银行在日后的经营活动中加大对存有客户的银行产品使用量的关注,努力优化现有产品的质量及发展具有时代性的新产品或服务。
    图片
    图 20 决策树依赖关系所有链接
    图片
    图 21 决策树依赖关系最强链接

    (二)贝叶斯网络

    1.依赖关系网络

        由于贝叶斯网络和决策树在依赖关系网络方面的结果一致,因此本文只对贝叶斯网络模型中的属性特征和属性对比加以解释。
    图片
    图 22 贝叶斯依赖关系所有链接
    图片
    图 23 贝叶斯依赖关系最强链接

    2.属性特征

        根据研究背景及意义可了解到,已流失客户的特征对银行的实际参考价值更高,因而本文只选取并着重研究客户流失时贝叶斯网络模型各属性的特征。从表4可以发现如下规则:(1)只使用一个产品的客户流失率最高,使用四个产品的客户流失率最低;(2)女性客户和非活跃客户往往更容易流失;(3)存贷款数额的高低总体上对客户流失率有重要影响,但过高或过低的存贷款数额对流失率的影响很小;(4)不同国家的客户对银行的忠诚度整体影响差异不大;(5)除了40-50岁年龄段的客户流失率较大之外,其余年龄段的客户对银行的客户保有量没有太大的影响。

    表 4 客户已流失的属性特征表

    属性 概率 属性 概率
    使用产品数量 1 70.73% 年龄 4 22.59%
    是否活跃客户 0 64.58% 国家 Spain 20.44%
    性别 Female 55.41% 使用产品数量 2 17.18%
    存贷款情况 3 47.98% 存贷款情况 2 14.55%
    性别 Male 44.59% 使用产品数量 3 11.27%
    年龄 3 40.47% 存贷款情况 4 10.60%
    国家 Germany 39.82% 年龄 1 7.79%
    国家 France 39.74% 年龄 5 1.44%
    是否活跃客户 1 35.42% 存贷款情况 1 1.24%
    年龄 2 27.56% 存贷款情况 5 1.03%
    存贷款情况 0 24.60% 使用产品数量 4 0.83%

    3.属性对比

        从对比分数图可以看出,除了使用2个产品的客户,其余持有银行产品的客户都倾向于流失状态,而40-60岁年龄段的客户同样也更倾向于离开本银行。其次,存贷款情况的反倾向说明本银行的存贷款业务对客户的吸引力不足,相关职能部门仍需要努力提升业务服务。从国家属性来看,只有德国客户倾向于流失状态,且发生概率远高于另外两个国家,这就需要银行采取回访客户等形式对德国客户群体进行深入分析研究,针对问题挽留和关怀客户。
    在这里插入图片描述
    图 24 “是否已流失”属性的对比分数

    (三)关联规则

    1.依赖关系网络

    图片
    图 25未流失客户的最强链接
    图片
    图 26已流失客户的最强链接

        由于关联规则的依赖网络十分复杂且庞大,在此只分析可预测属性的最强链接,如上图所示。从图可知,使用两个产品的客户与为未流失状态的依赖关系最强,与贝叶斯网络的属性对比结果一致,而使用三个产品的客户最强依赖于流失状态,这说明该银行存在性价比不高或客户体验较差的产品,当客户有意选购多种银行产品时,未能满足其需求的产品将大概率迫使客户停止与本银行的业务合作。对此,银行需要加大对产品的关注力度,利用收集的大数据分析银行产品的客户流失率,尤其是客户流失率最高和最低的产品,挖掘产品为客户提供的服务和利益特点,并将获取到的有效信息合理地应用到原有产品或新增产品上。

    2.规则

        为了方便挖掘模型结果的评估比较,分别设置关联规则模型的最小概率(置信度)为0.85、最低重要性(支持度)为0.3,得到如表5所示的十条规则。

    表 5 关联规则表

    概率 重要性 规则
    0.883 0.326 存贷款情况 = 0, 使用产品数量 = 2 -> 是否已流失 = 0
    0.961 0.3 20 年龄 = 4, 是否活跃客户 = 0 -> 是否已流失 = 1
    0.996 0.31 1 使用产品数量 = 3, 存贷款情况 = 3 -> 是否已流失 = 1
    0.959 0.3 10 使用产品数量 = 3 -> 是否已流失 = 1
    0.981 0.30 9 使用产品数量 = 3, 性别 = Female -> 是否已流失 = 1
    0.985 0.30 6 使用产品数量 = 3, 年龄 = 3 -> 是否已流失 = 1
    1.000 0.30 6 使用产品数量 = 3, 年龄 = 4 -> 是否已流失 = 1
    0.988 0.305 使用产品数量 = 3, 国家 = Germany -> 是否已流失 = 1
    0.971 0.304 使用产品数量 = 3, 是否活跃客户 = 0 -> 是否已流失 = 1
    0.960 0.302 使用产品数量 = 3, 是否有本行信用卡 = 1 -> 是否已流失 = 1

        分析表5可知,上述规则均同时大于最小概率和最低重要性,属于模型的强关联规则。对于使用三个产品的客户而言,无论其他属性的特征如何,这类群体总是存在极大的流失可能性,这就要求银行完善该客户群体的产品或服务反馈机制,在他们提供的建议基础上更新产品。此外,40-60岁的客户群体对本银行的忠实度较低,相关职能部门可以通过结合现实因素和本行特色为该群体制定个性化服务,并做好挽留举措。

    六、挖掘模型评估

        对于客户流失这种二分类问题,流失客户的总体样本量较小,所以本文选择查全率、查准率和F-measure对三种分类方法所构造的模型进行评估比较。在4777个测试样本中,贝叶斯网络模型的查全率最高,决策树模型的查准率最高,但考虑到过度追求查准率会导致查全率的降低,故只利用F-measure值选择最佳模型。依据表5的结果可知,决策树的表现最好,关联规则次之,而贝叶斯网络的表现最差。

    表 6 模型评估准则表

    查全率 R recall 查准率 P precision F-measure
    决策树 77.25% 75.65% 76.44%
    贝叶斯网络 79.73% 70.19% 74.66%
    关联规则 75.72% 75.03% 75.37%

        此外,从数据挖掘提升图可以了解到,这三种模型的提升图轨迹十分相近,且与理想模型的轨迹距离不大。图中当前度量位置位于总体50%,此处理想模型的总体正确率是50%(预测完全正确),决策树为44.30%,关联规则为42.73%,贝叶斯网络为43.81%。当度量位置移动到100%时,决策树为79.28%,关联规则为82.24%,贝叶斯网络为78.93%。上述说明三种模型都具有较高的参考价值,可以将其应用到银行客户流失的实际问题中。
    图片 图 27 数据挖掘提升图

    七、挖掘结果解释与应用

        在经过对三种不同分类方法建立的客户流失模型进行评估之后,对比分析评估结果就能确定最佳模型。决策树和关联规则模型输出结果主要是对决策规则的解释,而贝叶斯网络模型输出结果主要用于解释某特征群体的流失倾向。因此,在模型的实际应用过程中,相关人员还需要结合现实因素对最佳模型的输出结果进行解释。

        应用是数据挖掘的延伸。利用数据挖掘技术对银行客户的历史行为数据进行探索和分析,挖掘出客户流失的行为模式,并将这一模式运用于预测潜在客户的流失状态。当某客户的行为与流失客户群体普遍具有的特征匹配度越高时,表明该客户越容易流失。在做完客户的流失行为预测工作之后,银行便可以依据结果开展多种客户关怀、挽留举措以期降低客户流失率,在稳步发展中增强自身的市场竞争优势。[5]

    八、结论

        在信息化时代,银行若想在日益激励的市场竞争中取胜,其建立的数据仓库就不应当再成为“数据坟墓”,对数据的充分利用要求各职能部门改变原有的思维方式,并掌握基于数据仓库中信息丰富的数据的决策方法。

        基于决策树、贝叶斯网络、关联规则这三种分类挖掘技术,本文解释并评估了所建立的银行客户流失模型,得出以下结论:
        (1)使用银行产品的数量是判别该客户在未来一段时间内是否会流失的最重要因素。银行不仅需要做好产品维护工作,还要关注客户对产品使用的满意度。对于使用产品数量较多的客户,银行可以采用感恩回馈、优先服务等方式令客户感受到银行对自身的重视;而对于使用产品数量较少的客户,银行可以抓住当季社会热点与其他商家进行合作,推出联名产品或打折活动,同时通过提供个性化服务等吸引客户加大对本行产品的客户,激励其成为活跃客户。

        (2)年龄是影响预测客户流失的另一重要因素。综合年龄频数分布及模型结果得知,该银行客户的年龄分布不均匀,最大的客户群体为40-60岁,且该群体的客户往往倾向于流失状态。这说明银行没有重视对不同年龄段客户的定位,没有深入了解本银行客户年龄层的需求。对此,银行应当尽快进行目标客户定位,细分广大客户并制定针对性的策略,为目标客户提供更加精准有益的产品或服务,在人口老龄化的时代背景下抢先抓住中老年客户群体,提高存有客户的保有量。

        (3)存贷款作为银行的主要业务,其重要性不言而喻,但就基于该银行样本所构建的数据模型结果来看,办理存贷款业务的客户并没有表现出对该银行更高的忠诚度,相反,没有办理存贷款业务的客户流失率较低。这表明该银行的存贷款收益对客户的吸引力不强,在同等收益的条件下,客户更愿意选择其他低成本的银行办理存贷款业务。面对获取资金支持渠道多元化及同业间竞争愈演愈烈的现象,银行不仅需要分析自身存贷款业务弱势的原因,还应当实时关注外部环境的变化,在保留本银行服务特色的基础上,结合内外部环境分析结果,对存贷款业务进行优化,以吸引客户办理存贷款或提高存贷款金额。

        综上所述,对处于同质化现象严重的银行业来说,主动防范客户流失俨然已成为日常经营活动的重中之重,如何挖掘关键信息的内涵也成为银行从业人员需要学习的技能之一。银行能够识别潜在的流失客户,不仅意味着能够减少维系客户的成本,还意味着增加了客户与组织保持关系更持久的可能性。其次,由于客户的储蓄行为可能随着时间而演变或对银行服务市场的事件敏感,为了得到更优的预测效果,银行需要不断更新或重新发现客户流失预测模型。[6]最后,银行的稳步发展得益于优质客户的支持,为了能更精准地制定关怀挽留方案,银行还需要区分客户的优质程度,稳定现有优质客户,挽留潜在流失的客户,做到有的放矢,从而实现存有客户保有量的可持续增长。

    *附上数据集:源数据,提取码:z70a

    参考文献

        [1]任红娟,夏国恩.客户流失研究综述[J].中国商论,2018(32):166-167.
        [2]高海燕.基于数据挖掘的银行客户流失预测研究[D].西安理工大学,2007.
        [3]陈志泊.数据仓库与数据挖掘[M].北京:清华大学出版社,2017.
        [4]王振武,徐慧.数据挖掘算法原理与实现[M].北京:清华大学出版社,2015.
        [5]柳婷.基于数据挖掘的银行客户流失模型分析研究[D].重庆大学,2008.
        [6]蒙肖莲,蔡淑琴,杜宽旗,寇建亭.商业银行客户流失预测模型研究[J].系统工程,2004(12):67-71.

    展开全文
  • 这是在银行中基于客户流失预测的随机森林分类器的一种简单而现实的问题解决方案。 该模型采用经过预处理的数据集,并在训练集上进行训练,然后在测试数据集上进行预测,准确度约为85%。 对于一家银行来说,与特定...
  • 银行客户流失分析预测

    千次阅读 2020-09-27 17:22:20
    毫无疑问,客户流失会给银行带来大量损失。考虑到避免一位客户流失的成本很可能远低于挖掘一位新客户,对客户流失情况的分析预测至关重要。本文分析的数据为某银行10000条客户信息,有14个字段。 ...

    客户流失意味着客户终止了和银行的各项业务,毫无疑问,一定量的客户流失会给银行带来巨大损失。考虑到避免一位客户流失的成本很可能远低于挖掘一位新客户,因此对客户流失情况的分析预测至关重要。本文分析了某银行10000条客户信息,含14个字段,接下来我们将从这些数据中探索客户流失特征和原因,推测目前客户管理、业务等方面可能存在的问题,建立预测模型预警客户流失情况,为制定挽留策略提供依据。

    1. 探索性分析

    1.1 认识字段

    首先,初步了解下这些数据。

    在这里插入图片描述
    字段依次表示行号、客户Id、姓氏、信用积分、地理位置、性别、年龄、开户时长、账户余额、产品数量、有无信用卡、是否活跃、收入估计、是否流失(即目标变量)。为了便于后续处理,对字段重新排列,将目标变量放在首列,并去除无用字段。显然其中行号、客户Id、姓氏对流失情况的分析预测意义不大,可以忽略,其余字段可分为分类变量和数值变量,在数据处理环节再做变换等操作。另外,剔除少量异常数据。

    1.2 流失率与分类变量

    从数据中不难得知流失率为20.4%,接下来先对分类变量做初步探索,为了便于观察流失占比,这里采用饼图,饼图大小代表用户数量,橙、蓝分别代表流失、留存用户:
    在这里插入图片描述

    按性别分,女性用户少于男性用户数量,但流失率更高。建议银行提升女性的用户体验,考虑到女性消费能力很强,可以考虑和商家联手推出倾向女性顾客的优惠活动。按有无信用卡分,有信用卡者明显居多,有信用卡的两类群体中流失率略低。按国家分,法国用户数量最多,德国用户与西班牙用户数量相近,但德国用户流失率远高于其他两国,建议对德国的客户管理情况做进一步深入调研。按照活跃度分,不活跃用户流失率远高于活跃用户,因此活跃度是个需要重点关注和提升的指标。

    1.3 流失率与数值变量

    下面继续观察下数值变量的分布情况,如图:
    在这里插入图片描述
    从账户余额看,余额在10万-15万之间的较高余额用户流失率很高,这势必会对银行业务造成不小损失,值得重点关注。从年龄看,用户多分布在年龄在25-50岁之间,年龄较长的客户(45-65岁)流失率非常高,因而在采取挽留策略时需要视不同的年龄划分而定。从信用积分看,信用积分分布在600-700分之间的客户最多,流失的客户数量也最多。从开户时长看,用户的开户时长主要为1-9年,且开户1-9年的这些客户开户时长频数分布比较均匀,流失率没有明显差异;然而开户时间短于1年或者高于9年的用户有更高的流失风险,可以考虑优化新客户的开发和挽留策略。从产品数量看,拥有产品数为1、2的客户数量最多,且有2个产品的用户流失率低于拥有1个产品的用户,可以考虑提升产品的吸引力,增强用户黏度。从收入看,用户收入多在2万-18万间,且用户数量和流失率在此区间分布较为均匀,事实上社会中人群的收入分布并不是如此均匀,这表明有大量的潜在客户可以开发。

    2.数据处理

    2.1 删除字段

    前文已提到行号、客户Id、姓氏可以忽略,这里我们将这三个字段剔除。

    2.2 新增字段

    除了存款和收入,客户将多少比例的收入存到银行同样是个重要的考量参数,因此新增一个特征:存款收入比,即存款/收入。所有客户的存款收入比均大于零,且存款收入比越高,越容易流失。
    在这里插入图片描述

    2.3 处理缺失值、异常值

    数据无需处理缺失值,省略。至于异常值不止一两个,且对流失情况预测可能有一定意义,选择暂不处理。

    2.4 转换分类变量

    分类变量的种类较少,可直接选用独热编码来处理性别和国家,所用函数为pd. get_dummies()。

    2.5 归一化数值变量

    在归一化数值变量前先随机将80%数据划分为训练集,余下20%为测试集。然后对数值变量分别归一化,变换方法如下:
    df_train[col1] = (df_train[col1]-col1_min)/(col1_max-col1_min)
    顺便提下,在模型训练时,测试集属于外来数据,应该和训练集完全分开,如果直接对所有数据进行归一化,测试集的数据可能给训练集的特征范围等带来影响,进而影响模型效果。

    3. 模型拟合和选取

    3.1 模型调用

    将目标变量提取出来,命名为y_train, y_test,余下变量则命名为X_train,X_test。采用决策树、KNN近邻、支持向量机(SVM)几种常用的算法训练模型,并选取最优算法。
    这里涉及参数多采用sklearn中的默认参数,以简化工作。当然,随着对机器学习的了解深入,可以通过调参、模型融合等方式进一步提升预测效果。

    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.svm import SVC
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.metrics import accuracy_score
    
    model = [KNeighborsClassifier(), SVC(), DecisionTreeClassifier()]
    model_names = ["KNN", "SVM", "Decision tree"]
    for i in range(0, 3):
        y_pred = model[i].fit(X_train, y_train).predict(X_test)
        accuracy = accuracy_score(y_pred, y_test)*100
        print(model_names[i], ":", accuracy, "%")
    
    3.2 最佳预测模型

    三种模型在测试集中的预测准确率分别如下:
    在这里插入图片描述

    发现支持向量机SVM模型的效果最好,故选取该模型。对测试集的预测准确率达84.2%,可以推测用该模型对银行客户流失情况预测具有一定准确率,预测结果具备重要的参考价值。

    3.3 预测模型意义

    银行客户流失情况预测模型的建立,能够给银行业务提供有效的预警。对有流失倾向的客户做出标记,能使银行在客户管理和策略制定上更有针对性,用较低成本实现客户挽留率的改善,减少客户流失带来的损失。

    展开全文
  • 通过分析银行客户流失的原因,提出了建立客户流失预测模型的方法。利用模型,发现预测流失 群体,预测流失趋势,进而制定有效的控制策略,最大限度地降低客户流失率。为客户流失预测提供了一种新的研究思路和分析...
  • Python 银行信用卡客户流失预测(kaggle)

    千次阅读 多人点赞 2020-12-08 08:08:00
    1.背景越来越多的客户不再使用信用卡服务,银行的经理对此感到不安。如果有人能为他们预测哪些客户即将流失,他们将不胜感激,因为这样他们可以主动向客户提供更好的服务,并挽回这些即将流失客户...
  • 现在银行产品同众化现象普遍存在,客户选择产品和服务的途径越来越多,客户对产品的忠诚度越来越低,所以客户流失已经成为银行业最关注的问题之一。而获得新客的成本远高于维护老客户成本。因此,从海量客户交易数据...
  • Churn-Prediction-of-Bank-Customers:预测银行客户流失
  • 分类问题属于机器学习...在本文中,鉴于银行客户的某些特征,我们将预测客户在6个月后是否可能离开银行。客户离开组织的现象也称为客户流失。因此,我们的任务是根据各种客户特征预测客户流失。 $ pip ins...
  • 机器学习分类模型可预测银行客户流失。 嗨,访客们! 我是数据科学的新手,但我正在通过使用在线可用数据集将所有学习实践付诸实践。 我已经使用Python生成了机器学习分类模型! 我仍在学习,随着我学到更多,我...
  • 流失预测是个重要的业务,通过预测哪些客户可能取消对服务的订阅来最大限度地减少客户流失。虽然最初在电信行业使用,但它已经成为银行,互联网服务提供商,保险公司和其他垂直行业的通用业务。 预测过程是大规模...
  • 银行客户数据进行数据分析,以预测客户流失的原因,并提供防止这种情况的建议。 数据集:Churn_Modelling.csv 记录数:10,000 功能数量:14 使用的图书馆:pandas,matplotlib,numpy,seaborn
  • 银行流失用户分析及预测模型

    万次阅读 多人点赞 2018-08-24 22:20:08
    银行客户流失是指银行的客户终止在该行的所有业务,并销号。但在实际运营中,对于具体业务部门,银行客户流失可以定位为特定的业务终止行为。 商业银行的客户流失较为严重,流失率可达20%。而获得新客的成本是维护...
  • 2. 从用户生命周期分析客户流失的可能影响因素 5 3. 确定初选变量 6 (二) 预测变量与目标变量的相关性 7 1. 分类变量的直方图检验 7 2. 分类变量的卡方检验 11 3. 连续变量与目标变量的相关性...
  • 要介绍GBDT之前,先介绍一个基础成员,决策树。 什么是决策树?...实际预测时,在内部节点使用某一属性值判断,根据判断结果决定进入哪一个分支,直到达到叶子节点,得到分类结果。 决策树学习的三个
  • 很多人估计还不清楚数据挖掘的目的是什么,其实数据挖掘的两大目的就是是预测和描述数据,其中前者的计算机建模及实现过程通常被称为监督学习(supervised learning) ,后者的则通常被称为无监督学习(supervised ...
  • 本实战课程通过一个详细的动手实验帮助你使用IBM Watson Studio构建一个银行业中常见的预测客户流失的模型。通过动手实验,你将会掌握如何使用Python创建SK-Learn模型,以及如何使用可视化的画布模式训练模型。
  • 这篇文章中,我们将通过集成学习家族中的重要武器——**随机森林算法**来预测银行客户是否会流失。 该项目的具体需求是根据已知的一批客户数据来预测某个银行的客户是否会流失。通过学习历史数据,如果机器能够判断...
  • 在此业务案例研究中,我们预测银行客户流失率。 为了了解银行的客户,我们将使用一种深度学习技术,即人工神经网络(ANN)。从数百万的客户中,我们随机选择了1万个客户。 我们将使用客户的特征来确定他/她离开...
  • 用户流失已经成为产品运营的一项重要KPI“全球有50%的用户已经更换或者正准备更换他们...用户流失及用户参与度已成为大多数银行一项最重要议题有研究表明:”发展一个新客户的成本是维护一个老客户的3-8倍,一个老客...
  • 极端值也称离群值,可能会影响模型精度,进而影响预测结果。 极端值对于不同的模型,影响不同,虽然处理极端值并不是数据预处理的必经流程,但是我们需要知道极端值的存在对最终结果的影。 一般回归模型对极端值非常...
  • 贷中策略除了跟调额、营销相关外,与客户流失相关及营销相关的还有一个客户流失预测模型,是我们全流程中必不可少的一个客群分析。 目前,银行都面临着极大的优质客户流失的危险。这将对银行经营和效益产生极大的...
  • 使用监督机器学习预测商业银行保留(流失)率 描述 该项目应用监督的机器学习技术来开发预测模型,该模型... 如果您是经验丰富的银行客户,银行可能会就保留优惠与您联系。 银行向客户提供各种金融优惠,以防止他们离开
  • 银行客户流失预测 欢迎来到我的有关银行客户流失预测的数据科学项目。 探索,处理和利用了一个真实的数据集,该数据集具有针对银行的10,000个客户的用户特征和行为特征,并用于训练机器学习模型来预测流失概率。 ...
  • 该存储库将具有完整的基于机器学习和深度学习的银行客户流失预测ANN模型,该模型将分析客户离开的可能性。 该项目已部署在Google Cloud Platform上,并在Localhost上进行了完全测试。 项目描述 欢迎屏幕 主欢迎...
  • 该存储库将具有完整的基于机器学习和深度学习的银行客户流失预测ANN模型,该模型将分析客户离开的可能性。 该项目已部署在Google Cloud Platform上,并在Localhost上进行了完全测试。 项目描述 欢迎屏幕 主欢迎...
  • 深度学习资料集合:(1.1.1)--神经网络基础.pdf,(1.4.1)--银行客户流失预测.pdf,(2.1.1)--深度学习应用概况.pdf,(3.1.1)--卷积神经网络基础.pdf,(3.11.1)--卷积笔记.pdf,(4.1.1)--卷积神经网络算法.pdf,(4.7.1)...
  • 现在,该银行近来一直在经历快速的客户流失。 这意味着客户以异常高的速度离开银行,管理层希望找出问题所在,以及如何做才能留住客户。 我使用称为Gretl的软件工具完成了该项目的原型。 但是在这里,我将使用...

空空如也

空空如也

1 2 3
收藏数 54
精华内容 21
关键字:

银行客户流失预测