《数据挖掘》课程实践要求
从Kaggle上进行实践
网址:https://www.kaggle.com/datasets
要求:
越来越多的客户退出信用卡业务,这让银行经理感到不安。如果有人能预测谁会被淘汰,他们会很感激这样他们就能主动去找客户,为他们提供更好的服务,让客户的决定朝相反的方向发展。
我从一个网址为https://leaps.analyttica.com/home的网站获得了这个数据集。我一直使用这个方法来获取数据集,并相应地对其进行处理,以产生富有成效的结果。该网站解释了如何解决特定的业务问题。
现在,这个数据集包含了10000多个客户,包括他们的年龄、工资、婚姻状况、信用卡限额、信用卡类别等。它有将近18个功能。各个特征的介绍如下:
CLIENTNUM:客户的编号,是客户的唯一标识。
Attrition_Flag:数据的标签,包括流失的客户和不流失的客户。非数值类型。
Customer_Age:客户的年龄。
Gender:客户的性别。M代表男性,F代表女性。非数值类型。
Dependent_count:家属的人数。
Education_Level:客户受教育的程度。非数值类型。
Marital_Status:婚姻的状况。非数值类型。
Income_Category:客户一年的收入类别。非数值类型。
Card_Category:客户持有卡片的种类。非数值类型。
Months_on_book:客户与银行交互的频率。
Total_Relationship_Count:客户总共持有银行产品的数量。
Months_Inactive_12_mon:过去12个月没有与银行进行交互的月份数。
Contacts_Count_12_mon:过去12个月与银行进行交互的数量。
Credit_Limit:信用卡的信用额度。
Total_Revolving_Bal:信用卡上的循环余额总额。
Avg_Open_To_Buy:过去12个月开放购买的信贷额度。
Total_Amt_Chng_Q4_Q1:第4季度和第1季度相比的交易金额的变化。
Total_Trans_Amt:过去12个月的交易总额。
Total_Trans_Ct:过去12个月的交易总数。
Total_Ct_Chng_Q4_Q1:第4季度和第1季度相比的交易数量的变化。
Avg_Utilization_Ratio:平均卡片利用率。
Naive_Bayes_Classifier_Attrition_Flag_Card_Category_Contacts_Count_12_mon_Dependent_count_Education_Level_Months_Inactive_12_mon_1:朴素贝叶斯
Naive_Bayes_Classifier_Attrition_Flag_Card_Category_Contacts_Count_12_mon_Dependent_count_Education_Level_Months_Inactive_12_mon_2:朴素贝叶斯
(由银行已知,最后两个特征可以去掉。)
在这个商业问题上,我们的首要任务是找出那些正在流失的客户。即使我们预测不流失的客户是流失的,这也不会损害我们的业务。但将流失客户预测为非流失客户就可以了。所以召回(TP/TP+FN)需要更高。
到目前为止,我已经成功召回了62%的产品。需要更好的。
我们希望深入的探索性数据分析,可以帮助我们可视化流失客户和非流失客户之间的区别。
运用不同的分类模型进行分类预测,并将其模型对数据集进行预测,分析比较并可视化各模型的性能。
通过分析银行客户的数据集,深入挖掘出数据的特征,以及每个特征的重要程度、各个特征之间的联系。对客户数据集构建一个性能良好的分类模型,以便于银行对未来客户进行预测,预测他们是流失客户亦或是不流失的客户,并及时的联系沟通,有效地防止银行客户地流失。
使用python算法可有效地对数据进行分析、挖掘。首先通过DataFrame读取从kaggle上下载的数据集。然后进行数据的预处理,检测是否存在缺失值、将字符串类型转为机器可以处理的类型、划分数据集。然后构建分类模型,使用sklearn库里的经典的分类模型,其中包括:随机森林、感知器、逻辑回归、SVM、决策树、KNN、GBDT、朴素贝叶斯,对训练集进行模型地训练,再使用模型对测试集进行测试。
此外,我还使用深度神经网络DNN的方法,对数据集进行训练及测试。
测试的结果由精确率、召回率、准确率、F1值、ROC曲线等指标进行判定。我还对每个模型进行了可视化,使用PDPBOX工具包,对数据集进行探索性数据分析和可解释性分析,绘制了:
1.特征的重要性图
2.特征之间的散点图
3.构建模型前后的pdp图(部分依赖图),描述不同特征的流失客户与不流失客户的比例。
4.特征之间两两交互的影响图
5.通过可视化随机森林中的一棵决策树,分析模型建立的过程
6.ICE图,可视化出特征变化时,模型预测结果概率的变化。(比如性别由女性变男性时,模型预测结果是如何变化的。)
7.二维的PDP图,描述构建模型后,表达特征之间的交互关系。
8.使用eli5,绘制Permutation
Importance图。对测试集中某一列数据打乱,再将我们打乱的数据集在模型上预测。打乱后是否会导致模型预测精度大幅度下降。
最后,我还进行了使用SHAP值(SHAP所做的是量化每个特征对模型所做预测的贡献。)进行可视化分析,绘制出:
1.各个特征的数值大小和各特征的SHAP值关系图,反映数据中的某个特征对模型预测的结果是起到正向贡献还是负向贡献。
2.对于单个客户,使用shap.force_plot()绘制出该客户的各个特征对模型预测的贡献。
3.使用summary plot()对测试集所有样本进行聚类,按照相似性聚类展示、按照预测结果概率从到小展示,按照测试集原本样本顺序、按照某个特征分别展示。挖掘数据间的共同点。
4.使用dependence_plot()展示某个特征从小变大时对预测结果的shap值。比较特征变化对模型的影响。
5.绘制出决策图。决策图反映了每个测试样本在每一个特征下的决策路径。分类每个样本的决策过程。
当然,还需对各个分类算法进行了横向比较,分析出比较可行的分类模型。
实验流程图如下:
1.1读取数据集:
总的数据集为:10127*23,各个特征所代表的含义已在前面给出,第二列为数据集的标签。
1.2生成数据探索性分析EDA报告:
在该报告中可以查看数据集每个特征的分布状况、值的类型、以及特征之间的相关性:
1.3数据清洗
缺失值检查:用isnull().sum()判断数据集是否存在缺失值,同时统计缺失值的个数。
可以看到并无缺失值。
1.4去除无效特征
分析数据集可知,数据特征中的CLIENTNUM(客户的编号)以及数据集中的最后两列(朴素贝叶斯)是对分类模型的构建起不到作用,可以删掉,使得数据集维数降低。
1.5数据集格式转换
分析数据集可知,数据集中存在非数值类型的特征,它们并不能直接输入模型进行训练,故需要转换格式。
标签的转换:
可以得到标签只有两类,故属于二分类的问题。
使用数值0表示‘Attrited Customer’,即流失的客户;使用1表示‘Existing
Customer’即不流失的客户。
性别的转换:
从数据集中可知,Gender特征中M代表男性,F代表女性,是非数值类型。需要进行转换处理。
使用数值0代表‘F’,即女性;使用数值1代表‘M’,即男性。
婚姻状况的转换:
从数据集中可知,Marital_Status特征中分为4类。‘Unknown’代表未知其婚姻的状况,‘Single’代表单身状态,‘Divorced’代表离异状态,‘Married’代表已婚状态。
使用数值0代表‘Unknown’,数值1代表‘Single’,数值2代表‘Divorced’,数值3代表‘Married’。如下图所示:
学历的转换:
从数据集中可知,Education_Level特征中分为7类。'College’代表大学学历,'Doctorate’代表博士学历,'Graduate’代表毕业水平,'High
School’代表高中学历,'Post-Graduate’代表提前毕业水平,'Uneducated’代表未接受教育,'Unknown’代表未知学历。
按照教育水平从高到低排序,使用数值1代表’Unknown’,使用数值2代表’Uneducated’,使用数值3代表’High
School’,使用数值4代表’College’,使用数值5代表’Graduate’,使用数值6代表’Post-Graduate’,使用数值7代表’Doctorate’。
如下图:
收入的转换:
从数据集中可知,Income_Category特征中分为6类。’$120K
+‘代表年薪大于$120K,’$40K - $60K’代表年薪位于$40K - $60K,’$60K -
$80K’代表年薪位于$60K - $80K,’$80K - $120K’代表年薪位于$80K -
$120K,'Less than $40K’代表年薪小于$40K,'Unknown’代表其年薪未知。
按照收入从高到低排序,使用数值6代表’$120K +’,使用数值5代表’$80K -
$120K’,使用数值6代表’$60K - $80K’,使用数值3代表’$40K -
$60K’,使用数值2代表’Less than $40K’,使用数值1代表’Unknown’。如下图:
银行卡种类的转换:
从数据集中可知,Card_Category特征可分为4类,'Blue’代表蓝卡,'Gold’代表金卡,'Platinum’代表铂金卡,'Silver’代表银卡。
按照银行卡等级排序,使用数值4代表’Platinum’,使用数值3代表’Gold’,使用数值2代表’Silver’,使用数值1代表’Blue’。如下图:
到目前为止,我们已经把特征为字符串型的值转换为数值型,查看数据如下:
可以得到,标签’Attrition_Flag’是object类型,并不是int型,不难通过模型进行处理,需要把它转为int型。转换如下:
至此,我们已经完成了数据集的预处理。
对于数据预处理好的数据集,我们可以保存下来,方便后面进行模型的构建。
数据集的特征的分布:
可以看到数据集中男女性别的比例,以及客户年龄段的分布曲线。
绘制热力图:
对于多维特征的数据集,由于不方便直接得出这些特征之间的关联性,我们可以绘制出热力图,如下图所示:
若两特征相交的值越接近1,则这两个特征呈正相关;反之,越接近-1,这两个特征呈负相关。由上图分析可知,’Avg_Open_To_Buy’和’
Credit_Limit’这两个特征呈正相关。
单列特征与标签的关系:
我们选取’ Customer_Age’特征,绘制柱形图,探索它与标签的关系,如下图所示:
可以看到,1表示不流失的客户,0表示流失的客户。客户年龄的不同,它们的标签的比例也不同。
同样地,不同教育水平的客户,它们的标签也不同,从下图中可以看到,处于大学毕业的客户是银行的主要客户,其流失的概率也较小。
**绘制箱形图:**表示数据的统计分布
我们使用箱型图来观察数值波动较大的某些特征。
上图表示了不同标签的过去12个月的总交易额和银行卡可用额度的箱型图,5条线从上至下分别表示了最大值、上中位数、中位数、下中位数、最小值。
绘制小提琴图:反映特征各个数值的分布数量。
同样地,我们对上述两个特征使用小提琴图,如下图:
它反映了数据分布的同时,绘制出来各个区间的数量。
绘制散点图:
使用散点图,刻画出,不同年龄,不同的总交易额的情况下,流失客户和不流失客户的分布。如下图:
从图中可以看到,各个年龄段中,总交易量很大时,基本上都是不流失的客户;而流失的客户基本处于总交易额较少、年龄较大的区间。
接下来我会使用PDPBOX工具包,对数据集进行进一步地探索性数据分析:
使用pdpbox绘制不同性别下,客户属于不流失客户的比例(先验概率统计):
可以看到,数据集中女性有5358个样本,其中属于不流失客户的比例为:0.826。而男性有4769个样本,其中属于不流失客户的比例为:0.854。这说明男性较女性而言,更不容易成为流失的客户。
同样地,不同年龄段的客户,其属于不流失客户的比例绘制如下:
可以分析出,客户的年龄段处于[53,56)时,更容易成为流失客户,银行应该对他们进行沟通联系。
描述两列特征之间的关系:
我使用了客户的年龄和过去12个月的总交易额这两列特征,绘制出关系图如下:
其中,颜色越深,说明该区域的客户越属于不流失的客户;圆圈越大,说明该区域的客户越多。由图分析可知,总交易额越少的客户,颜色越浅,满足前述的条件。
至此,我们从多维度的可视化完成了构建模型前的数据探索性分析。
总体方案:先将数据集划分为训练集和测试集,再从sklearn库中导入分类模型,其中包括:随机森林、感知器、逻辑回归、SVM、决策树、KNN、GBDT、朴素贝叶斯。
除此之外,我还构建了深度神经网络模型,对数据集进行分类预测。
对每一个模型,绘制出其特征重要性图、混淆矩阵图、ROC曲线、精确率、准确率、召回率、F1值,来评估模型的好坏。
除此之外,我还会对模型进行可解释性分析。通过绘制pdp图(部分依赖图)、ICE图、绘制Permutation
Importance图、shap值分析图、可视化决策树已经绘制模型的决策图。
划分数据集:
随机森林分类模型:
直接导入sklearn库中的随机森林进行模型的构建,绘制出混淆矩阵、ROC曲线如下图所示:
评估指标:
可以看到模型的分类还是很准确的。
ROC曲线:
可以看到,ROC曲线很接近左上角,说明模型效果很好。通过计算得出,曲线包围的面积是0.9836,很接近1.0,很好地反映了模型预测的效果。
此外,随机森林是由多颗决策树构成的,如何展示某棵决策树的决策过程,以了解模型的构建呢?我绘制出第50棵决策树如下图所示:
有该树可以得出,每个节点越近蓝色,说明模型预测它越属于不流失的客户;越接近黄色,说明模型预测它越可能属于流失的客户。同时,决策树越深,其基尼指数越小,纯度越高。
在随机森林模型构建过程中,会使用不同的数据集,以及会使用部分特征,而不是全部特征,我将第50棵决策树所用到的特征以及特征的重要程度绘制如下:
需要注意,这只是第50棵树的特征的重要性,而不是全部的随机森林模型的特征的重要性。
对此,我绘制出全部的随机森林模型的特征的重要性,如下图:
从图看出,过去12个月的总交易量和总交易额这两个特征最重要,而银行卡的种类这个特征对应构建模型并不重要。
我以随机森林分类模型为基础,进行模型的可解释性分析以及可视化。
绘制Permutation Importance图:
在构建好随机森林分类模型后,使用eli5,绘制Permutation
Importance图,对测试集中某一列数据打乱,再将我们打乱的数据集在模型上预测。打乱后是否会导致模型预测精度大幅度下降。
如果大幅度下降,就说这些列特征对模型比较重要。如果没有大幅度下降,甚至更高,这些列可能有噪声,或者列对模型没有作用。Permutation
Importance图如下:
分析可知,绿色的特征对随机森林模型而言很重要,而浅红色的特征对该模型的预测起到负向作用。可以看到,’Months_on_book’、’Income_Category’、’Education_Level’对模型的预测起到了负向贡献。
绘制pdp图:
在构建模型前,我们绘制了不同年龄段的客户,属于哪个标签的概率的pdp图,这属于先验图。构建随机森林模型后,我考虑了模型的因素,再次画出不同年龄段的pdp图如下图:
可以观察到不同年龄段下模型预测的准确性,这是考虑了模型的因素。之前分析出客户的年龄段处于[53,56)时,更容易成为流失客户,而在这个年龄段中,模型预测的准确性高达0.99。
绘制ICE图:
将测试集每一个样本在某一个特征变化时候的预测结果显示出来。
对于性别而言,如下图:
特征由女性变成男性,每一个样本预测为不流失客户的概率会变大,这也符合之前的分析。若线条趋向负数,则说明预测为不流失客户的概率变小。
对于年龄特征而言:
年龄越大,每一个样本预测为不流失客户的概率会变小,起到负向贡献。
对比总交易额的pdp图和ICE图:
有两图可知:当总交易额在2500附近时,模型预测结果准确度降低,会突然起到负向作用。
绘制二维PDP图:
如果同时考虑两个特征的pdp图,我绘制了二维的pdp图如下图所示:
从图中可以看出,当总交易额在[3600,4400]区间,年龄小于26岁时,模型预测客户为不流失的客户的概率最高;而当总交易额在7800左右时,模型预测客户为不流失客户的概率仅为0.6左右。
**使用Shap值进行分析:**打破模型的黑箱子
SHAP所做的是量化每个特征对模型所做预测的贡献。
对测试集所有样本,预测为需要联系和不需要联系的客户各自的平均概率,如下:
从shap值的角度进行分析,可知:对某个样本而言,在模型预测下,它被期望预测为流失客户的概率是0.1588,而被期望预测为不流失客户的概率为0.8412。
那么,每个样本都有自己的shap值,可视化shap值使其更直观,如下:
它反映了特征的重要程度,对于某个特征,计算测试集每个客户的该特征shap值之和,shap值越高,特征越重要。
至此,已经用过三种构建特征重要度的方法了。使用weight,PermutationImportance和shap这三种方式衡量特征重要度。
深入探讨各个特征的数值大小和各特征的SHAP值关系图:
summary
plot为每个样本绘制其每个特征的shap值,每一行代表一个特征,横坐标为shap值。一个点代表一个样本,颜色表示特征值(红色高,蓝色低)。每一行表示一个特征,红色表示该特征的值较高的数据点,蓝色表示该特征较低的数据点。越往右边是正向贡献,越往左边是负向贡献。
模型两两特征的shap值可视化:
红色表示该特征的值较高的数据点,蓝色表示该特征较低的数据点。越往右边是正向贡献,越往左边是负向贡献。
这些都是整个测试集的特征的shap值进行交互的结果,那么若我们想观察单个客户的情况,如下:
先选出测试集的某个客户:
绘制force plot图:
计算该客户的各个特征对需要和不需要联系的客户两个预测结果的shap值的影响:
红色:有正向贡献的特征,蓝色,负向贡献的特征。红条越大,表示shap越大。红条减去蓝条:是base
value平均结果到最终预测结果之间的差距。可以看到,5909号客户的真实标签是True,模型预测为不流失客户的概率是0.94。
绘制summary plot图:
将大量样本的每个特征进行集成分析:
这里选择60个样本,将测试集样本的force plot旋转九十度并拼接在一起,形成summary
plot图。可以在下拉菜单选择按照相似性聚类展示、按照预测结果概率从到小展示、按照测试集原本样本顺序、按照某个特征分别展示。如下图所示:
按照相似性聚类展示:
按照预测结果概率从到小展示:
可以分析相似的客户都具有哪些特征,比如他们是不是都是因为总交易量是多少而被识别为不流失的客户。
绘制DEPENDENCE PLOT图:
展示某个特征从小变大时对预测结果的shap值,比如当年龄变化时,预测结果的shap值如何变化,如下图:
可以看到,当年龄增大时,模型预测结果的shap值会逐渐减小。
再比如总交易额变化时,模型预测结果的shap值的变化如下:
其中,蓝点代表女性,红点代表男性。
绘制决策图:
决策图可以展示测试集所有数据的决策过程:
决策图由下往上的特征是按照特征重要程度排序的,决策时先从最底端的’Card_Category’特征开始进行决策,由下往上进行决策,受不同的影响,有些样本被预测为流失客户,即蓝色的路径;有些被预测为不流失客户,即红色的路径。
对上图进行聚类,以便找出异常值路径:
可以看到,样本的蓝色路径被分配到左边,若左边存在着红色路径,则该红色路径就是模型预测错误的样本。
我们也可以展示单个客户的决策图:
可以看到,该客户索引号为80,在原始数据集X中的索引号为1100,被模型预测为不流失客户。
模型预测错误的客户的分析:
首先找出所以预测错误的客户:
取出第一个客户进行分析,如下图:
4142号客户的真实标签是False,即他属于流失客户,但是模型预测他属于不流失的客户的概率为0.56。
在决策图中显示测试集中模型预测错误的样本,用点划线绘制如下图:
至此,已经将随机森林模型进行了可解释性分析及其可视化,接下来要进行不同分类模型的横向比较。
在上述的实验过程中,我们构建了随机森林模型,但是这不一定是最优的,需要进行横向比较各种模型的指标性能。
感知器:(Perceptron)
使用训练集对它进行训练,该模型的性能如下:
混淆矩阵:
指标:
逻辑回归:(LogisticRegression)
使用训练集对它进行训练,该模型的性能如下:
混淆矩阵:
指标:
ROC曲线及其包围的面积:
包围的面积是:0.884
SVM:(SVC)
使用训练集对它进行训练,并且使用核函数‘rbf’,该模型的性能如下:
混淆矩阵:
指标:
决策树:(DecisionTreeClassifier)
使用训练集对它进行训练,该模型的性能如下:
混淆矩阵:
指标:
ROC曲线及其包围的面积:
包围的面积:0.864
KNN:(KNeighborsClassifier)
使用训练集对它进行训练,该模型的性能如下:
混淆矩阵:
指标:
ROC曲线及其包围的面积:
包围的面积:0.897
GBDT:(GradientBoostingClassifier)
使用训练集对它进行训练,该模型的性能如下:
混淆矩阵:
指标:
ROC曲线及其包围的面积:
朴素贝叶斯:(MultinomialNB)
使用训练集对它进行训练,该模型的性能如下:
混淆矩阵:
指标:
ROC曲线及其包围的面积:
深度神经网络(DNN):
使用20个节点,2个隐藏层,学习率为0.01,Epoch为100,Batch的大小为200,并且使用sigmoid()作为激活函数,使用pytorch对测试集构建深度神经网络模型。
混淆矩阵:
指标:
以上是我使用随机森林、感知器、逻辑回归、SVM、决策树、KNN、GBDT、朴素贝叶斯、DNN等分类模型构建的分类器。
构建好以上的模型后,我将进行分类模型的横向比较。
’ Attrited_Customer’:
对于标签为流失客户’ Attrited_Customer’的样本,各个分类模型的指标如下图:
绘制柱形图进行直观比较:
分析:对于精确率prediction而言,随机森林、决策树、感知器、SVM都很高,其中感知器、SVM的精确率达到了100%,而朴素贝叶斯模型的精确率最低。
对于召回率recall而言,随机森林、决策树都很高,而感知器的召回率最低,几乎为0。
对于准确率而言,随机森林、决策树、SVM都很高,而朴素贝叶斯的准确率最低。
对于F1值而言,随机森林、决策树都很高,而朴素贝叶斯和DNN很低。
综上,对于标签为流失客户’
Attrited_Customer’的样本,随机森林、决策树模型效果都很好,其中,随机森林效果最好,各项指标都大于95%。
‘Existing_Customer’:
绘制柱形图进行直观比较:
分析:对于精确率prediction而言,随机森林、决策树、SVM都很高,其中随机森林模型的精确率达到了100%,而感知器模型的精确率最低。
对于召回率recall而言,随机森林、感知器、SVM、决策树都很高,而朴素贝叶斯的召回率最低,几乎为0。
对于准确率accuracy而言,随机森林、决策树都很高,而朴素贝叶斯的准确率最低。
对于F1值而言,随机森林、决策树、SVM都很高,而朴素贝叶斯很低。
综上,对于标签为流失客户’ Existing
Customer’的样本,随机森林、决策树、SVM模型效果都很好,其中,随机森林效果最好,各项指标都大于99%。
取出单个准确率进行比较:
可以看到还是决策树和随机森林模型的效果最好,其中以随机森林为最好。由此可以得到,该数据集适合用树形结构的模型进行分类预测。
综上所述,本次实验我使用银行提供的数据集,首先进行了数据的预处理,构建起一套分类模型,准确预测客户是否属于流失客户,以帮助银行及时与客户进行沟通联系。通过构建随机森林模型,我使用pdp、ICE等图将分类模型这个黑箱子进行可视化,分别进行了探索性分析和构建模型后的可解释性分析,从三个角度分析了最具有影响力的特征因素。最后,通过不同分类算法模型的构建、比较,得出了随机森林模型这个性能优秀的模型,真正地提高了预测流失客户的性能。