西瓜书/南瓜书_学习_2

2.1 经验误差与过拟合

还是一样的,先来点儿专业术语。

错误率(error rate):顾名思义,就是错误判断的占比,比如说,你总共挑了m个瓜,其中a个是坏瓜,那么,此时的错误率E=a/m;

精度(accuracy):与错误率相对的概念,一般写成百分比类型,即

误差(error):学习器(learner)的实际预测输出与样本的真实输出之间的差异。学习器在训练集上的误差称为"训练误差"(training error)或"经验误差"(empirical error) ,在新样本上的误差称为"泛化误差"(generalization error)。

过拟合(overfitting):我们在上一章中知道我们希望得到尽可能准确的模型,但是并不是在训练集上表现很好的模型就是好的。我们事实上寻找的目标是一种样本间的“潜在规律”,但是有时模型过分准确的学习了训练集,就会把训练集中的某种特点当作规律,导致在新样本上表现不佳,这就是过拟合。

欠拟合(underfitting):与过拟合相对的概念。就是对训练集的学习过于不准确,导致并没有得出什么判断的规律。

上图片来感受一下:

欠拟合事实上比较容易解决,增加迭代次数,调整决策树分叉理论上都可行。然而,过拟合就很难解决,也是将伴随所有模型的问题。可能的原因有很多,比如学习能力过强,以上图为例,把锯齿这种不算特征的特征也算在了判断标准之内。

在现实任务中,我们往往有多种学习算法可供选择,甚至对同-个学习算法,当使用不同的参数配置时也会产生不同的模型。这就是机器学习中的"模型选择"(model selection)问题。评估时,我们当然希望使用泛化误差进行评估,但是泛化误差本身无法获取,样本误差又无法判断是否发生了过拟合,那么,我们应当如何选择模型呢?

2.2 评估方法

        通常的做法是,先通过实验来对泛化误差进行评估。为此,我们需要一个测试集(testing set),通过测试集上的测试误差(testing error)来作为泛化误差的近似。但是要注意的是,在选择测试集的时候,我们需要尽可能地避免测试集中出现训练集中已经出现的样本。

        原因也很简单,还是那西瓜举例。你挑了一些西瓜来练习判断是不是好瓜,在你挑出来瓜后,你肯定得切开看看是不是好瓜。如果在这里继续用训练集里的数据来测试,相当于你对着已经切开的瓜,看它是不是好瓜,显然是不合理的,这样你确实是一挑一个准,但是你再去买瓜的时候,一样挑不出瓜来。

        那么,如何处理我们手头的数据集D来获取一个测试集呢?答案是对D本身进行处理,常见的办法有留出法(hold_out)交叉验证法(cross validation)和自助法(bootstrapping)

2.2.1 留出法

        留出法的做法是将我们手头的D划分成两个互斥的集合,训练集S和测试集T。

        使用的时候有几点需要注意:
        (1)尽量在划分时保持样本特征分布的一致性。假设D中有100个样本,S有70,T有30,正例反例各占50,那么在划分S和T时,S应当有35个正例和反例,T应当有15个正例和反例,也就是所谓的分层采样(stratified sampling)。假如给S分了50个正例,那么在T测试的时候,误差估计将由于训练/测试数据分布的差异而产生偏差。

        (2)单次划分后得到的模型往往不够可靠,需要改变S和T的划分多次来提高泛化性。还是以上面的为例,我这35个正例并不是都相同的,每次用于训练的正例不同,得到的模型显然是不同的,所以我们需要进行排列组合,多次测试,再取平均值。

        (3)我们还需要注意控制S和T的比例,这个数一般在1:2到1:4之间。原因也很简单,如果S过大,模型会过于拟合S,T中的样本在数量不足的情况下,可能出现全是完美契合或是全部错误的情况,结果不够准确稳定;而如果S过小,T过大,可能导致模型训练不足,尚未得出足够好的结果。

2.2.2 交叉验证法

        先上图片感受一下:

        

        在图片给出的例子里,D被分为了互斥的10份,更一般的情况下,我们说分成了k份,即:

        和上面的留出法一样,划分时也要注意数据分布的一致性,即从D中通过分层采样得到。

        每次取出一个划分作为测试集,然后剩下k-1个划分作为训练集,这样进行k次后,对测试结果取平均值,返回结果。

        显然,这个方法的效果与k的取值有很大的关系,所以为了突出这一点,这种方法也称为K折交叉验证(K-fold cross validation)图中的例子就是一个10折交叉验证。

        根据上面的学习,看到分类,我们自然会想到样本的划分是否避免了偶然性,因此,这种方法通常要随机使用不同的划分重复p次,最终结果是这p次k折交叉验证的平均(eg:10次10折交叉验证)

        这种方法还有一种特殊情况,即留一法(leave_One_Out,简称LOO),用法就是,每个划分中只有一个样本,D中有多少样本就进行多少次验证,比如有m个样本,就进行m次实验,产生m个模型。这种做法确实比较准确,但是问题也很明显,要进行太多次重复训练,时间复杂度极高。因此一般在样本较少的时候,考虑使用。

