过拟合与欠拟合及其解决方法
我们在进行模型训练的时候会出现模型不能够很好地拟合数据的情况,这个时候就需要我们来判断究竟现在的模型是欠拟合还是过拟合。
1. 欠拟合
首先欠拟合就是模型没有很好地捕捉到数据特征,不能够很好地拟合数据
- training error
- cross validation error
- test error
解决方法:
1)添加其他特征项,有时候我们模型出现欠拟合的时候是因为特征项不够导致的,可以添加其他特征项来很好地解决。例如,“组合”、“泛化”、“相关性”三类特征是特征添加的重要手段,无论在什么场景,都可以照葫芦画瓢,总会得到意想不到的效果。除上面的特征之外,“上下文特征”、“平台特征”等等,都可以作为特征添加的首选项。
2)添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强。例如上面的图片的例子。
3)减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数。
2. 过拟合
通俗一点地来说过拟合就是模型把数据学习的太彻底,以至于把噪声数据的特征也学习到了,这样就会导致在后期测试的时候不能够很好地识别数据,即不能正确的分类,模型泛化能力太差。
解决方法:
1)重新清洗数据,导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据。
2)增大数据的训练量,还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小。
3)采用正则化方法。正则化方法包括L0正则、L1正则和L2正则,而正则一般是在目标函数之后加上对于的范数。但是在机器学习中一般使用L2正则,下面看具体的原因。
L0范数是指向量中非0的元素的个数。L1范数是指向量中各个元素绝对值之和,也叫“稀疏规则算子”(Lasso regularization)。两者都可以实现稀疏性,既然L0可以实现稀疏,为什么不用L0,而要用L1呢?个人理解一是因为L0范数很难优化求解(NP难问题),二是L1范数是L0范数的最优凸近似,而且它比L0范数要容易优化求解。所以大家才把目光和万千宠爱转于L1范数。
L2范数是指向量各元素的平方和然后求平方根。可以使得W的每个元素都很小,都接近于0,但与L1范数不同,它不会让它等于0,而是接近于0。L2正则项起到使得参数w变小加剧的效果,但是为什么可以防止过拟合呢?一个通俗的理解便是:更小的参数值w意味着模型的复杂度更低,对训练数据的拟合刚刚好(奥卡姆剃刀),不会过分拟合训练数据,从而使得不会过拟合,以提高模型的泛化能力。还有就是看到有人说L2范数有助于处理 condition number不好的情况下矩阵求逆很困难的问题(具体这儿我也不是太理解)。
4)采用dropout方法。这个方法在神经网络里面很常用。dropout方法是ImageNet中提出的一种方法,通俗一点讲就是dropout方法在训练的时候让神经元以一定的概率不工作
评估学习器的方法
(1)留出法:
定义:直接将集合划分为两个互斥的集合,其中一个作为训练集合,一个作为测试集合
注意:
(a)测试集合和训练集合尽可能保持数据分布的一致性,比如要保证正反样本的比例不变(这是一种导致过拟合的原因)
(b)在给定了训练/测试集合的样本比例之后,仍要存在多种的划分方式,对数据集合D进行分割。毕竟单次的使用留出法的结果往往是不可靠的。一般要采用若干次的随即划分,重复进行实验评估后取得平均值作为留出法的最终评估结果
(c)训练/测试集合的大小比例问题。测试集合过小,会导致测评结果的方差变大;训练集合过小,会导致偏差过大,一般使用的都是2/3~4/5的样本用于训练
(2)交叉验证法(无放回的重采样)
交叉验证方法还有一个特例:留一法(Leave-one-out,LOO)。显然留一法不受随即样本划分的影响,因为m个样本只有唯一的方式划分为m个子集,每个子集包含一个样本。由于使用的训练数据集合和初始数据集合相比只是少了一个数据,那么相应训练出来的模型就会很相似,实践认为,留一法的评估结果往往是比较准确的。但是留一法存在性能上的缺陷。比如,m个样本就要训练m个模型,当m比较大的时候,那么就比较麻烦了
优点:
1. 在处理较小的数据集合的时候我们一般会使用较大的k值来增加,根据NX(1-1/k)较大的k使得在每次的迭代中会有更小的数据bias,但是同时会导致validation的时间变长,而且也会导致high Variance。也可以看出,LOO更适合小数据集上的训练
2. 那么数据较大的时候我们一般会使用较小的k值
(3)自助法Bootstrapping(有放回的重采样)
有放回的随机采样方法。我们可以做一个简单的估计,样本在m次采样的过程中始终不被采到的概率是(1-1/m)^m,对m取极限,得到1/e=0.368。也就是说,通过自助法,初始数据集合中大概有36.38%的样本未出现在采样数据集合D’中,于是我们可以将D‘作为训练集合,剩下的数据作为测试集合,那么我们对这中大概有1/3的样本没在测试集合中出现的测试称作包外估计(out-of-bag estimate)
优点:
1. 数据集合较小,难以有效划分训练/测试集时很有用
2. 能从训练集合中产生很多不同的训练集,这对集成学习等方法很有好处
缺点:
改变了初始数据的分布,会引入偏差。因此如果初始的数据量足够的时候还是希望使用留出法和交叉验证法比较好
如何度量模型性能
一、ROC曲线和P-R曲线
1.precision、TPR(召回率)、FPR
首先在评估预测时会想到模型的正确率,也就是precision,但是在样本数不均衡的情况下此值没有意义
在二分类中通常用到 TPR 和 FPR
召回率 (Recall) = TPR = 查全率 :正样本有多少被找出来了(召回了多少) - 或者预测的正样本的正确率
精确率 (Precision) = 查准率 :预测认为的正样本,有多少猜对了(猜的准确性如何)
FPR: 预测的负样本的错误率
如图:
,图中圆圈内部是模型的预测的正样例值 ,圈外是模型预测的负样例(同时还能看到实际的正例和负例)取图形单词的首字母:
precision = TP / ( TP + FP )
recall = TPR = TP / (TP + FN )
FPR = FP / ( FP + TN )
2.ROC曲线和AUC指标
根据模型的预测结果对记录进?排序,按此顺序逐个对记录作为正样本进?预测,计算得到 FPR 和 TPR 。 以FPR为横轴,以TPR为纵轴,得到ROC曲线,同时曲线与坐标轴围成的面积是AUC指标
模型ROC曲线有交叉时, AUC?的模型性能优于AUC?的模型
3.P - R 曲线
P = precision(查准率)
R = Recall = TPR (查全率)
所以:P - R 曲线 是以 R 为横坐标,以P为纵坐标得到的坐标系曲线,如图:
1 .平衡点?的模型性能优于平衡点?的模型
2 . 在医院的初筛指标中,我们更看重的是准确率和召回率。即需要召回率来看,诊断能否覆盖更多的病例,同时需要准确率来看,预测的准确性
方差——偏差分解
偏差-方差分解(Bias-Variance Decomposition)是统计学派看待模型复杂度的观点。Bias-variance分解是机器学习中一种重要的分析技术。给定学习目标和训练集规模,它可以把一种学习算法的期望误差分解为三个非负项的和,即样本真实噪音noise、bias和 variance。
noise 样本真实噪音是任何学习算法在该学习目标上的期望误差的下界;( 任何方法都克服不了的误差)
bias 度量了某种学习算法的平均估计结果所能逼近学习目标的程度;(独立于训练样本的误差,刻画了匹配的准确性和质量:一个高的偏差意味着一个坏的匹配)
variance 则度量了在面对同样规模的不同训练集时,学习算法的估计结果发生变动的程度。(相关于观测样本的误差,刻画了一个学习算法的精确性和特定性:一个高的方差意味着一个不稳定的匹配)。
偏差度量了学习算法期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力;方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响;噪声表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度……泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。给定学习任务,为了取得好的泛化性能,则需使偏差较小,即能够充分拟合数据,并且使方差较小,即使得数据扰动产生的影响小。
比较检验
首先,我们希望比较的是泛化性能,然而通过实验评估方法我们获得的是测试集上的性能,两者的对比结果可能未必相同;第二,测试集上的性能与测试集本身的选择有很大关系,且不论使用不同大小的测试集会得到不同的结果,即使用相同大小的测试集?若包含的测试样例不同,测试结果也会有不同;第二,很多机器学习算法本身有一定的随机性,即便用相同的参数设置在同一个测试集上多次运行,其结果也会有不同。
原文地址:https://www.cnblogs.com/zhgmen/p/11135302.html