模型选择
怎么去选超参数
训练误差和泛化误差
训练误差:模型在训练数据上的误差(指模型看到的数据上有标号的数据上的误差)
泛化误差:模型在新数据上的误差(我们所关心的是这个,是在新的数据上的误差)
训练误差好并不代表着泛化误差好。
怎么计算训练误差和泛化误差呢?一般来说有两种数据集,一个是验证数据集,另一个是测试数据集。
验证数据集
一个用来评估模型好坏的数据集。我们经常讲训练数据集分成一半一半,其中的一般是用来训练我们的模型参数,另一半验证数据集就是讲我们训练好的模型在验证数据集上测试一下精度和误差。因为验证数据集是不参与训练的,所以在一定的程度上能反映超参数的好坏。
验证数据集一定不能和训练数据集混在一起。(常犯的错误)
测试数据集
只能使用一次,不能来调超参数
实际上是没有真正的测试数据集,在代码中的test data也是验证数据集,真正的测试数据集是一个新的数据集,甚至不知道标号的数据集。
我们经常遇到的问题是没有那么多的训练数据,如果直接那一半的数据去验证不参与模型的训练的话,是很划不来的事情。解决这样的问题常见的一个就是K-则交叉验证
K-则交叉验证算法
拿到一个数据集的时候将这个数据集随机打散,分割成K块,做K次计算,每一次讲第K快的数据集作为验证数据集,其余的作为训练数据集。
上面的图做一下解释:将数据集假设分成三块,这样就可以做三则运算,选择其中的一份作为验证数据集,在验证数据集上验证精度,剩下的两块上训练数据集。同理剩下的两次运算也是这样的。这样的话我们得到三个u安政的精度,把这三个精度做平均就得到了K则交叉验证的误差。常用的话K=5或10
这样做的好处是:尽可能大的将我的数据集作为训练数据集。代价是算起来比较费时费力。
总结:
训练数据集:训练模型参数
验证数据集:选择模型超参数
非大数据集上通常使用K则交叉验证
过拟合和欠拟合
模型容量指得是模型的复杂程度,根据数据的复杂程度来选择模型的容量
简单数据使用了复杂模型就会出现过拟合,复杂数据使用了简单的模型会出现欠拟合。
模型容量
拟合各种函数的能力
低容量的模型难以拟合训练数据
高容量的模型可以记住所有的训练数据
上面的这两个模型都不是很好的模型,第一个模型就是一个简单的线性函数,因为模型过于简单,使得模型无法将数据覆盖,第二个模型虽然覆盖了所有的数据,但是这个模型太复杂使得模型也覆盖了其中的噪声。
模型容量的影响
模型从低到高也是一种常见的调参的策略,当模型过于简单的时,训练误差比较高,是因为模型过于简单,无法拟合复杂的数据,此时的泛化误差也是很高的。随着模型容量的增加,训练误差下降,模型的拟合能力下降。但是泛化误差从一开始的下降到某一个点的时候开始回升,原因是模型过于关注细节导致新进来的数据模型没有及时地感知到。
泛化误差和训练误差之间的差值时衡量过拟合和欠拟合程度的。核心任务时将这个差距缩小,不让其过于大。但是再出现过拟合的时候不一定都是坏事,在保证模型足够大的时候,通过各种手段来控制模型的容量使得泛化误差往下降。
估计模型容量
难以在不同的种类算法之间比较,例如,树模型和神经网络
给定一个模型的种类,将有两个主要的因素:参数的个数,参数值的选择范围
线性模型参数的个数是d+1,神经网络假设做的事一个单隐含层,隐含层设为m,k是最后的分类类别个数,只要在m 足够大的情况下,这个单隐藏层的神经网络是大于线性模型的。
通过模型参数的个数来判断哪一个模型的容量较高。
参数值的选择范围,假设参数可以在很大的区域内选择的话,模型的复杂度比较高。反之,模型的容量比较低。
VC维
对于一个分类模型,VC维等于一个最大的数据集的大小,不管如何给定标号,都存在一个模型来对他进行完美的分类。
举例:
线性分类器的VC 维
二维输入的感知机,VC维=3
能够分类任何三个点,但不是4个(xor)
支持N维输入的感知机的VC 维是N+1
一些多层感知机的VC 维O(N log2N)
VC维的用处
提供为什么一个模型好的理论依据,它可以衡量训练误差和繁华误差之间的间隔。
但深度学习中很少用,衡量的不是很准确,计算深度学习模型的VC 维很困难
数据的复杂度
多个重要的因素,样本个数,每个样本的元素个数,时间空间结构,多样性
总结
模型容量要匹配数据的复杂度,否则可能会导致欠拟合和过拟合
统计机器学习提供数学工具来衡量模型的复杂度
实际中一般靠观察训练误差和验证误差