摘要: 如何判断偏差和方差?我们应该如何降低误差?本文将就这两个问题探讨如何使用学习曲线降低这两个主要误差.
机器学习模型两个主要的误差来源:偏差和方差.在构建模型时,设法降低这两个主要误差,模型的准确度会更高.本文将就这两个问题探讨如何使用学习曲线降低这两个主要误差,我们将使用真实的数据集,并尝试预测发电厂的电力输出.
预测发电厂的电能输出,并生成学习曲线.
偏差 - 方差权衡(trade-off)
在监督学习中,假设特征和目标间存在某种关系,并用模型预测这种未知的关系.假定这个假设成立,则称这个描述特征和目标间关系的模型为 f.
实际应用中,f 几乎是完全未知的,我们试着用模型 f(^) 预测(注意二者标记略有不同).使用某一数据集会输出一个 f(^),使用不同的数据集,或许会输出不同的 f(^).随着训练集的改变,则输出不同的 f(^).随着数据集的改变而 f(^) 发生变化的量被称为方差.
使用线性回归或随机森林等不同的方法预测真实 f.例如,线性回归假设特征和目标之间存在线性关系.然而,对于大多数实际场景来说,特征和目标之间的真实关系是复杂且非线性的.简化假设会给模型带来偏差,对真实关系的假设错误越多,偏差越高,反之亦然.
一般来说,在某些测试数据上进行测试时,模型 f(^) 会有一些误差.偏差和方差只会增加误差,若希望模型的误差最低,则偏差和方差需要降到最低.但是这不太可能,因此偏差和方差之间需要有个权衡.低偏差的方法非常适合训练数据,如果改变训练集,则会得到明显不同的模型.
如果训练集改变时,模型 f(^) 没有太大的改变,则方差很小,这说明偏差越大,方差越小.
我们从数学上解释下想要较低偏差和方差的原因:方差和偏差只会增加模型误差,我们希望偏差较低以避免建立一个过于简单的模型.在大多数情况下,一个简单的模型在训练数据上表现很差,且极有可能在测试数据上有糟糕的表现.
同样,我们希望方差较低以避免建立一个过于复杂的模型.这样的模型几乎完全适合训练集上的所有数据点.然而,训练数据通常包含噪音,而且只是一个更大样本集中的一个样本.复杂的模型能捕捉到噪音,对样本外数据进行测试时,性能通常较差.这是因为模型很好的学习了样本训练数据,它对样本内的数据很了解,但是对其他数据一无所知.然而,在实际应用中不能同时拥有较低的偏差和方差,因此要在二者之间做一个权衡.
学习曲线
将现有数据一分为二:训练集和验证集.从训练集取出 1 个实例预测模型.再测量模型在验证集和单个训练实例上的误差.单个训练实例上误差为 0,因为完全适合单个数据点很容易,但验证集上的误差将会很大,因为该模型是为单个实例构建的,无法精确的推导出其他数据.再分别取 50,100,500…… 直到使用整个训练集,训练集改变时,误差值随之改变.
有两个误差值可供测量:验证集和训练集.根据训练集大小的变化绘制两个误差,得到两条曲线,这两条曲线被称为学习曲线.学习曲线展示了随着训练集数据量的增加,模型误差的变化.
N=1 时(N 为训练实例的数量),该模型完全适合单个训练数据点,误差为 0,但并不适合于 20 个不同数据点的验证集,误差要高的多.随着 N 增大,模型不再适合训练集,训练误差变大.然而模型是在更多数据上训练的,因此可以更好的适应验证集,验证误差减少.学习曲线如下.
数据说明
上述学习曲线是理想化的表现,下面在实践中使用真实数据进行探讨:建立预测电厂每小时电能输出的回归模型.使用 pandas 库中的 read_excel() 函数读取存储数据的. xlsx 文件.
每列含义如下:
PE 是目标变量,描述每小时电量净值的输出,所有其它变量都是潜在特征值,也是小时平均值,而不是像 PE 那样的净值.
确定数据集的大小
训练集的最小值是 1,最大值是训练集中实例总个数.我们的数量集有 9568 个实例,因此最大值为 9568.使用 80:20(训练集:验证集)的比例确定训练集有 7654 个实例,验证集有 1914 个实例,则产生学习曲线的最大值为 7654.
在这里,我们使用如下 6 个范围值,针对每个指定数值分别训练新的模型.
使用 scikit-learn 中的 learn_curve() 函数生成回归模型的学习曲线
来源: http://www.jianshu.com/p/dece2bb0a284