机器学习的性能评估(一)

在深度学习的实践方法论中,性能度量是第一步需要确立的,在某些方面,其优先级甚至比选择基准模型还重要。

经验误差、过拟合、欠拟合

在学习性能评估之前,我们需要先了解一下:
误差:学习器的实际预测输出与样本的真实输出之间的差异。
训练误差:学习器在训练集上的误差。
泛化误差:学习器在测试集上的误差。
显然,我们希望得到一个泛化误差小的学习器。但是,在训练模型的时候,我们一般不知道测试集的组成分布,因此,我们在训练时,一般都是努力最小化训练误差,而实际上,也很容易得到一个训练误差很小的学习器。

但是,根据实验发现,训练误差小,并不能以此断定一个学习器的好坏。我们希望学习器能学习到样本身上的普遍规律,这样,在遇到新的样本时,学习器能通过学习到的普遍规律对其进行预测。

在实际模型训练中,经常会出现:模型把训练数据自身的一些非普遍特点、甚至是噪声当做了所有样本都应具有的一般特性,这就会导致模型的泛化性能下降,这种现象就是过拟合。表现就是,模型在训练集上表现很好,但是在测试集上表现很差(训练loss下降, acc也跟着下降)。

欠拟合:模型对于训练样本的一般特性都没学好。表现就是模型在训练集上表现不好,在测试集上表现也不好。欠拟合主要有模型的学习能力太弱导致的,我们可以更换更强的模型,或者增加训练次数。

一般面试中,经常出现的,解决过拟合的方法:

  1. 更多的训练数据, 模型强弱是相对的,既然模型学习能力太强,我们就给出更多的训练数据供模型去学习,给予模型更多需要学习的情况。从这个角度出发,有以下几种具体的方法:
    从数据来源处获取:这种方法是效果最好的,但一般也是比较难实现的。
    数据增强:在原有数据的基础上,使用数据增强技术,比如对图片进行翻转,平移、缩放加入噪声、光照改变等。具体要根据任务而定。

  2. 更合适的模型:因为模型相对于任务和数据来说太强了。我们需要采取措施来降低模型的学习能力或者约束模型的学习能力。
    更简单的模型:对NN来说,就是使用较浅的网络来替换当前网络。对于决策树来说,就是使用剪枝来降低决策树的学习能力。
    更短的训练时间:虽然模型学习能力强,但是也需要时间来学习拟合特征,我们可以使用早停训练方法,将训练集分为训练集和验证集,当验证集误差提升时,就停止继续训练,防止模型进一步过拟合。
    正则化:将网络参数加入到loss中,防止网络参数过大,一定程度上约束了网络的学习能力。

还一种更加合理的解释就是,由于激活函数的引入,激活函数在不同区间能,其表征能力不同,当输出较小时,其工作在激活函数的线型区域(其梯度很大,收敛也很快),但是这样,其对复杂问题的建模也就变弱(近似于线性单元)。随着输出慢慢增大,激活函数的非线性能力增大,其表征能力也变大,模型也就相对越来越复杂。而输入是固定的,输出的大小由每一层的参数W决定的。随着网络不断训练,误差积累越来越多,浅层的网络参数W可能会变的很大。因此,减少训练时长,可以防止网络过拟合。

  1. 给网络加入噪声:给网络中加入一定噪声,影响网络学习。
    在输入加入噪声,通过前向传播到loss中,会引入一个类似于L2正则项的loss,达到和正则化一样的目的。
    在网络响应中加入噪声,网络前向推导过程综合,将模型神经元的输出改为随机值,是不是和dropout有点类似。还有比如label smoothing,给与负点一定的奖励,防止one-hot label的过硬约束。这样一算,其实Hinton的知识蒸馏,软标签也是这个思路,单独学习logits太过强硬,并不是最好的。学习soft logits 可以才是更好的。

  2. Dropout:在集成学习中,我们知道,可以通过多个弱学习器,构建一个泛化性能更加强的强学习器。而,dropout就类似集成学习的思想,既然网络太强了,我们就尝试把网络变弱(以概率p让一些神经元失活),这样,多次训练,我们就可以近似是训练了多个不同的弱网络。在实际测试使用费时,再以一定概率加权集成。可以达到比原谅完整网络更强的泛化性能。

  3. 迁移学习:还有说迁移学习也是一种解决过拟合的办法,前提如果数据太过简单,我们可以尝试使用一个在类似任务上训练好的模型,固定一部分参数层,单独训练很少的层。这看起来也是约束模型的学习能力。

