精华内容
下载资源
问答
  • 这是在银行中基于客户流失预测的随机森林分类器的一种简单而现实的问题解决方案。 该模型采用经过预处理的数据集,并在训练集上进行训练,然后在测试数据集上进行预测,准确度约为85%。 对于一家银行来说,与特定...
  • 通过分析银行客户流失的原因,提出了建立客户流失预测模型的方法。利用模型,发现预测流失 群体,预测流失趋势,进而制定有效的控制策略,最大限度地降低客户流失率。为客户流失预测提供了一种新的研究思路和分析...
    [摘要] 客户流失是竞争日益激烈的市场中银行面临的一大难题。通过分析银行客户流失的原因,提出了建立客户流失预测模型的方法。利用模型,发现预测流失 群体,预测流失趋势,进而制定有效的控制策略,最大限度地降低客户流失率。为客户流失预测提供了一种新的研究思路和分析方法。  
      [关键词] 客户流失流失预测模型数据挖掘  
       随着我国加入WTO,国内银行正酝酿着有史以来最为深刻的变革,不仅面临着同业之间的激烈竞争,还有来自非同业与国外银行的激烈竞争。随着竞争的日趋激 烈,在行业中获得一个新客户的开支越来越大,因而保持原有客户、防止客户流失的工作也越来越有价值。客户已成为银行至关重要的商业资源。目前国内对客户流 失的研究主要集中在提供个性化服务、实行“一对一”营销,以吸引客户,提高客户忠诚度上,但这不能从根本上解决问题。本文探讨的是直接对客户流失数据进行 建模,通过对当前客户数据库中的客户基本信息及客户的行为数据进行分析,建立客户流失预测模型。利用该模型,发现预测流失群体,预测流失趋势,进而制定有 效的控制策略,最大限度地降低客户流失率。  
        
      一、客户流失原因分析  
        
      1.客户流失的类型。所谓客户流失是指客户不再重复购买,或终止原先使用的服务。导致银行客户流失的具体原因有很多,通常根据客户流失原因可将流失客户分成以下几种类型:  
       (1)自然流失。这种类型的客户流失不是人为因素造成的,比如客户的搬迁和死亡等。这样的客户流失是不可避免的,应该在弹性流失范围之内。自然流失所占 的比例很小,银行可以通过提供网上服务等方式,让客户在任何地方、任何时候都能方便快捷地使用银行的产品和服务,减少自然流失的发生。  
       (2)竞争流失。由于竞争对手的影响而造成的流失称为竞争流失。竞争突出表现在价格战和服务战上。如:客户找到了收益更高的产品而转移购买;竞争对手服务 质量的提高;竞争对手产品技术手段的更新而使客户转向购买技术更先进的替代产品,等等,这些都可导致客户的流失。  
      (3)过失流失。过失 流失是由于银行自身工作中的过失引起客户的不满意而造成的。比如,企业形象不佳、服务态度恶劣,客户对银行的产品和服务质量感到不满,并通过直接或间接的 渠道投诉却得不到解决,这些都会使客户转而投向竞争对手。过失流失在客户流失总量中所占的比例较高,但同时也是企业可以通过采取一些有效手段来防止的。  
      2.客户流失原因分析。有市场竞争就有市场退出,在银行之间的竞争过程中,原有客户的流失相当正常,关键在于必须找到客户流失的原因,进而制定有效的控制策略。导致客户流失的因素主要有以下几种:  
       (1)金融服务品种单一。在同等的外部条件下,银行的竞争力取决于每一家银行所能提供的业务品种和服务手段。金融服务产品的相对单一,不能随时根据市场 变化和用户需求,推出新的金融服务品种和调整金融发展战略,必然导致客户的流失。因此完善金融服务品种和手段、提供实时创新的金融产品和增加个性化服务品 种有利于银行固定一批优质客户,降低银行的客户流失率。  
      (2)服务与客户关怀不够。客户的流失或保留取决于对产品或服务的评价,客户的 抱怨和询问如果不能得到妥善的处理会造成他们的离去。要建立多种渠道反馈客户对产品和服务的意见,让他们感觉到自己受到了尊重。这样做不仅可以提高客户的 满意度和忠诚度,而且还能从客户那里收集到免费的建议,以便不断改善银行的产品和服务。银行应将投诉看作是完善企业服务的捷径。  
      (3)银行内部员工的流失。银行内部员工的流失,可能导致和它长期保持联系的重要客户的流失。频繁的员工流动不仅增加了银行员工培训的成本,还会使客户不得不重新认识和熟悉新的接触对象,这可能增加了他们的不适而导致流失的发生。  
      (4)不注重企业形象。良好的企业形象会增加客户的信赖感。银行应该在各方面尽量避免产生负面的社会影响,以优质的产品和多元化的服务、良好的企业文化、完善的售后服务机制和积极进取的企业目标来赢得客户的信赖,从而减少流失的发生。  
        
      二、客户流失预测模型的建立  
        
       客户流失是一种理性消费的选择,它的发生具有非常明显的因果关系,这种因果关系往往体现在过去的消费记录中。建立客户流失预测模型就是通过对流失客户的 数据进行分析后得出的,包括基本模型和行为模型。建立客户流失基本模型的目的是找出描述客户的基本数据与客户流失之间的关联,发现描述流失客户基本特征的 关键属性集合。市场营销部门可以根据流失基本模型随时监控客户流失的可能性,如果客户流失的可能性高于事先划定的一个限度,就可以通过多种促销手段提高客 户的忠诚度,防止客户流失的发生,从而可以大大降低客户的流失率;建立客户流失的行为模型,则可识别出流失客户的典型行为,以此用作流失趋势的预测,进而 制定有效的控制策略。  
      客户流失模型的建立和应用过程如下:  
      1.数据采样。从银行的各业务数据库中采集样本数据。数据选 择包括目标变量的选择、输入变量的选择和建模数据的选择等多个方面。目标变量的选择:在客户流失分析系统中,实际面对的流失主要有账户取消发生的流失和账 户休眠发生的流失两种形式。对于不同的流失形式,我们需要选取不同的目标变量。输入变量的选择:输入变量用于在建模时作为自变量寻找与目标变量之间的关 联。在选择输入变量时,我们通常选择两类数据:静态数据和动态数据。静态数据指的是通常不会经常改变的数据,包括客户的基本信息(如性别,年龄,婚姻状 况,职业,居住地区等)。动态数据指的是经常或定期改变的数据,如每月存取记录、消费金额、消费特征等等。建模数据的选择:由于银行客户的流失主要是自然 流失、竞争流失和过失流失三种,自然流失是由于客户的迁徙等原因导致的客户流失,而竞争流失和过失流失是竞争对手的优惠政策和客户对目前的服务不满意而导 致的客户流失,显然第二、三种流失的客户才是银行真正关心的,对银行具有挽留价值的客户。因此,我们在选择建模数据时必须选择第二、三种流失的客户数据参 与建模,才能建立出较精确的模型。  
      2.数据分析与建模。数据分析就是对采样后的数据进行初步分析,试图寻找出不同变量之间的关联度,以 及不同变量对于客户流失的影响程度。并非所有输入变量都是同样的重要,部分因子可能同客户流失无关,删除那些和客户流失概率相关性不大的变量,减少建模变 量的数量。这样不仅可以缩短建立模型的时间,减小模型的复杂程度,而且可使建立的模型更加精确。  
      建立客户流失模型,必须遵循数据挖掘模 型的建立与分析方法。运用相关的数据挖掘工具,数据挖掘工具能够提供包括决策树、贝叶斯判别、神经网络、近邻学习、回归、关联、聚类等多种建模方法。通过 使用多种建模方法,预建立多个模型,再比较这些模型的优劣,从而选择出最适合客户流失分析的建模方法。整个建模过程实际上是一个不断循环的过程,一个模型 分析的结果可能是另一个模型的输人变量。  
      3.模型的评估及应用。一个模型在建立之后,需要用大量的数据对其进行评估和验证。只有经过实 际数据检验并被证明正确的模型才能得到充分的相信。模型的验证是数据挖掘成败的关键,不但要验证流失模型的过程正确,同时使用这些模型的其他输入和输出过 程也要正确。验证的方法是在建模之前,我们把样本数据分为两部分:三分之二的数据用来建模,三分之一的数据用来评估和验证。输入用于检验的样本数据,比较 通过该模型数据挖掘得到结果与已知历史结果的差异,如果差异很大,就要考虑改进模型或重新建立新的模型。
    一旦模型确定后,即可以应用于当前的客户和业务活动中。通过客户流失基本特征模型在当前客户数据库中发现预测流失的群体;运用客户流失行为模型对当前客户数据库中客户的行为进行分析,预测流失趋势。进而制定有效的控制策略,以防止和减少客户的流失。  
        
      三、客户流失预测  
        
      建立客户流失模型的目的就是为了发现预测流失的目标群体和预测流失趋势。识别流失控制的目标群体,是银行客户流失预测的首要任务,为了识别流失控制的目标群体,必须引入客户价值分析,客户价值分析的意义在于:  
       1.对任何银行来说,不同的客户带来不同的利润回报,具有不同的价值。银行应当不再简单地追求客户数量,而应是更多地寻求客户的质量。客户价值分析可以 帮助企业找到最有价值的客户群体。在银行的业务数据库中有三个要素能够作为客户价值分析的重要指标,这三个要素是:最近一次购买、购买频率和购买金额。最 常购买的客户也是满意度最高的客户,增加客户购买的次数意味着从竞争对手处抢占了更多的市场占有率。  
      2.任何银行的资源都是有限的,为 了在维持低成本的前提下获得高回报,银行要将有限的资源向重点客户倾斜。而实现这些策略的前提是对客户进行价值分析,了解客户的价值差异。按照客户价值以 及其在所有客户中所占的比例,可将客户在价值维度上划分为VIP客户(大约占1%)、主要客户(约占4%)、普通客户(约占15%)和小客户(剩余 80%)。针对不同的客户细分群采取差异化的服务策略,以减少客户流失率。  
      确定了流失控制的目标群体,客户流失预测的第二个任务就是,银行应根据客户流失的行为模型,跟踪和发现客户的流失趋势,及早采取预防措施,最大限度地降低客户流失率。面对激烈的市场竞争,银行一般可以采取3种策略:  
      (1)进攻策略:集中力量,发挥自身优势,主动发起攻势。加大科技投入,开发技术含量更高的产品,最大限度的满足客户需求,使客户的收益最大化,从而在保留住自己现有的客户的基础上,增加市场份额,去吸引和争取新的客户,抢夺竞争对手的用户。  
       (2)防守策略:如果企业自身能力有限,就应当努力提高服务水平和质量,采取优惠政策,尽量保持和巩固现有市场。防守策略有两个基本形式:提高用户满意 程度,一个满意的顾客会引发8笔潜在的生意,其中至少有1笔成交,而一个不满意的顾客会影响25个人的购买意愿;设置转变壁垒 (Switching Barriers),所谓转变壁垒是指,用户转变到竞争对手的银行时,用户需要付出成本。  
      (3)撤退策略:对某一产品或服务,如果银行通过市场分析或前景预测,感到前景对自己不利,就干脆放弃这种产品或服务品种,以腾出资源开发新产品、占领新市场。  
        
      四、结束语  
        
       客户流失的根源在于市场竞争,通过建立流失预测模型,使银行能从源头上控制客户流失,防患于未然,从而有效的防止客户流失。在日益激烈的市场竞争中,防 范客户流失不是银行经营中亡羊补牢式的被动行为,而应是贯穿银行经营管理始终的营销策略,防范客户流失同开发新市场、发展新客户具有同等重要的意义,甚至 从营销效率考虑,防范客户流失比发展新客户更经济。  
    展开全文
  • 银行客户流失预测

    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

    展开全文
  • 分类问题属于机器学习...在本文中,鉴于银行客户的某些特征,我们将预测客户在6个月后是否可能离开银行。客户离开组织的现象也称为客户流失。因此,我们的任务是根据各种客户特征预测客户流失。 $ pip ins...

    原文链接:http://tecdat.cn/?p=8522

    原文出处:拓端数据部落公众号

     分类问题属于机器学习问题的类别,其中给定一组特征,任务是预测离散值。分类问题的一些常见示例是,预测肿瘤是否为癌症,或者学生是否可能通过考试。在本文中,鉴于银行客户的某些特征,我们将预测客户在6个月后是否可能离开银行。客户离开组织的现象也称为客户流失。因此,我们的任务是根据各种客户特征预测客户流失。

    
     $ pip install pytorch
    

    数据集

    让我们将所需的库和数据集导入到我们的Python应用程序中:

    
    import torch
    import torch.nn as nn
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    %matplotlib inline
    

    我们可以使用pandas库的read_csv()方法来导入包含我们的数据集的CSV文件。

    
    dataset = pd.read_csv(r'E:Datasets\customer_data.csv')
    

    让我们输出数据集 :

    
    dataset.shape
    

    输出:

    
    (10000, 14)
    

    输出显示该数据集具有1万条记录和14列。我们可以使用head()数据框的方法来输出数据集的前五行。

    
    dataset.head()
    

    输出:

    您可以在我们的数据集中看到14列。根据前13列,我们的任务是预测第14列的值,即Exited。 

    探索性数据分析

    让我们对数据集进行一些探索性数据分析。我们将首先预测6个月后实际离开银行并使用饼图进行可视化的客户比例。让我们首先增加图形的默认绘图大小:

    
    fig_size = plt.rcParams["figure.figsize"]
    fig_size[0] = 10
    fig_size[1] = 8
    plt.rcParams["figure.figsize"] = fig_size
    

    以下脚本绘制该Exited列的饼图。

    
    dataset.Exited.value_counts().plot(kind='pie', autopct='%1.0f%%', colors=['skyblue', 'orange'], explode=(0.05, 0.05))
    

    输出:

    输出显示,在我们的数据集中,有20%的客户离开了银行。这里1代表客户离开银行的情况,0代表客户没有离开银行的情况。让我们绘制数据集中所有地理位置的客户数量:

    输出显示,几乎一半的客户来自法国,而西班牙和德国的客户比例分别为25%。

    现在,让我们绘制来自每个唯一地理位置的客户数量以及客户流失信息。我们可以使用库中的countplot()函数seaborn来执行此操作。

    输出显示,尽管法国客户总数是西班牙和德国客户总数的两倍,但法国和德国客户离开银行的客户比例是相同的。同样,德国和西班牙客户的总数相同,但是离开银行的德国客户数量是西班牙客户的两倍,这表明德国客户在6个月后离开银行的可能性更大。

    数据预处理

    在训练PyTorch模型之前,我们需要预处理数据。如果查看数据集,您将看到它具有两种类型的列:数值列和分类列。数字列包含数字信息。CreditScoreBalanceAge等。类似地,GeographyGender是分类列,因为它们含有分类信息,如客户的位置和性别。有几列可以视为数字列和类别列。例如,该HasCrCard列的值可以为1或0。但是,那HasCrCard列包含有关客户是否拥有信用卡的信息。 

    让我们再次输出数据集中的所有列,并找出哪些列可以视为数字列,哪些列应该视为类别列。columns数据框的属性显示所有列名称:

    Index(['RowNumber', 'CustomerId', 'Surname', 'CreditScore', 'Geography', 'Gender', 'Age', 'Tenure', 'Balance', 'NumOfProducts', 'HasCrCard', 'IsActiveMember', 'EstimatedSalary', 'Exited'], dtype='object')

    从我们的数据列,我们将不使用的RowNumberCustomerId以及Surname列,因为这些列的值是完全随机的,并与输出无关。例如,客户的姓氏对客户是否离开银行没有影响。其中列的其余部分,GeographyGenderHasCrCard,和IsActiveMember列可以被视为类别列。让我们创建这些列的列表: 除该列外,其余所有列均可视为数字列。

    
    numerical_columns = ['CreditScore', 'Age', 'Tenure', 'Balance', 'NumOfProducts', 'EstimatedSalary']
    

    最后,输出(Exited列中的值)存储在outputs变量中。

    我们已经创建了分类,数字和输出列的列表。但是,目前,分类列的类型不是分类的。您可以使用以下脚本检查数据集中所有列的类型:
    输出:

    
    RowNumber            int64
    CustomerId           int64
    Surname             object
    CreditScore          int64
    Geography           object
    Gender              object
    Age                  int64
    Tenure               int64
    Balance            float64
    NumOfProducts        int64
    HasCrCard            int64
    IsActiveMember       int64
    EstimatedSalary    float64
    Exited               int64
    dtype: object
    

    您可以看到GeographyGender列的类型是object,HasCrCardIsActive列的类型是int64。我们需要将分类列的类型转换为category。我们可以使用astype()函数来做到这一点,

    现在,如果再次绘制数据集中各列的类型,您将看到以下结果:

    输出量

    
    RowNumber             int64
    CustomerId            int64
    Surname              object
    CreditScore           int64
    Geography          category
    Gender             category
    Age                   int64
    Tenure                int64
    Balance             float64
    NumOfProducts         int64
    HasCrCard          category
    IsActiveMember     category
    EstimatedSalary     float64
    Exited                int64
    dtype: object
    

    现在让我们查看Geography列中的所有类别:

    Index(['France', 'Germany', 'Spain'], dtype='object')
    

    当您将列的数据类型更改为类别时,该列中的每个类别都会分配一个唯一的代码。例如,让我们绘制列的前五行,Geography并输出前五行的代码值:

    输出:

    
    0    France
    1     Spain
    2    France
    3    France
    4     Spain
    Name: Geography, dtype: category
    Categories (3, object): [France, Germany, Spain]
    

    以下脚本在该列的前五行中绘制了值的代码Geography

    输出:

    
    0    0
    1    2
    2    0
    3    0
    4    2
    dtype: int8
    

    输出显示法国已编码为0,西班牙已编码为2。

    将分类列与数字列分开的基本目的是,可以将数字列中的值直接输入到神经网络中。但是,必须首先将类别列的值转换为数字类型。分类列中的值的编码部分地解决了分类列的数值转换的任务。

    由于我们将使用PyTorch进行模型训练,因此需要将分类列和数值列转换为张量。首先让我们将分类列转换为张量。在PyTorch中,可以通过numpy数组创建张量。我们将首先将四个分类列中的数据转换为numpy数组,然后将所有列水平堆叠,如以下脚本所示:

    
    geo = dataset['Geography'].cat.codes.values
    ...
    

    上面的脚本输出分类列中前十条记录。输出如下:输出:

    
    array([[0, 0, 1, 1],
           [2, 0, 0, 1],
           [0, 0, 1, 0],
           [0, 0, 0, 0],
           [2, 0, 1, 1],
           [2, 1, 1, 0],
           [0, 1, 1, 1],
           [1, 0, 1, 0],
           [0, 1, 0, 1],
           [0, 1, 1, 1]], dtype=int8)
    

    现在要从上述numpy数组创建张量,您只需将数组传递给模块的tensortorch

    输出:

    
    tensor([[0, 0, 1, 1],
            [2, 0, 0, 1],
            [0, 0, 1, 0],
            [0, 0, 0, 0],
            [2, 0, 1, 1],
            [2, 1, 1, 0],
            [0, 1, 1, 1],
            [1, 0, 1, 0],
            [0, 1, 0, 1],
            [0, 1, 1, 1]])
    

    在输出中,您可以看到类别数据的numpy数组现在已转换为tensor对象。同样,我们可以将数值列转换为张量:

    
    
    numerical_data = np.stack([dataset[col].values for col in numerical_columns], 1)
    ...
    

    输出:

    
    tensor([[6.1900e+02, 4.2000e+01, 2.0000e+00, 0.0000e+00, 1.0000e+00, 1.0135e+05],
            [6.0800e+02, 4.1000e+01, 1.0000e+00, 8.3808e+04, 1.0000e+00, 1.1254e+05],
            [5.0200e+02, 4.2000e+01, 8.0000e+00, 1.5966e+05, 3.0000e+00, 1.1393e+05],
            [6.9900e+02, 3.9000e+01, 1.0000e+00, 0.0000e+00, 2.0000e+00, 9.3827e+04],
            [8.5000e+02, 4.3000e+01, 2.0000e+00, 1.2551e+05, 1.0000e+00, 7.9084e+04]])
    

    在输出中,您可以看到前五行,其中包含我们数据集中六个数字列的值。最后一步是将输出的numpy数组转换为tensor对象。输出:

    
    tensor([1, 0, 1, 0, 0])
    

    现在,让我们绘制分类数据,数值数据和相应输出的形状: 输出:

    
    torch.Size([10000, 4])
    torch.Size([10000, 6])
    torch.Size([10000])
    

    在训练模型之前,有一个非常重要的步骤。我们将分类列转换为数值,其中唯一值由单个整数表示。例如,在该Geography列中,我们看到法国用0表示,德国用1表示。我们可以使用这些值来训练我们的模型。但是,更好的方法是以N维向量的形式表示分类列中的值,而不是单个整数。

    我们需要为所有分类列定义矢量大小。关于维数没有严格的规定。定义列的嵌入大小的一个好的经验法则是将列中唯一值的数量除以2(但不超过50)。例如,对于该Geography列,唯一值的数量为3。该Geography列的相应嵌入大小将为3/2 = 1.5 = 2(四舍五入)。以下脚本创建一个元组,其中包含所有类别列的唯一值数量和维度大小:

    
    categorical_column_sizes = [len(dataset[column].cat.categories) for column in categorical_columns]
    ...
    

    输出:

    
    [(3, 2), (2, 1), (2, 1), (2, 1)]
    

    使用训练数据对监督型深度学习模型(例如我们在本文中开发的模型)进行训练,并在测试数据集上评估模型的性能。因此,我们需要将数据集分为训练集和测试集,如以下脚本所示:

    
    total_records = 10000
    ....
    

    我们的数据集中有1万条记录,其中80%的记录(即8000条记录)将用于训练模型,而其余20%的记录将用于评估模型的性能。注意,在上面的脚本中,分类和数字数据以及输出已分为训练集和测试集。为了验证我们已正确地将数据分为训练和测试集:

    
    print(len(categorical_train_data))
    print(len(numerical_train_data))
    print(len(train_outputs))
    
    print(len(categorical_test_data))
    print(len(numerical_test_data))
    print(len(test_outputs))
    

    输出:

    
    8000
    8000
    8000
    2000
    2000
    2000
    
    

    创建预测模型

    我们将数据分为训练集和测试集,现在是时候定义训练模型了。为此,我们可以定义一个名为的类Model,该类将用于训练模型。看下面的脚本:

    
    class Model(nn.Module):
    
        def __init__(self, embedding_size, num_numerical_cols, output_size, layers, p=0.4):
            super().__init__()
            self.all_embeddings = nn.ModuleList([nn.Embedding(ni, nf) for ni, nf in embedding_size])
            self.embedding_dropout = nn.Dropout(p)
            self.batch_norm_num = nn.BatchNorm1d(num_numerical_cols)
    
    
    
            return x
    
    
    

    接下来,要查找输入层的大小,将类别列和数字列的数量加在一起并存储在input_size变量中。之后,for循环迭代,并将相应的层添加到all_layers列表中。添加的层是:

    • Linear:用于计算输入和权重矩阵之间的点积
    • ReLu:用作激活函数
    • BatchNorm1d:用于对数字列应用批量归一化
    • Dropout:用于避免过拟合

    在后for循环中,输出层被附加到的层的列表。由于我们希望神经网络中的所有层都按顺序执行,因此将层列表传递给nn.Sequential该类。

    接下来,在该forward方法中,将类别列和数字列都作为输入传递。类别列的嵌入在以下几行中进行。

    embeddings = []
    ...

    数字列的批量归一化可通过以下脚本应用:

    x_numerical = self.batch_norm_num(x_numerical)
    

    最后,将嵌入的分类列x和数字列x_numerical连接在一起,并传递给sequence layers

    训练模型

    要训​​练模型,首先我们必须创建Model在上一节中定义的类的对象。

    您可以看到我们传递了分类列的嵌入大小,数字列的数量,输出大小(在我们的例子中为2)以及隐藏层中的神经元。您可以看到我们有三个分别具有200、100和50个神经元的隐藏层。
    让我们输出模型并查看:

    
    print(model)
    

    输出:

    
    Model(
      (all_embeddings): ModuleList(
     ...
      )
    )
    

    您可以看到,在第一线性层中,in_features变量的值为11,因为我们有6个数字列,并且类别列的嵌入维数之和为5,因此6 + 5 = 11。out_features的值为2,因为我们只有2个可能的输出。

    在实际训练模型之前,我们需要定义损失函数和将用于训练模型的优化器。以下脚本定义了损失函数和优化器:

    
    loss_function = nn.CrossEntropyLoss()
    

    现在,我们训练模型。以下脚本训练模型:

    
    epochs = 300
    aggregated_losses = []
    
    for i in range(epochs):
    
    
    print(f'epoch: {i:3} loss: {single_loss.item():10.10f}')
    

    神经元元数设置为300,这意味着要训练模型,完整的数据集将使用300次。for为每次迭代期间循环的执行方式,损失是使用损耗函数来计算。每次迭代过程中的损失将添加到aggregated_loss列表中。

    上面脚本的输出如下:

    epoch:   1 loss: 0.71847951
    epoch:  26 loss: 0.57145703
    epoch:  51 loss: 0.48110831
    epoch:  76 loss: 0.42529839
    epoch: 101 loss: 0.39972275
    epoch: 126 loss: 0.37837571
    epoch: 151 loss: 0.37133673
    epoch: 176 loss: 0.36773482
    epoch: 201 loss: 0.36305946
    epoch: 226 loss: 0.36079505
    epoch: 251 loss: 0.35350436
    epoch: 276 loss: 0.35540250
    epoch: 300 loss: 0.3465710580
    

    以下脚本绘制了各个时期的损失函数:

    plt.plot(range(epochs), aggregated_losses)
    plt.ylabel('Loss')
    plt.xlabel('epoch');
    

    输出:

    输出显示,最初损失函数迅速降低。在250个步长之后,损失几乎没有减少。

    做出预测

    最后一步是对测试数据进行预测。为此,我们只需要将categorical_test_datanumerical_test_data传递给model该类。然后可以将返回的值与实际测试输出值进行比较。以下脚本对测试类进行预测,并输出测试数据的交叉熵损失。

    
    with torch.no_grad():
    ...
    

    输出:

    
    Loss: 0.36855841
    

    测试集上的损失为0.3685,比训练集上获得的0.3465略多,这表明我们的模型有些过拟合。由于我们指定输出层将包含2个神经元,因此每个预测将包含2个值。例如,前5个预测值如下所示:

    
    print(y_val[:5])
    

    输出:

    
    tensor([[ 1.2045, -1.3857],
            [ 1.3911, -1.5957],
            [ 1.2781, -1.3598],
            [ 0.6261, -0.5429],
            [ 2.5430, -1.9991]])
    

    这种预测的思想是,如果实际输出为0,则索引0处的值应大于索引1处的值,反之亦然。我们可以使用以下脚本检索列表中最大值的索引:

    
    y_val = np.argmax(y_val, axis=1)
    

    输出:现在让我们再次输出y_val列表的前五个值:

    
    print(y_val[:5])
    

    输出:

    
    tensor([0, 0, 0, 0, 0])
    

    由于在最初预测的输出列表中,对于前五个记录,零索引处的值大于第一索引处的值,因此可以在已处理输出的前五行中看到0。

    最后,我们可以使用从sklearn.metrics模块confusion_matrixaccuracy_score以及classification_report类找到了准确度,精密度和召回值,混淆矩阵。

    from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
    
    print(confusion_matrix(test_outputs,y_val))
    print(classification_report(test_outputs,y_val))
    print(accuracy_score(test_outputs, y_val))
    

    输出:

    [[1527   83]
     [ 224  166]]
                  precision    recall  f1-score   support
    
               0       0.87      0.95      0.91      1610
               1       0.67      0.43      0.52       390
    
       micro avg       0.85      0.85      0.85      2000
       macro avg       0.77      0.69      0.71      2000
    weighted avg       0.83      0.85      0.83      2000
    
    0.8465
    

    输出结果表明,我们的模型达到了84.65%的精度,考虑到我们随机选择神经网络模型的所有参数这一事实,这非常令人印象深刻。我建议您尝试更改模型参数,例如训练/测试比例,隐藏层的数量和大小等,以查看是否可以获得更好的结果。

    结论

    PyTorch是Facebook开发的常用深度学习库,可用于各种任务,例如分类,回归和聚类。本文介绍了如何使用PyTorch库对表格数据进行分类。


    最受欢迎的见解

    1.探析大数据期刊文章研究热点

    2.618网购数据盘点-剁手族在关注什么

    3.r语言文本挖掘tf-idf主题建模,情感分析n-gram建模研究

    4.python主题建模可视化lda和t-sne交互式可视化

    5.疫情下的新闻数据观察

    6.python主题lda建模和t-sne可视化

    7.r语言中对文本数据进行主题模型topic-modeling分析

    8.主题模型:数据聆听人民网留言板的那些“网事”

    9.python爬虫进行web抓取lda主题语义数据分析

    展开全文
  • CDA数据分析师 出品作者:真达、Mika数据:真达【导读】今天教大家如何用Python写一个电信用户流失预测模型。之前我们用Python写了员工流失预测模型,这次我们试试Python预测电信用户的流失。01、商业理解流失客户是...

    37d3d539b6003af30038e0b4e4e08e5b1238b6b1.jpeg?token=b4e7318b6118cec8f5d7ba2c7224a63e

    CDA数据分析师 出品

    作者:真达、Mika

    数据:真达

    【导读】

    今天教大家如何用Python写一个电信用户流失预测模型。之前我们用Python写了员工流失预测模型,这次我们试试Python预测电信用户的流失。

    01、商业理解

    流失客户是指那些曾经使用过产品或服务,由于对产品失去兴趣等种种原因,不再使用产品或服务的顾客。

    电信服务公司、互联网服务提供商、保险公司等经常使用客户流失分析和客户流失率作为他们的关键业务指标之一,因为留住一个老客户的成本远远低于获得一个新客户。

    预测分析使用客户流失预测模型,通过评估客户流失的风险倾向来预测客户流失。由于这些模型生成了一个流失概率排序名单,对于潜在的高概率流失客户,他们可以有效地实施客户保留营销计划。

    下面我们就教你如何用Python写一个电信用户流失预测模型,以下是具体步骤和关键代码。

    02、数据理解

    此次分析数据来自于IBM Sample Data Sets,统计自某电信公司一段时间内的消费数据。共有7043笔客户资料,每笔客户资料包含21个字段,其中1个客户ID字段,19个输入字段及1个目标字段-Churn(Yes代表流失,No代表未流失),输入字段主要包含以下三个维度指标:用户画像指标、消费产品指标、消费信息指标。字段的具体说明如下:

    d53f8794a4c27d1ef8a68368c81fe569dfc438ef.jpeg?token=6b7475ac3265776eb47a4f618b4980ca

    03、数据读入和概览

    首先导入所需包。

    # 数据处理

    import numpy as np

    import pandas as pd

    # 可视化

    import matplotlib.pyplot as plt

    import seaborn as sns

    import plotly as py

    import plotly.graph_objs as go

    import plotly.figure_factory as ff

    # 前处理

    from sklearn.preprocessing import LabelEncoder

    from sklearn.preprocessing import StandardScaler

    # 建模

    from sklearn.linear_model import LogisticRegression

    from sklearn.neighbors import KNeighborsClassifier

    from sklearn.tree import DecisionTreeClassifier

    from sklearn import tree

    from sklearn.ensemble import RandomForestClassifier

    from sklearn.naive_bayes import GaussianNB

    from sklearn.neural_network import MLPClassifier

    from sklearn.svm import SVC

    from lightgbm import LGBMClassifier

    from xgboost import XGBClassifier

    # 模型评估

    from sklearn.model_selection import train_test_split, GridSearchCV

    from sklearn.metrics import confusion_matrix, accuracy_score, classification_report

    from sklearn.metrics import roc_auc_score, roc_curve, scorer

    from sklearn.metrics import recall_score, precision_score, f1_score, cohen_kappa_score

    pd.set_option('display.max_columns', None)

    读入数据集

    df = pd.read_csv('./Telco-Customer-Churn.csv')

    df.head()

    11385343fbf2b21145bbc35b194a2d3f0dd78e64.jpeg?token=160acd7a63f883d5858e89fffc17dd16

    04、数据初步清洗

    首先进行初步的数据清洗工作,包含错误值和异常值处理,并划分类别型和数值型字段类型,其中清洗部分包含:

    OnlineSecurity、OnlineBackup、DeviceProtection、TechSupport、StreamingTV、StreamingMovies:错误值处理TotalCharges:异常值处理tenure:自定义分箱定义类别型和数值型字段# 错误值处理

    repl_columns = ['OnlineSecurity', 'OnlineBackup', 'DeviceProtection',

    'TechSupport','StreamingTV', 'StreamingMovies']

    for i in repl_columns:

    df[i] = df[i].replace({'No internet service' : 'No'})

    # 替换值SeniorCitizen

    df["SeniorCitizen"] = df["SeniorCitizen"].replace({1: "Yes", 0: "No"})

    # 替换值TotalCharges

    df['TotalCharges'] = df['TotalCharges'].replace(' ', np.nan)

    # TotalCharges空值:数据量小,直接删除

    df = df.dropna(subset=['TotalCharges'])

    df.reset_index(drop=True, inplace=True) # 重置索引

    # 转换数据类型

    df['TotalCharges'] = df['TotalCharges'].astype('float')

    # 转换tenure

    def transform_tenure(x):

    if x <= 12:

    return 'Tenure_1'

    elif x <= 24:

    return 'Tenure_2'

    elif x <= 36:

    return 'Tenure_3'

    elif x <= 48:

    return 'Tenure_4'

    elif x <= 60:

    return 'Tenure_5'

    else:

    return 'Tenure_over_5'

    df['tenure_group'] = df.tenure.apply(transform_tenure)

    # 数值型和类别型字段

    Id_col = ['customerID']

    target_col = ['Churn']

    cat_cols = df.nunique()[df.nunique() < 10].index.tolist()

    num_cols = [i for i in df.columns if i not in cat_cols + Id_col]

    print('类别型字段:\n', cat_cols)

    print('-' * 30)

    print('数值型字段:\n', num_cols)

    类别型字段:

    ['gender', 'SeniorCitizen', 'Partner', 'Dependents', 'PhoneService',

    'MultipleLines', 'InternetService', 'OnlineSecurity',

    'OnlineBackup', 'DeviceProtection', 'TechSupport',

    'StreamingTV', 'StreamingMovies', 'Contract', 'PaperlessBilling',

    'PaymentMethod', 'Churn', 'tenure_group']

    ------------------------------

    数值型字段:

    ['tenure', 'MonthlyCharges', 'TotalCharges']

    05、探索性分析

    对指标进行归纳梳理,分用户画像指标,消费产品指标,消费信息指标。探索影响用户流失的关键因素。

    1. 目标变量Churn分布

    79f0f736afc379319000f5973a0eff4242a91171.jpeg?token=11fb0f7b8c919eebc8a0c8219bc871c9

    经过初步清洗之后的数据集大小为7032条记录,其中流失客户为1869条,占比26.6%,未流失客户占比73.4%。

    df['Churn'].value_counts()

    No 5163

    Yes 1869

    Name: Churn, dtype: int64

    trace0 = go.Pie(labels=df['Churn'].value_counts().index,

    values=df['Churn'].value_counts().values,

    hole=.5,

    rotation=90,

    marker=dict(colors=['rgb(154,203,228)', 'rgb(191,76,81)'],

    line=dict(color='white', width=1.3))

    )

    data = [trace0]

    layout = go.Layout(title='目标变量Churn分布')

    fig = go.Figure(data=data, layout=layout)

    py.offline.plot(fig, filename='./html/整体流失情况分布.html')

    2.性别

    bba1cd11728b47108df8b24912048bfafe0323b5.jpeg?token=b34c5f4c71fd71d3a526bcedf8d3d70a

    分析可见,男性和女性在客户流失比例上没有显著差异。

    plot_bar(input_col='gender', target_col='Churn', title_name='性别与是否流失的关系')

    3. 老年用户

    a71ea8d3fd1f4134afc253daf4d5ddcdd3c85eea.jpeg?token=ac09c835ba915715cd1be7fc3f3aed68

    老年用户流失比例更高,为41.68%,比非老年用户高近两倍,此部分原因有待进一步探讨。

    plot_bar(input_col='SeniorCitizen', target_col='Churn', title_name='老年用户与是否流失的关系')

    4. 是否有配偶

    4ec2d5628535e5dd47875e28a40cefe8cc1b62f4.jpeg?token=b2effd101a898d1c84b1c36eba676257

    从婚姻情况来看,数据显示,未婚人群中流失的比例比已婚人数高出13%。

    plot_bar(input_col='Partner', target_col='Churn', title_name='是否有配偶与是否流失的关系')

    5. 上网时长

    f603918fa0ec08fa740bd72e8b24756a54fbda06.jpeg?token=77734bb460348665dec061af901780ae

    经过分析,这方面可以得出两个结论:

    用户的在网时长越长,表示用户的忠诚度越高,其流失的概率越低;新用户在1年内的流失率显著高于整体流失率,为47.68%。plot_bar(input_col='tenure_group', target_col='Churn', title_name='在网时长与是否流失的关系')

    6. 付款方式

    b7fd5266d0160924c6b1c0e906cd7dfde4cd34f9.jpeg?token=6f14fe9f099243536ed7e6cfea59706a

    支付方式上,支付上,选择电子支票支付方式的用户流失最高,达到45.29%,其他三种支付方式的流失率相差不大。

    pd.crosstab(df['PaymentMethod'], df['Churn'])

    ac4bd11373f08202d97bf58d9831b3eaa9641bec.jpeg?token=dd8614533187f4efc05bad41dbcf26e5

    plot_bar(input_col='PaymentMethod', target_col='Churn', title_name='付款方式与是否流失关系')

    7. 月费用

    21a4462309f790521d60edc6dd399fcd7acbd519.jpeg?token=015ad5706bf7188a09a44d28521dd4f7

    整体来看,随着月费用的增加,流失用户的比例呈现高高低低的变化,月消费80-100元的用户相对较高。

    plot_histogram(input_col='MonthlyCharges', title_name='月费用与是否流失关系')

    8. 数值型属性相关性

    0bd162d9f2d3572c34f04e1859d92b2063d0c332.jpeg?token=432d4c589db8f46bb3f0b933da0eb4c7

    从相关性矩阵图可以看出,用户的往来期间和总费用呈现高度相关,往来期间越长,则总费用越高。月消费和总消费呈现显著相关。

    plt.figure(figsize=(15, 10))

    sns.heatmap(df.corr(), linewidths=0.1, cmap='tab20c_r', annot=True)

    plt.title('数值型属性的相关性', fontdict={'fontsize': 'xx-large', 'fontweight':'heavy'})

    plt.xticks(fontsize=12)

    plt.yticks(fontsize=12)

    plt.show()

    06、特征选择

    使用统计检定方式进行特征筛选。

    # 删除tenure

    df = df.drop('tenure', axis=1)

    from feature_selection import Feature_select

    # 划分X和y

    X = df.drop(['customerID', 'Churn'], axis=1)

    y = df['Churn']

    fs = Feature_select(num_method='anova', cate_method='kf', pos_label='Yes')

    x_sel = fs.fit_transform(X, y)

    2020 09:30:02 INFO attr select success!

    After select attr: ['DeviceProtection', 'MultipleLines', 'OnlineSecurity',

    'TechSupport', 'tenure_group', 'PaperlessBilling',

    'InternetService', 'PaymentMethod', 'SeniorCitizen',

    'MonthlyCharges', 'Dependents', 'Partner', 'Contract',

    'StreamingTV', 'TotalCharges', 'StreamingMovies', 'OnlineBackup']

    经过特征筛选,gender和PhoneService字段被去掉。

    07、建模前处理

    在python中,为满足建模需要,一般需要对数据做以下处理:

    对于二分类变量,编码为0和1;对于多分类变量,进行one_hot编码;对于数值型变量,部分模型如KNN、神经网络、Logistic需要进行标准化处理。# 筛选变量

    select_features = x_sel.columns

    # 建模数据

    df_model = pd.concat([df['customerID'], df[select_features], df['Churn']], axis=1)

    Id_col = ['customerID']

    target_col = ['Churn']

    # 分类型

    cat_cols = df_model.nunique()[df_model.nunique() < 10].index.tolist()

    # 二分类属性

    binary_cols = df_model.nunique()[df_model.nunique() == 2].index.tolist()

    # 多分类属性

    multi_cols = [i for i in cat_cols if i not in binary_cols]

    # 数值型

    num_cols = [i for i in df_model.columns if i not in cat_cols + Id_col]

    # 二分类-标签编码

    le = LabelEncoder()

    for i in binary_cols:

    df_model[i] = le.fit_transform(df_model[i])

    # 多分类-哑变量转换

    df_model = pd.get_dummies(data=df_model, columns=multi_cols)

    df_model.head()

    8644ebf81a4c510f6a2ba862b3936d2ad52aa529.jpeg?token=25959125ca3ba5a7e980e77e4d244c60

    08、模型建立和评估

    首先使用分层抽样的方式将数据划分训练集和测试集。

    # 重新划分

    X = df_model.drop(['customerID', 'Churn'], axis=1)

    y = df_model['Churn']

    # 分层抽样

    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0, stratify=y)

    print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)

    #修正索引

    for i in [X_train, X_test, y_train, y_test]:

    i.index = range(i.shape[0])

    (5625, 31) (1407, 31) (5625,) (1407,)

    # 保存标准化训练和测试数据

    st = StandardScaler()

    num_scaled_train = pd.DataFrame(st.fit_transform(X_train[num_cols]), columns=num_cols)

    num_scaled_test = pd.DataFrame(st.transform(X_test[num_cols]), columns=num_cols)

    X_train_sclaed = pd.concat([X_train.drop(num_cols, axis=1), num_scaled_train], axis=1)

    X_test_sclaed = pd.concat([X_test.drop(num_cols, axis=1), num_scaled_test], axis=1)

    然后建立一系列基准模型并比较效果。

    cefc1e178a82b9018d18d767a047e1703812ef7b.jpeg?token=80dcc21b16d185ed3982da319a283772

    假如我们关注roc指标,从模型表现效果来看,Naive Bayes效果最好。我们也可以对模型进行进一步优化,比如对决策树参数进行调优。

    parameters = {'splitter': ('best','random'),

    'criterion': ("gini","entropy"),

    "max_depth": [*range(3, 20)],

    }

    clf = DecisionTreeClassifier(random_state=25)

    GS = GridSearchCV(clf, parameters, scoring='f1', cv=10)

    GS.fit(X_train, y_train)

    print(GS.best_params_)

    print(GS.best_score_)

    {'criterion': 'entropy', 'max_depth': 5, 'splitter': 'best'}

    0.585900839405024

    clf = GS.best_estimator_

    test_pred = clf.predict(X_test)

    print('测试集:\n', classification_report(y_test, test_pred))

    测试集:

    precision recall f1-score support

    0 0.86 0.86 0.86 1033

    1 0.61 0.61 0.61 374

    accuracy 0.79 1407

    macro avg 0.73 0.73 0.73 1407

    weighted avg 0.79 0.79 0.79 1407

    将这棵树绘制出来。

    import graphviz

    dot_data = tree.export_graphviz(decision_tree=clf, max_depth=3,

    out_file=None,

    feature_names=X_train.columns,

    class_names=['not_churn', 'churn'],

    filled=True,

    rounded=True

    )

    graph = graphviz.Source(dot_data)

    03087bf40ad162d9bb3c948cc015e1eb8813cda6.jpeg?token=bea2a2e5899f136753452ffa62371966

    输出决策树属性重要性排序:

    imp = pd.DataFrame(zip(X_train.columns, clf.feature_importances_))

    imp.columns = ['feature', 'importances']

    imp = imp.sort_values('importances', ascending=False)

    imp = imp[imp['importances'] != 0]

    table = ff.create_table(np.round(imp, 4))

    py.offline.iplot(table)

    d01373f082025aafdbba13192a27e363014f1aad.jpeg?token=d5c4fa561bfb7babd734cc611b3f954c

    后续优化方向:

    数据:分类技术应用在目标类别分布越均匀的数据集时,其所建立之分类器通常会有比较好的分类效能。针对数据在目标字段上分布不平衡,可采用过采样和欠采样来处理类别不平衡问题;属性:进一步属性筛选方法和属性组合;算法:参数调优;调整预测门槛值来增加预测效能。

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

    千次阅读 2020-09-27 17:22:20
    毫无疑问,客户流失会给银行带来大量损失。考虑到避免一位客户流失的成本很可能远低于挖掘一位新客户,对客户流失情况的分析预测至关重要。本文分析的数据为某银行10000条客户信息,有14个字段。 ...
  • 【原创】Python中用PyTorch机器学习分类预测银行客户流失模型 数据分析报告论文(代码数据).docx
  • 基于分类方法的银行客户流失预测

    千次阅读 2020-08-16 19:12:19
    技术栈:Excel、SPSS、SQL SERVER BI
  • 银行流失用户分析及预测模型

    万次阅读 多人点赞 2018-08-24 22:20:08
    银行客户流失是指银行的客户终止在该行的所有业务,并销号。但在实际运营中,对于具体业务部门,银行客户流失可以定位为特定的业务终止行为。 商业银行的客户流失较为严重,流失率可达20%。而获得新客的成本是维护...
  • 流失预警模型(二分类),代码原型为本人在某银行做的流失模型,AUC:83%、召回率:19.4%,精确率:85%(数据是外部数据/代码已脱敏) 你将习得:数据的处理、LightGBM、sklearn包(里面含有:GridSearchCV寻找最优...
  • 神经网络也是机器学习的一种模型,是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。 ...
  • 文章目录引言一、银行业客户群体与产品的类别二、客户流失预警模型的业务意义三、数据介绍与描述1.单因子分析之连续变量2.单因子分析之类别变量3.多因子分析 引言 下面使用的是jupyter notebook,完整代码解析见...
  • 现在银行产品同众化现象普遍存在,客户选择产品和服务的途径越来越多,客户对产品的忠诚度越来越低,所以客户流失已经成为银行业最关注的问题之一。而获得新客的成本远高于维护老客户成本。因此,从海量客户交易数据...
  • Python 银行信用卡客户流失预测(kaggle)

    千次阅读 多人点赞 2020-12-08 08:08:00
    1.背景越来越多的客户不再使用信用卡服务,银行的经理对此感到不安。如果有人能为他们预测哪些客户即将流失,他们将不胜感激,因为这样他们可以主动向客户提供更好的服务,并挽回这些即将流失客户...
  • 机器学习分类模型预测银行客户流失。 嗨,访客们! 我是数据科学的新手,但我正在通过使用在线可用数据集将所有学习实践付诸实践。 我已经使用Python生成了机器学习分类模型! 我仍在学习,随着我学到更多,我...
  • 银行客户群体 1.银行的个人客户 银行对个人客户的主要业务是:为个人客户合理安排个人财务,具体有 (1)存款,取款 (2)小额贷款 (3)代理投资理财 (4)信息咨询 (5)其他各类中介服务 目的:为客户取得收益...
  • 本实战课程通过一个详细的动手实验帮助你使用IBM Watson Studio构建一个银行业中常见的预测客户流失模型。通过动手实验,你将会掌握如何使用Python创建SK-Learn模型,以及如何使用可视化的画布模式训练模型
  • 贷中策略除了跟调额、营销相关外,与客户流失相关及营销相关的还有一个客户流失预测模型,是我们全流程中必不可少的一个客群分析。 目前,银行都面临着极大的优质客户流失的危险。这将对银行经营和效益产生极大的...
  • 客户流失预测Customers are any business’ bread and butter. Whether it is a B2B business model or B2C, every company strives for a sticky customer base with minimal attrition to ensure an ongoing, ...
  • 感知机模型二、神经网络在流失预警模型中的应用1.数据预处理2.参数设置3.代码部分 一、神经网络模型概述   人工神经网络(ANN),它的基本特点是试图模仿大脑的神经元之间传递、处理信息的模式。其具有以下两个...
  • 数据挖掘大作业文档,对银行客户流失进行分析,随着互联⽹⾦融的异军突起,银⾏业的竞争愈加激烈,防⽌客户流失和挽留⽼客户成为各⼤银⾏ 关⼼的重要问题。本⽂⾸先根据已有数据集对各特征进⾏描述性统计分析,初步...
  • 极端值也称离群值,可能会影响模型精度,进而影响预测结果。 极端值对于不同的模型,影响不同,虽然处理极端值并不是数据预处理的必经流程,但是我们需要知道极端值的存在对最终结果的影。 一般回归模型对极端值非常...
  • 银行客户流失分析

    千次阅读 多人点赞 2019-07-22 09:12:51
    随着互联网金融的异军突起,银行业的竞争愈加激烈,防止客户流失和挽留老客户成为各大银行关心的重要问题。本文首先根据已有数据集对各特征进行描述性统计分析,初步了解数据;之后进行数据预处理,包括数据清洗,...
  • 机器学习 客户流失Building up and keeping a loyal clientele can be challenging for any company, especially when customers are free to choose from a variety of providers within a product category....
  • 基于大数据的客户流失预测流程

    千次阅读 2018-07-04 20:45:37
    客户流失预测 客户流失是电信行业最重要的服务方面之一。客户流失的广义说法是因为客户自己或运营商违反服务协议而终止客户服务的行为。 然而,客户流失的最主要和最常见的原因是由于客户对运营商的服务不满意或...
  • 流失预测流程一共分为四个步骤,分别为(1)数据预处理(2)特征选择(3)模型选择(4)模型评估 1. 数据理解 数据取自于kaggle平台分享的数据集,共有21个字段7043条记录。 数据主要包括影响客户流失的各种因素...
  • 随机森林:客户流失预测

    千次阅读 2018-03-19 01:00:58
    本文主要对客户流失进行分类预测。1 背景与挖掘目标1.1 背景1、客户流失对利润增长造成的负面影响非常大,仅次于公司规模、市场占有率、单位成本等因素的影响;2、流失一个老客户比获得一个新客户对公司的损失更大;...
  • 这次我们要学习的是银行用户流失预测项目,首先先来看看数据,数据分别存放在两个文件中,’Churn-Modelling.csv’里面是训练数据,’Churn-Modelling-Test-Data.csv’里面是测试数据。下面是数据内容: 数据来源于...
  • 流失预测是个重要的业务,通过预测哪些客户可能取消对服务...在本篇文章中,我们将看到通常使用的哪些类型客户数据,对数据进行一些初步分析,并生成流失预测模型 - 所有这些都是通过Spark及其机器学习框架来完成的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,639
精华内容 655
关键字:

银行客户流失预测模型