2.2.3 自助法

        自助法不同于上面两种方法,并没有使用D中的一部分样本用作测试,避免了因训练样本不同产生的估计偏差,它采用的方法是自助采样法(bootstrap sampling)。

        什么是自主采样法呢?以瓜举例。我手上现在有一定数量的西瓜,我进行m次随机的放回采样,也就是随便挑个西瓜,记录下特征,然后放回去,这样重复m次,我手上就有了包含m组数据的数据集,初始数据集中有的样本多次出现,有的则从未出现。大概算一下,设样本在m次采样中始终不被采样到的概率为        ,对它取极限可得:

                                                        

大概三分之一的样本不会出现在采样样本集中。

我们设原来的样本集叫D,刚刚得到的采样样本集叫D‘,于是我们可以将D’用作训练集,D/D'用作测试集。这样,实际评估的模型与期望评估的模型都使用m个训练样本,而我们仍有数据总量约1/3的没在训练集中出现的样本用于测试。这种测试结果,亦称为包外估计(out of bag estimate)

        自助法在数据集较小、难以有效划分训练/测试集时很有用;此外,自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处。 然而,自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差(类似于上面提到的划分时会出现的问题)。因此,在初始数据量足够时,留出法和交叉验证法更常用一些。

2.2.4 调参与最终模型

        看到标题也能想到这一部分要干什么了。在我们得到最终能用的模型前,需要对参数(parameter)进行调整,也就是所谓的调参(parameter turning)。

        在调参过程中,我们显然也是需要数据来测试它与样本的拟合程度的,这组数据就叫做验证集(validation set)

        因为本身参数大部分都是可以在实数范围内取值的,这样直接慢慢穷举显然不现实。因此需要我们先设定一定的范围,比如参数A,范围[0,2],然后再设定一定的步长,比如0.05,然后在这五个数中选择。

        选定大概的参数范围后,我们需要做的是拿完整的数据集D对模型参数进行调整和测试,最终得到的才是我们的最终模型。

2.3 性能度量

        在有了模型后,我们仍然需要对模型的性能(比如精确度之类的)进行评估,以便于后续的优化,这个标准就叫性能度量(performance measure)

        和我们评价瓜的好坏类似,为了评估模型的性能,我们需要把预测结果与实际结果(真实标记)进行比较,也就是把f(x)和y进行比较。

           均方误差是常用的标准:

其实很好理解,就是D中的m个数据,把每一个预测值和实际值都进行比较,然后求平均值。

更一般的,对于数据分布Ð和概率密度函数p(.),均方误差可描述为:

这个式子的形式就是概率密度函数求概率的形式,对D中的每一个x,然后函数为,再乘p(x),也就是概率密度,最后求积分,相当于上面的求和再求平均。

2.3.1 错误率和精度

        错误率:

        

        和上一章里的那个类似,对二元分布{0,1}求和,再平均。

        精度:

        

        和错误率只有=不同,因此二者相加应该为一(其实就是概率函数下面的总面积为1,因此错误和准确这一二元关系相加为一)。

更一般的,对于数据分布Ð和概率密度函数p(.),错误率与精度可分别描述为:

其实就是1/m换成了积分。

2.3.2 查准率,查全率与F1

        这是另外的两个性能度量,也引出了很重要的概念——混淆矩阵(confusion matrix)

                     

在这一部分中,我们叫查准率(precison)——P   查全率(recall)——R

                                                        

这其实是一对儿冤家,依旧以西瓜为例。设想,如果你想尽可能把所有好瓜拿到,那么你肯定会把所有怀疑的个体全挑出来,因为此时即使挑错了,也不在你的考虑范畴内,这样一来,你就加大了TP和FP,减小了FN,所以R升高,P减小;如果你要保证挑出来的都是好瓜,那么你肯定会谨慎很多,也就是会减少TP和FP,升高FN,也就是P升高,R减小。

所以我们通常会让机器对样本以“是正例的概率”进行排序,这样一来,我们可以找到我么们想要的P和R的比例的一个位置。

