泛化能力
让我们从一个问题开始:什么模型是好的?
- 我们可以说我们希望这个模型很好的适用于我们没有见过的样本
事实上我们想要一个对大部分情况都好的模型,但这是很难实现甚至不可能的(或者花费太过于高昂),所以我们要做的是:搞清楚客户要的到底是什么,然后把需要的东西给出就好了,我们不用关心它在别的情况下表现的好不好。(这是机器学习这个学科看待问题的角度)
综合来说,一个模型泛化能力强,即很好的适用于我们没见过的样本,我们就认为这个模型是好的。
不过评价一个模型好不好的标准要视具体问题进行具体分析。
过拟合与欠拟合(overfitting&underfitting)
下面我们需要引进几个概念:
- 泛化误差:在“未来”样本上的误差
- 经验误差:在训练集上的误差,亦称:“训练误差”
我们能控制的是训练集上的结果,但是我们想要的是未来的结果,那么我们一定要在这两者之间找到某种联系!
所以机器学习所有的研究都是基于以下假设进行的:
新数据和已有数据符合同一个规律
我们所追求的是泛化误差越小越好,但我们只能控制经验误差,是不是说经验误差也越小越好呢?
当然不是!
究其原因是因为在机器学习的过程中会出现一个被称为 “过拟合(过配)(overfitting)” 的问题。

上面的这个图很好的说明了什么是 “过拟合” 与 ”欠拟合“
过拟合:其实就是把训练数据中的特性学出来了,而这个特性算不上一般规律
欠拟合:与过拟合相反,就是重要的特性还没学出来
所以训练误差并不是越小越好,当训练误差太小的时候可能已经把不该学的东西学进去了!
那有没有一个方法可以找到完美的解决方案呢?---------没有!!!!
过拟合是机器学习中的核心内容,不同的算法只是在通过不同的方式与过拟合作斗争!
在学习一个新的算法时我们要主动思考以下问题:
-
这种算法是通过怎样的方法缓解过拟合问题的?
-
这种方法什么时候会失效?
三大问题
我们现在要考虑以下三个关键问题:
- 如何获得测试结果\to评估方法
- 如何评估性能优劣\to性能度量
- 如何判断实质差别\to比较检验:分辨在统计意义上这个模型是不是好的
评估方法
这里的评估方法似乎不止是说模型的评估,而是背后学习算法的评估!
关键:如何获得测试集
第一个问题是我们该如何得到测试结果,值得注意的是,我们只有用户给我们提供的训练数据。
测试集代表着模型在训练时被见过的东西:测试集应当与训练集互斥
常见的方法:
- 留出法(hold-out)
- 交叉验证法(cross validation)
- 自助发(bootstrap)
留出法

所以啥时留出法呢?比如说你给我100个数据,拿80个数据进行训练,20个数据进行测试(用于检测模型表现的怎么样)
留出法是最简单的方法,但我们依然需要注意一些事情
- 我们在分割训练集与测试集时需要保持数据分布的一致性(可以使用诸如“分层采样的方法”)
- 多次重复划分(例如:100次随机划分)
- 测试集不能太大也不能太小(例如:\frac{1}{5} -\frac{1}{3}):测试集若是太大则模型不符合我们的要求,若测试集太小,则对模型的评估不准确
假如说我们有两个备选的算法L_1和L_2,在经历多次测试后我们发现L_1的误差总是小于L_2的误差,于是我们可以认为算法L_1要比L_2好,那是不是说明我们只要把L_1某次用80个数据训练出来的模型提交给用户就好了呢?不是的!
我们还需要再次使用L_1 ,利用全部的样本(100个)训练模型,再把这个模型提交给用户
k—折交叉验证法
上面的留出法有一些问题:数据集中总有一些数据训练的时候永远没用上,或测试的时候永远没用上
我们希望模型对训练集中所有数据的性能都考察过。
下面图式的这个方法就可以完美的解决问题:

