数据挖掘在信用卡诈骗中的应用研究_第1页
数据挖掘在信用卡诈骗中的应用研究_第2页
数据挖掘在信用卡诈骗中的应用研究_第3页
数据挖掘在信用卡诈骗中的应用研究_第4页
数据挖掘在信用卡诈骗中的应用研究_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据挖掘在信用卡诈骗中的应用研究摘要信用卡在日常生活中越来越普及,给人们的日常生活带来了诸多便利。作为一种新型的金融工具,银行找到了新的利润来源,但是与此同时,信用卡作为一种无抵押的信用贷款工具,作为发行方的银行如果错误判断了信用卡用户的还款能力,往往会承担很多未知的风险。如果信用卡用户长期无法按时偿还信用卡欠款金额,甚至恶意拖欠欠款,则将构成信用卡诈骗,损害银行的利益,这是一种犯罪行为。因此,很有必要将数据分析和数据挖掘的相关技术引用到信用卡欺诈检测上,帮助银行准确识别出潜在的违约用户,这能帮助银行免受信用卡欺诈带来的损失。本次设计将采用一个kaggle网站上的台湾银行信用卡数据集,利用描述性统计、可视化作图等工具对数据集进行数据探索。对数据集有了初步了解之后,对数据集进行数据清洗和转换,再通过使用逻辑回归、神经网络、决策树等常用的机器学习算法,对数据集建立模型。使用F1分数、准确率等常用的评价指标评价不同算法的得到的模型再测试集上的性能表现。关键词: 数据分析,数据挖掘,信用卡欺诈AbstractCreditcardsarebecomingmoreandmorepopularindailylife,bringingconveniencetopeople'sdailylives.Asanewtypeoffinancialinstrument,thebankhasfoundanewsourceofprofit,butatthesametime,creditcardasanunsecuredcreditloantool,astheissuer'sbank,ifitmisjudgesthecreditcarduser'srepaymentability,itwilloftenTakeonmanyunknownrisks.Ifthecreditcarduserfailstorepaythecreditcarddebtamountontime,orevenmaliciouslydefaultsonthearrears,itwillconstitutecreditcardfraudanddamagetheinterestsofthebank.Thisisacriminalact.Therefore,itisnecessarytorefertothetechnologyofdataanalysisanddataminingtocreditcardfrauddetectiontohelpbanksaccuratelyidentifypotentialdefaultusers,whichcanhelpbanksavoidthelossescausedbycreditcardfraud.ThisdesignwilluseaTaiwanesebankcreditcarddatasetonthekagglewebsitetoexploredatasetsusingtoolssuchasdescriptivestatisticsandvisualmapping.Afterapreliminaryunderstandingofthedataset,thedatasetiscleanedandtransformed,andthedatasetismodeledbyusingcommonlyusedmachinelearningalgorithmssuchaslogisticregression,neuralnetworks,anddecisiontrees.TheperformanceofthemodelretestsetobtainedbydifferentalgorithmswasevaluatedusingcommonlyusedevaluationindexessuchasF1scoreandaccuracy.Keywords:Dataanalysis,datamining,creditcardfraud目录1引言 11.1 研究背景与意义 11.2国内外研究现状 21.3研究内容及主要工作 22数据挖掘方法 32.1数据挖掘基本概念 32.2本文涉及的方法的基本概念 42.2.1逻辑回归 42.2.2多项式拓展 52.2.3朴素贝叶斯 62.2.4神经网络 72.2.5主成分分析 82.2.6决策树 93使用的数据集 103.1数据来源和简介 103.2数据探索 123.2.1数据质量探索 123.2.2连续变量描述性统计 133.2.3违约率 153.2.4离散变量数据分布 153.2.5连续变量数据分布 263.2.6相关性探索: 314数据预处理 334.1异常值处理 334.2增删变量以及主成分分析 344.3离散变量进行哑变量编码 374.4连续变量标准化 384.5多项式拓展 384.6划分数据集 395数据挖掘 415.1模型评价指标 415.1.1F1分数 415.1.2AUC分数 415.2逻辑回归 425.2.1单变量逻辑回归 425.2.2选择正则化参数 445.2.3性能评价 475.3神经网络 495.3.1选择隐藏层规模 495.3.2模型评价 525.4朴素贝叶斯 535.4.1实现过程 535.4.2性能评价 545.5决策树 555.5.1主要过程 555.5.2性能评价 565.6模型比较 57结论 58参考文献 59致谢 601引言研究背景与意义随着经济的全球化发展,国内国外的银行纷纷进入全球市场。银行再盈利方面,传统模式的存储盈利已经不饿满足银行的需求,借此机会,信用卡普及了。信用卡再上世纪五十年代诞生于美国,作为信用卡行业最发达的国家,美国的信用卡主要有维萨(VISA)、万事达(MasterCard)、美国运通(AmericanExpress)和大来(DinnersClub)。现如今,大多数国家紧随美国的不发,银行大力推广信用卡,同时信用卡这一金融工具发展的越来越成熟。 在信用卡发展的早期阶段,各大机构为了能够吸引到大量的用户来使用自家的信用卡,往往会降低信用卡的申请门槛,大量的发行信用卡,抢占新兴的市场份额。得益于这种政策,截止到1970年,超过一般的美国人使用上了信用卡。知道2017年,VISA的全球交易额已经达到二10.21万亿美元,市场份额超过了50%。 随着信用卡普及率逐年上升,信用卡用户不能按时还款甚至恶意违约的信用卡欺诈犯罪行为出现的越来越频繁。根据央行统计报告显示,截止到2013年,我国的信用卡坏账总额已经高达251.92亿元,比上一年年末,增加了105.34亿元,增幅达到了71.86%。出现了这么严峻的信用卡欺诈请款,除了信用卡发卡前的审核准确率较低之外,归根结底,不饿能及时找出高违约风险的信用卡用户才是最重要的原因。上诉原因导致了信用卡恶意违约的犯罪愈演愈烈。因此。利用新的技术手段来提高信用卡发卡前对申请人的信用评级准确率,和及时发现已有用户中的高风险用户,已经势在必行。如何从信用卡数据集中挖掘出有用的信息,结合数据分析分析信用卡违约用户群的群体特征,将非常有助于银行避免发放信用卡给无力按时偿还欠款的用户,同时挖掘出已有用户群中违约风险较高的用户群,对其提高警惕,采取如降低信用额度等措施,从根源上避免银行遭受不必要的经济损失。另一方面,将数据分析和数据挖掘用在银行信用卡信用欺诈检测上,也能让优质的信用卡申请人更加快速便捷的拿到申请的信用卡,不论对于广大用户而言还是对于银行而言,都是一种互利共赢的方式。1.2国内外研究现状 在国外,BrauseR等人于1999年通过将关联规则、高斯核函数和神经网络等算法应用在信用卡欺诈数据集上,得到了不错的模型预测准确率。2011年,BhattacharyyaS采用了不同以往的方法,将随机森林、逻辑回归、支持向量机等常用的及其学习方法运用到国际信用卡业务交易的数据集上,对比分析三种模型在信用卡欺诈检测应用中的效果。在国内,早期较为常用的是决策树和逻辑回归这两种算法。在2008年,杨玺采用了支持向量机算法。2010年,刘艳红提出将支持向量描述算啊SVDD应用到这方面的想法,而且两阶段信用卡欺诈检测模型克服了信用卡数据包含的信息量可能不充足的问题。2011年,段刚龙等人提出了将F-scores、支持向量机相结合的途径,成功克服了模型泛化能力不够强的问题。总的来说,没有哪一种算法能普遍适用于所有的数据集,同种算法在不同的数据集中表现可能有很大的差别。1.3研究内容及主要工作这篇文章所用到的数据集为kaggle网站上的台湾银行信用卡数据集,并在这个数据集上,使用常用的数据分析方法和常用的机器学习算法,对数据集进行分析和建模,达到能用于预测的目的。 第一章作为引言,简单介绍这个题目的背景和研究意义,简单介绍国内和国外在这方面的研究情况,各种研究方法的优点。同时介绍这篇文章的整体思路和基本的写作框架。 第二章作为文中所用到的相关知识的理论介绍,包括各种常用的数据分析方法和常用的数据挖掘方法的介绍。 第三章着重与数据探索,简单介绍这次题目所用到的数据集的基本情况,并且对该数据集进行初步的探索 第四章将引入常用的模型评价指标,并进行数据挖掘过程中的数据预处理、第五章侧重于将数据挖掘应用在数据集上的研究,建立模型,比较不同数据挖掘方法的效果,并对全文做出总结。同时指出这边文章中的不足之处和进一步完善的方法。2数据挖掘方法2.1数据挖掘基本概念 数据挖掘,即DataMining,不同于传统的分析,是指在数据中挖掘出有价值的信息,期间可能用到一些机器学习的算法,数据挖掘知识覆盖面广泛,涉及统计学、计算机等专业领域的知识。数据挖掘可以分为有监督学习和无监督学习两种形式,前者所引用的数据集中,每条数据记录除了包含输入变量之外,还包含了输出的类标签。而无监督学习的数据集记录则不包含真实的类标签,只包含了对应的输入变量值。此篇文章属于有监督学习范畴。 数据挖掘整个过程可以大致分为以下几个步骤:定义挖掘目标:首先得明确本次数据挖掘过程的目标是什么,想要达到什么效果。数据采样:即明确数据来源,手动抽取数据集或者利用现成的数据集,数据集质量要能保证相关性、可靠性和有效性,不能忽视采用的数据集的数据质量,否则数据挖掘的效果会很差,甚至造成误导。数据探索:对采用的数据集进行初步的探索,可以进行描述性统计或者可视化等常用的方法,分析数据集中各个变量之间的相关性,目标变量和输入变量之间的相关性,变量取值的规律性,形成对数据集和数据集质量的初步认知数据预处理:数据集一般都会有错误数据或者缺失数据,可能造成这种情况的原因包含人工录入数据过程出错、数据存储过程中意外丢失损坏、虚假数据等。数据预处理一般包含了缺失值处理、异常值处理、均值诡异、主成分分析、特征工程等过程。建立模型:没有哪一种方法是适合解决所有问题的,即使是相似的题目,用同一种算法得到的效果也有可能天差地别。在这一步应该分析所选的题目适合使用哪些方法,实践过程应该如何调整所选择的方法的参数。将模型理论知识和实践相结合。模型评价:如果数据挖掘过程中使用了多种方法,我们该如何评价哪种方法的效果更好,值得投入到实际应用中呢?这个时候就需要我们选择合适的模型评价指标,根据数据集的数据质量和题目的具体情况,选择的模型评价指标往往不同。2.2本文涉及的方法的基本概念2.2.1逻辑回归线性回归是通过一系列的点,计算出一条曲线来拟合这些点,从而对未来输入的值进行连续型变量的预测,预测上的输出结果值域为实数。而逻辑回归不同于线性回归,主要用于离散变量的二分类。假设数据集中每一条记录为(xi,yi),其中共有m个样本,其中第i个样本xⅈ类标签预测值公式如下:h其中x为输入的特征向量,θT为模型参数的转置,作出−x~由上图可见,−θTx逻辑回归代价函数如下:Jθ=1其中:costhθ(xicosthθ(xi对每个参数进行如下梯度下降过程:θj=θ如果要拟合的逻辑回归模型较为复杂,一般需要进行多项式拓展,才能得到更好的效果。2.2.2多项式拓展 假设数据集中每一条记录为(xi,yi),其中共有m个样本,其中第i个样本xⅈ 为了模型能够拟合更加复杂、维度更高的数据集,使拟合效果更好,可以对原始数据集进行多项式拓展,将每个属性跟其他属性结合成二次项、三次项或者更高次项,并插入到原始数据集中,一并进行数据挖掘。2.2.3朴素贝叶斯朴素贝叶斯是一个经典的统计学习方法,可用于分类。之所以称之为朴素,是指各个变量之间相互独立。但是在实际生活中,数据集所有变量之间相互独立的条件往往不会得到满足,用于分类的话,由于变量之间难免会有相关性,效果可能没有理论上的那么好。朴素贝叶斯用于分类时基于一下贝叶斯公式:P(B|A)=P假设B为样本属于某个类,A为样本的已有特征,那么由于假设变量之间相互独立,P(A|B)为整个数据集中,样本属于该类的情况下,A中所有已有特征各自出现的概率的乘积。例如:P(“属于第二类”|“属性1=1,属性2=2”)=P“属性1=1,属性2=2”P2.2.4神经网络神经网络模仿了人类大脑神经元之间的信息传递过程,由多个层以及许多神经元节点构成,每个节点通过一个激活函数对前一层的神经网络节点的输出进行运算,再将运算结果传递到下一层神经元。同时,每个神经元之间的连接,是加上了不同的权重的。 更具神经网络的层次结构,一般可以分为输入层、隐藏层、输出层。输入层就是用于输入样本数据,经过隐藏层的复杂运算,如前向传播、后向传播之后,输出到输出层。如下图所示,下图未插入一行偏置单元: 假设aij为第j层第i个单元的值,aaah以上就是前向传播求预测值的过程接下来是后向传播求神经元误差值,进行梯度下降调整参数的过程:在前面的逻辑回归小结有提到sigmoid函数,而神经网络也用到了sigmoid函数作为激活函数。由上面的前向传播过程,可以得到输出层误差为:δ=根据微积分中的链式求导,第l层的值为a(l),下一层的值为a(l+1)。此时把δg往前计算,就能求出各层的而误差,进而使用逻辑回归中的梯度下降优化模型,不断调整参数。使得代价函数的值最小。2.2.5主成分分析有时候数据集过于庞大,运算量过大,导致耗时过长,可以适当降低数据集的维度,对数据集进行压缩,减少其占用的存储空间,同时加快机器的运行速度。其次,更低维度的数据也更方便对其进行可视化。主成分分析整个过程主要是寻找一个维度较低的空间,把原始数据集映射到低纬度空间中,而且原始数据到低维空间的投影距离最小,及最小化误差。计算低维空间向量包含:计算协方差、奇异值分解、计算低维矩阵、转换为低维数据这几个主要步骤。协方差矩阵:C=再对协方差矩阵进行奇异值分解。主成分分析过程中,原始数据集到新的低维空间的距离可以采用平均投影误差的平房来衡量:J=1其中,xapproxJ得到的结果就是从n维空间像更低维度的k维空间进行映射。2.2.6决策树决策树是一种常见的分类算法,性能优秀。决策树一般需要进行以下步骤:1.利用特征A的某个取值a,将数据分为两部分,计算A=a时的基尼系数2.遍历所有特征的所有取值,重复步骤1,直到满足停止条件,算法的停止条件既可以选择样本包含的最小样本数,又可以选择基尼系数阈值3.开始剪枝,避免模型过拟合,泛化性能差。3使用的数据集3.1数据来源和简介此次题目采用来自kaggle网站上面的一个台湾银行信用卡数据集,该数据集每条数据集记录包含了信用卡用户的个人基本信息,如性别、年龄、婚姻情况等基本的人口统计学信息。除此之外,每条记录还包含了2005年4月至2005年9月期间,该用户应偿还的信用卡账单金额、实际已偿还的信用卡金额等信息。而该数据集的类标号则为用户在下个月是否违约。该数据集总共包含了30000条记录,每条数据记录包含了25个属性,其中一个属性为类标签。其中BILL_AMT变量为对应月分的账单金额,账单金额=之前月份欠款+本月新的欠款,正数表示有为欠款,负数表示卡中有存款结余。其中PAY_AMT变量为对应月份的还款金额,PAY_AMT=偿还的欠款+存入信用卡的钱,大于BILL_AMT表示按时还款,小于BILL_AMT但大于最低还款限度表示延迟还款,小于最低还款限度表示违约。类标签为下个月(10月)用户是否违约。数据集的主要字段如下:ID:信用卡客户ID号LIMIT_BAL:以新台币计算的信贷金额(包括个人和家庭/补充信贷)SEX:性别(1代表男性,2代表女性)EDUCATION:受教育程度(1=研究生,2=大学,3=高中,4=其他5=未知,6=未知)MARRIAGE:婚姻状况(1=已婚,2=单身,3=其他)AGE:年龄PAY_0:2005年9月的还款记录(0=按时付款,1=延迟一个月付款,2=延迟两个月付款,...8=延迟八个月付款,9=延迟九个月及以上付款)PAY_2:2005年8月的还款情况(特征值含义如上)PAY_3:2005年7月的还款情况(特征值含义如上)PAY_4:2005年6月的还款情况(特征值含义如上)PAY_5:2005年5月的还款情况(特征值含义如上)PAY_6:2005年4月的还款情况(特征值含义如上)BILL_AMT1:2005年9月账单金额(新台币)BILL_AMT2:2005年8月账单金额(新台币)BILL_AMT3:2005年7月账单金额(新台币)BILL_AMT4:2005年6月账单金额(新台币)BILL_AMT5:2005年5月账单金额(新台币)BILL_AMT6:2005年4月账单金额(新台币)PAY_AMT1:2005年9月支付金额(新台币)PAY_AMT2:2005年8月支付金额(新台币)PAY_AMT3:2005年7月支付金额(新台币)PAY_AMT4:2005年6月支付金额(新台币)PAY_AMT5:2005年5月支付金额(新台币)PAY_AMT6:2005年4月支付金额(新台币)default.payment.next.month:是否违约还款(1代表是,0代表否)3.2数据探索3.2.1数据质量探索由上图可知,该数据集总共有30000条样本,没有缺失值,数据类型有int和float,都为数值型,但有些变量比如SEX,EDUCATION虽然是数值类型,但其实是分类变量,取值范围在书籍集说明文档中有做说明。3.2.2连续变量描述性统计由上图可以观察到,账单金额从BILL_AMT6到BILL_AMT9,均值逐渐上升,说明人们在2005年4月到9月这段时间越来越倾向于信用卡消费,这种消费方式越来越被人们接受。最小值和最大值区间跨度比较大,最好进行连续变量标准化。每个月的账单金额中位数都为20000左右。由上图可以得出:从PAY_AMT6到PAY_AMT1分别代表了2005年4月到9月,每个月的还款金额。均值和中位数随着时间的推移,都有上升的趋势,说明人们的还款能力逐渐提高。最大最小值跨度同样比较大,需要进行标准化。由上图可得:信贷金额取值范围从10000大100万不等,均值为16万,中位数为14万,说明大多数人的额度为15万新台币左右。取值范围跨度同样比较大,需要进行标准化。3.2.3违约率违约率为0.2212,样本不平衡,存在偏斜类的现象。模型评价指标可以考虑使用F1分数,而不是只用准确率。因为如果只用准确率的话,为了得到更高的准确率,可能模型会将所有样本猜测为没有违约,这样最差的模型也能得到78%左右的准确率。模型评价指标将在第五章进行讨论3.2.4离散变量数据分布主要代码如下:indexName=('SEX','MARRIAGE','EDUCATION','PAY_0','PAY_2','PAY_3','PAY_4','PAY_5','PAY_6')foriinindexName:print(i,'取值分布为:\n',data[i].value_counts(),'\n')figure,(ax1,ax2)=matplotlib.pyplot.subplots(2,1)ax1.hist(data.loc[data['default.payment.next.month']==0,'EDUCATION'])ax1.set_title('NoDefault')ax2.hist(data.loc[data['default.payment.next.month']==1,'EDUCATION'])ax2.set_title('Default')matplotlib.pyplot.xlabel('EDUCATION')matplotlib.pyplot.show()运行结果如下:SEX:性别(1代表男性,2代表女性)由图可以得出,女性用户数较多,大概是男性的1.5倍婚姻状况(1=已婚,2=单身,3=其他)单身的用户人数比已婚的用户人数多,但是已婚人士的违约率高于单身人士出现了文档中未解释的异常值,需要对异常值进行处理。(1=研究生,2=大学,3=高中,4=其他5=未知,6=未知)大学学历人数最多,高中学历用户的违约率最高,大概在50%,而且随着学历的升高,违约率减少。出现了说明文档中未做解释的异常值,需要进行异常值处理,异常值数量较少,可以考虑直接将包含异常值的数据记录删除。(-1=按时付款,1=延迟一个月付款,2=延迟两个月付款,...8=延迟八个月付款,9=延迟九个月及以上付款)一旦超过2个月未还款,违约率将超过50%不难看出,没有违约的子图频数更高,大都数人会选择按时还款或者偿还最低还款,避免违约情况出现。其他探索:主要代码如下:defmyBoxplot(feature1,feature2,feature3):matplotlib.pyplot.figure()seaborn.boxplot(x=feature1,y=feature2,hue=feature3,data=data,showfliers=False)matplotlib.pyplot.show()运行结果如下:SEX:性别(1代表男性,2代表女性)MARRIAGE:婚姻状况(1=已婚,2=单身,3=其他)已婚用户年龄普遍高于未婚用户,但差距较小已婚男性年龄普遍高于已婚女性,未婚男性年龄普遍高于未婚女性。EDUCATION:受教育程度(1=研究生,2=大学,3=高中,4=其他5=未知,6=未知)MARRIAGE:婚姻状况(1=已婚,2=单身,3=其他)已婚用户年龄普遍高于未婚用户,MARRIAGE取值为其他的用户,在上面几个箱型图中,年龄普遍大于已婚用户和单身用户,有可能是离婚用户。不同学历的用户群在年龄上的分布大致相同,受教育程度对年龄分布的影响不明显。SEX:性别(1代表男性,2代表女性)信贷金额不论男女,都随着年龄的增长而增长,直到大约30岁,之后趋于平稳,50随之后开始震荡。男性的信贷金额普遍比女性的高。EDUCATION:受教育程度(1=研究生,2=大学,3=高中,4=其他5=未知,6=未知)MARRIAGE:婚姻状况(1=已婚,2=单身,3=其他)单身用户的额度普遍比已婚用户的额度要低。随着学历的升高,用户往往能得到更大的信贷额度。不论教育程度高低,违约人数都是占少部分。,信贷金额主要集中在10万到20万新台币。3.2.5连续变量数据分布主要代码如下:figure,(ax1,ax2)=matplotlib.pyplot.subplots(2,1)ax1.hist(data.AGE[data['default.payment.next.month']==1],bins=20)ax1.set_title('Default')ax2.hist(data.AGE[data['default.payment.next.month']==0],bins=20)ax2.set_title('NoDefault')matplotlib.pyplot.xlabel('Age')matplotlib.pyplot.ylabel('NumberofObservations')matplotlib.pyplot.show()运行结果如下:除了在30~35岁这个年龄段,用户的履约能力更高之外,其他年龄段的分布没有明显区别,信用卡的主要用户集中在25到30岁,然后随着年龄的逐渐增长,使用信用卡的人越来越少。中年人青年人客户消费需求多,存在购房、购车、下一代教育等大额消费需求,但与此同时,这各群体正是社会的中坚力量,还款能力并不弱。信贷金额的峰值在5万新台币附近,大部分是0-10万新台币的信用额度不论用户违约与否,大多数账单金额集中在5万新台币附近,违约与否的信贷金额的分布没有显著差别。说明用户是否违约和每月的账单金额大小没有明显的关系。未违约用户每个月还款金额与违约用户每月还款金额相比,分布上没有明显差别3.2.6相关性探索:主要代码如下:matplotlib.pyplot.figure()seaborn.heatmap(data.iloc[:,0:-1].corr())matplotlib.pyplot.show()运行结果如下:BILL_AMT之间的相关性随着月间距离的增加而减小。相关性最低的是9-4月。PAY之间没相关性PAY_AMT之间的相关性随着月间距离的增加而减小。相关性最低的是9-4月。类标签和其他变量的相关性:LIMIT_BAL负相关,跟6个PAY变量关系比较大,正相关,而且跟PAY_0关系最大既然PAY变量与类标签相关性较高,那么如果建模的时候准确率太低的话,可以尝试只用PAY变量建模4数据预处理数据集在采集数据和保存数据的过程中难免会出现错误,需要进行异常值处理和缺失值处理。同时,对数据进行转换有利于挖掘出更有价值的信息,建立性能更好的模型。4.1异常值处理在第三章的数据探索中,我发现数据集中,有些记录某个变量的取值不在说明文档中,除了查阅kaggle官方的数据集说明文档之外,经过在网上查阅其他关于该数据集变量的说明文档,现在开始对数据集中的异常值进行处理。在PAY变量中,异常值0表示偿还了最小金额,区别与按时还款,但是不属于违约。EDUCATION变量中,0,5,6三个取值在官方文档中解释为unknown,为了方便,归入到4(other)中。其他属性的异常值未找到合适的解释,包含这些异常值的记录将直接予以删除。主要代码如下:#异常值处理:#EDUCATION异常值0,4,5,6全部归为4(其他)print('修正前的education取值:\n',data.EDUCATION.value_counts())index=list((data.EDUCATION==5)|(data.EDUCATION==6)|(data.EDUCATION==0))data.loc[index,'EDUCATION']=4print('修正后的education取值:\n',data.EDUCATION.value_counts())#其他变量异常值直接删除print('修正前的MARRIAGE取值:\n',data.MARRIAGE.value_counts())index=list(data.MARRIAGE!=0)data=data.loc[index,:]print('修正后的MARRIAGE取值:\n',data.MARRIAGE.value_counts())结果如下:4.2增删变量以及主成分分析删除变量ID,该变量唯一标识一个客户,对改题目没有意义:主要代码如下:#删除变量IDdataX.drop(['ID'],axis=1,inplace=True)print('删除了变量ID后剩余的变量',dataX.columns)运行结果如下:在之前的数据分析过程中,我发现了男人更可能违约,已婚人士更倾向于违约,因此把这两个变量组合成一个新的变量SEXandMARRIAGE,插入到数据集中:主要代码如下:#发现男人更有可能违约,已婚人士更有可能违约,进行特征工程,组合这两个变量dataX['SEXandMARRIAGE']=0dataX.loc[((dataX.SEX==1)&(dataX.MARRIAGE==1)),'SEXandMARRIAGE']=1#marriedmandataX.loc[((dataX.SEX==1)&(dataX.MARRIAGE==2)),'SEXandMARRIAGE']=2#singlemandataX.loc[((dataX.SEX==1)&(dataX.MARRIAGE==3)),'SEXandMARRIAGE']=3#divorcedmandataX.loc[((dataX.SEX==2)&(dataX.MARRIAGE==1)),'SEXandMARRIAGE']=4#marriedwomandataX.loc[((dataX.SEX==2)&(dataX.MARRIAGE==2)),'SEXandMARRIAGE']=5#singlewomandataX.loc[((dataX.SEX==2)&(dataX.MARRIAGE==3)),'SEXandMARRIAGE']=6#divorcedwomandataX.to_csv('增加变量SEXandMARRIAGE.csv')为了加快神经网络的运行速度,节省时间,在神经网络模型中可以选择采用主成分分析来降低数据集的维度;主要代码如下:fromsklearn.decompositionimportPCAmodelPCA=PCA()modelPCA.fit(dataX)print('各个变量保留的方差:\n',modelPCA.explained_variance_ratio_)varSum=0#for循环内的变量拿不出来,用这个变量记住要保留几个变量parameterPCA=0forindexinrange(0,len(modelPCA.explained_variance_ratio_)):varSum=varSum+modelPCA.explained_variance_ratio_[index]ifvarSum>=0.95:print('选取方差贡献量前',index+1,'个属性即可保留95%的方差')parameterPCA=index+1print('parameterPCA的值为:',parameterPCA)breakmodelPCA=PCA(n_components=parameterPCA)modelPCA.fit(dataX)#transform之后是ndarraydataX=modelPCA.transform(dataX)dataX=pandas.DataFrame(dataX)print('降维之后数据集规模:',len(dataX),'行',len(dataX.iloc[0,:]),'列')dataX.info()dataX.to_csv('降维完成.csv')4.3离散变量进行哑变量编码在处理离散变量的时候,应该对离散变量进行哑变量编码,否则计算代价函数时,都某个取值的距离与到另一个取值的距离是不一样的,这是不对的,因为一个类个中取值之间应该是在同一个等级上的。把有n种取值的某个属性,转换为n维向量,该向量中只有一个元素为1,其余为0,再将该向量插入到数据集中。主要代码如下:print('转换为哑变量之前,一共有',len(dataX.iloc[0,:]),'个变量')forcolNameindataX.columns:ifcolNameinindexCategorical:#get_dummies()返回向量数据框dummy=pandas.get_dummies(dataX.loc[:,colName])print('get_dummies(',colName,')返回值类型为:',type(dummy),'有',len(dummy),'行',len(dummy.iloc[0,:]),'列\t','正确答案是',len(dataX.loc[:,colName].unique()),'列')#列拼接print('合并之前有',len(dataX.iloc[0,:]),'列')dataX=dataX.drop([colName],axis=1)dataX=pandas.concat([dataX,dummy],axis=1)print('合并之后有',len(dataX.iloc[0,:]),'列')print('转换为哑变量之后一共有',len(dataX.iloc[0,:]),'个变量')运行结果如下:4.4连续变量标准化某些变量的值域过大,标准化有助于加快收敛速度,节省时间。主要代码如下:forcolNameindataX.columns:ifcolNamenotinindexCategorical:colData=dataX.loc[:,colName]dataX.loc[:,colName]=(colData-colData.mean())/colData.std()4.5多项式拓展如果模型拟合效果欠佳,不能得出更复杂的模型,可以考虑使用多项式拓展,形成二次项插入到数据集中。主要代码如下:#多项式拓展,除了类标签,此时data中不包含类标签colName=dataX.columnsforcolIndex1inrange(0,len(colName)):forcolIndex2inrange(colIndex1,len(colName)):print('正在处理第',colIndex1,'列和第',colIndex2,'列')dataX=pandas.concat([dataX,dataX.iloc[:,colIndex1]*dataX.iloc[:,colIndex2]],axis=1)print('多项式拓展之后的数据集info:')dataX.info()dataX.to_csv('多项式拓展完成.csv')4.6划分数据集将数据集按照6:2:2的比例划分为训练集、交叉验证集合、测试集。定义函数用于读取数据集。主要代码如下:defloadData():importpandasimportosdata=pandas.read_csv('dataDone.csv',index_col=0)dataTraining=data.iloc[:int(0.6*len(data)),:]print('训练集样本数:\n',len(dataTraining))dataCV=data.iloc[int(0.6*len(data)):int(0.8*len(data)),:]print('交叉验证集样本数:\n',len(dataCV))dataTest=data.iloc[int(0.8*len(data)):,:]print('测试集样本数:\n',len(dataTest))#每次从新进行数据预处理,训练集违约率都会变化,但调用loadData()不会变化print('训练集违约率为:',dataTraining['default.payment.next.month'].sum()/len(dataTraining))print('交叉验证集合违约率为:',dataCV['default.payment.next.month'].sum()/len(dataCV))print('测试集合违约率为:',dataTest['default.payment.next.month'].sum()/len(dataTest))os.system('pause')dataTrainingX=dataTraining.iloc[:,0:-1]dataCVX=dataCV.iloc[:,0:-1]dataTestX=dataTest.iloc[:,0:-1]dataTrainingY=dataTraining.iloc[:,-1]dataCVY=dataCV.iloc[:,-1]dataTestY=dataTest.iloc[:,-1]returndata,dataTrainingX,dataCVX,dataTestX,dataTrainingY,dataCVY,dataTestY5数据挖掘5.1模型评价指标选择哪种模型评价指标,需要按照具体的数据集和使用的具体的机器学习方法,结合考虑,没有哪一种模型评价指标是适用于所有模型或者所有问题的。之前的数据分析过程中,我发现了数据集总体违约率大约为22%,是一个倾斜的数据集,此时不应该只考虑准确率,最好使用F1分数,auc分数等作为模型评价指标,能更好的解决偏斜类的问题。5.1.1F1分数假设用TP,TN,FP,FN分别表示真正例,真负例,假正例,假负例,那么精确率precision=TP/(TP+FP)召回率recall=TP/(TP+FN)准确率accuracy=(TP+TN)/(TP+FP+TN+FN)F1分数=2*precision*recall/(pression+recall)同时考虑了精确率和召回率,能有效避免模型把全部样本归为一个类别,还能获得不错的准确率的情况出现。5.1.2AUC分数ROC曲线和AUC分数也经常被用来衡量二分类分类器的性能。假正率FPR,真正率TPR计算公式如下:FPR=FP/TN+FNTPR=TP/TP+FPTPR的增加以FPR的增加为代价。ROC曲线下的面积就是AUC分数,可以作为模型性能的评价指标。5.2逻辑回归5.2.1单变量逻辑回归由于采用的数据集中包含了24个输入变量,根据之前数据分析章节中的热度图可以得知,每个变量与类标签的相关性不尽相同,为了能更直接的了解到各个输入变量对模型准确判断输入样本的类标签的贡献有多大,可以对各个变量一一建立逻辑回归模型,计算AUC分数。主要代码如下:fromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLogisticRegressionfromsklearn.metricsimportroc_auc_scoreaucs=list()forindexNameindata.columns[0:-1]:modelLogisticRegression=LogisticRegression()#modelLogisticRegression.fit()要求第一个参数为DataFrame,第二个为SeriesmodelLogisticRegression.fit(pandas.DataFrame(dataTrainingX[indexName]),dataTrainingY)possibilityPositive=numpy.array([score[1]forscoreinmodelLogisticRegression.predict_proba(pandas.DataFrame(dataTestX[indexName]))])auc=roc_auc_score(dataTestY.values,possibilityPositive)aucs.append(auc)#折线图importmatplotlib.pyplotaspltplt.plot(data.columns[0:-1],aucs)plt.xlabel('columnsName')plt.ylabel('aucScore')plt.show()对每个变量进行单变量逻辑回归,得到的AUC分数如下:由上图可以得出,各个变量最低的AUC分数也有0.5,最高达到了0.645.2.2选择正则化参数为了逻辑回归模型过拟合,泛化性能差,即在训练集上表现得非常优秀,但是在测试集和实际应用中性能表现却不佳,可以为代价函数加上正则化项。选取的正则化参数范围从0.0001到100,分别用以上正则化参数建立逻辑回归模型,测试其在交叉验证集上的性能表现,筛选出最佳的正则化参数,训练模型并用于实际使用。主要代码如下:fromsklearn.linear_modelimportLogisticRegressionlambdaRange=[0.0001,0.001,0.01,0.02,0.04,0.08,0.16,0.32,0.64,1.28,2.56,5.12,10.24,100,1000]accuracyCV=list()foriinlambdaRange:#sag随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度modelLogisticRegression=LogisticRegression(C=(1/i),solver='sag',n_jobs=2)#用values,要求numpy的arraymodelLogisticRegression.fit(dataTrainingX,dataTrainingY)prediction=modelLogisticRegression.predict(dataTrainingX)print('当C=',1/i,'时,\n在训练集上的正确率为:',len(prediction[prediction==dataTrainingY[:]])/len(prediction))print('在训练集上预测为1的数量为:',len(prediction[prediction==1]))fromsklearn.metricsimportprecision_score,recall_score,f1_scoreprecision=precision_score(dataTrainingY,prediction)recall=recall_score(dataTrainingY,prediction)F1=2*precision*recall/(precision+recall)print('在训练集上的pecision为:',precision,'\trecall为:',recall,'\tF1分数为:',F1)prediction=modelLogisticRegression.predict(dataCVX)accuracy=len(prediction[prediction==dataCVY[:]])/len(prediction)accuracyCV.append(accuracy)print('在交叉验证集上的正确率为:',accuracy)print('在交叉验证集上预测为1的数量为:',len(prediction[prediction==1]))fromsklearn.metricsimportprecision_score,recall_score,f1_scoreprecision=precision_score(dataCVY,prediction)recall=recall_score(dataCVY,prediction)F1=2*precision*recall/(precision+recall)print('在交叉验证集上的pecision为:',precision,'\trecall为:',recall,'\tF1分数为:',F1,'\n')#折线图找出最佳正则化参数importmatplotlib.pyplotaspltplt.plot(lambdaRange,accuracyCV)plt.xlabel('lambda')plt.ylabel('accuracyCV')plt.show()lambdaBest=lambdaRange[accuracyCV.index(max(accuracyCV))]print('当正则化参数为',lambdaBest,'时,交叉验证及上正确率最高,为',max(accuracyCV))随着正则化参数lambda的变化,模型再在交叉验证集上的准确率如下面图片所示:由以上折线图可以得出,随着正则化参数的增大,交叉验证集上的性能表现在正则化参数为10.24的时候最佳。下一步使用该正则化参数训练得到的模型,在测试集上进行检验。5.2.3性能评价用最佳正则化参数,在测试集上进行预测,评估模型性能:主要代码如下:#用最佳的正则化参数在测试上预测prediction=modelLogisticRegression.predict(dataTestX)accuracy=len(prediction[prediction==dataTestY[:]])/len(prediction)print('在测试集上的正确率为:',accuracy)print('在测试集上预测为1的数量为:',len(prediction[prediction==1]))fromsklearn.metricsimportprecision_score,recall_score,f1_scoreprecision=precision_score(dataTestY,prediction)recall=recall_score(dataTestY,prediction)F1=2*precision*recall/(precision+recall)print('在测试集上的pecision为:',precision,'\trecall为:',recall,'\tF1分数为:',F1,'\n')#只在测试集上计算auc,目前0.75possibilityPositive=numpy.array([score[1]forscoreinmodelLogisticRegression.predict_proba(dataTestX)])auc=roc_auc_score(dataTestY.values,possibilityPositive)print('测试集上的auc分数为:\n',auc)fromsklearn.metricsimportbrier_score_lossbrier=brier_score_loss(dataTestY.values,possibilityPositive)print('测试集上的brier分数为:\n',brier)由上图可以得出,当正则化参数为10.24时,逻辑回归模型在测试集上的正确率为82.2%,F1分数为0.43,表现良好。5.3神经网络5.3.1选择隐藏层规模此次选择的神经网络仅包含一个隐藏层,一个输入层和一个输出层。隐藏层的规模一般为输入层的整数倍,为了得到更好的效果,在交叉验证集上对隐藏层的神经元数进行选择倍数为输入层的1倍或者2倍。在训练集上用不同的隐藏层神经元个数进行训练:主要代码如下:accuracyCV=list()foriinrange(1,4):model=Sequential()model.add(Dense(input_dim=len(dataTrainingX.iloc[0,:]),output_dim=i*len(dataTrainingX.iloc[0,:])))model.add(Activation('sigmoid'))model.add(Dense(input_dim=i*len(dataTrainingX.iloc[0,:]),output_dim=1))model.add(Activation('sigmoid'))#去掉了,class_mode='binary'pile(loss='binary_crossentropy',optimizer='adam')#300改成100model.fit(dataTrainingX,dataTrainingY,nb_epoch=100,batch_size=1)prediction=model.predict_classes(dataTrainingX)prediction=pandas.DataFrame(prediction)prediction=prediction.iloc[:,0]print('\n当隐藏层神经元个数为',i*len(dataTrainingX.iloc[0,:]),'时:')print('keras在训练集上的正确率为:',len(prediction[prediction.values==dataTrainingY.values])/len(prediction))print('keras训练集上预测为1的数量为:',len(prediction[prediction==1]))fromsklearn.metricsimportprecision_score,recall_score,f1_scoreprecision=precision_score(dataTrainingY,prediction)recall=recall_score(dataTrainingY,prediction)F1=2*precision*recall/(precision+recall)print('keras在训练集上的pecision为:',precision,'\trecall为:',recall,'\tF1分数为:',F1)