我们可以通过PR曲线来直观的见识一下:

如果一个模型的曲线在PR图上完全在另一条的下方,或者说内部,我们可以说A包住了C,也就是说,A的性能优于C。但是这样无法分辨A和B的优劣,所以在实际问题中,我们还是会以我们自身的需求出发,看我们是需要更全还是更准。

当然,如果实在要比个上下的话,曲线下的面积是个不错的标准。还有一个标准,就是平衡点(Break-Event Point),用于判断模型达到平衡点时的取值,比如图中A比B在达到平衡点时,P和R的取值都更大,所以我们可以说,在此标准下,A优于B。

比起BEP更准确的,就是F1:

F1的一般形式则为Fβ:

其中ß>O度量了查全率对查准率的相对重要性[VanRijsbergen, 1979]. ß = 1时退化为标准的F1;ß> 1时查全率有更大影响;ß < 1时查准率有更大影响。可以更自由地选择P和R的权重。

F1是基于P和R的调和平均定义的

Fβ则是加权调和平均

与算数平均((P+R)/2)和几何平均(√P*R)相比,调和平均更重视较小的值。

有时,当我们进行多次训练的时候,很可能会得到不止一个混淆矩阵,那么我们就需要思考如何解决在n个矩阵上综合考察P和R。

一种做法是宏查准率宏查全率,以及相应的宏F1

算法就是在每个矩阵上先分别算出P和R,再求和求均值

与之相对的,就是先把各矩阵的各元素相加求平均,得到,再算P和R,也就是微查全率微查准率以及微F1

                ​​​​​​​        

        ​​​​​​​        

2.3.3 ROC和AUC

还有一个提高模型泛化能力的方法,就是设定一个分类阈值,比如{0,1}的情况下,你设置一个0.5,模型对每个样本预测完后返回的值若大于0.5,则归为正例,否则为负例,这也类似上面提到的,将数据从“最可能为正例”到“最不可能为正例”排序,其中设置一个截断点,用于分开正例和负例。截断位置的设置,取决于我们对P和R的偏好。

而这个根据可能性排序的质量就很大影响了对模型泛化能力的评估,ROC曲线则是从这个角度出发来研究学习器泛化性能的有力工具。

对于ROC曲线,我们需要从正例中挑选最重要的两个特征,作为横纵轴,对于每个样本,我们现在不关心是不是正例,我们现在把他们全视作正例,只考虑它们是正例的概率。ROC曲线的纵轴是"真正例率"(True Positive Rate,简称TPR),横轴是"假正例率"(False Positive Rate,简称FPR)

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​    ​​​​​

显示ROC曲线的图称为"ROC图",图2.4(a)给出了一个示意图,显然, 对角线对应于"随机猜测"模型,而点(0,1)则对应于将所有正例排在所有反例之前的"理想模型":

其中AUC的意思是曲线下的面积,也就是ROC下的面积。

可由此式计算

注意,ROC上每个点的变化是由于阈值调整导致的,比如(1,1)这个点,此时TN和FN=0,因为阈值拉到最大,也就是所有的样本预测出来都是真的,所以只有TP和FP。(0,1)点达不到是因为几乎不可能存在FP和FN都为0的模型,也就是百分之百正确的模型。

具体曲线的画法为,设前一个点为(x,y)如果当前为真正例,则坐标为;若为假正例,则,在图上表现出来就是,如为真,则上移,为假,则右移

ROC的比较和PR一致,也是包住就是外面的好,比不出来就比面积,也就是AUC

所以我们可以看出来AUC和ROC的性能有密切关系,我们可以藉由它来定义损失(loss)

形式化地看, AUC考虑的是样本预测的排序质量,因此它与排序误差有紧密联系.给定m +个正例和m − 个反例,令D +和D − 分别表示正、反例集合

参考:机器学习公式推导【Day3】排序损失loss_conquer997的博客-CSDN博客

简单来讲,Lrank对应的是ROC曲线上的面积,因此我们可以有AUC=1-Lrank

2.3.4 代价敏感错误率和代价曲线

        与我们对某种好瓜有倾向一样,我们对某些坏瓜有尽量避免的倾向,按标准一点儿的话来说就是,我们对一些错误有尽量避免的偏好,也就是说,同为错误也是有非均等代价的(unequal cost)

        以混淆矩阵来讲解:

        

cost00和cost11是TP和TN,所以选到它们时,不会造成cost,在矩阵上就是0,而另外两者是会造成cost的,也就是cost01和cost10。我们可以根据我们真实类别的不同,赋给两个位置不同的值,也就是根据两种错误的严重程度,赋给不同大小的值。