假设现在有一百个数据,(假设我们要做10折)把这个数据集分成10个子集(大小相同)。随后我们做10次测试。每次测试我们都把其中1个子集作为测试集,剩下的9个作为训练集,所有测试的结果平均后得到最终的结果。
好吧,不过现在还有一个问题,划分子集的方式也会影响结果,所以我们也有必要对数据集进行10次的随机划分,于是我们得到了10\times 10 的交叉验证(10\times 10CV)
值得注意的是,如果我们每次只留一个数据作为测试集进行测试,我们就获得了:留一法(leave-one-out,LOO)
但并不一定更加准确(NFL定理)
自助法
基于”自助采样“(bootstrap sampling),亦称“有放回采样”,“可重复采样”
这个方法在什么时候有用呢?当我们要做100个样本的模型但是手头的数据太少,如果每次我们用99个样本进行训练留出一个作为测试集,但是如果我多留一点吧,训练出来的模型又不准了,那有没有一种办法可以让我们既可以训练出一种M_{100}算法(用100个样本训练出来的算法)又可以留出来一部分作为测试集呢?可放回采样就是在做这件事情!
所以可放回采样到底是啥呢?
可放回采样
我们可以想象一个盒子,在这个盒子里面我们放了10个球,每次摸一个球,记录一下,再把这个球放回去,下次再取一个球,于是有的球会多次出现,有的球根本没取到,但不管怎么说,原来有10个球我现在还可以取10个球出来,就是取出来的球可能有重复

用这种方法,我们可以实现用100个数据做模型,我们现在可以采样出一个样本包含100个数据进行训练,同时在采样中没有出现
的数据可以留出来做测试。
所以,没有出现的数据大概有多少呢?我们可以进行以下计算来估计一下:
\lim_{m\to \infty}(1-\frac{1}{m})^m=\frac{1}{e}\approx 0.368
于是我们可以得知约有36.8 \%的样本不会出现,我们可以用这些没有出现的数据作为测试集,这样的测试方法被称为:
包外估计(out-of-bag estimation)
不过这种方法还是有很多缺陷的,最大的缺陷是:数据分布有所改变
因此:
- 数据量不够
- 数据分布对结果没有显著的影响
可以使用这种方法
调参与验证集
我们一般会遇到两种参数:
- 算法的参数:一般由人工设定,亦称“超参数”
- 模型的参数:一般由学习确定
这两个事情该怎么理解呢?比如说,现在有一个算法是用多项式函数去逼近数据, 我们都知道多项式分为一次、二次、三次....这个算法有一个参数:“选用多项式的次数是多少?”。这个参数是“超参数”,要由用户提供。在得知了多项式的次数后我们需要通过学习确定多项式每一项的系数,这里的系数就是“模型的参数”。
我们可以认为模型是参数对算法和数据的实例化
调参过程相似:先产生若干模型然后基于某种评估方法进行选择
参数调的好不好往往对最终性能有关键性的影响
“对模型的选择”覆盖了把机器学习中很多变量确定的过程。
有的时候我们可能会遇到“验证集”,我们需要将其与测试集进行区分,验证集就是专门用于调参数的!
额,所以验证集是怎么来的呢?其实和测试集差不多。
当我们要考虑到有条参数的需求时,我们会将数据集分为3个部分,分别是:训练集,验证集,测试集(验证集是从训练集身上分出来的,调参数是训练的一部分!)
我们用训练集训练模型,用验证集调参数,调整完参数后通过测试集判断好还是不好。(既然验证集是用来调参数的那训练集有什么用啊? )
值得注意的是,在算法参数选定后,我们要把训练集和测试集合起来重新训练得到最终模型,这个模型再放到测试集中去测试才能得到它的性能。
性能度量
性能度量是衡量模型泛化能力的评价标准,反映了任务需求,使用不同的性能度量往往会导致不同的评价结果。
回归(regression)任务
对于这类任务我们通常使用“均方误差”作为性能度量。
E(f;D)=\frac{1}{m}\sum_{i=1}^m (f(x_i)-y_i)^2
下面是对于上式的说明:
- f(x_i)是模型f产生的结果
- y_i是真相(ground-truth)
有的时候我们把均方误差称为“二次误差”,“平方误差”
有的时候我们还会发现\frac{1}{m} 前面还有一个常数项(比如\frac{1}{2})但没有影响!!!(所用模型都用同一个算法计算误差,最后统一比较,对于我们选择模型当然不会有影响!)(前面加一个\frac{1}{2}的好处是求导时会把2消掉)
分类任务
对于分类任务我们最常使用的性能度量是“错误率”
E(f;D)=\frac{1}{m}\sum_{i=1}^m\mathbb{I}(f(x_i)\neq y_i)
- \mathbb{I}(\cdot)被称为指示函数,当内部的判断为真时,值为一;内部判断为假时,值为零
与错误率相反的被称为“精度(accuracy)”
acc(f;D)=\frac{1}{m}\sum_{i=1}^m\mathbb{I}(f(x_i)= y_i) =1-E(f;D)
这两个性能度量的方法还是太简单了,我们还可以搞定更精确一些:“查准率”,“查全率”
根据分类的结果,我们可以获得一个混淆矩阵:

