文章目录
【本文部分内容参考周志华《机器学习》韩家烨《数据挖掘:概念与技术》】
我们在根据同一个数据集通过不同的的算法,或者是同一个算法的不同参数,会得到不同的模型。那我们怎么决定最终选择使用哪个模型呢?
我们知道,我们是要选择泛化误差最小的那个模型。但泛化误差无法直接计算,我们根据训练数据集得到的只是训练误差,那我们应该怎么评估一个模型的泛化误差?最简单直观的方法就是将训练数据集中的一部分用作训练,另一部分用作验证,它们之前没有交集,这样就可以近似得到所需要的泛化误差了。
下面我们第一部分先介绍如何将训练数据集分为训练与验证2部分。
将数据分成了2部分以后,通过不同的的算法,或者是同一个算法的不同参数得到了各种各样的模型,怎么衡量这些模型的好坏呢?泛化误差是一个最终的目标,但同时他并不适用于所有的情况,或者说各种应用场景会有不同的侧重点。比如,医疗问题中,我们希望不要错过发现任何一个病例,但可以接受部分没病的人被误判为有病,这个示例中的正样本的泛化误差代价就远高于负样本了。但另一些示例中,则可以只是希望尽量的提升精度,减少错误率。
因此,在第二部分我们介绍了各种详细的指标,说明如何衡量一个算法的好坏。
简单的说:
(1)为了得到尽量准确的泛化能力,我们将样本集分为训练样本集和验证样本集—样本的划分方式。
(2)用各种各样的方法表示泛化误差,以适应不同的应用场景----泛化能力的衡量。
1、样本的划分方式
样本的划分方式主要是指如何将样本集划分为训练样本集和验证样本集。
1.1 留出法(hold-out)
留出法是指直接将数据集D划分为2个互斥的集合(训练集S和验证集T)。但要注意以下几个细节:
(1)训练/测试数据集的划分要尽可能的保持一致性,避免由于数据划分的差异而对最终结果产生影响。比如对于分类来说,要保持各个类别的比例在训练/测试数据集中保持一致,这种方式一般称为“分层采样”。举个例子,如果数据集中的正负样本比例是1:3,则在训练/测试数据集中都应该近似为1:3。
(2)即使使用了分层采样,仍存在多种划分方法对数据集进行划分。比如选前70%数据作训练,或者是后70%作训练,会得到不同的结果。所以,如果数据集并非十分庞大时,一般要会进行若干次随机划分、重复进行计算评估后以平均值作为最终的模型评估值。
(3)如果S包含了大部分样本,则由于T的数据过少,会导致评估结果不够稳定准确;而如果S过少,则与D相差太大,降低了保真性。一般的做法是将大约2/3~4/5的数据用于训练,其余用于验证。
1.2 交叉验证法(cross validation)
交叉验证法将数据集D按照分层采样分为k个子集,然后每次训练选择其中一个作为验证数据集,其余k-1个子集作为训练数据集。通常把交叉验证法称为“k折交叉验证法”。k最常用的是10,此时称为10折交叉验证法。
与留出法类似,如何将数据集D划分为k个子集同样存在多种划分方式。为减少因样本划分不同而引入差别,k折交叉验证法通常随机使用不同的划分p重复p次,最终的评估结果就是p次k折交叉验证结果的均值,例如常见的“10次10折交叉验证”。
极端情况下,令k=m(m为D中的样本数量),即是交叉验证法的特例:留一法。留一法有以下特点:
(1)不受样本随机划分方式的影响,因为每个样本都会一次且唯一一次充当验证数据。
(2)训练数据集S仅比D少了一个样本,因此其得到的模型与使用D极为类似,一般认为其结果比较准确。
(3)问题:在数据集比较大时,训练m个模型的开销难以接受。
1.3 自助法(bootstrapping)
自助法的做法是每次从数据集D中随机取出一个样本,然后将样本重新放加D中,接着开始下一轮的抽取。。。这个过程重复m次。
自助法抽样得到的样本数与D中的样本数相同,但D中的部分样本在S中出现了多次,部分样本从未在S中出现,这些样本将作为验证集T。一个样本不被放入S的概率为(1-1/m)^m,当m无穷大时,概率趋向于1/e=0.368。也就是说大约36.8%的样本将作为测试集。
优点:(1)当数据集较小,难以划分训练/测试数据集时很有效。(2)能从初始数据集中产生多个不同的训练集,对于集成学习等很有好处。
缺点:(1)改变了初始数据集的分布,这会引入偏差。
在数据量充足时,尽量不要使用自助法。
2、泛化能力的度量
通过合适的方法对数据集进行划分,并计算后可以得到一个模型,那么如何衡量这个模型的泛化能力呢?正如上面所言,衡量不同模型的泛化能力时,使用不同的度量有可能得到不同的评判结果。这意味着没有绝对好坏的模型,模型的好坏不仅取决于数据和算法,还取决于任务的需求。
2.1 回归问题的的性能度量
在回归任务中,一般会使用均方误差作度量:
E
(
f
:
D
)
=
1
m
∑
i
=
1
m
(
f
(
x
i
)
−
y
i
)
2
E(f:D)=\frac{1}{m}\sum_{i=1}^m(f(x_i)-y_i)^2
E(f:D)=m1i=1∑m(f(xi)−yi)2
而一般的,对于概率密度为p(x)的数据而言,均方误差可以表示为:
E
(
f
:
D
)
=
∫
x
∼
D
(
f
(
x
)
−
y
)
2
p
(
x
)
d
x
E(f:D)= \int_{x\thicksim D}(f(x)-y)^2p(x)dx
E(f:D)=∫x∼D(f(x)−y)2p(x)dx
2.2 分类问题的性能度量
2.2.1 错误率与精度
错误率即被错误分类的样本占总样本数量的比例,而精度则是分类正确的样本占总样本数量的比例。很明显:1-错误率=精度。
2.2.2 准确率与召回率
我们先定义几个符号:
TP:本身为正,分类结果也为正的样本数量。
TN:本身为负,分类结果也为负的样本数量。
FP:本身为负,但分类结果为正的样本数量,也就是假的正样本。
FN:本身为正,但分类结果为负的样本数量,也就是假的负样本。
P:正样本的数量。
N:负样本的数量。
很明显,我们有以下关系:
T
P
+
F
N
=
P
T
N
+
F
P
=
N
T
P
+
F
N
+
T
N
+
F
P
=
P
+
N
=
m
\begin{aligned} TP+FN=P \\ TN+FP=N \\ TP+FN+TN+FP=P+N=m \\ \end{aligned}
TP+FN=PTN+FP=NTP+FN+TN+FP=P+N=m
准确率的定义为:
P
=
T
P
/
(
T
P
+
F
P
)
P=TP/(TP+FP)
P=TP/(TP+FP)
召回率的定义为:
R
=
T
P
/
(
T
P
+
F
N
)
=
T
P
/
P
R=TP/(TP+FN)=TP/P
R=TP/(TP+FN)=TP/P
准确率的含义为:被分类为正的样本中,有多少是真实的正样本。比如在信息检索中,我们要考虑搜索出来的结果有多少是用户真正感兴趣的。
召回率的含义为:所有正样本中,有多少被分类为了正样本。
一般而言,准确率高则召回率低,召回率高则准确率低。把二者的数值画成一条曲线,则是PR曲线。根据PR曲线,如何比较不同模型的好示呢:
(1)如果一个模型的PR曲线完全包住另一个模型,则可以认为前者更优。
(2)比较PR曲线下的面积,面积越大,模型越优。
(3)平衡点(BEP),即准确率=召回率时的值,越大越好。
(4)F1和Fbeta。见周志华《机器学习》P31
2.2.3 ROC曲线
ROC曲线的纵坐标为真正例率(TPR),横坐标为假正例率(FPR),定义为:
T
P
R
=
T
P
/
(
T
P
+
F
N
)
F
P
R
=
F
P
/
(
F
P
+
T
N
)
\begin{aligned} TPR=TP/(TP+FN) \\ FPR=FP/(FP+TN) \end{aligned}
TPR=TP/(TP+FN)FPR=FP/(FP+TN)
ROC曲线下的面积可以用于衡量模型的效果。
一个典型的ROC曲线如下图:
2.2.4 代价敏感错误率与代价曲线
正如上面所言,不同类别的分类错误会有不同的损失,可以为错误赋予非均等代价。详见周志华《机器学习》P35
2.3 比较检验
使用上面某种评估方法计算得到算法的性能度量,然后对这些性能度量作比较,从而找到更好的模型。那怎么比较?直接比大小吗?实际上比这个复杂。
简单的说,假设在测试集上观察到模型A比模型B好,则A的泛化能力是否在统计意义上好于B,这个结论的把握有多大?比较检验理论就是分析这些内容。这里不再细说,有兴趣可以参考周志华《机器学习》P37。