在这种cost有不同值的情况下,我们现在就不是简单地计算错误的次数,而是量化的考虑错误带来的代价大小,也就是我们希望最小化总体代价(total cost)。

若将上表中的第0类作为正类、第1类作为反类,令D+与D-分别代表样例集D的正例子集和反例子 集,则"代价敏感"(cost-sensitive)错误率为:

        ​​​​​​​        ​​​​​​​        

简单解读一下,对所有正例和负例子集的二项分布分别求和,然后求平均,得到最后的损失期望。

在非均等代价下,ROC曲线不能直接反映出学习器的期望总体代价,而 "代价曲线"(cost curve)则可达到该目的。代价曲线图的横轴是取值为[0,1] 的正例概率代价:

机器学习模型性能评估(三):代价曲线_机器学习算法那些事的博客-CSDN博客

(归一化正例概率代价,分子是整理概率代价,分母是总概率代价)

其中p是样例为正例的概率;纵轴是取值为[0,1]的归一化代价

分子是模型总概率代价,分母是模型总概率代价最大值,也就是FNR和FPR取1的情况

分析模型归一化代价的时候,只考虑分子项,归一化项可理解为常数,不影响模型的理解。

在二分类问题中,ROC曲线的每个点对应一个分类器,分类器可用阈值表示为:

FNR:假负例率,即已知测试样本是正样本,测试结果是负样本的概率,即条件概率。

同样的TNR,FPR,TPR的表达式也可以通过条件概率的形式给出:

(TNR是真负例率)

正例先验概率p,负例的先验概率(1-p)。结合正例先验概率,那么当输入为正例,测试结果为负例的联合概率分布(joint probability distribution):

其他的情况也同理:

整个方程推导如下:

期望损失代价是由正例先验概率(p)和混淆矩阵决定的,当ROC曲线的阈值确定时,FPR和FNR也相应的确定。因此,代价曲线是一条直线,不同的代价曲对应不同的分类器。

因此,代价曲线如下图:

期望总体代价越小,则模型的泛化性能越好;反之,模型泛化性能越差。

取ROC曲线上的每一点,计算相应的FNR,FPR。FNR和FPR在已知的情况下,归一化代价是一条随正例概率变化的直线。因此,代价曲线是一条直线,ROC曲线每个点都对应一条代价曲线。

对于给定的正例概率p,取所有代价曲线在该频率下的最小值,然后求该最小值与正例概率所围成的面积,得到如上图所示的阴影曲线。

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

证明:在FPR和FRN已知的情况下,代价曲线是一条直线

2.4 比较检验

        统计假设检验(hypothesis test)是用于比较学习器性能的方法。下面默认以错误率为性能度量,用∊表示。

2.4.1 假设检验

可以参考:机器学习数学基础八:假设检验_机器学习假设检验_喜欢吃豆的博客-CSDN博客

        假设检验中的"假设"是对学习器泛化错误率分布的某种判断或猜想,我们现实中并不知道实际的泛化错误率,所以在使用的时候,以测试错误率⋵代替。

        假设一个模型,样本数为m,错误率为∊,则误分类的数量为∊*m,设m'=∊*m,则模型将m'个样本误分类,剩下的全部正确的概率为,由此可估算出恰将⋵*m个样本误分类的概率为这也表达了在包含m个样本的测试集上,泛化错误率为∊的学习器被测得测试错误率为⋵的概率;

(注,此处的第一项是组合数,我一开始一直以为是列矩阵,整个式子的意思是m中随机选择⋵*m个数,乘正确的出现概率和错误的出现概率,就是C(3)(10)*p^3*(1-p)^7的那种分布)

简单理解的话,这里的∊的大小代表的是拿模型测试样本,理想情况下会有几个被误分类,也就是假如有十个样本,∊=0.3,那就是有三个会被误分类。而⋵代表的就是我们实际测的结果,测了很多次,每次看有几个被误分类,也就是上图的来源,我们可以看到出现三个误分类的概率最大,所以⋵=0.3,与上面的概念相符。

图中的1-α代表的是我们的假设“∊≤∊0”的“置信度”相应于非阴影区域的范围。

考虑此假设,则在1-α的概率内内观测到的最大错误率:

若测试错误率小于临界错误率,则得出结论:在α显著度下,假设成立,即能以1-α的置信度认为,学习器的泛化错误率不大于ε0,也就是不可被拒绝。

(待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值