这里需要知道,一般解决一个机器学习问题,都是一个NP难甚至更难,而一个机器学习算法,其必然是有效的,必须能在多项式时间能得出结论,是一个P问题。如果我们可以通过某种设计使得最小化经验误差就可以获得最优解,那么就意味着(P=NP), 这显然是不正确的。因此,只要我们相信(P!=NP),那么过拟合就不可以被避免

评估方法

在实际试验中,我们通常可以得到多个基准算法不同或者训练方法不同的模型,如果评估做这些模型呢,也就是机器学习中的模型选择

理想情况下,我们希望用模型的泛化误差来进行模型评估。但是,我们是不可能获得模型的泛化误差的,因此,只能取一个近似,我们需要一个未知数据的子集(表现就是,测试集中的数据,在相应的训练集中应该没出现过):测试集, 通过比较模型在测试集上的‘测试误差’来评估模型。

下面介绍几种获得测试集的方法:

  1. 留出法(hold-out)
    留出法就是将原始数据集,划分为两个互斥集合,一个大的作为训练集,小的作为测试集。
    训练集和测试集的划分,需要保持两个子集中的数据同分布相同(通俗理解就是,在训练集中正样本占据70%,在测试集中的增氧泵也应该是70%),否则,在测评模型时,会由于数据分布不同产生偏差。在实际操作中,为了实现数据同分布,我们可以采用分层随机采样,对每个类别分别采样划分子集。
    即使采用分层采样,也有很多种采样方法。使用不同的训练/测试集,对模型评估的结果也可能不同。因此, 一般会进行若干次随机采样评估,最终取多次评估结果的平均值作为最终的评估结果
    由于是将一个数据集划分为两个子集,不可避免就是比重的问题,一般是取(2/3~4/5)作为训练集,但是这也是一个折中的办法,因为训练集比测试集大,得出的结果不稳定,训练集过小,和原始数据集差异太大,就丢失了我们训练模型的保真性, 一般情况下,测试集至少要有30个样例。

  2. 交叉验证法(cross validation)
    交叉验证法,先将数据集划分为大小相似且互斥的k个子集,每个子集都尽量保持数据同分布(分层采样获得)。然后,取其中的k-1个子集作为训练集,余下的那个子集作为测试集。这样就可以进行k次训练和评估,最终取k次评估的均值作为评估结果。这种方法也叫(k折交叉验证)。
    这种评估方法的稳定性和保真性很大程度取决于k的选取。一般选择k=10.
    注意上面,划分数据集为k个互斥子集的方法也具有随机性,为了减少因为随机划分引入的误差,也是采用多次划分,进行多次k折交叉验证。假设我们要划分p次,就叫做p次k折交叉验证,其中需要进行 p ∗ k p*k pk次模型评估。
    留一法(Leave-One-out 简称LOO),是k折交叉验证的特例,假设k==(len(dataset)),那么,每次就只从数据集中随机选择一个样本作为测试集。显然,这样划分k个子集不具备随机性了,因此不需要p次划分。而,一般,因为训练集只比原始数据集少了一个样本,其训练出的结果保真性很高。一般都任务留一法评估结果很好,但是实际操作太难了,因为模型数据集一般很大>>10,这么多次评估需要很大计算量和时间。

  3. 自助法(bootstrapping)
    我们在进行评估时,一般希望,我们训练的模型来自完整的数据集上,而之前的留出法和K折交叉验证都会减少训练集的规模(留一法计算量太大)。因此不可避免对的引入了因为训练集和实际数据集规模不同而带来的估计误差。
    自助法的思想来自放回采样,假设原始数据集的大小为m,我们使用放回采样对原始数据集采样m次,可得到规模和原始数据集相同的数据集(但是其中可能一个元素会被采样多次,也可能一个元素根本不被采样到),很容易计算出,一个元素根本不被采样到的概率为36.8%。因此,我们就可以把那些从未被采样到的元素作为测试集,采样数据集用作训练集进行评估,这样测试集约为原始数据集的1/3,而训练集和原始数据集等规模。这样的测试结果也叫做包外估计
    优点
    自助法在数据集很小、难以有效划分训练/测试数据集时很有用。而且,其生成的训练数据集时完全不同的,在集成学习中,boosting就是基于这个方法设计的。
    缺点
    不可避免的,自助法会改变数据集的分布,引入估计偏差。

性能度量

