大数据分析常听到的相关名词除了统计学外,还有数据挖掘与机器学习,再加上物联网(InternetofThings,IoTs)风行,许多专家提到未来会朝向人工智能(ArtificialIntelligence,AI)时代迈进,这些名词到底有什么异同呢?本质上它们都与数据分析相关,只是各自的侧重有所区别。作为应用数学的一个领域,统计学是最基础且重要的。它是收集、整理、分析与解释数据及信息的学科,用以回答问题或产生结论。尽管大数据时代下各种数据充斥,数据科学家仍然经常因为建模上的原因,例如特征的信息力、参数估计能力或者结果的可解释性等,使用部分而非全部的数据进行分析。很多人会有一个观念,认为统计学就是一些不切实际的检定,在当今低结构化数据充斥的预测建模中派不上用场。这样的想法不完全正确,最近兴起的数据挖掘与机器学习领域,仍然沿袭了基本的统计分析概念,误差建模、随机化、协变、相关与独立等,再结合进阶抽样与仿真(simulation),来获取模型更好的性能表现。国内外数据挖掘或机器学习的学者专家们,都非常精于概率与统计等基本知识,推荐系统、统计自然语言处理、支持向量机、深度学习等背后都与统计学密切相关,许多重要方法的提出者也都来自数学/统计界,况且低结构化数据还是需要转为结构化数据方能进行各种运算,因此,结构化数据理解、处理与计算仍然是最重要的基础。归根结底来说,统计学将林林总总的数据,结合概率论(probability)与优化(optimization)技术,建构成量化模型(mathematicalmodels),因此有人说“统计量化了万事万物”(Statisticsquantifieseverthing),大数据时代下它仍然是基础且必备的武器之一。 20世纪80年代信息化风潮崛起,企业资源规划(EnterpriseResourcePlanning,ERP)、顾客关系管理(CustomerRelationManagement,CRM)、供应链管理(SupplyChainMan-agement,SCM)等企业e化系统大行其道,各类组织纷纷架设关系数据库,专家们鼓励企业从结构化的数据库中进行知识发现(KnowledgeDiscoveryinDatabase,KDD),因而数据挖掘开始在大专院校的课程中出现,其主要的目的就是寻找与解释数据中先前未知但有趣的形态,所以数据挖掘是在大量数据中探索形态(Dataminingexplorespatterns)。 人工智能与大数据时代的来临,许多人推崇机器学习,因为它着眼于可产生准确预测的 务实模型,所以机器学习实际进行预测(Machinelearningpredictswithpracticalmodels)。 机器学习所用的手法如归纳(induction)法、概率模型与贝叶斯方法(Bayesianapproach) 等非常类似统计学,但它更关注于实际问题的解决,例如,大量数据能否运算?预测是否能 更准确?而不像统计学比较强调推理与解释。人工智能不仅仅通过归纳与学习,让机器具备 人的感知能力(例如,计算机视觉、语音识别、自动问答等),更希望系统能自我推理、顺应 环境的变化,以及规划未来的行动能力,因此我们可以说人工智能能理解与行动(Artificial intelligencebehavesandreasonslikehumanbeings)。 无论如何,大数据分析与程序设计两者应该是未来智能化时代的重要方向。从名词层 出不穷的角度来看,现代人活得的确比较辛苦,因为很多新名词不断扑面而来,但是读者 绝对可以期待这些技术能让我们的世界越来越美好。本书的副标题名为“统计机器学习之 数据驱动程序设计”,目的在于结合统计学与机器学习,使它们成为大数据分析的理论与实 战。一般说来,机器学习能使计算机实际识别不同形态且能自我学习,统计学从理论的精确 性角度探讨建模过程的诸多优点或缺失。两者的结合使它们成为分析许多领域中多元数据 的强大技术,包括图像识别、语音识别、自然语言处理、制造系统控制,以及物理、化学、 生物、医药、天文学、气象与材料等领域大数据工作的重要支撑。国外著名大学,如加州大 学伯克利分校、卡内基梅隆大学、英国伦敦皇家学院、澳大利亚国立大学等,均已实现这一 跨领域的大数据分析名词——统计机器学习。 3.1 随机误差模型 许多领域中建立反应变量(responsevariable)y与多个预测变量(predictorvariables) x1,x2,··· ,xm之间的模型,或称关系y=f(x1,x2,··· ,xm)是一项基本的任务,其中y是系 统中我们感兴趣的事实性质,可惜它通常无法直接决定,或是要付出较高的代价方能得知, 然而x1,x2,··· ,xm的数据却是唾手可得的。因此,我们搜集了能表示问题空间的n组样本 yi与xij,其中i=1,2,··· ,n 与j =1, 2, ··· ,m(可记为反应变量向量yn×1 或y,及预测变 量矩阵Xn×m或X),尝试建构y与xj的关系。反应变量y又可称为输出(output)变量、 因(dependent)变量、结果(outcome)变量或目标(target)变量;而预测变量x1,x2,··· ,xm 又称为投入(inputs)变量、独立或自(independent)变量、解释(explanatory)变量、特征或属性(featuresorattributes),某些特定领域亦称为协变量(covariates)。 模型y=f(x1,x2,··· ,xm)帮助我们运用xj来预测y,一般而言,模型分成下面几种层级,分级的关键取决于我们对两者关系的了解程度(VarmuzaandFilzmoser,2009)。 .理想状况下的模型:这些模型是基本的科学定律,它们大多是简单的数学方程式,其中所有的参数都是已知的。举例来说,一个自由落体从一定的高度h触地的时间为y,则y是重力加速度常数g与高度h的函数(2h/g)0.5,这个模型适用的前提是忽略空气阻力;牛顿第二运动定律也是理想状况下的模型:F = m · a,F是净外力,是所有施加于实体上的力的向量和,m是质量,a是加速度。 .非理想状况下的模型:前述关系在理想的环境下是精确的(exact),然而现实生活中的环境并非理想,因而许多关系不那么精确,这时y与xj,j=1,2,··· ,m之间可表达成如下的随机误差(randomerror)模型,或称概率(probabilistic)模型: y=f(x1,x2,,xm)+.(3.1) ··· 其中.是随机误差,所以y也是随机变量(randomvariable)。通常假设随机误差.的期望值为0,方差为σ2,因此下面的式子是成立的: E(y| x1,x2,··· ,xm)=f(x1,x2,··· ,xm)(3.2) 其中E(·)是期望值函数。也就是说,虽非理想状况,但是y的条件期望值与预测变量x1,x2,··· ,xm 之间的精确函数形式是成立的。 .参数未知的模型:前述理想状况下y=f(x1,x2,··· ,xm),或非理想状况下E(y| x1,x2,··· ,xm)=f(x1,x2,··· ,xm)的关系可能已知,但是式中的参数未知。举例来说,应用亮度测定物质浓度的Bouguer–Lambert–Beer’s定律也是理想状况下的物理原则,它指出吸光物质的浓度c可由下式来决定: c = A (3.3) al其中l是光源到物质的距离,a为吸收系数· (absorptioncoe.icient),A为吸亮度(absorbance)。A的定义为log(I0/I),I0为入射光强度,I为光通过物质样本后的强度。I0、I及l等测量容易,但吸收系数a通常是未知的,实践时是用一组已知浓度的标准溶液(c已知,I0、I与l可测量),应用多变量校验过程(multivariatecalibrationprocedure)的回归方法,获得红外线或近红外线光谱中不同波长下吸收系数a的值,解决参数未知的问题。 .关系不确定的模式:更多实战问题中x1,x2,··· ,xm与y之间不存在理论关系式,这时只能假设两者存在某种关系。例如,化合物的熔点或毒性与其结构衍生出的变量有关,这些衍生变量通常称为分子描述子(moleculardescriptors)。研究化合物结构与性质间的量化关系(QuantitativeStructure-PropertyRelationships,QSPR),或结构与活性关系(QuantitativeStructure-ActivityRelationships,QSAR)时,也需要前述的多变量校准回归过程,但这时两者的关系形式f(·)可能是我们预先假设的(实行有母数统计方法);或是不限制函数f(·)的形式,而用机器学习算法总结y与x1,x2,··· ,xm的关系。无论如何,其目的是从搜集的数据中,建立适合的函数形式,来进行估计或预测应用等任务,因此也经常称为预测建模(predictivemodeling)。对于这种纯粹由实证数据推导出来的模型,不仅无理论支持,而且我们事先不知道哪些变量有用,所以分析建模时通常涉及众多变量。因此,如何锁定关键变量进行建模,且模型完成后未来应用的预测性能如何估计,都是预测建模的重要工作(参见3.3节模型选择与评定)。最后,所获得的模型与参数可用来预测无法直接测量的重要性质,并有助于了解x1,x2,··· ,xm 与y 的关系,达成由数据构建随机误差模型的目的。 总结来说,统计机器学习是重要的大数据分析技术,它从所搜集的数据中建构出(build- ing)或估计出(estimate)、学习出(learning)、拟合出(fitting)(此后交替使用这些近义词) 预测变量xj,j=1,2,,m与反应变量y之间的非精确(non-exact)函数关系E(y x1,x2,··· ,xm)=f(x1,x··· 2, ··· ,xm),进而自动化某些任务,或者对未知样本进行预测。| 以下以2.1.5节的水质样本algae为例,说明如何拟合出上述非精确的函数关系E(y| x1,x2,··· ,x11)=f(x1,x2,··· ,x11),其中反应变量y为第一种有害藻类的浓度a1,考虑 的预测变量有因子与化合物成分season、size、speed、mxPH、mnO2、Cl、NO3、NH4、oPO4、 PO4与Chla等11个变量。首先将样本分割为拟合模型的训练集与评估模型性能的测试集, 模型估计最简单的方式是用训练样本估计模型后,再用未参与训练的测试样本评估模型的 表现,避免球员兼裁判的情况发生(参见图3.1的保留法)。 图3.1保留法下简单的训练与测试机制 library(DMwR)data(algae) # 移除遗缺程度严重的样本 algae<-algae[-manyNAs(algae),] # 用近邻的加权平均数插补缺失值 cleanAlgae<-knnImputation(algae,k=10) # 确认数据表中已无缺失值 sum(is.na(cleanAlgae)) ## [1] 0 # 设定随机数种子,使得结果可重复性 set.seed(1234) #随机保留50个样本稍后进行模型测试 idx<-sample(nrow(cleanAlgae),50) # 分割出训练与测试样本 train<-cleanAlgae[-idx,1:12]test<-cleanAlgae[idx,1:12] #用148个训练样本估计函数关系 a1Lm<-lm(a1~.,data=train) #拟合完成后运用模型a1Lm估计训练样本的a1有害藻类浓度 trainPred<-predict(a1Lm,train[-12]) #模型a1Lm摘要报表 summary(a1Lm) ####Call:##lm(formula=a1~.,data=train)####Residuals:##Min1QMedian3QMax##-28.20-10.76-1.508.6943.71####Coefficients:##EstimateStd.ErrortvaluePr(>|t|)##(Intercept)63.6994628.149552.260.0253*##seasonspring2.505004.607940.540.5876##seasonsummer-0.950314.32980-0.220.8266##seasonwinter2.901124.159640.700.4868##sizemedium0.721694.212180.170.8642##sizesmall10.074834.663592.160.0326*##speedlow-1.219575.59340-0.220.8277##speedmedium-0.277673.77575-0.070.9415##mxPH-5.709643.12319-1.830.0698.##mnO21.030150.812481.270.2071 ##Cl-0.046880.04739-0.990.3244##NO3-2.248690.82583-2.720.0073**##NH4-0.001060.00177-0.600.5495##oPO4-0.044670.04954-0.900.3688##PO4-0.008680.04077-0.210.8318##Chla-0.075600.08970-0.840.4009##...##Signif.codes:##0'***'0.001'**'0.01'*'0.05'.'0.1''1####Residualstandarderror:16.8on132degreesoffreedom##MultipleR-squared:0.449,AdjustedR-squared:0.387##F-statistic:7.18on15and132DF,p-value:2.51e-11 #训练样本的模型性能指标RMSE值(参见3.2.1节)#因为球员兼裁判,所以较为乐观 (trainMSE<-sqrt(mean((train$a1-trainPred)^2))) ## [1] 15.9 #用模型a1Lm估计测试样本的a1有害藻类浓度 testPred<-predict(a1Lm,test[-12]) #测试样本的模型性能指标RMSE值 (testMSE<-sqrt(mean((test$a1-testPred)^2))) ## [1] 24.85 summary(algae$a1) ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 0.00 1.52 6.95 17.00 24.80 89.80 图3.1的保留法通常随机分割数据集为训练子集与测试子集,如果没有固定随机数种子,两数据子集的内容不尽相同,因此每次得到的评估结果也不相同(下面测试集的RMSE比训练集RMSE还低),这样的建模机制让人担心无法获得稳定良好的模型f.(x1,x2,··· ,x11), 3.3 节将会介绍进阶的模型建立与评定流程。 #测试集的RMSE比训练集RMSE还低的结果 (trainMSE<-sqrt(mean((train$a1-trainPred)^2))) ## [1] 16.26 testPred<-predict(a1Lm2,test[-12])(testMSE<-sqrt(mean((test$a1-testPred)^2))) ## [1] 19.4 3.1.1 统计机器学习类型 3.1 节中两种层级的统计机器学习模型建构过程,通常称为监督式学习(supervisedlearning)(第5章),因为是在学习目标y的明确指引下,建构出E(y| x1,x2,··· ,xm)=f(x1,x2,··· ,xm)的关系。y为数值变量时,称为监督式学习的回归(regression)建模;y为类别变量时,则是监督式学习的分类(classification)模型。 然而因为前述的关系不确定,或是事先不知道哪些预测变量有用,我们需要对陌生的问题空间进行探索,这时学习的目标y不甚明确,或者暂时忽略之,仅在预测变量空间中实行聚类、关联、降维等分析与探索手法,这种学习方式称为无监督式学习(unsupervisedlearning)(第4章)。 监督式学习通常需要大量有标签的(labeled)样本,样本标记的过程耗时且费工,如人工分类网页、语音数据誊写、肉眼分类蛋白质结构等。而无监督式学习中没有y值的样本称为无标签(unlabeled)样本,在数据自动搜集的年代其获得成本相对低廉。而半监督式学习(semi-supervisedlearning)融合前述的两种学习方式,交叉运用有类别标签与无类别标签的训练样本来建立预测模型,具有很高的实用价值。以分类问题为例,这种学习方式基本的想法是大量无标签训练样本的类型尽管未知,但是这些样本的信息结合小量标签样本后的有效利用,可能获得不错的结果。 一般而言,有两种类型的半监督式学习,一种是半监督式分类,它运用无标签训练样本的信息,改善标准监督式分类算法的性能。著名的迭代式自我训练(self-training)即属于这种类型,首先用标签训练样本建立分类模型,接着用模型对无标签样本进行分类预测,预测结果信心度较高的样本直接并入标签样本中加以扩展,扩展完毕后用新的标签样本训练下一迭代的新模型,再将新模型应用到剩余无标签样本,如此反复扩展标签样本与更新分类模型。直到满足收敛准则才停止迭代,输出最终模型结果。另一种是半监督式聚类,借助有标签的训练样本形成的必连(must-link)与必分(cannot-link)限制,融入聚类算法的距离或相似性计算准则(参见3.4节),形成聚类。换句话说,就是运用标签样本的信息,修正聚类算法的目标函数。 本书6.3节的强化学习(reinforcementlearning)涉及序列相关的决策,这类决策的解题基本思想非常简单,将循序决策的大问题分解(decompose)成不同但相关的子问题,逐一解决子问题后再合并它们的解即可得出原问题的解。序列相关的决策建模符合真实情形,改进许多统计模型中观测值为独立的假设,因为这个假设并非永远成立。此外,典型的机器学习或统计模型只考虑当前状态(currentstate)下的短期最佳解,如果在时间先后彼此相关的多个步骤上运用短期解,则可能取得长期(整体)的次优解(globalsuboptimalsolutions),因为建模时忽略了观测值间的依存关系(dependency)。强化学习较监督式学习的问题困难,因为它不是单次(one-shot)的决策问题,马尔可夫决策过程(MarkovDecisionProcess,MDP)是重要的解法之一,常用来解决国际象棋或象棋的对弈问题,以及机器人动作控制等动态问题,棋手或工作中的机器手臂须在不同时间点采取行动,以取得长期最佳解,这里动态是指环境状态会因自身或对手的行动持续改变1。 除了前述基本的学习类型,本书第6章还介绍团结力量大的集中学习与层层转换的深度学习,帮助数据科学家解决日益复杂的诸多问题。 3.1.2 过度拟合 统计机器学习的出现,开启了新的编程范式(paradigm)。过去基于人类可读的高层次符 号,表达想要解决的问题、解题逻辑与解答搜索方式的老派人工智能,称为符号式(symbolic) 人工智能,专家系统(expertsystems)是最典型的表示。传统符号式人工智能的编程方式, 是设计师输入数据与处理规则,然后程序根据这些规则输出处理完成的数据(参见图3.2), 例如前述的专家系统编程。机器学习出现后,程序员可以输入数据,也就是特征矩阵Xn×m, 与各样本期望获得的答案,目标变量向量yn×1,程序则是输出如何从输入数据到结果答案 的函数关系或运算规则,这些关系或规则运用到新样本的预测变量上,即产生对应的问题 答案案(Chollet,2018)。 图3.2统计机器学习下的新编程范式(Chollet,2018) 随机误差模型与统计机器学习就是希望从数据中将隐含且不精确的函数关系学习出来,而非图3.2上半部的显式编程(explicitprogramming)。例如说我们想要建立能自动标记度假照片标签的分类模型,首先要准备许多已经人工标记好的照片,其中包括度假与非度假的照片,作为图3.2下半部的数据与答案。统计机器学习会学会照片特征与其标签(度假/非度假)的统计关系,以此发展出度假照片自动标记的过程,本例就是监督式学习中分类模型的应用。 1http://www.moneyscience.com/pg/blog/StatAlgo/read/635759/reinforcement-learning-in-r-markov-decision-process-mdp-and-value-iteration 当今科技进步,许多监督式分类与回归模型的弹性相当大,能够建立非常复杂的模型。然而复杂模型容易过度强调训练样本中未来不会重复出现的(reproducible)形态,因而产生过度拟合的(overfitted)模型。无监督式学习也会有过度拟合的问题,例如,聚类分析(clusteringanalysis)将特征相似的样本集聚成群,评估聚类模型优劣的一种方式是考虑群内(intra-cluster)与群间(inter-cluster)样本的相似性或是变异性。随着聚类数的增加,群内样本差异越来越小,相似性持续攀升;而群间差异越来越大,如此渐次将样本分割为更细的聚类,最终导致获得观测值各自成群的过度拟合结果。因此,建模者如果欠缺一套评估模型是否过度拟合的指引方针,很可能会陷入模型性能不佳的危机中。 统计机器学习将数据分割为训练子集与测试子集(参见图3.1),前者用来建立模型,后者用来评估模型性能表现。图3.3是不同数据子集下模型复杂度与预测误差的变化关系,提供模型是否过度拟合的重要线索。实线A表示训练集样本的预测误差,随着模型复杂度的提高,训练预测误差越来越低;虚线B为未参与模型建立的测试集样本,其预测误差在模型复杂度适中时达到最低,而当模型小(复杂度低)或大(复杂度高)时,测试集误差就向上攀升了。整体而言,图中C段表示拟合不足(underfitting);D段为较佳的模型复杂度;E段则是过度拟合(overfitting)了,这时模型复杂到与训练集拟合的过度良好,但却逐渐丧失对测试集的预测能力(VarmuzaandFilzmoser,2009)。 图3.3模型复杂度与预测误差之间的变化关系 高度复杂的模型几乎可以分毫无差地拟合任何训练数据,也就是说真实的yi和预测的y.i之间的偏差(残差)几乎是零。很可惜这样的模型对于未用于建模的测试样本,或未知类别标签的样本不一定管用,因为模型很可能是过度拟合的。这种现象说明与训练数据拟合过头的模型,不一定有足够的一般化(generalization)的能力。这好比在数学解题时,不幸碰到答案印刷错误的题目,我们却把它的解法死记硬背下来,套用到正常的题目后结果当然就出错了。 基本上数据内涵的消息可分成两个部分:分析师感兴趣的形态(pattern)与随机噪声 (stochasticnoise)。举例来说,房价取决于房屋面积与卧室间数,卧室越多通常房价越高。 但是同一区域且卧室数量相同的房子,也不大可能会有完全相同的房价,所以这些房价的 变动就是噪声了。再以弯道驾驶为例,理论上有一个最佳的转向和行驶速度。假设我们观 察了100位司机行驶经过弯道,大部分的驾驶都接近最佳的转向角度与速度,但是它们不 会有完全相同的表现,因为噪声导致各观察值偏离最佳值。 统计机器学习的目标是建立所关心形态的模型,而尽量减少噪声的干扰影响。当算法 试图拟合除了形态以外的噪声,所产生的模型就会是过度拟合了。弯道驾驶的例子中,如果 想要准确预测转向角度与速度,我们会考虑更多的变量,如弯度、车型、驾驶经验、天气、 驾驶情绪等。然而越过某一个临界点后,考虑再多的变量已无法找出更多的形态,而只是 拟合噪声了。而因为噪声是随机的,所以过度拟合的模型无法一般化到未知的数据,模型 性能呈现的结果就是图3.3低训练误差与高测试误差的E段了1。 D段欲求形态到开始抓取到噪声的E段,两者的临界点通常不明显,所以建模者很难有仅捕捉到所要形态,而完全无噪声的万无一失的做法。因此数据分析与建模的工作经常是尝试错误(trial-and-error)的过程,及早累积数据处理与分析的实战经验,是成为顶尖数据科学家的不二法门。 图3.3也显示,训练误差一般来说总是低于测试误差,然而下列情况可能使得结果并非如此2: . 训练集有许多难搞的样本; . 测试集大多是容易预测的样本。 虽然异常状况总是潜伏在统计机器学习建模的过程中,不过下列四种状况可帮助数据科学家了解自身建模的处境: . 拟合不足:测试与训练误差均高; . 过度拟合:测试误差高,训练误差低; . 拟合良好:测试误差低,且稍高于训练误差; . 拟合状况不明:测试误差低,训练误差高。 作为一门实战科学的实践者,数据科学家应该动手实现并多多思考,做中学、学中错、错后修,不断积累失败经验,方能应付随机建模的各种状况。 1https://www.quora.com/Can-overfitting-occur-on-an-unsupervised-learning-algorithm 2https://stats.stackexchange.com/questions/187335/validation-error-less-than-training-error 3.2 模型性能评量 没有评量就无法管控!任何预测模型只有运用适当的指标,评量其模型性能后才能合理地运用。无论是何种建模方法论,评量该模型性能的方法通常很多,每种评估方法的角度不同,评量结果因此都有些许的差别。为了了解特定模型的优缺点,建议多方评量模型,仅依赖单一评估指标是有误判风险的。本节介绍回归与分类等监督式学习常用的性能评量指标,无监督式学习的性能评估请参见4.3.4节聚类结果评估。 3.2.1 回归模型性能指标 对回归模型来说,许多性能评量的计算都基于残差(residual,或称预测误差predictionerror,也可简称为误差error),残差ei定义如下: ei = yi . y.i(3.4) 其中yi是真实的反应变量值;y.i为预测的反应变量值,或称模型输出值,它是将第i笔样本的m个预测变量值(xi1,xi2,··· ,xim),代入估计所得的模型f.(·),计算出来的预测值y.i。也就是说,y.i=f.(xi1,xi2,··· ,xim)。残差通常由独立的测试集、交叉验证下或拔靴抽样下的各测试样本集计算得来(参见3.3.1节重抽样与数据分割方法,以及图3.12校验集运用四折交叉验证估计模型最佳复杂度示意图)。 常用的回归模型预测性能指标有误差平方和(SumofSquaredError,SSE),它是残差平方的总和: zz ∑∑ SSE = e 2 i =(yi. y.i)2 (3.5) i=1i=1 其中z是预测值的个数,通常是训练样本数,或者是测试样本的大小。SSE是许多回归模型参数优化问题中的目标函数(参考第5章回归建模部分),误差平方和的缺点是过大的残差,可能因为平方运算而导致过度的影响,这时可以改用残差绝对值的总和误差绝对值和(SumofAbsoluteError,SAE): z ∑ SAE = i=1|yi . y.i| (3.6) 预测误差的算术平均数统计上称为偏误(bias)eˉ: z eˉ=1 ∑ (yi. y.i)(3.7)zi=1 偏误公式的物理意义是各评估样本预测误差的平均值,合理的偏误值应该接近零。然而,如果模型拟合不佳,可能导致预测误差平均值不为零。但是仅由预测误差平均值来判定模型性能是有风险的,所以进一步计算预测误差的标准偏差(StandardErrorofPredictionyerror,SEP),以了解残差的离散程度(参见2.2.1节摘要统计量),其公式如下:√ ∑ SEP =1 ze)2 (3.8) 将式(3.4)代入上式后即为下式:z . 1 i=1(ei . ˉ √ ∑ SEP =1 z(yi. y.i. eˉ)2 (3.9) z . 1 i=1 性能衡量指标适当地注明下标,可以让人更了解如何运用它。SEPTRN或SEPCAL通常表示训练集所计算得到的预测误差标准偏差,SEPTEST是测试集计算得到的预测误差标准偏差(注:训练集(TRN)或校验集(CAL)经常交替使用);而SEPCV是交叉验证重抽样法(参见3.3.1节重抽样与数据分割方法)计算得到的预测误差标准偏差。其大小关系通常为SEPTEST>SEPCV>SEPTRN(为什么?),表示模型性能估计乐观程度逐渐增加。 另一个常用的回归模型预测性能指标是均方预测误差(MeanSquaredError,MSE)或简称为均方误差,它是残差平方值的算术平均: z 1 ∑ MSE=(yi. y.i)2 (3.10)zi=1 均表示平均,方则表示预测误差的平方。均方误差可能是最常见到的回归模型性能指标,通常模型拟合得越好,其均方误差值越小。因为均方误差的单位是原始反应变量单位的平方,较易造成数据解读上的困扰。MSE开方根后取正值的均方根预测误差(RootMeanSquaredError,RMSE)与反应变量的原始单位相同 √ ∑ RMSE =1 z(yi. y.i)2 (3.11)zi=1 式(3.10)的均方误差期望值E(MSE),经过一些整理后可以得到下面重要的式子: ()2 E(y. y.)=V(.)+f(X). f.(X)=σ2 +(bias)2 + variance (3.12) 其中V (·)表示方差;σ2 是前述随机误差模型中误差项.的方差,是随机误差建模无法减少的必然误差(irreducibleerror);偏误(bias)是模型估计或学习得到的函数形式f.(X)与真实函数关系f(X)之间的差距;最后一项是模型f.(X)的方差。 除了无法减少的必然误差外,模型偏误与模型变异存在着抵消关系(trade-off)。一般而言,越复杂的模型其变异越高,亦即训练数据些许变动,估计出来的模型就会不同,因而导致过度拟合,减损模型一般化的能力。另一方面,简单模型较不易过度拟合,但缺点是弹性不足,较难抓到反应变量与预测变量间的真实关系,因而有高的模型偏误。大数据下许多预测变量高度相关,这种共线性(collinearity)大幅提高模型的变异。当两预测变量有高的相关系数值时,称这现象为共线性;而多重共线性是超过两个以上的变量彼此相关的状况。统计机器学习中的惩罚法(penalizedmethods)(参见5.1.3节),通过添加参数估计优化模型中目标函数的惩罚项,适度地提高模型偏误,换取模型变异大幅的降低,减缓共线性导致模型性能不显著或结果不稳定的问题,这就是统计机器学习领域所谓的变异-偏差权衡取舍(variance-biastrade-off)现象。 有些建模方法须比较不同变量(或主成分)数量下的模型性能,例如:多元线性回归与偏最小二乘法(5.1.1节与5.1.2节)。这时性能衡量准则必须考虑变量数量m,变量太少的模型性能可能不佳(拟合不足),变量太多结果会过度拟合,导致预测性能还是不良。这类指标常用的有调整后的判定系数R2 adj(adjustedcoe.icientofdetermination),顾名思义它来自于下面的判定系数R2(coe.icient of determination): R2 = TSS . RSS RSS (3.13)TSS = 1 . TSS 其中训练样本的残差平方和(ResidualSumofSquares,RSS)就是式(3.5)的SSE,表示未被训练模型所解释的信息量,计算公式如下: n ∑ RSS=(yi. y.i)2 (3.14) i=1 而总平方和(TotalSumofSquares,TSS)是yi与yˉ差距的平方和,其物理意义表示数据的总信息含量,与反应变量y的方差成正比,计算公式如下: n ∑ TSS=(yi. yˉi)2 (3.15) i=1 判定系数如上所示,表示数据中的信息(TSS)被模型所解释(TSS-RSS)的比例(介于0与1之间),因此其值是越高越好。但是R2 在回归建模实际应用时,会发生模型中变量越多,其判定系数总是较高的误导现象。因此,将模型中变量个数m(即模型复杂度)纳入考虑,即为R2 adj: R2 n . 1RSS/(n. m . 1) adj =1 . n . m . 1(1 . R2)=1 .TSS/(n. 1) (3.16) 从上式可以看出调整后判定系数R2 会惩罚较复杂(较大)的模型,与判定系数R2 一样, adj 其值也是越高越好(注:m越大,自由度n. m . 1越小,式(3.16)后项的分子越大,因而R2 越小)。 adj 须注意的是,这些判定系数指标(R2 与R2 adj) 其实是反应变量观测值与预测值相关系 数的平方。因此它们是相关性的衡量,而非准确性衡量。观测值与预测值的相关性高,预测 结果不一定就准确,而前述均方误差MSE与均方根误差RMSE是准确性衡量。举例来说, 某测试集反应变量的方差为5,如果预测模型就测试集计算所得的均方根误差RMSE是1, 则R2 约为1 . 15 2 =0.8;假设另一个测试集的均方根误差相同,但是其反应变量的方差较 12小(为3),则R2 约为1 . 3 =0.67。这个例子说明R2 的解释与反应变量的变异性有关, 反应变量的变异性大,则判定系数R2 较优的可能性高(KuhnandJohnson,2013)。 反应变量的变异性在实践时对于用户如何看待模型也有很大的影响,假设台北市的房价是六百万到两亿台币,可想而知其变异非常大。一个R2 =90%的模型看似很好,但其均方根误差RMSE很可能是数十万元的量级(orderofmagnitude),这对中低价位的房产而言可能是无法接受的准确度。话虽如此,某些情况下建模的目标只是要排列新样本,再通过内部校验(internalcalibration)的方式调整预测值,这时反应变量实际值与预测值的等级相关系数(rankcorrelation)就会派上用场了(参见3.5.1节相关与独立)。(注:根据维基百科,量级是数字以10为底的科学计数法表达方式a× 10n,其中的n即为该数字的量级。换句话说,数字的量级就是该数字以10为底的对数值四舍五入。例如:1500的量级为3,因为1500=1.5× 103。) 此外,下面两种性能指标常用于逐步回归中的变量挑选(或回归模型复杂度决定)(参见 5.1 节)。赤池弘次信息准则(Akaike’sInformationCriterion,AIC)可用来衡量多个统计模型的相对质量: AIC=nln(RSS/n)+2m(3.17)当预测变量m越来越多时,式(3.17)的残差平方和RSS会越来越小,但是AIC会根据第二项2m惩罚大的模型。建模者通常偏好AIC小的模型,此处请注意AIC的值无意义,只是用它来比较不同的模型。 另一个是施瓦茨-贝叶斯信息准则(Schwarz’sBayesianInformationCriterion,BIC),简称为贝叶斯信息准则,其公式与AIC非常类似,都与残差平方和RSS有关: BIC=nln(RSS/n)+mlnn(3.18) 如果样本数n>7,式(3.18)中的lnn会大于2。因此,对于较大模型BIC会给予比AIC更多的惩罚(注:通常样本要足够多,才能合理估计较大更复杂的模型)。换言之,BIC会选择比AIC更简单的模型。 3.2.2 分类模型性能指标 许多回归建模方法也可以用于监督式分类问题,例如树形模型、人工神经网络、支持向量机等都是回归与分类问题两栖的好手,但是两种问题的评估方式非常不同,例如,回归模型评估指标RMSE与R2 不适用分类的情形,虽然分类预测模型也可以产生连续的概率预测值。本节从整体与类别相关两个角度介绍分类模型的性能指标,分类模型性能的可视化将在3.2.3节与回归模型性能可视化一起说明。 3.2.2.1 模型预测值 分类模型的反应变量为类别或离散型,例如,预测授信客户是否会违约?其反应变量可能为会(yes)或不会(no);或是病人在患病过程中的等级,第一期、第二期或第三期等。分类模型通常产生两种类型的预测值,一种是类别标签,例如前述的会违约(yes)或不会违约(no);另一种则是类别概率值(classprobability)或类别隶属度(classmembership)。前者是离散型(discrete)的预测值,而后者的概率或隶属度预测值与回归模型预测值一样都是连续值。这两种预测值各有用途,类别预测值使我们有具体根据可做出决策,但是概率预测值却可让我们对分类模型的预测结果更有信心。比如说一封电子邮件预测为垃圾邮件的概率是0.51,与另一封概率为0.99的信,虽然同样被归为垃圾邮件(当阈值为0.5时),但我们对后者的信心更强! 3.2.2.2 混淆矩阵常用的分类模型性能评量大多基于混淆矩阵(confusionmatrix)来计算,以图3.4的2× 2混淆矩阵为例,行表示预测的结果(简称为predicted),分别是预测为阴性(negative,Cn)与阳性(positive,Cp),或是信息检索(informationretrieval)中的抓取(retrieved)与未抓取(notretrieved);而列则是样本的真实的类别(简称为observed或actual),分别是阴性与阳性,或是信息检索中的有关(relevant)与无关(notrelevant)。因此,行列交叉得到真阳数(TruePositive,TP)、真阴数(TrueNegative,TN)、假阳数(FalsePositive,FP)与假阴数(FalseNegative,FN)等,其中形容词真与假表示预测的结果是否与其真实的类别相同,而真假后方的阴阳则指预测的结果。读者请注意,混淆矩阵的行列是可以任意变换(或转置)的,另外,因为矩阵中的样本总数是固定的,所以预测为阳性的个数如果增加,则阴性的预测数自然会减少,也就是说阳性与阴性的预测数量是相依而非独立的。此外,阳性事件通常是我们所关心的事件,如授信客户违约、垃圾邮件与短信、患有某种疾病等,当这些事件发生时,人们通常会采取顺应措施。数据科学家为了计算模型性能,应将观测与预测的反应变量值存储为向量。混淆矩阵是等长的观测类别标签向量与预测类别标签向量,交叉统计后的二维表格结果。下面是R语言产生混淆矩阵的方式,先用随机抽样的方式产生两个向量,再用table()函数查看其 各自的频率分布,最后用table()函数做交叉统计产生混淆矩阵,结果可看出TP为3、TN为16、FP为5、FN为6。 图3.42× 2 混淆矩阵 #相同随机数种子下结果可重置(reproducible) set.seed(4321) #重置抽样(replace参数)与设定各类被抽出的概率(prob参数) observed<-sample(c("No","Yes"),size=30,replace=TRUE,prob=c(2/3,1/3)) # 观测值向量一维频率分布表 table(observed) ## observed ## No Yes ##21 9 predicted<-sample(c("No","Yes"),size=30,replace=TRUE,prob=c(2/3,1/3)) # 预测值向量一维频率分布表 table(predicted) ## predicted ## No Yes ##22 8 table(observed,predicted) ## predicted ## observed No Yes ## No16 5 ## Yes6 3 Python 语言的做法如下: import numpy as np # 随机产生观测值向量 observed=np.random.choice(["No","Yes"],30,p=[2/3,1/3]) # 观测值向量一维频率分布表 np.unique(observed,return_counts=True) ## (array(['No', 'Yes'], dtype='