其中:
- T代表预测的结果是对的;F代表预测的结果是错的
- P代表预测的结果是正例;N代表预测的结果是反例
于是我们可以得出以下的两个性能度量方法:
查准率(precision):
P=\frac{TP}{TP+FP}
不难看出查准率就是在计算预测结果为正例的情况下预测结果是对的概率
查全率
R=\frac{TP}{TP+FN}
- TP+FN代表了所有的正样本
- 不难看出查准率的核心含义是在所有的正样本中找出了正样本的概率。
但查准率和查全率是分开的两个指标,万一有一个算法在P上更好,另一个算法在R上更好,我们要选那个呢?不好说吧。
不过我们可以吧查准率和查全率两个指标混合在一起,于是我们得到了:
F1度量
F1=\frac{2\times P\times R}{P+R} =\frac{2\times TP}{number \;of\; all\; the\; examples +TP-TN}
有点奇怪,不过上面的东西是由下面的式子变过来的:
\frac{1}{F1}=\frac{1}{2}\cdot(\frac{1}{P}+\frac{1}{R})
它实际上是P 和R 的调和平均。(所以什么是调和平均呢:)
如果对查准率与查全率有不同的偏好,则可以使用以下的式子:

- \beta>1时对查全率有更大的影响
- \beta<1时对查准率有更大的影响
比较检验
话说我们前面也看了不少评估方法了对吧,那在某种度量下取得评估结果后,是否可以直接比较来评价优劣呢?
NO!!!!!!!!!!!!!!
因为:
- 测试性能不等于泛化性能
- 测试性能随测试集的变化而变化
- 很多机器学习算法本身具有一定的随机性
机器学习的目标不是最优,而是概率近似正确
统计假设检验( hypothesis test)为学习器性能比较提供了重要的依据!
-
两学习器的比较
-
交叉验证t检验(基于成对t检验)
-
k折交叉验证
A B e_A-e_B err_{A1} err_{B1} err_{A1}-err_{B1}=\omega_1 err_{A2} err_{B2} err_{A2}-err_{B2}=\omega_2 ... ... ...... (假如说是10折)若我们发现在十次中err_{Ai}有将近5次小于err_{B_i},另外五次则相反,每次差的还不多.
我们用\omega的均值加上它的标准差,来判断是不是我们上面提及的分布(t检验:点击跳转)
-
-
McNemar(基于列联表,卡方检查)
-
这部分书中有较为详细的说明!!!!去读书
上一章:<机器学习初步:绪论>
下一章:<机器学习初步:线性模型>
全部评论 (0)
暂无评论,快来抢沙发吧~