给定了评估方法和训练好的模型。我们还需要一个评估度量标准。
性能度量标准:衡量模型泛化能力的评价标准。
一个性能度量标准的是否适用取决于我们的任务、测试数据、模型等。因此,没有一个普适的标准。

下面我们先介绍一些分类任务中,经常用到的性能度量标准:

  • 错误率
    分类错误的样本数占样本总数的比例。
    E ( f ; D ) = 1 m ∑ i = 1 m I ( f ( x i ) ≠ y i ) E(f ; D)=\frac{1}{m} \sum_{i=1}^{m} \mathbb{I}\left(f\left(\boldsymbol{x}_{i}\right) \neq y_{i}\right) E(f;D)=m1i=1mI(f(xi)=yi)
    其中 f ( . ) f(.) f(.)是预测函数, I ( f ( x i ) ≠ y i ) \mathbb{I}\left(f\left(\boldsymbol{x}_{i}\right) \neq y_{i}\right) I(f(xi)=yi)是指示函数,代表分类错误的样例。
    对于数据分布 D D D和概率密度函数 p ( . ) p(.) p(.),连续变量的错误率可以表示如下:
    E ( f ; D ) = ∫ x ∼ D I ( f ( x ) ≠ y ) p ( x ) d x E(f ; \mathcal{D})=\int_{\boldsymbol{x} \sim \mathcal{D}} \mathbb{I}(f(\boldsymbol{x}) \neq y) p(\boldsymbol{x}) \mathrm{d} \boldsymbol{x} E(f;D)=xDI(f(x)=y)p(x)dx
  • 精度
    精度是分类正确的样本数占总样本数的比例。根据定义,可以很自然的得到 e r r o r + a c c = 1 error + acc = 1 error+acc=1.
    acc ⁡ ( f ; D ) = 1 m ∑ i = 1 m I ( f ( x i ) = y i ) = 1 − E ( f ; D ) \begin{aligned} \operatorname{acc}(f ; D) &=\frac{1}{m} \sum_{i=1}^{m} \mathbb{I}\left(f\left(\boldsymbol{x}_{i}\right)=y_{i}\right) \\ &=1-E(f ; D) \end{aligned} acc(f;D)=m1i=1mI(f(xi)=yi)=1E(f;D)
    对于连续变量的精度:
    acc ⁡ ( f ; D ) = ∫ x ∼ D I ( f ( x ) = y ) p ( x ) d x = 1 − E ( f ; D ) \begin{aligned} \operatorname{acc}(f ; \mathcal{D}) &=\int_{\boldsymbol{x} \sim \mathcal{D}} \mathbb{I}(f(\boldsymbol{x})=y) p(\boldsymbol{x}) \mathrm{d} \boldsymbol{x} \\ &=1-E(f ; \mathcal{D}) \end{aligned} acc(f;D)=xDI(f(x)=y)p(x)dx=1E(f;D)
  • 查全率、查准率和F1
    单独的acc和error可能并不能满足我们对所有任务的度量需求,比如对于(罪犯的识别分类,我们肯定本着宁可错抓100,也不可以放过一个,这个时候,就有了我们的查全率)。首先是从二分类任务开始,类别一共两个:正例和负例(对于多分类,可以转化为正例和其他例),我们就可以绘制混淆矩阵:
    在这里插入图片描述
    混淆矩阵中的P(positive)、N(negative)是根据模型预测而言的,而T、F则是模型预测和真实标签对的对比得到。
    根据上面的混淆矩阵,可以很简单的给出查全率(Recall、召回率)和查准率(Precision、精确率)。
    查全率(R):预测正确的样例在所有真正正例中的占比。如果,我们把模型阈值降到最低,把所有样例都预测为正例,就可以得到100%的查全率,当然,这样查准率就会降低。
    R = T P T P + F N R=\frac{T P}{T P+F N} R=TP+FNTP
    查准率(P):预测正确的样例在所有预测为正的样例中的占比。如果我们给出一个特别严的标准,只把特别有把握是正例的样例预测为正例,这样,我们的查准率就会很高,但是对应的,会漏掉很多应该被预测为正例的样例,查全率就会降低。
    P = T P T P + F P P=\frac{T P}{T P+F P} P=TP+FPTP
    一般情况下,模型会给出预测的置信度(是正例的概率),我们可以选取不同的阈值,就可以计算出不同的P、R,而P、R是一对相对的度量,我们可以使用R作为横轴,P作为纵轴根据画出PR曲线,使用这个曲线来评估多个模型。
    在这里插入图片描述
    很容易相到,当查全率一样时,查准率肯定越高越好,查准率一样时,查全率也是越高越好。因此,如果A模型的PR曲线完全包裹住B模型的PR曲线,我们可以断定,A模型是由于B模型的。
    但是这种情况很难出现,一般是A、B模型的PR曲线相交,此时最合理的方法肯定是比较曲线和坐标轴围成的面积。但是这个值是很难计算的。因此,引入了多个基于查全率和查准率的性能度量:
    平衡点(Break-Even-Point BEP):就是PR曲线和函数 y = x y=x y=x的交点,也就是P=R的时候,这个值越大越好,但是这个也是一个简化的判断。
    F1:这个实际上就是在计算P、R的调和平均,这样的话,较小值在计算时占的比重大一些,也达到了我们的目的,获得一个P、R都尽可能高的模型。而且F1度量有一个一般形式——— F β F_{\beta} Fβ, 根据任务对P、R的重视程度设置值 β {\beta} β给P、R不同的权重。
    1 F 1 = 1 2 ⋅ ( 1 P + 1 R ) F 1 = 2 × P × R P + R = 2 × T P  样例总数  + T P − T N \frac{1}{F 1}=\frac{1}{2} \cdot\left(\frac{1}{P}+\frac{1}{R}\right)\\ F 1=\frac{2 \times P \times R}{P+R} =\frac{2 \times T P}{\text { 样例总数 }+T P-T N} F11=21(P1+R1)F1=P+R2×P×R= 样例总数 +TPTN2×TP
    加入 β {\beta} β之后:
    1 F β = 1 1 + β 2 ⋅ ( 1 P + β 2 R ) F β = ( 1 + β 2 ) × P × R ( β 2 × P ) + R \frac{1}{F_{\beta}}=\frac{1}{1+\beta^{2}} \cdot\left(\frac{1}{P}+\frac{\beta^{2}}{R}\right)\\ F_{\beta}=\frac{\left(1+\beta^{2}\right) \times P \times R}{\left(\beta^{2} \times P\right)+R} Fβ1=1+β21(P1+Rβ2)Fβ=(β2×P)+R(1+β2)×P×R
    对于有多个二分类混淆矩阵或者是多个类别,每两两之间计算一个混淆矩阵时,我们希望从多个混淆矩阵得到一个宏观的P、R,一个很正常的想法就是求平均:
    1、对多个混淆矩阵计算多个P、R,再计算P、R的均值:
    macro ⁡ − P = 1 n ∑ i = 1 n P i macro ⁡ − R = 1 n ∑ i = 1 n R i macro ⁡ − F 1 = 2 × macro ⁡ − P × macro ⁡ − R macro ⁡ − P + macro ⁡ − R \operatorname{macro}-P=\frac{1}{n} \sum_{i=1}^{n} P_{i}\\ \operatorname{macro}-R=\frac{1}{n} \sum_{i=1}^{n} R_{i}\\ \operatorname{macro}-F 1=\frac{2 \times \operatorname{macro}-P \times \operatorname{macro}-R}{\operatorname{macro}-P+\operatorname{macro}-R} macroP=n1i=1nPimacroR=n1i=1nRimacroF1=macroP+macroR2×macroP×macroR
    2、对于多个混淆矩阵,计算其中的TP、FP、TN、FN的均值 T P ‾ 、 F P ‾ 、 T N ‾ 、 F N ‾ \overline{T P}、\overline{F P}、\overline{T N}、\overline{F N} TPFPTNFN, 再基于均值计算P、R:
    micro ⁡ − P = T P ‾ T P ‾ + F P ‾ micro ⁡ − R = T P ‾ T P ‾ + F N ‾ micro ⁡ − F 1 = 2 × micro ⁡ − P × micro ⁡ − R micro ⁡ − P + micro ⁡ − R \operatorname{micro}-P=\frac{\overline{T P}}{\overline{T P}+\overline{F P}}\\\operatorname{micro}-R=\frac{\overline{T P}}{\overline{T P}+\overline{F N}}\\ \operatorname{micro}-F 1=\frac{2 \times \operatorname{micro}-P \times \operatorname{micro}-R}{\operatorname{micro}-P+\operatorname{micro}-R} microP=TP+FPTPmicroR=TP+FNTPmicroF1=microP+microR2×microP×microR

下一节再单独介绍一下ROC曲线和AUC值。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值