Debugging
当我们实现了一个机器学习算法后,通常需要分析并解决一些性能问题,比如我们在预测新的测试样本时产生很大的误差,我们需要怎么做呢?通常有以下几种做法:
- 获取更多数据
解决高方差问题 - 减少特征
解决高方差问题 - 增加特征
解决高偏差问题 - 增加多项式
解决高偏差问题 - 增大正则项系数
解决高方差问题 - 减小正则项系数
解决高偏差问题
交叉验证
将原始训练样本随机抽取 30% 作为测试集,剩下 70% 作为训练集。然后在训练集进行训练并得到最小误差参数 ,最后计算模型在测试集中的误差作为模型评估标准,线性回归通常采用平方误差:
在逻辑回归中可以使用对数代价函数计算误差:
或者使用 0 / 1 误差,即预测错误时误差为 1,预测正确时误差为 0:
求所有样本的平均误差:
模型选择
首先在算法中加入参数 ,代表模型的多项式阶数(degree of polynomial),然后将数据集分为训练集(60%)、验证集(Cross Validation,20%)、测试集(20%),并分别使用不同阶数的模型在训练集进行训练,得出各自的参数 ,在验证集中选择误差最小的模型作为最终选择, 最后通过测试集估测模型的泛化能力。
偏差(Bias)和方差(Variance)
通常简单(低阶)的模型参数较少,偏差较高,会造成欠拟合问题。复杂(高阶)的模型参数较多,方差较高,会造成过拟合问题。所以我们通常要分析模型是高偏差还是高方差,进而使用恰当的策略改进模型。
我们可以通过调节模型的多项式阶数,记作 ,来得到合适的模型。
可以发现,训练集误差 随着多项式阶数 的增加持续下降,验证集误差随着多项式阶数 的增加先降后升。也就是说,如果模型在训练集和验证集都产生很大的误差,则是一个高偏差的模型,如果在验证集的误差远大于训练集的误差,则是一个高方差的模型,即:
正则化和偏差、方差
通常我们使用正则化的目的是让参数值尽可能地小,而正则项系数 则是平衡参数权重和拟合程度之间的关系。通过上图可以发现,如果 取值过大,会使得参数惩罚过重,使模型产生高偏差,从而导致欠拟合。如果 取值过小,会使得参数权重过大,模型过于复杂,使模型产生高方差,泛化能力变差,从而导致过拟合。所以恰当的正则项系数对模型十分重要。我们可以选取一系列待定的正则项系数,比如 ,分别代入代价函数,在训练集进行拟合,然后在验证集中选择误差最小的模型作为最终选择,最后通过测试集估测模型的泛化能力。
可以发现,训练集的误差 随着 的增大而增大。验证集的误差 在 过大(underfitting)或过小(overfitting)都会很高。所以,如果当验证集误差 和训练集误差 都很大时,说明正则项系数 过大,参数过少,使模型产生了高偏差,从而导致了欠拟合。如果当验证集误差 远大于训练集误差 时,说明正则项系数 过小,参数过多,使模型产生了高方差,从而导致了过拟合。通过观察可以手动或自动得出使得验证集误差 最小的点,然后选取该点对应的正则项系数 即可。所以绘制学习曲线通常可以帮助我们分析算法是处于高偏差还是高方差。
样本数量和偏差、方差
可以发现,训练集的误差 会随着训练样本数量 的增加而增加,验证集的误差 会随着训练样本数量 的增加而减小,因为随着样本的增加,泛化能力逐渐增强,所以数据越多,越能拟合出合适的模型。
在高偏差的情况下,训练集误差 会随着样本 的增加而增加,验证集的误差 随着样本的增加而减少,但 增加到一定程度后 下降逐渐趋缓,最后会收敛在一个较高的水平,得到的是比较大的 和 ,所以在高偏差的情况下,增加样本并不能明显减小验证集的误差。
在高方差的情况下,训练集的误差 随着样本的增加而增加,验证集的误差 随着样本的增加而减小, 和 目前可能有很大一段差距,如果持续增加样本, 会持续下降,从而接近 ,所以增加样本对高方差的模型是有明显帮助的。
神经网络
结构简单的神经网络,参数较少,虽然计算量小,但容易欠拟合。结构复杂的神经网络,参数较多,计算量大,容易过拟合。可以使用正则项优化,也可以比较不同层数或神经元数的模型在验证集的误差,进而选择合适的层数或神经元数。
网友评论