模型评估与过拟合
1、误差
错误率(error rate):分类错误的样本占总样本的比例
准确率(accuracy):分类正确的样本占总样本的比例
误差(error):学习器的实际预测输出与样本的真实输出之间的差异
经验误差(empirical error):学习器在训练集上的误差
泛化误差(generalization):学习器在新样本上的误差
测试误差(test error):学习器在测试集上的误差
通常情况下我们需要的模型是“泛化误差”小,而不是单纯的“经验误差“小。
2、过拟合和欠拟合
上面我们提到了我们需要的模型是“泛化误差”小,而不是单纯的“经验误差“小。这是因为学习器如果在训练上的效果很好但是对于新的样本效果却很差,会产生“过拟合”的问题,与之相对的是在所有样本上表现都不是很好的“欠拟合”。
产生过拟合的原因有很多,最常见的就是当一个学习器的学习能力过于强大,把我们训练样本中包含的几乎所有特性都学习到了,同样对于欠拟合则是因为学习器的学习能力低下而造成的。那么遇到了这些问题的时候又该怎么解决呢?
过拟合(overfitting)
1、增加数据量
我们需要喂给学习器的东西就是数据,那么不妨先从数据下手,更多的数据是用来解决过拟合的一个好的方法,因为更多的数据能够让模型学习到更多的有效特征,从而减小噪声带来的影响。
2、降低模型复杂度
数据量不是很多的时候,复杂的模型往往能够学习到更多的特征,此时我们适当的降低模型的复杂度就可以很好的避免模型拟合过多的噪声。神经网络中常用的方法有:减少神经网络的层数、减少神经元的个数等;决策树中常用的方法有:剪枝、降低树的深度等。
3、正则化方法
正则化方法用于给模型的参数加上一定的正则约束,常用的正则化方法有L1正则化、L2正则化等。
4、集成学习
集成学习是把多个模型集成在一起,来降低单一模型过拟合的风险,如Bagging、Boosting。
欠拟合(underfitting)
1、添加新特征
当特征不足或者现有特征与样本标签的相关性不强的时候,容易出现过拟合的问题。因子分解机、梯度提升决策树、Deep-crossing都是常见的丰富特征方法。
2、增加模型复杂度
简单的模型学习能力很差,通过增加复杂度可以提高模型的拟合能力。例如:在线性模型中添加高次项,在神经网络中增加网络层数或者神经元的个数。
3、减小正则化系数
上面提到了加入正则化是为了解决过拟合的问题,同时我们也可以通过调节正则化系数的方式来解决欠拟合问题。
3、评估方法
在现实任务中,我们往往有很多的学习算法可以用于选择,同样对于每一个算法的不同参数也会产生不同的模型,那么我们应该怎样去选择模型?怎样去选择参数呢?
通常我们可以通过实验测试来对学习器的泛化误差进行评估而作出选择,因此我们需要一个“测试集”来测试学习器对新样本的判别能力,然后把测试集所得到的“测试误差”来作为泛化误差的一个近似,从而起到选择模型的作用。需要注意的是,要保证我们的测试样本尽量不要在训练集中出现。
现在我们有一个包含m个样例的数据集D={(x1,y1),(x2,y2)...(xm,ym)},我们怎样保证这个数据集既能训练又能测试呢?看一下下面的办法。
留出法(hold-out)
留出法直接将数据集D划分成两个互斥的集合,一个作为训练集S,一个作为测试集T,在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的估计。
通常我们使用一次留出法的结果是不准确的,我们可以使用随机划分进行采样评估的方法进行多次评估,最终将每次评估的结果取均值作为留出法的评估结果。
常见的选取比例为{训练集:70%-80%,测试集:30%-20%}
交叉验证法(cross validation)
交叉验证法先将数据集D划分成K个大小相似且互斥的子集,每个子集都尽可能的保持分布的一致性(从D中分层采样获得)。然后我们每次用K-1个子集的并集作为训练集,余下的那个子集作为测试集,这样我们可以得到K组训练集/测试集,也就可以进行K词训练/测试,为了强调K值的存在,我们通常把这种交叉验证叫做“K折交叉验证”。
交叉验证的示例图如下(10折为例):
如果训练集中有m个样本,我们取K=m,也就是每次我们都用一个样本来当作训练集,这种方法叫做留一法,因为留一法使用的训练集和我们的原数据集很相似,所以人们往往认为留一法会更准确,但是留一法需要对有m个样本的数据集训练m次,这样的开销也是人们无法忍受的,同时留一法的评估结果也未必比其他方法准确。
自助法(bootstrapping)
当数据集较小的时候,我们通过上面的两种方法对数据集进行划分会让我们的训练集进一步的减小,而使用留一法又会导致有巨大的计算开销,自助法则很好的解决了该类的问题。
自助法是基于自助采样法而产生的,给定包含m个样本的数据集D,我们对它进行采样产生数据集D1(每次随机从D中挑选一个样本拷贝放入到D1中,再将该样本放回到D中,进行m次有放回的采样),采集得到的数据集中有一部分样本会在D1中多次出现,另一部分不出现,我们可以进行一个简单的估计,样本在m次采样中始终不被采到的概率是,对其取极限可以近似的得到0.368。
根据结果我们可以知道在数据集D中有36.8%的样本没有出现在采样数据集D1中,这样我们就可以把D1来当作测试集,把没有出现在数据集中的样本当作训练集进行训练。
自助法在数据集较小,难以有效划分训练集/测试集的时候很有用,但是当数据量比较大的时候留出法和交叉验证法更常用一些。
4、参数调节
通常我们在选择好的学习器后有两类参数需要去设定,一类是可以从数据中学习估计得到,还有一类参数是无法从数据中估计,只能靠人的经验进行设计指定,后者我们称之为超参数。那么超参数是怎么去进行调节的呢?
验证集
首先我们引入一个新的概念叫验证集,有很多的资料中把验证集和测试集混为一谈,实际上我们可以把训练集分成三个部分:训练集(60%)、验证集(20%)、测试集(20%),而验证集主要用于“调参”,这就好比我们在高考前做的事情,平常我们做大量的练习题就好比学习器中使用训练集进行训练的过程,多次进行的模拟考试就相当于使用验证集不断的去调节我们自身答卷能力,而最后的高考就和测试集一样用于检验我们最终的结果。
常见的参数调节方法如下:
网格搜索
网格搜索通过查找搜索范围内的所有的点来确定最优值,如果采用较大的搜索范围和较小的步长,网格搜索有很大的概率找到全局最优值。但是随着超参数的增加这种搜索方法十分消耗计算资源和时间,因此网格搜索一般会先使用较广的搜索范围和较大的步长,来寻找全局最优值可能的位置;然后再逐渐缩小搜索范围和步长,来寻找更精确的最优值。这种操作方案可以降低所需的时间和计算量,但是由于目标函数一般是非凸的,所以很可能会错过全局最优值。
随机搜索
随机搜索的思想与网格搜索比较相似,只是不再测试上界和下界之间的所有值,而是在搜索范围中随机选取样本点,如果样本点集足够大,那么通过随机采样也能大概率的找到全局最优值,或与其近似,随机搜索一般要比网格搜索要快一些,但是和网格搜索的快速版一样,它的结果也是每办法保证的。
贝叶斯优化算法
贝叶斯优化算法在寻找最优值参数时,采用了与网格搜索、随机搜索完全不同的方法。网格搜索和随机搜索在测试一个新点时,会忽略前一个点的信息,而贝叶斯优化算法则充分利用了之前的信息。贝叶斯优化算法通过对目标函数形状进行学习,找到使目标函数向全局最优值提升的参数。
贝叶斯优化算法首先根据先验分布,假设一个搜集函数;然后,每一次使用新的采样点来测试目标函数时,利用这个信息来更新目标函数的先验分布;最后,算法测试由后验分布给出的全局最值最可能出现的位置的点。
对于贝叶斯优化算法,一旦找到了一个局部最优值,他会在该区域不断采样,所以很容易陷入局部最优值,为了弥补这个缺点,贝叶斯优化算法会在探索和利用之间找到一个平衡点,“探索”指的是在还未取样的区域获取采样点,而“利用”则是根据后验分布在最可能出现全局最值的区域进行采样。