prediction=model.predict_classes(dataCVX)prediction=pandas.DataFrame(prediction)prediction=prediction.iloc[:,0]accuracy=len(prediction[prediction.values==dataCVY.values])/len(prediction)accuracyCV.append(accuracy)print('keras在交叉验证集上的正确率为:',accuracy)print('keras在交叉验证集上预测为1的数量为:',len(prediction[prediction==1]))fromsklearn.metricsimportprecision_score,recall_score,f1_scoreprecision=precision_score(dataCVY,prediction)recall=recall_score(dataCVY,prediction)F1=2*precision*recall/(precision+recall)print('keras在交叉验证集上的pecision为:',precision,'\trecall为:',recall,'\tF1分数为:',F1)numberBest=(accuracyCV.index(max(accuracyCV))+1)*len(dataTrainingX.iloc[0,:])print('当隐藏层神经元个数为',numberBest,'时,在交叉验证集上的正确率最高,为',max(accuracyCV))matplotlib.pyplot.plot([1,2,3],accuracyCV)matplotlib.pyplot.xlabel('units')matplotlib.pyplot.ylabel('accuracyCV')matplotlib.pyplot.show()运行结果如下:可以得出,当隐藏层的神经元个数和输入层神经元个数相等的时候,模型泛化性能最佳,随着隐藏层神经元个数的增加,开始出现过拟合的情况,即在训练集上表现优秀,在交叉验证集上表现的很差。5.3.2模型评价选用上一步得到的神经元规模,训练模型并在测试集上进行检验。主要代码如下:#在测试集上预测:model=Sequential()model.add(Dense(input_dim=len(dataTrainingX.iloc[0,:]),output_dim=numberBest))model.add(Activation('sigmoid'))model.add(Dense(input_dim=numberBest,output_dim=1))model.add(Activation('sigmoid'))#去掉了,class_mode='binary'pile(loss='binary_crossentropy',optimizer='adam')#300改成100model.fit(dataTrainingX,dataTrainingY,nb_epoch=100,batch_size=1)prediction=model.predict_classes(dataTestX)prediction=pandas.DataFrame(prediction)prediction=prediction.iloc[:,0]print('keras在测试集上的正确率为:',len(prediction[prediction.values==dataTestY.values])/len(prediction))print('keras测试集上预测为1的数量为:',len(prediction[prediction==1]))fromsklearn.metricsimportprecision_score,recall_score,f1_scoreprecision=precision_score(dataTestY,prediction)recall=recall_score(dataTestY,prediction)F1=2*precision*recall/(precision+recall)print('keras在测试集上的pecision为:',precision,'\trecall为:',recall,'\tF1分数为:',F1)准确率为0.78,F1分数为0.432,相比训练集上的表现,说明模型出现了过拟合,表现不好。5.4朴素贝叶斯5.4.1实现过程主要代码如下:modelNaiveBayes=GaussianNB()modelNaiveBayes.fit(dataTrainingX,dataTrainingY)prediction=modelNaiveBayes.predict(dataTrainingX)#第0行第1列的数表示y_true中值为0,y_pred中值为1的个数print('训练集混淆矩阵:\n',metrics.confusion_matrix(dataTrainingY,prediction))precision=precision_score(dataTrainingY,prediction)recall=recall_score(dataTrainingY,prediction)F1=2*precision*recall/(precision+recall)print('训练集上的正确率为:',len(prediction[prediction==dataTrainingY.values])/len(prediction))print('训练集上的pecision为:',precision,'\trecall为:',recall,'\tF1分数为:',F1)#在测试集上验证prediction=modelNaiveBayes.predict(dataTestX)print('测试集混淆矩阵:\n',metrics.confusion_matrix(dataTestY,prediction))precision=precision_score(dataTestY,prediction)recall=recall_score(dataTestY,prediction)F1=2*precision*recall/(precision+recall)print('测试集上的正确率为:',len(prediction[prediction==dataTestY.values])/len(prediction))print('测试集上的pecision为:',precision,'\trecall为:',recall,'\tF1分数为:',F1)5.4.2性能评价运行结果如下:由上图可以看出,朴素贝叶斯在训练集上的正确率为80.3%,F1分数为0.35测试集上的正确率为80.4%,F1分数为0.35模型性能良好5.5决策树5.5.1主要过程主要代码如下:fromsklearnimportmetricsfromsklearn.treeimportDecisionTreeClassifierimportmyFunctionfromsklearn.metricsim

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论