美文网首页机器学习笔记
葡萄牙银行电话贷款数据分析

葡萄牙银行电话贷款数据分析

作者: 光的文明 | 来源:发表于2018-02-21 00:57 被阅读60次

    写在前面

    研究生一年级上半学期的课程很快就结束了,本学期数据挖掘课程老师在寒假留给我们一个大作业。大作业一共有五个project,要求任选一个进行数据分析,在权衡后选择了葡萄牙银行电话贷款的案例。该案例的数据集是银行电话推销贷款业务的客户信息,题目要求对这些客户信息进行数据分析,预测电话推销贷款的成功率。数据集一共有两个版本,较早的版本数据维度比新版数据的维度要少,在笔者的实验中使用新的数据集。新版数据集包含两个数据文件,较大的数据文件中包含约四万条数据,较小的包含约四千条数据,较小的数据集被用来训练例如svm这样需要较大计算量的模型。该数据集可以在UCI数据库中下载,现在给出数据集地址

    数据集描述

    数据集中的数据用于描述银行客户的信息,每条信息拥有二十个属性,包括用户的年龄,受教育程度,职业等等。这些属性有的是离散值,例如受教育程度,有的是连续值,例如客户年龄。每条数据有一个标签属性,用于表述该客户在电话推销后是否接受银行的贷款业务,“no”代表不接受,“yes”则代表接受。根据程序对每个属性取值的分析,数据集中的数据存在缺失值,即有的属性取值为“unknown”,这些缺失值在其后的数据分析中需要进行特别处理。数据集中标签为“no”的数据占多数,标签为“yes”的数据占少数,二者的比例大约为9:1,即该数据存在类别不平衡问题,在数据分析中也需要进行处理。

    分析方案制定

    数据挖掘的分析方法多种多样,每种方法都有自己的适用范围,面对题中的分析任务,笔者认为任意选取某一种分析方法进行分析是不负责任的,必须对比多种模型在数据集上的表现才能确定最佳的分析方法。基于笔者自身的能力和精力,笔者最终决定选取随机森林,决策树,logistic回归和svm四种方法,在其中选取表现最佳的方法作为这个case的预测模型。且基于提升自己编程能力和对模型理解运用能力的目的,该案例分析中所有代码除矩阵运算外,均为笔者手动实现,不借用任何现成的机器学习框架。

    数据预处理

    上一小节中提到了所要用到的四个模型,这四个模型中有的要求输入数据为离散型变量,例如决策树和随机森林,有的要求输入数据为连续型变量,例如svm和logistic回归。因此就需要对数据集进行必要的预处理来满足不同模型的需求。

    首先考虑决策树和随机森林,这两种模型均需要输入离散型的变量,因此对数据集的连续型变量进行离散化。对于年龄这样的数据,笔者以十岁为一个阶段进行区间划分,落入不同阶段内的年龄赋不同的枚举值,对于较大的连续型变量则用其整除某一值的整数商来作为该属性的离散值。

    其次考虑svm和logistic回归,这两种模型均要求连续型的输入数据。在对原始数据集连续化过程之前首先需要考虑这样一个问题,即原数据集中有不少属性值是缺失的,必须将这些缺失值从数据集中“移除”掉,否则会对模型产生负面影响。“移除”的方法有两个,其一是将这些有缺失值的数据从数据集中删掉,其二是根据其他的完整数据来预测这些缺失值的取值。方案一的优点是简单,缺点是会造成数据集规模和代表性的缩水,方案二的优点是能够最大限度的保留数据集,保证模型的泛化能力,缺点是较为复杂。最终笔者选取的方案是使用随机森林模型对数据集中的缺失值进行预测。

    图0

    在补齐数据集中的缺失值之后就可以对其进行连续化操作了。连续化操作针对的对象是离散型变量,这些离散型变量可以分类两类,一类是二值型离散变量,一类是多值型离散变量。二值型离散变量可以简单地对一个取值赋1,另一个赋0。多值型离散变量又可以分为两类,一类是取值为有序的,例如受教育年限,一类是取值为无序的,例如婚姻状态。对于有序的多值型离散变量,可以简单地用有序的连续数值对应各个离散值,对于无序的多值型离散变量则需要引入哑变量来进行数值化。哑变量又称为虚拟变量,可以理解为向量,对于一个取值数为n的多值无序变量,其哑变量的维数为n-1。举例如下:

    图1

    数值化后的数据集需要进一步进行正规化操作,因为某些取值可能过大,这在距离计算时可能会导致扰动。通常对数据正规化操作就是对数值型变量求对数,但是该数据集中有利率这个属性,该属性存在负值,因此必须采用别的正规化操作方法。笔者选取了两种正规化计算方法,其正规化计算公式如下所示。方法一:

    图2

    方法二:

    图3

    由于数据集比较庞大,数据预处理是个非常耗时的操作,因此笔者推荐将预处理后的数据持久化保存到本地。

    训练集与测试集选取

    由于原数据集中正例与反例的数目不平衡,为了保证模型的泛化性能,必须对这个问题进行解决。解决类别不平衡问题一共有两种思路,一种是过抽样,一种是欠抽样。前者是利用某种算法人为地增加较少样例的数目,例如smote算法,另一种是人为地减少数目较多的样例的数目。前一种方法的优点在于能够在总样本量较少的情况下既保证类别平衡,又保证训练集的规模,缺点在于实现起来较为复杂。后一种方法的优点是简单,只需要简单地删除数据集中类别较多的数据直到类别平衡为止,缺点是在数据集规模较小的情况下这种方法可能导致数据集变得更小,导致模型欠拟合。在本例中即使是较小的数据集规模也在四千以上,因此从实现简单的角度出发,笔者选用欠抽样的方法来保证数据集的类别平衡,即从较多样例的类别中随机选取与较少样例类别相同数目的样例。代码如下:

    图4

    解决了数据集类别不平衡问题中,就应该开始产生训练集和测试集。训练集和测试集应是两个没有交集的集合,且训练集和测试集大小之比大多为7:3。在本例中笔者采用自助法产生训练集和测试集:首先遍历数据集,每次遍历从数据集中随机选择一条数据放入训练集中,同时并不将该条数据从原数据集中删除,这样该条数据就能参与下一次遍历时的随机选取。这样,遍历完一次原数据集就能产生一个大小与原数据集相同的训练集,这个训练集中是包含重复数据的,测试集即是原数据集与训练集的差集。记原始数据集的大小为m,则训练集中某一样本抽取m次都不被抽中的概率为:

    图5

    取该概率的极限可得到:

    图6

    根据以上计算,训练集的大小基本相当于原数据集的30%,而训练集的大小和原数据集相同,因此训练集合测试集不相交且大小之比为7:3。

    模型评估

    实验平台为Macbook Pro,操作系统为OS X Capitan 10.11.5,内存8 GB 1867 MHz DDR3,模型使用python语言编写,笔者使用的python版本为3.6.3。

    随机森林

    随机森林是并行式集成学习的一种。集成学习的中心思想是设置若干个弱学习器(基学习器),每个弱分类器都会对待分类数据给出自己的预测值,整个模型的输出取决于所有弱分类器给出的结果,笔者在实现时采用投票法给出最终结果。这样的学习方法虽然比较简单,但是在某些问题上却能给出较为准确的预测结果。随机森林就是这样的一种方法,其基学习器为决策树,该决策树与通常的决策树不同,通常的决策树在节点上选择属性进行分裂时候选属性集是在该节点上所有属性组成的集合,但随机森林中决策树节点上的候选属性集是该节点上所有属性集合上随机选取的一个子集,该子集的大小一般设置为该节点上所有属性集合大小的以2为底的对数。

    鉴于笔者计算机能力的限制,笔者只测试了基学习器数量在1-20的情况,每种情况下做五次实验,模型的预测准确率取五次准确率的平均值,实验数据集为bank-additional-full。实验结果如下所示:

    图7

    从结果中可以大致看出其分类准确率与基学习器个数存在一定的关系,为了验证笔者的想法,将平均分类准确率与基学习器个数做图如下:

    图8

    图中横坐标代表基学习器数量,纵坐标代表模型分类准确率。从图中可以看出随着基学习器数量的增多,整个模型的分类准确率提升。在基学习器数量大于15后准确率趋于稳定,且基学习器数量为奇数时整个模型的预测准确率较高。

    综合实验结果,可以推算出随机森林的预测准确率大约为0.804。

    决策树

    决策树是数据挖掘领域非常著名的一种方法,是数据挖掘十大算法之一,同时该方法也非常简单有效,在某些应用场景下堪比专家。实验用到的数据集为bank-additional-full,一共做100次实验,实验分类错误率如下图所示:

    图9

    一百次实验的平均错误率为0.621,其实验次数与预测正确率的关系如下图所示:

    图10

    图中横轴为实验次数,纵轴为模型预测准确率。从图中可以看出,决策树模型的预测准确率比较稳定,基本只和训练集与测试集数据有关,在一百次实验中,其准确率一直稳定在0.61附近。

    Logistic回归

    Logistic回归是线性回归的一种,该模型的相关说明请参见笔者的另一篇博客浅谈随机梯度下降法在对数回归中的应用。由于线性模型的计算量比较大,因此在实验该模型的过程中笔者采用较小的数据集bank-additional,量化该数据后本地存储为bank-addtional-format-lr供实验读取。

    笔者采用线性损失函数,并且使用随机梯度下降法训练模型。该方法中有两个较为重要的参数,一个是迭代次数,另一个是梯度下降步长。为了得到较为收敛的数据且避免陷入局部最小,迭代次数选为10000次,步长选为0.001。回归分析中最重要的是回归系数是否收敛,若回归系数收敛则说明模型是收敛的,否则一个发散的模型是无法使用的。下图为回归系数全部31个维度的收敛情况:

    图11 图12 图13 图14 图15 图16

    图中横轴代表迭代次数,纵轴代表回归系数相应维度的数值变化情况。从图中可以看出,回归系数在所有的维度上都收敛或者有收敛的趋势,这说明整个模型是收敛的。接下来需要考察模型的预测准确率,笔者一共做了十次实验,整理结果如下:

    图17

    从实验结果可以看出,回归模型整体预测的正确率较高,平均达到准确率达到0.909,且准确率表现十分稳定,正负相差不超过0.015。这也说明该案例是一个线性可分的问题?

    SVM

    支持向量机(Support Vector Machine)是机器学习领域应用十分广泛的一种模型,其数学模型十分优美。更加难能可贵的是svm能够通过核函数的方式将原本低纬度线性不可分的数据映射到更高维度的希尔伯特空间,从而使其线性可分,能够解决许多非线性问题。笔者在实现svm模型时采用了高效的序列最小优化算法(SMO)。

    笔者在实验时采用的数据集是bank-additional,量化后的数据本地存储为bank-additional-format-svm。SVM模型本身需要的标定的参数是比较多的,包括松弛变量C,核函数的种类,KKT条件的容忍参数,选择rdb核函数时到达率参数等。由于在logistic回归中笔者怀疑该案例是一个线性可分的问题,因此首先测试线性核函数。在测试中松弛变量C选择为较大的0.6,这样能够最大限度地让训练集中所有数据都正确分类,提高模型的泛化能力。KKT条件的容忍参数设定为0.01。

    笔者一共实验二十次,实验结果如下图所示:

    图18

    从实验结果可以看出,svm的平均分类准确率为0.691。接着,笔者又选取了rbf核函数,到达率选择了较大的1.3。在rbf核函数下svm的表现比线性核要差得多,平均分类准确率只达到0.46左右。

    综合四个模型的实验,可以得到如下结果:

    图19

    可以看出,表现最好的是回归模型,然后是随机森林模型,接着是svm模型,最后是决策树模型。

    展望

    该案例的数据分析做到这里告一段落,笔者认为还有一些可以优化的地方,在这里写明,希望以后有机会能够做的更好。第一点是数据预处理做的不充分,笔者在训练模型时将数据的所有属性都带入模型,没有对数据的属性进行筛选,这就不可避免地将一些对结果影响不大的属性也带入了,给模型引入了更多的不确定性因素;第二点是原始数据可能存在一些不可分的情况,在这种情况下主流的做法应该是引入主成分分析,对原始数据进行降维,但是限于笔者的精力和时间,这一点没有做;第三点是实验做的不充分,例如随机森林的基学习器个数最大只做到了20,应该做更多的,其他方法也应该在每个参数水准上做更多的实验来得到更加能够说服人的结果。

    开源

    https://github.com/yhswjtuILMARE/DataMiningOfBank

    2018年2月22日

    相关文章

      网友评论

        本文标题:葡萄牙银行电话贷款数据分析

        本文链接:https://www.haomeiwen.com/subject/rtrntftx.html