




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章监督学习6.1监督学习的概念监督学习是指从给定的一组带标签的数据中学习输入(特征变量)和输出(目标变量)的映射关系,当新的数据到来时,可以根据这个映射关系预测新数据的结果。按目标变量的类型,监督学习又可以分为分类和回归:分类:当预测目标是离散型时,即预测类别,学习任务为分类任务。例如,预测一位企业的员工是否会离职?常用的算法是分类算法,例如决策树分类、朴素贝叶斯分类、逻辑回归等。回归:当预测目标是连续型时,即预测值大小,学习任务为回归任务。例如,预测一辆新造的汽车价格。常用的算法就是回归算法,例如线性回归、岭回归等。有些机器学习的算法,例如神经网络、决策树、随机森林、K-近邻等,既适用于连续型目标变量也适用于离散型目标变量。监督学习的流程如图6-1所示:选择一个适合目标任务的数学模型,例如决策树、线性回归等模型。先把一部分已知的“问题和答案”,即带标签的训练数据集,给机器去学习,监督两字体现这里。机器从训练数据集中总结出了自己的“方法论”。人类把“新的问题”,即新数据集,给机器,让机器使用学习到的方法论去解答。6.2模型评价6.2.1评估方法对于收集到的一份数据集
D,同时要在D上进行训练和测试,因此要把D分成训练集和测试集。常用的基于数据随机选样划分的评估方法有留出法和交叉验证。1.留出法(HoldOut)在留出法中,给定的数据集随机地划分成两个独立互斥的集合:训练集和测试集。一般情况下,30%的数据分配到测试集,其余的数据分配到训练集。使用训练集训练学习器,推导出模型,模型的性能使用测试集进行评估,检验模型的测试误差,进而估计模型的泛化能力。使用留出法进行模型评价时,更好的方法是将数据划分为三个部分:训练集、测试集和验证集,如图6-2所示。训练集用来模型拟合,估计出模型参数;验证集用来调整模型参数,得到更优的模型;测试集用来衡量模型性能优劣。图6-2留出法(HoldOut)在数据样本不是很多的情况下,则需要分层抽样,这样可以保证训练集和测试集中各类样本的比例与原数据集是一致的,这样的划分结果也更具代表性。关于百分比例的选择,理论上来说是要用D中的数据来建模的,因此训练集占比越大,建模能使用的数据信息就越多,但是此时测试集数据过少,测试结果不具有普遍性。因此需要根据实际情况来选择,一般情况下会选择30%左右的数据作为测试集。留出法划分数据集的效果还是跟测试集的选取密切相关,最终模型表现的好坏与初始数据的划分结果有很大的关系,具有一定的偶然性。为了减少这种偶然性,可以选择多次划分数据集将最后结果取平均值的方式去处理。2.交叉验证(CrossValidation)交叉验证就是对原始样本数据进行切分,然后组合成为多组不同的训练集和测试集,用训练集训练模型,用测试集评估模型。某次的训练集可能是下次的测试集,故而称为交叉验证。交叉验证的方法有K折交叉验证和留一交叉验证,其中K折交叉验证应用较为广泛。(1)K折交叉验证(K-foldCrossValidation)将数据集随机划分为K个互不相交的子集或者“折”:S1,S2,S3,……,Sk,每个折的大小大致相等。每次选取K-1份作为训练集,用剩下的1份作为测试集,进行训练和测试。训练和测试进行K次,每个子样本测试一次,得到K次不同的测试效果,平均K次的结果作为最终的模型效果。这个方法的优势在于同时重复运用随机产生的子样本进行训练和测试,测试结果减少偶然性,更准确地评估模型。关于K的选择,通常来说,如果训练集相对较小,则增大K值,这样在每次迭代过程中将会有更多数据用于模型训练,同时算法时间延长;如果训练集相对较大,则减小K值,这样可以降低模型在不同的数据块上进行重复拟合的计算成本,在平均性能的基础上获得模型的准确评估。一般地,建议使用10折交叉验证,因为它具有相对低的偏置和方差。(2)留一验证(LeaveOneOut)留一验证是只使用原样本中的一个样本来当做测试集,而剩余的样本当做训练集。这个步骤一直持续到每个样本都被当过一次测试集。它是K-fold交叉验证的一种特例,即K与样本数量相等的时候。6.2.2
评估指标对于监督学习训练得到的模型,到底如何评价一个模型预测的好坏呢?不同模型预测的结果如何比较?一般可以使用评估指标来进行模型评价和比较。评估指标有两个作用:了解模型的泛化能力,可以通过同一个评估指标来对比不同模型,从而知道哪个模型相对较好,哪个模型相对较差。可以通过评估指标来逐步优化模型,而评估方法提供了不同情景下使用这些指标对模型进行评价。用于模型评价的评估指标有很多,按照类别可以分为:适用于分类模型:混淆矩阵、准确率、查准率、查全率、F1、ROC曲线等。适用于回归模型:MSE、RMSE、MAE、MAPE、R-Square、AdjustR-Square等。1.分类算法的评估指标分类模型常用的几个评估指标都是基于混淆矩阵构建。混淆矩阵如表6-1所示。
表6-1混淆矩阵
实际值预测值正例反例正例真正例(TP)假正例(FP)反例假反例(FN)真反例(TN)真正例(TP):模型成功将正例预测为正例。真反例(TN):模型成功将反例预测为反例。假反例(FN):模型将正例错误预测为反例。假正例(FP):模型将反例错误预测为正例。准确率
(Accuracy)准确率是一个描述模型总体准确情况的百分比指标,主要用来说明模型的总体预测准确情况,计算公式如下:准确率=(真正例+真反例)/N(6-1)准确率虽然可以判断总体的正确率,但是在样本严重不平衡的情况下,并不能作为很好的指标来衡量结果。比如有一个预测客户流失的模型,数据集有84335条是不流失客户,2672条为流失客户,该模型把所有客户都判断为不流失客户(即没有发现任何流失客户),这时准确率为
84335/(84335+2672)=96.92%。虽然这时的准确率很高,但是该模型没有发现流失客户,所以该模型其实很糟糕。(2)查准率(Precision)对于预测问题来说,往往关注的并不是模型的准确率。例如对于客户流失问题,更多地会关注预测流失且实际流失的那部分人。即提供的预测流失名单中到底最后有百分之多少真正流失了。查准率用来反映提供名单的精准性,也叫精准率。它是所有预测为正例的样本中,实际为正例的样本所占的比例,计算公式如下:
查准率=真正例/(真正例+假正例)
(6-2)查准率表示对正样本结果中的预测准确程度,而准确率是对所有样本结果的预测准确程度。查准率适用的场景是需要尽可能地把所需的类别检测准确,而不在乎这些类别是否都被检测出来。(3)查全率(Recall)只是查准率高似乎也有问题,还是以客户流失问题来说,假设通过数据挖掘模型只给出了一个20人的流失名单,结果该名单中有16个人确实流失了,这个模型的查准率达到了80%,相当不错,可是问题是最终有200个人流失,而模型只发现了其中的16个,这样的模型性能显然是不会被认可。因此就需要使用查全率,查全率也称召回率或命中率,主要是反映正例的覆盖程度,它是实际为正例的样本中被正确预测为正例的样本所占的比例,计算公式如下
查全率=真正例
/(真正例+假反例)
(6-3)查全率适用的场景是需要尽可能地把所需的类别检测出来,而不在乎结果是否准确。
然而这两者往往成正相关,因为如果调高阈值,例如认为流失概率超过90%才认定为流失,那么会导致假警报率很低,但是命中率也很低;而如果调低阈值,例如认为流失概率超过10%就认定为流失,那么命中率就会很高,但是假警报率也会很高。因此,为了衡量一个模型的优劣,数据科学家根据不同阈值下的命中率和假警报率绘制了ROC曲线,如图6-3所示,其中横坐标为假警报率(FPR),纵坐标为命中率(TPR)。曲线越靠近左上角,说明在相同的阈值条件下,命中率越高,假警报率越低,模型越完善。若一个学习器的ROC曲线被另一个学习器的曲线完全“包住”,那么则可以断言后者的性能优于前者。若两个学习器的ROC曲线发生交叉,则难以一般性地断言两者孰优孰劣,较为合理的判断依据就是比较ROC曲线下的面积,即AUC,AUC值越大,对应的学习器越优越。图6-3ROC曲线
max_depth=3max_depth=5max_depth=7max_depth=9min_samples_leaf=5DT(max_depth=3,min_samples_leaf=5)DT(max_depth=5,min_samples_leaf=5)DT(max_depth=7,min_samples_leaf=5)DT(max_depth=9,min_samples_leaf=5)min_samples_leaf=10DT(max_depth=3,min_smples_leaf=10)DT(max_depth=5,min_samples_leaf=10)DT(max_depth=7,min_samples_leaf=10)DT(max_depth=9,min_samples_leaf=10)min_samples_leaf=15DT(max_depth=3,min_samples_leaf=15)DT(max_depth=5,min_samples_leaf=15)DT(max_depth=7,min_samples_leaf=15)DT(max_depth=9,min_samples_leaf=15)表6-2决策树算法两个参数形成的参数网格6.3决策树算法6.3.1决策树算法介绍决策树是一种简单但广泛使用的分类器,是一个由根部向下运用递归分割子树的算法,以建立一个树形结构的分类器。树上的每个非叶子结点表示某个属性的测试,每一个分支代表一个分类规则,叶子结点保存着该分类规则的分类标签。如图6-4所示介绍一个典型的决策树模型:判断哪些天气条件下适合外出运动。6.3.2
决策树算法实现决策树算法的实现是一种贪心算法,它以自顶向下递归的划分的方式构造树结构。算法的基本策略如下:树以代表训练样本的单个结点开始。如果样本都在同一个类,则该结点成为叶子结点,并用该类标记。否则,算法选择最有分类能力的属性作为决策树的当前结点。根据当前决策结点属性的每个已知的值,每个取值形成一个分枝,有几个取值形成几个分枝,并据此划分训练样本,将数据划分为若干子集。针对上一步得到的每一个子集,算法使用同样的过程,递归地形成每个划分样本上的决策树。一旦一个属性出现在一个结点上,就不必在该结点的任何后代上考虑它。递归划分步骤仅当下列条件之一成立时停止:给定结点的所有样本属于同一类。没有剩余属性可以用来进一步划分样本。在这种情况下,使用多数表决,将给定的结点转换成树叶,并以样本中占比最多的类别作为该结点的类别标记,同时也可以存放该结点样本的类别分布。给定结点没有样本,则利用该结点的父结点来判断分类标记,并将该结点转换成叶结点。某一结点中的样本数低于给定的阈值。在这种情况下,使用多数表决,确定该结点的类别标记,并将该结点转换成叶结点。1.属性选择度量在决策树算法中,最主要的一个任务是选择一个最具分类能力的属性,如何度量一个属性是最有分类能力的?下面介绍几种属性选择的度量指标。信息增益信息增益表示由于特征A而使得对数据D的分类的不确定性减少的程度。信息增益的计算涉及熵和条件熵,熵和条件熵的计算公式参考第5章5.3.4节,信息增益的计算公式参考第5章5.4.2节。(2)信息增益比信息增益比的计算公式参考第5章5.4.2节。(3)基尼系数(Gini)熵的计算涉及对数运算,比较耗时,基尼系数在简化计算的同时还保留了熵的优点。基尼系数代表了模型的不纯度,基尼系数越小,纯度越高,选择该特征进行劈划也越好。这和信息增益(比)正好相反。
2.连续型属性对于连续型属性即数值属性,可以将分裂限定在二元分裂,属性劈划的关键是找到最佳劈划点,寻找过程如下:对连续型变量,按从小到大的顺序排列值,假设排列之后的数组表示为:a1<a2<a3<….<am。遍历每一对相邻的值并计算相应的属性选择度量(如信息增益比等),每一对相邻的点隐含着一个最佳劈划点t=(ai+ai+1)/2和一个劈划(D),选择最大信息增益或者信息增益比,对基尼系数,则选择最小的基尼系数的劈划点进行劈划。3.树剪枝决策树算法在学习的过程中为了尽可能正确地分类训练样本,不停地对结点进行划分,因此会导致整棵树的分枝过多,容易造成过拟合。剪枝方法可以处理这种过分适应训练集数据问题,即过拟合。通常,该方法使用统计度量,剪去最不可靠的分枝,使树的结构更易于理解,提高树的正确分类能力,即提高树独立于测试数据正确分类的可靠性。有两种常用的剪枝方法预剪枝(pre-pruning)和后剪枝(post-pruning)。1)预剪枝:预剪枝是在构造决策树的过程中,先对每个结点在划分前进行估计,如果当前结点的划分不能带来决策树模型预测性能的提升,则不对当前结点进行划分并且将当前结点标记为叶结点;2)后剪枝:后剪枝是先把整棵决策树构造完毕,然后自底向上的对非叶结点进行考察,若将该结点对应的子树换为叶结点能够带来预测性能的提升,则把该子树替换为叶结点。4.缺失值处理决策树算法本身可以处理缺失值。当一个被劈划的属性含有缺失值时,在这个属性上是缺失的每个样本被分成若干片断,采用数值加权方案,按照比例将各个片断分配到下面的每个分枝,并一直传递下去,这个比例是各分枝所含的样本数目的比值,最终含有缺失值的样本的各部分都会到达某一个叶结点,参与分类的决策。数据集含有缺失值同样可以使用一般的属性选择度量来计算,只是计算的时侯不再是整数累计,而是使用加权值来计算。6.3.3
决策树算法应用案例通过已有的员工信息和离职表现来搭建相应的员工离职预测模型,基于员工离职预测模型预测之后的员工是否会离职。1.案例概述大部分员工决定离职时,通常需经过思考期。慰留员工的最佳时机,就是在他们产生离职想法之前。本案例通过数据分析的方法,构建离职预测模型,对员工的离职进行预测。员工离职预测模型能够提前预判,尽早介入,针对员工最关注/不满的问题及时提供解决方案(例如,升职加薪,教育优惠,经济补偿等),从而提高满意度,降低员工离职风险,特别是留住经验丰富的员工,避免员工“去意已决”时才进行无效挽留。2.数据集本案例使用的数据集共有14999组历史数据,其中,3571组为离职员工数据,11428组为非离职员工数据,离职率为23.81%。数据集中变量的详细描述如表6-3所示,表格中的“是否离职”列为目标变量,剩下的字段为特征变量,用于通过一个员工的特征来判断其是否会离职。根据这些历史数据搭建决策树模型来预测之后员工的离职可能性。变量名变量说明取值范围是否离职离散型变量,共有2个类别0-未离职,1-已离职满意度连续型变量,对公司的满意程度0~1绩效评估连续型变量,绩效评估分值0~1参与过的项目数连续型变量,单位:个2~7平均每月工作时长连续型变量,单位:小时96~310工作年限连续型变量,单位:年2-10是否有过工作差错离散型变量,共有2个类别0-没有,1-有五年内是否升职离散型变量,共有2个类别0-没有,1-有职业离散型变量,共有10个类别Accounting、HR等薪资水平离散型变量,共有3个类别Low、Medium、High表6-3员工离职数据集字段含义说明3.分析过程-大数据应用平台本案例按照下面步骤展开分析:离职员工特征探索:探索员工离职的原因跟哪些因素有关。模型构建和评估:基于决策树算法,在训练集上构建员工离职预测模型,并在测试集上评估模型性能。模型应用:将离职预测模型应用到新数据集,预测员工离职的概率。
(1)离职员工特征探索离职员工特征探索主要来分析哪些变量与员工离职密切相关,离职员工有哪些特点?根据各变量的数据类型可以分为:连续变量与是否离职的关系:可以使用直方图或者箱型图,如果希望得到离散变量与连续变量之间关系的量化描述,可以使用方差分析。离散变量与是否离职的关系:可以使用柱状图或者堆积柱状图,如果希望得到两个离散变量之间关系的量化描述,也可以使用交叉表。在大数据应用平台的自助报告中,对于本案例的数据集,采用堆积直方图探索连续变量对公司满意度、月均工作时长、绩效评估、工作年限、参与过的项目数与离职的关系,如图6-5所示。从图上看,离职员工的特点如下:对公司的满意度较低的员工越容易离职,大部分离职员工对公司满意度小于0.5。平均月工作时长很短(117~160)或者很高(>224)的员工越容易离职,工作时长较合理(160~224)的员工离职率较低。绩效评估很低和很高的员工越容易离职,中绩效的员工离职率。工作年限在3到5年间的员工越容易离职,工作年限很短或者很长的员工离职率较低。参加项目个数越多的员工离职率越大(去除项目数为2的样本)。在大数据应用平台的自助报告中,采用堆积百分比柱状图探索离散型变量五年内是否升职、工作差错、薪资水平、职位与离职的关系,结果如图6-6所示。从图上看,离职员工的特点:未出过工作差错的员工离职率比较高,离职率随着薪资的增加而降低,五年内没有升职的员工的离职率比较大,职位与员工离职的关系不大。(2)模型构建和评估对于企业来说,经验丰富的优秀员工的离职是特别大的损失,优秀的员工是企业争相竞争的人才。因此,本案例将重点针对有经验的优秀的员工,构建离职预测模型。那什么样的员工才算是优秀的有经验的呢?本案例将绩效评估>=0.7或者工作年限>=4或者参与过的项目数>5的这些人定义为优秀的或者有经验的员工。在大数据应用平台的工作流功能模块中,使用分析组件构建分析工作流,实现员工离职预测模型的构建和评估,模型构建和评估的分析流程如图6-7所示。提取优秀员工使用“过滤”节点提取优秀员工样本集,将“过滤”节点与“员工离职数据”表相连接,优秀员工的筛选表达式为“绩效评估>=0.70OR工作年限>=4OR参与过的项目数>5”,筛选出来的优秀员工有9772名,其中,2014组为离职员工数据,7758组为非离职员工数据,离职率为20.61%,与原始数据差别不大。2)划分训练集和测试集使用“数据分割”节点将数据集分成二个互相排斥的子集:训练集和测试集。该节点有两个输出端口,一个是训练集,另一个是测试集。数据分割有两种不同的分割方式:百分比和固定大小。每种分割方式又可以采用系统抽样或者随机抽样进行。如果需要在两个子集中均保留目标变量的各类别的原始分布,可在节点的参数设置中定义一列“分层列”,然后算法将根据分层列中各类别的样本比例,对数据进行分划。本案例中,将“数据分割”节点与“过滤节点”通过端口相连接,“数据分割”节点的参数设置如图6-8所示。数据分割后,训练集为6841组数据,离职率为20.61%;测试集为2931,离职率为20.61%。因为采用了分层抽样,因此两个子集的目标变量的类别分布均保留原始目标变量的类别分布。3)模型构建在训练集上,采用决策树算法建立员工离职预测模型。将数据分割节点的训练集输出端口与“决策树”节点相连接,并设置决策树节点的参数。决策树节点的参数说明如表6-4所示。参数名称描述预测变量从表中选择若干列作为预测变量,可以接受数值或者字符型的列目标变量从表中选择一列作为目标变量,只接受字符型的列权重用于平衡类别分布非常不均衡的数据集最小节点数目此参数是树生长的停止条件,值越大树生长越早停止,默认值是2。最大树深度此参数是树生长的停止条件,值越小树生长越早停止,默认值是20。剪枝置信度此参数控制剪枝的水平,该值越低表示树被剪枝得越简化,默认值是25%在本案例中,决策树节点的参数设置为目标变量为“是否离职”,预测变量选择除
“是否离职”之外的所有列,最小节点数目设置为10,其余参数为默认值。决策树节点的输出可以归纳出一组决策规则,并将预测模型保存到用户空间,这个模型可以应用到新数据集用于预测员工的离职概率。执行决策树节点,结果可以使用“决策树浏览器”查看决策树结构,如图6-9所示。图6-9使用“决策树浏览器”查看决策树结构表6-4决策树节点的参数说明
满意度>0.11&工作年限<=4.0&平均每月工作时长<=276.0→不离职(置信度:97.16%)这条规则中的叶子结点有4304名员工,其中4182名是非离职员工,122名是离职员工,表示当一名员工的特征符合这条规则时,则该员工不离职的概率是4182/4304=97.16%。满意度>0.11&工作年限>4.0&绩效评估<=0.81→不离职(置信度:95.31%)这条规则中的叶子结点有879名员工,其中834名是非离职员工,45名是离职员工,表示当一名员工的特征符合这条规则时,则该员工不离职的概率是834/879=95.31%。以上两条规则可以识别出训练集中(4182+834)/5431=92.35%的不离职员工。另外,从决策树浏览器图可以得到在构建决策树时每次的最佳劈划属性的排序,从而可以知道影响员工离职的关键性因素:对公司的满意度、工作年限、绩效评估和平均每月工作时长。4)模型评估构建好决策树模型之后,还需要使用测试集对决策树算法的性能进行评估。大数据应用平台提供“分类评估”节点对算法性能进行评估,该节点有两个输入:模型和表格数据,输出包括错误率,混淆矩阵,ROC图等评估结果。执行“分类评估”节点,得到评估结果,可以查看分类评估报告,如图6-10所示。决策树算法构建的离职预测模型,在测试集上总体错误率为2.9%,总体准确率为97.1%。对于预测问题来说,往往关注的并不是模型的准确率。更多地关注预测离职且实际离职的那部分员工所占的比率,即查准率。从评估报告中见离职的查准率等于97.09%,说明提供的预测可能离职的名单中最后有97.09%的员工真正离职了,离职预测的准确性很高。另外,还需要关注提供的名单是不是尽可能地覆盖了所有可能离职的员工名单,即查全率,也叫命中率。评估报告见离职查全率等于88.57%。提供的离职名单在准确性和覆盖度上都比较好。另外,点击“ROC表”->“ROC图”可以查看ROC曲线。ROC图有两条曲线,黑色的这条表示未离职类别的ROC曲线,紫色这条表示离职类别的ROC曲线,这两条曲线都很陡峭的,曲线下的面积AUC都为0.94999,表示模型的预测效果很好,如图6-11所示。图6-11决策树模型的ROC曲线(3)模型应用训练好了员工离职决策树模型后,可以使用“应用”节点基于训练好的决策树预测模型对公司其他未离职的员工进行预测。预测的分析工作流如图6-12所示。“应用”节点有两个输入端口:数据表和模型,将训练好的决策数据模型和新数据表与“应用”节点相连接,执行该节点,它会在原始数据的基础上增加新的两列,一列为目标变量预测值(Predicted_Class),另一列为概率值(Confidence_Value),即可信度,如图6-13所示。通过“过滤”节点可以将可能有离职倾向的员工筛选出来,提交给人力资源管理部门,留住优秀人才。本案例通过决策树算法构建了针对优秀的有经验的员工的离职预测模型,该模型可以对员工的离职进行预测,能够提前预判,在员工产生离职想法之前,及时提供解决方案,留住优秀有经验的人才。同时识别出影响优秀员工辞职的主要因素,如对公司的满意度、员工的工作年限、绩效评估以及平均每月工作时长。图6-12员工离职预测分析工作流4.分析过程-基于Python(1)数据读取与预处理首先读取员工离职数据集,代码如下:图6-13应用节点的预测结果第2行代码用read_excel()函数读取Excel文件数据赋给变量df。第3行代码用df.head()查看表格的前5行,结果如下所示:“是否离职”列中的数字1代表离职,数字0代表未离职。第4行代码用或“|”运算符来筛选优秀员工,优秀员工的定义请参考前面,并赋给变量df。使用df.shape可以查看筛选后的行数为9772行。第5行代码用replace()函数对“薪资水平”列的内容需要进行数值化处理,将文本“low”、“medium”、“high”分别替换为数字0、1、2。第6行代码用get_dummies()函数来创建哑特征,get_dummies默认会对DataFrame中所有字符串类型的列进行独热编码。特征编码后的数据结果如下所示:虽然决策树算法本身是天然支持离散型变量的机器学习算法,但是Scikit-Learn中的决策树算法只支持数值型变量,因此需要对离散型变量先进行特征编码,将其转换为数值型变量,在这个例子里对于“薪资水平”变量使用数字编码,因为变量自身存在顺序,是有序变量。对于“职位”变量使用独热编码。(2)提取特征变量和目标变量建模前,首先将特征变量和目标变量分别提取出来,代码如下:第1行代码用drop()函数删除“是否离职”列,将剩下的数据作为特征变量赋给变量X。第2行代码用DataFrame使用列名提取具体列的方式提取“是否离职”列作为目标变量,并赋给变量y。(3)划分训练集和测试集提取完特征变量和目标变量后,还需要将原始数据划分为训练集和测试集。训练集用于进行模型训练,测试集用于检验模型训练的结果,代码如下:第1行代码从Scikit-Learn库中引入train_test_split()函数。第2行代码用train_test_split()函数划分数据集为训练集和测试集,其中X_train、y_train为训练集数据,X_test、y_test为测试集数据,训练集数据有6840条,测试集数据有2932条。案例中,test_size设置为0.3,表示选取30%的数据用于测试。如果数据量较多,也可以将其设置为0.1,即分配更少比例的数据用于测试,分配更多比例的数据用于训练。因为train_test_split()函数每次划分数据都是随机的,所以如果想让每次划分数据的结果保持一致,可以设置random_state参数,这里设置的数字123没有特殊含义,它只是一个随机数种子,也可以设置成其他数字。(4)模型构建划分好训练集和测试集之后,就可以从Scikit-Learn库中引入决策树模型进行模型训练了,代码如下:第1行代码从Scikit-Learn库中引入分类决策树模型DecisionTreeClassifier。第2行代码设置决策树的参数max_depth(树的最大深度)为5,并设置随机状态参数random_state为数字123,使每次程序运行的结果保持一致,最后将其赋给变量dt_model。第3行代码用fit()函数进行模型训练,传入的参数就是前面划分出的训练集数据。(5)模型评估与预测训练好模型后,需要使用测试集对模型进行评估。直接预测是否离职这里把测试集中的数据导入模型中进行预测,代码如下,其中model就是前面训练好的决策树模型:predict()函数将直接打印预测结果,其中0为预测不离职,1为预测离职。想要查看测试集的预测准确度,可以使用accuracy_score()函数,代码如下:将score打印输出,结果为0.9696,即模型对整个测试集的预测准确度为96.96%。
上面是用accuracy_score()函数来获取模型评分,其实Scikit-Learn库的决策树分类算法自带模型评分功能,代码如下:这里的dt_model为上面训练好的决策树模型,score()函数会自动根据X_test的值计算出预测值,然后去和实际值进行比对,从而计算出预测准确度,最后同样可以得到评分score为0.9696。2)预测不离职和离职的概率决策树分类模型在本质上预测的并不是精确的0或1的分类,而是预测属于某一分类的概率。想要查看预测为各个分类的概率,可以通过如下代码:第1行代码获得的y_pred_proba是一个二维数组,数组左列为分类=0的概率,右列为分类=1的概率。第2行代码将其转换为DataFrame格式以方便查看。前面直接预测是否离职,其实是看属于哪种分类的概率更大。例如,第1行数据的不离职概率0.983850大于离职概率0.016150,所以预测结果为不离职。3)模型预测效果评估对于分类模型,不仅要关心整体的预测准确度,也关心模型在每一类样本里面的表现,此时可以使用混淆矩阵来查看,python中使用confusion_matrix()函数,代码如下:第1行代码引入confusion_matrix()函数;第2行代码为confusion_matrix传入测试集的目标变量真实值y_test和预测值y_pred。将混淆矩阵cf_mat打印输出,结果如下所示:可以看到,实际离职的594(67+527)人中有527人被准确预测,命中率(TPR)为527/594=88.72%;实际未离职的2338(2316+22)人中有22人被误判为离职,假警报率(FPR)为22/2338=0.94%。需要注意的是,这里的TPR和FPR都是在阈值为50%的条件下计算的。Python还可以通过如下代码计算命中率,无须手动计算:运行结果如下所示:其中recall对应的就是命中率(又称召回率和查全率),可以看到,对于分类为1的命中率为0.89,和之前手动计算的结果0.8872一致。accuracy表示整体准确度,其值为0.97,和之前计算出的0.9696是一致的;support表示样本数,其中2338为实际类别是0的样本数,348为实际类别是1的样本数,2932为测试集的全部样本数。此外,模型的
precision(精准率)为0.96,因此,模型在测试集上的预测效果还不错。对于分类模型,还可以绘制ROC曲线来评估模型。我们希望在阈值相同的情况下,假警报率尽可能小,命中率尽可能高,即ROC曲线尽可能陡峭,其对应的AUC值(ROC曲线下方的面积)尽可能高。在Python中,通过如下代码就可以求出不同阈值下的命中率(TPR)和假警报率(FPR)的值,从而绘制出ROC曲线:第1行代码引入roc_curve()函数;第2行代码为roc_curve()函数传入测试集的目标变量y_test及预测的离职概率y_pred_proba[:,1],计算出不同阈值下的命中率和假警报率,并将三者分别赋给变量fpr(假警报率)、tpr(命中率)、thres(阈值)。此时获得的fpr、tpr、thres为3个一维数组,通过第3~6代码可以将三者合并成一个二维数据表。通过打印roc_table查看不同阈值下的假警报率和命中率,结果如下所示:可见随着阈值的下降,命中率和假警报率都在上升。其中,第一个阈值无含义,常设置为最大阈值,保证无记录被选中。表格第2行表示只有当某员工被预测为离职的概率≥100%(因为概率不会超过100%,所以其实就是被预测为离职的概率等于100%),才判定其会离职,此时命中率为48.48%,即所有实际离职的员工中被预测为离职的员工占48.48%,在这种极端阈值条件下,该命中率已算很高了。第3行表示只有当某员工被预测为离职的概率≥93.19%,才判定其会离职,此时命中率为88.72%,假警报率为0.94%,依此类推。已知不同阈值下的假警报率和命中率,可使用Matplotlib库中的plot()函数绘制ROC曲线,代码如下:第2行代码是基于假警报率和命中率,用plot()函数绘制很陡峭的ROC曲线如图6-14。图6-14ROC曲线要求出ROC曲线下的AUC值,则可以通过如下代码实现:第1行代码引入roc_auc_score()函数;第2行代码为roc_auc_score()函数传入测试集的目标变量y_test及预测的离职概率。使用print函数输出AUC值为0.9664,预测效果还是不错的。6.4K近邻算法6.4.1K近邻算法介绍
6.4.2
K近邻算法实现K近邻算法是一种lazy-learning算法,算法不需要使用训练集进行训练。K近邻分类算法的工作原理是:存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即已知样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似(最近邻)数据的分类标签。一般来说,选择样本数据集中前K个最相似的数据,这就是K近邻算法中K的出处,通常K是不大于20的整数。最后,选择K个最相似数据中出现次数最多的分类,作为新数据的分类。K近邻分类算法的实现步骤如下:计算距离:计算新数据与训练集中每个样本的距离,按照距离从小到大的顺序排序。选择近邻:选取与新数据距离最小的前K个点。判定类别:计算前K个点所在类别的出现频率,返回出现频率最高的类别作为新数据的预测分类。
6.4.3
K近邻算法应用案例1.案例概述图像识别是机器学习领域一个非常重要的应用场景,本节通过一个较为经典的手写数字识别模型来讲解如何在实战中应用K近邻算法。。2.数据集手写数字识别,或者说图像识别的本质就是把如图6-15所示的图片中的数字转换成计算机能够处理的数字形式。(1)图像二值化通过图像二值化可以将图片大小为32×32的手写数字“4”的图片转换成由0和1组成的“新的数字4”,如图6-16所示。数字1代表有颜色的地方,数字0代表无颜色的地方,这样就完成了手写数字识别的第一步。图6-16数字4的二值化表示(2)二维数组转换为一维数组经过图像二值化处理获得32×32的0-1矩阵,为了方便进行机器学习建模,还需要对这个二维矩阵进行简单的处理:在第1行数字之后依次拼接第2~32行的数字,得到一个1×1024的一维数组。利用这种一维数组就可以计算不同手写数字之间的距离,或者说这些手写数字的相似度,从而进行手写数字识别。MNIST数据集是一个手写体识别数据集,来自美国国家标准与技术研究所。它包含了各种手写数字图片以及每张图片对应的数字标签,图片大小为28*28,且为黑白图片。其中,60000张手写数字图片作为训练数据,由来自250个不同人手写的数字构成,其中50%是高中学生,50%来自人口普查局的工作人员;10000张图片作为测试数据。本案例使用的数据集共有1934个二值化处理好的手写数字0~9,每一行是一个手写数字的一维数组。“对应数字”列是手写数字,也是目标变量;其余列为该手写数字对应的1024维特征值,也是预测变量。3.分析过程-大数据应用平台在大数据应用平台的工作流功能模块中,使用分析组件构建分析工作流,实现手写数字预测模型的构建和评估,模型构建和评估的分析流程如图6-17所示:(1)划分训练集和测试集在进行模型构建和评估前,通过“数据分割”节点,将数据集划分为训练集和测试集。本案例将原始数据集中的20%划分为测试集,同时选择“对应数字”列为分层列,以避免少数类没有参与训练建模的问题。数据分割后,训练集共1548条,用于进行模型训练;测试集共386条,用于检验模型性能的优劣。(2)模型构建本案例使用“K近邻”节点计算新样本与原始训练集中各个样本的欧氏距离,取新样本的K个近邻点,并以大多数近邻点所在的分类作为新样本的分类。将“数据分割”节点的训练集输出端口和“K近邻”节点相连接,并对K近邻节点的参数进行设置,K近邻节点的参数如下:预测变量:从表中选择若干列作为预测变量,可以接受数值的列。这里选择“对应数字”列外的所有其他列。目标变量:只能从表中选择一列,且只接受字符型的列。这里选择“对应数字”列。近邻数:最近邻居的数目,默认值为1。这里设置为5,即选择5个近邻点来判定新样本的分类。距离算法:用来计算数据点之间距离的方法,包括明氏距离、欧氏距离、曼氏距离和切比雪夫距离。这里选择欧氏距离。(3)模型评估在测试集上,对“K近邻”算法的性能进行评估。“分类评估”节点可以实现分类模型的评估,点击该节点可以查看分类评估报告,如图6-18所示。图6-17手写数字预测模型构建和评估的分析流程K-近邻算法构建的手写数字预测模型,在测试集上总体错误率为9.326%,总体预测正确率达到了90%以上。从评估报告中,数字3的预测精准率比较低,为81.25%,低于其他类别,而数字4、8和9的查全率比较低,分别为78.38%、77.78%和73.17%,有超过20%的手写图片被错误地预测为其他的数字。但总体上说,结果还比较好,可以保存该K-近邻模型到用户空间,便于在模型应用阶段在新数据集上预测手写数字。另外,也可以利用ROC曲线来评估其预测效果,其评估方法与决策树模型的评估方法是一样的。(4)模型应用根据评估结果,将“K近邻”节点的模型输出并保存到用户空间,将得到的模型通过“应用”节点,应用到新数据上,即可预测新数据集的手写图形的数字类别。预测的分析工作流如图6-19所示。图6-19模型应用工作流执行“应用”节点,在原始数据的基础上增加新的两列,一列为目标变量的预测值(Predicted_Class),另一列为概率值(Confidence_Value),即可信度。
4.分析过程-基于Python(1)数据读取首先通过pandas库读取数据,代码如下:通过打印df.head()查看表格的前5行,结果如下所示:其中第1列“对应数字”为目标变量y,其余1024列为特征变量X,接下来我们将利用这些数据搭建手写数字识别模型。(2)提取特征变量和目标变量在建模前,首先将特征变量和目标变量分别提取出来,代码如下:(3)划分训练集和测试集提取完特征变量和目标变量后,将数据划分为训练集和测试集,代码如下:这里将test_size设置为0.2,表示选取20%的数据用于测试。random_state设置为123,使每次运行程序得到的数据划分结果保持一致。(4)模型构建划分好训练集和测试集之后,可以从Scikit-Learn库中引入K近邻算法进行模型训练,代码如下:第1行代码从Scikit-Learn库中引入K近邻算法分类算法KNeighborsClassifier。第2行代码设置参数n_neighbors为5来初始化KNN模型,并赋给变量knn_model,n_neighbors=5表示选择5个近邻点来决定新样本的类别标记。第3行代码用fit()函数进行模型训练,传入的参数就是前面划分出的训练集数据。(5)模型评估与预测通过如下代码即可对测试集数据进行预测,预测对应的数字,同时可以使用accuracy_score()函数,查看测试集所有数据的预测准确度:将score打印输出,结果为0.9793,也就是说,模型对整个测试集的预测准确度为97.93%。对于分类模型,不仅关心整体的预测准确度,也关心模型在每一类样本里面的表现,Python可以通过如下代码计算每一个类别的精准率和命中率:代码运行结果如右表所示:可以看到,对于各个数字分类,模型的precision(精准率)和recall(命中率)都比较高,超过90%。因此,模型在测试集上的预测效果还不错。另外,也可以利用ROC曲线来评估其预测效果,其评估方法与决策树模型的评估方法是一样的。6.5
朴素贝叶斯算法6.5.1
贝叶斯定理贝叶斯定理由英国数学家托马斯·贝叶斯(ThomasBayes)提出的,用来描述两个条件概率之间的关系。通常,事件A在事件B发生的条件下与事件B在事件A发生的条件下,它们两者的概率并不相同,但是它们两者之间存在一定的相关性,并具有以下公式,称之为贝叶斯公式:其中:P(A)表示事件A发生的概率,是事件A的先验概率。比如在投掷骰子时,P(2)指的是骰子出现数字“2”的概率,这个概率是六分之一。P(B)表示事件B发生的概率,是事件B的先验概率。P(B|A)是条件概率,表示在事件A
发生的条件下,事件B
发生的概率,条件概率是“贝叶斯公式”的关键所在,它也被称为“似然概率”,
一般是通过历史数据统计得到,一般不把它叫做先验概率,但从定义上也符合先验定义。P(A|B)是条件概率,表示在事件B
发生的条件下,事件A发生的概率,这个计算结果也被称为“后验概率”,是在条件B下,A的后验概率。由上述描述可知,贝叶斯公式可以预测事件发生的概率,两个本来相互独立的事件,发生了某种“相关性”,此时就可以通过“贝叶斯公式”实现预测。6.5.2
朴素贝叶斯算法实现贝叶斯分类法是基于贝叶斯定理的统计学分类方法,是机器学习中应用极为广泛的分类算法之一。它通过预测一个给定的元组属于一个特定类的概率,来进行分类。朴素贝叶斯是贝叶斯模型当中最简单的一种,其算法核心为贝叶斯定理。所有事物之间的特征都是相互独立的,彼此互不影响,这就时“朴素”定义的由来。朴素贝叶斯分类假定一个属性值对给定类的影响独立于其它属性的值,该假定称作类条件独立。
6.5.3
朴素贝叶斯算法应用案例本节以肿瘤预测模型为例,应用朴素贝叶斯模型来预测肿瘤为良性或是恶性肿瘤。1.案例概述肿瘤性质的判断影响着患者的治疗方式和痊愈速度。传统的做法是医生根据数十个指标来判断肿瘤的性质,预测效果依赖于医生的个人经验而且效率较低,而通过机器学习有望能快速预测肿瘤的性质2.数据集本案例使用的数据集共有569组样本。其中,良性肿瘤211例、恶性肿瘤358例。数据集中变量的详细描述如表6-5所示,表格中的“肿瘤性质”列为目标变量,剩下的字段为特征变量,本案例只选取了6个特征变量,在医疗行业中实际用于判断肿瘤性质的特征变量要多得多。本案例的目的是根据这些数据搭建朴素贝叶斯模型,帮助医生提高判断效率,从而及早展开治疗。表6-5肿瘤数据集字段含义说明3.分析过程-大数据应用平台在大数据应用平台的工作流功能模块中,使用分析组件构建分析工作流,如图6-20所示,实现肿瘤类型预测模型的构建、评估和应用的分析。(1)目标变量类型转换由于“肿瘤数据”表中的“肿瘤性质”列是数值型,而朴素贝叶斯节点的目标变量只接受字符型列,因此需要使用“列类型转换”节点将列的类型从数值型转换成字符型。(2)特征分析在建模之前,可以探索哪些变量与区分肿瘤的性质有密切的相关?在大数据应用平台的自助报告中,采用箱型图探索连续型变量与肿瘤性质的关系,如图6-21所示。图6-20肿瘤类型预测模型分析工作流程从箱型图上可以看出,“最大周长”、“最大凹陷度”、“平均凹陷度”、“最大面积”、“最大半径”和“平均灰度值”这六个变量在良性组中的中位数明显高于恶性组,表现出了明显的差异,说明这些特征变量与目标变量可能都有比较密切的关系。(3)划分训练集和测试集在进行模型构建和评估前,通过“数据分割”节点,将数据集划分为训练集和测试集。本案例的569组数据并不算多,因此设定“测试集百分比”为20,即按8∶2的比例来划分训练集和测试集。数据分割后,训练集共456条,用于进行模型训练;测试集共113条,用于检验模型性能的优劣。(4)模型构建在训练集上,采用“朴素贝叶斯”算法建立模型。如图6-22所示。将“数据分割”节点的训练集输出端口与“朴素贝叶斯”节点相连接,并对朴素贝叶斯节点的参数进行设置:预测变量:从表中可选择若干列作,接受数值型或者字符型的列。这里选择“最大周长”、“最大凹陷度”、“平均凹陷度”、“最大面积”、“最大半径”和“平均灰度值”。目标变量:只能从表中选择一列,且只接受字符型的列。这里选择“肿瘤性质”。先验概率:采用数据集默认的值。(5)模型评估朴素贝叶斯算法构建的肿瘤预测模型,如图6-23在测试集上总体错误率为4.425%,总体准确率为98.23%。这里关注的并不是模型的总体准确率,而更关注预测恶性肿瘤的准确性。从评估报告中,见恶性肿瘤(类名=1)的查准率等于94.94%,这说明提供的预测可能是恶性肿瘤的病人名单中最后有94.94%的病人真的被诊断位恶性肿瘤,恶性肿瘤预测的准确性很高。另外,还需要关注提供的病人名单是不是尽可能地覆盖了所有可能是恶性肿瘤的病人名单,即查全率。可见恶性肿瘤的查全率等于98.68%。因此,模型在测试集上的预测肿瘤性质的效果不错,提供的病人名单在准确性和覆盖度上都比较好,可以保存该朴素贝叶斯模型到用户空间,便于在模型应用阶段在新的病人数据集上使用。另外,也可以利用ROC曲线来评估其预测效果。图6-22朴素贝叶斯节点(6)模型应用最后,将得到的肿瘤预测模型通过“应用”节点,应用到新数据上,得到预测结果。如图6-24所示。图6-23朴素贝叶斯模型的分类评估报告执行该节点,它会在原始数据的基础上增加新的两列,一列为目标变量的预测值(Predicted_Class),另一列为概率值(Confidence_Value),即可信度。通过“过滤”节点可以将可能有是恶性肿瘤的病人筛选出来,辅助医生提高诊断效率,从而及早展开治疗。图6-24朴素贝叶斯模型应用4.分析过程-基于Python(1)数据读取首先通过pandas库读取数据,代码如下:通过打印df.head()查看表格的前5行,结果如右图所示:其中
“肿瘤性质”为目标变量y,其余6列为特征变量X,接下来将利用这些数据搭建肿瘤性质预测模型。(2)提取特征变量和目标变量在建模前,首先将特征变量和目标变量分别提取出来,代码如下:第1行代码用drop()函数删除“肿瘤性质”列,即目标变量,其余的作为特征变量赋给变量X。第2行代码提取“肿瘤性质”列作为目标变量赋给y。(3)划分训练集和测试集提取完特征变量和目标变量后,将数据划分为训练集和测试集,代码如下:这里将test_size设置为0.2,表示选取20%的数据用于测试。stratify=y,表示划分后的训练集和测试集中的肿瘤性质类别的比例与目标变量y中肿瘤性质类别的比例保持一致。random_state设置为123,使每次运行程序得到的数据划分结果保持一致。划分后的训练集有455组数据,测试集有114组数据。(4)模型构建划分好训练集和测试集之后,可以从Scikit-Learn库中引入K近邻算法进行模型训练,代码如下:第1行代码从Scikit-Learn库中引入朴素贝叶斯模型(naive_bayes),并使用应用场景最为广泛的高斯朴素贝叶斯模型(GaussianNB),它适用于任何连续数值型的数据集。第2行代码将模型赋给变量nb_model,这里没有设置参数,即使用默认参数。第3行代码用fit()函数训练模型,其中传入的参数就是前面获得的训练集数据X_train、y_train。至此,一个朴素贝叶斯模型便搭建完成了,之后就可以利用模型来进行预测。(5)模型评估与预测通过如下代码即可对测试集数据进行预测,预测肿瘤的性质。通过打印输出y_pred[0:100]查看前100个预测结果。想要查看测试集的预测准确度,可以使用accuracy_score()函数,python代码如下:将score打印输出,结果为0.9824,也就是说,模型对整个测试集的预测准确度为0.9824。说明114组测试集数据中,约112组数据预测正确,2组数据预测错误。对于分类模型,不仅要关心整体的预测准确度,也要关心模型在每一类样本里面的表现,Python可以通过如下代码计算每一个类别的精准率和命中率:运行结果为:可以看到,对于恶性肿瘤的预测,模型的precision(精准率)=0.99和recall(命中率)=0.99都比较高,因此,模型对于预测肿瘤性质的效果还不错。6.6
支持向量机算法6.6.1
支持向量机算法介绍支持向量机(SupportVectorMachine,SVM)是一种基于统计学习理论的模式识别方法,
属于有监督学习模型,主要用于解决数据分类问题。SVM将每个样本数据表示为空间中的点,使不同类别的样本点尽可能明显地区分开。通过将样本的向量映射到高维空间中,寻找最优区分两类数据的超平面,使各分类到超平面的距离最大化,距离越大表示SVM的分类误差越小。通常SVM用于二元分类问题,对于多元分类可将其分解为多个二元分类问题,再进行分类,主要的应用场景有图像分类、文本分类、面部识别、垃圾邮件检测等领域。SVM的主要思想可以概括以下两点:(1)高维映射:对于线性不可分的情况,通过使用非线性高维映射,将低维输入空间线性不可分的样本转化到高维特征空间,如图6-25所示,使其线性可分,从而使得高维特征空间采用线性算法对样本的非线性特征进行线性分析成为可能。这个非线性高维映射称之为核函数,选择不同的核函数,可以生成不同的SVM。(2)最佳超平面:基于结构风险最小化理论在特征空间中构建最优分割超平面,一个最优超平面可以尽最大可能地把正负类样本分开,使得学习器得到全局最优化。图6-25
经过高维映射后,二维分布的样本点变成了三维分布6.6.2
支持向量机算法实现支持向量机模型由简单到复杂分为以下三种:线性可分支持向量机(LinearSupportVectorMachineInLinearlySeparableCase),样本是线性可分,对应的最大间隔类型为硬间隔最大化,即分类超平面要严格满足每个样本都分类正确。线性支持向量机(LinearSupportVectormachine),当样本近似线性可分,引入松弛因子,可以得到一个线性分类器,对应的最大间隔类型为软间隔最大化,即战略性地将那些噪声数据放弃,得到一个对于大部分样本都可以正确分类的超平面。非线性支持向量机(Non-LinearSupportVectorMachine),当样本非线性可分时,即使引入松弛因子也不能得到一个近似线性可分的结果时,采用核技术进行特征映射,在高维空间采用软间隔最大化方法得到一个非线性模型,对应的最大间隔类型为核映射+软间隔最大化。在实际应用中很少有线性问题,支持向量机模型应用最多的是第三种模型。然而,复杂模型是简单模型的改进,而且通过核函数映射就能将低维的非线性问题转化为高维空间的线性问题。1.线性可分支持向量机首先假设有两分类数据,如图6-26所示。图6-26数据分布图现在要找出一条最佳的分割线,将两类数据分隔开。对于线性可分两分类数据,支持向量机就是条直线,对于高维数据点就是一个超平面,如图6-27所示的三条直线都可以将上图中的两类数据分开来。当然,除了a、b、c外还有无数条分割线,那么,在这些分割线中哪条是最完美的呢?目标是选择一条具有较强分类能力的直线,即较稳定的分类结果和较强的抗噪声能力。图6-27多种分隔方法假如在上图中又增加了一些数据,如图6-28所示。由于新增了样本数据,相对于直线b而言,直线a与c对样本变化的适应性变差,使用直线a进行分类,标记的圆形点会被分到三角形中,使用直线c进行分类,标记的三角形点会被分到圆形中。如何找到最优分类数据的分割线,使得具有最优的数据分类能力呢?这条分界线要尽可能地远离两类数据点,即数据集的边缘点到分界线的距离d最大,这里虚线穿过的边缘点就叫作支持向量,分类间隔2d,如图6-29所示。这里的数据点到超平面的距离就是间隔(margin),当间隔越大,这条分割线(分类器)也就越健壮,当有新的数据点的时候,使用这条分割线得到的分类结果也就越可信。图6-29最优分界线图6-28增加样本后的数据分布假设b为最优分割线,那么此分割线方程为:现在将式(6-26)转化成向量形式:式(6-27)只是在二维形式上的表示,如果扩展到n维,那么式(6-27)将变成:所以可以根据式(6-28)将超平面方程写成更一般的表达形式:现在已经把超平面的函数表达式推导出来,用函数区分两类数据,为每个样本点x设置一个类别标签yi:则:由于超平面距离两类数据支持向量的距离相等,且最大值为d,那么:注:这里D(t)为向量t到超平面的距离。由式(6-31)和式(6-32)处理可得:
对于式(6-33)两边同乘yi进行归一化处理:那么此时的分类间隔为:所以这里便转化成求:而最大化2/||w||等价于最小化||w||,当然也等价于最小化||w||2。为了下面优化过程中对函数求导的方便,将求min(‖w‖)转化为求式(6-37),即线性SVM最优化问题的数学描述:
其对偶形式为:
将式(6-38)带入式(6-40)可得:将式(6-42)带入式(6-39)可得最终优化表达式:
其中,c为可选的常数。线性核函数是原始输入空间的内积,即特征空间和输入空间的维度是一样的,参数较少,运算速度较快。一般情况下,在特征数量相对于样本数量非常多时,适合采用线性核函数。(2)多项式核函数多项式核函数(PolynomialKernel)的参数比较多,当多项式阶数高时,复杂度会很高,对于正交归一化后的数据,可优先选此核函数,其表达式如下:
(4)Sigmoid核函数Sigmoid核函数来源于感知机中的激活函数,SVM使用Sigmoid相当于一个两层的感知机网络,Sigmoid核函数表达式如下:
3)使用SMO等算法得到最佳超平面得到最佳分类面的表达式。非线性支持向量机模型核函数的选择非常关键,而选定核函数后,核函数中的参数也直接影响了模型性能。因此,在非线性支持向量机模型中,需要优化的超参数有惩罚参数C及核函数的参数,如多项式核函数的阶次p、高斯核函数的核函数宽度σ。6.6.3支持向量机算法应用案例1.案例概述信用卡盗刷一般发生在持卡人信息被不法分子窃取后,复制卡片进行消费或信用卡被他人冒领后激活并消费等情况下。一旦发生信用卡盗刷,持卡人和银行都会遭受一定的经济损失。本节要运用支持向量机分类算法搭建一个金融反欺诈模型。2.数据集本案例使用的数据集共有1000条客户信用卡的交易数据。其中,有400个欺诈样本,600个非欺诈样本。数据集中变量的详细描述如表6-6所示,表格中的“欺诈标签”列为目标变量,若是盗刷信用卡产生的交易则标记为1,代表欺诈,正常交易则标记为0。剩下的字段为特征变量,本案例只选取了5个特征变量,在实际中使用的特征变量远比本案例多得多,根据这些数据搭建支持向量机模型。表6-6金融反欺诈数据集字段含义说明3.分析过程-大数据应用平台在大数据应用平台的工作流功能模块中,使用分析组件构建分析工作流,实现金融发欺诈模型的构建和评估,模型构建和评估的分析流程如图6-30所示:图6-30金融反欺诈模型构建和评估的分析流程(1)划分训练集和测试集在进行模型构建和评估前,通过“数据分割”节点,将数据集划分为训练集和测试集。本案例将原始数据集中的20%划分为测试集,同时选择“欺诈标签”列为分层列,以避免少数类没有参与训练建模的问题。数据分割后,训练集共800条,用于进行模型训练;测试集共200条,用于检验模型性能的优劣。(2)模型构建本案例使用“支持向量机”节点来构建金融发欺诈模型。将“数据分割”节点的训练集输出端口和“支持向量”节点相连接,并对支持向量机节点的参数进行设置,支持向量机节点的参数说明如下:预测变量:从表中选择若干列作为预测变量,可以接受数值的列。这里选择除“欺诈标签”列之外的所有其他列。目标变量:只能从表中选择一列,且只接受字符型的列。这里选择“欺诈标签”列。SVM类型:选择SVM类型,有C-SVC、nu-SVC和one-classSVM三种分类方法,默认为C-SVC。这里使用默认值。成本参数C:若SVM类型为C-SVC,设置成本参数C,默认值为1。这里设置为0.6。nu值:
若SVM类型为nu-SVC和one-classSVM时,设置nu值。默认值为0.5。阶数:
若核函数为多项式时,需指定阶数,默认值为3。Gamma:
除线性核函数外,其他三个核函数需要指定gamma,如果设为0,则使用1/样本数。自动标准化:是否需要对预测变量进行规范化,默认值为False。(3)模型评估在测试集上,对“支持向量机”算法的性能进行评估。“分类评估”节点可以说实现分类模型的评估,分类评估报告如图6-31所示。支持向量机算法构建的金融欺诈模型,在测试集上总体错误率为22%。除了模型的总体准确率,更应关注识别欺诈的查准率和查全率。从评估报告中可以看到欺诈(类名=1)的查准率等于73.08%,这说明提供的预测可能存在欺诈的客户名单中最后有73.08%的客户真的存在欺诈行为。另外,还需要关注提供的客户名单是不是尽可能地覆盖了所有可能有欺诈行为的客户名单,即查全率。欺诈的查全率等于71.25%,即提供的预测可能存在欺诈的客户名单占实际发生了欺诈的客户的71.25%。因此,如果模型在测试集上的预测效果还不错,可以保存该支持向量机模型到用户空间,以便于在模型应用阶段在新的客户数据集上使用。(4)模型应用根据评估结果,将“支持向量机”节点的模型输出并保存到用户空间,将得到的模型通过“应用”节点,应用到新数据上,即可预测新数据集的欺诈。预测的分析工作流如图6-32所示。执行“应用”节点,它会在原始数据的基础上增加新的两列,一列为目标变量的预测值(Predicted_Class),另一列为概率值(Confidence_Value),即可信度。4.分析过程-基于Python(1)数据读取首先通过pandas库读取数据,代码如下:通过打印df.head()查看表格的前5行,结果如下所示:其中第1列“欺诈标签”为目标变量y,其余5列为特征变量X,接下来我们将利用这些数据搭建手写数字识别模型。(2)提取特征变量和目标变量首先将特征变量和目标变量分别提取出来,代码如下:第1行代码用drop()函数删除“欺诈标签”列,即目标变量,其余的作为特征变量赋给变量X。第2行代码提取“欺诈标签”列作为目标变量赋给y。(3)划分训练集和测试集提取完特征变量和目标变量后,将数据划分为训练集和测试集,代码如下:这里将test_size设置为0.2,表示选取20%的数据用于测试。random_state设置为123,使每次运行程序得到的数据划分结果保持一致。(4)模型构建划分好训练集和测试集之后,导入sklearn中的SVM工具包,核函数采用线性核函数进行模型训练,代码如下:第1行代码从Scikit-Learn库中引入支持向量机分类算法SVC;第2行代码设置参数kernel为linear来初始SVC模型,并赋给变量svm_model。第3行代码用fit()函数进行模型训练,传入的参数就是前面划分出的训练集数据。(5)模型评估与预测想要查看测试集的预测准确度,可以使用accuracy_score()函数,如下代码:将score打印输出,结果为0.785,也就是说,模型对整个测试集的预测准确度为78.5%。对于分类模型,需要关注查准率和查全率,Python可以通过如下代码计算每一个类别的查准率和查全率:运行结果如下所示:可见对于判断是否欺诈,模型的precision(查准率)为0.82,查准率比较高,但是recall(查全率)为0.59,命中率不够高,表示有一些实际是欺诈的客户模型没能识别出来,遗漏了。因此,可以再调节模型的参数,以获得更优的预测效果。
6.7
线性回归
图
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业机器人技术在制造中的应用
- 工业机器人技术与工业自动化
- 工业机器人与旋转灌装机的结合应用
- 工业污染防治与绿色生产实践
- 工业污染监测与治理策略探讨
- 工业绿色能源利用与管理
- 工业污染防治的法律措施与实践
- 工业生产线设备维修培训
- 工业节能减排的先进技术与实践
- 工业节能减排的技术与策略研究
- 外科护理队伍发展方向
- 《N235提取锗新工艺》
- 2024-2030年中国汽车注塑模具行业竞争战略及发展潜力研究报告
- qc初级推进者考试试题及答案
- 060177统计学(江苏开放大学本科期末试卷)
- SAP S4HANA 用户操作手册-FICO-006-财务月结
- 化妆品监督管理条例培训2024
- 数字经济学 课件全套 第1-15章 数字经济学基础 - 数字经济监管
- 2024年山东省青岛市中考地理试题卷(含答案及解析)+2023年中考地理及答案
- 中医适宜技术-中药热奄包
- 中国医院质量安全管理第2-13部分:患者服务临床用血
评论
0/150
提交评论