对模型方差和偏差的解释之二:泛化误差
2014-08-08 22:08
169 查看
原文:http://blog.csdn.net/vivihe0/article/details/33319969
我们说过,如何在实际应用中建模,我们不可能知道产生数据的真实函数是什么,那么如何评价模型的好坏呢?由于我们拟合曲线的目标是对新的x值做出好的预测。为了检验我们建立的模型的好坏,我们需要一个测试集,这个集合与我们训练模型的训练集相互独立。也就是说,测试集中的样本数据必须是在训练模型的时候,模型没有见过的样本数据。已经训练好的模型在遇见新的样本时的表现被称作泛化性能。
现在我们还是利用函数y=sin(2*pi*x)来产生数据。我们分别产生两个数据集,训练集和测试集。训练集的产生过程与上面的例子一样,包含11个样本点;测试集是在0到1的范围内随机产生100个输入样本x值,然后用与训练集一样叠加噪声项,产生目标输出值t。我们用1阶到10阶的多项式分别拟合11个训练集样本,再用拟合的模型在测试集上测试。这样我们可以得到模型在训练集和测试集上的误差大小。
我们用均方误差(mean square error)来定义误差的大小,它是残差平方和除以样本数。这样模型在不同样本数的样本集上的误差就有了可比性。相应的MATLAB代码如下,结果见图。
[plain]
view plaincopy
%产生训练集11个样本
xTrain = 0:0.1:1;
tTrain = sin(2*pi*xTrain) + normrnd(0, 0.3, 1, 11);
% 产生测试集100个样本
xTest = unifrnd(0, 1, 1, 100);
tTest = sin(2*pi*xTest) + normrnd(0, 0.3, 1, 100);
%用训练集拟合10个不同阶数的多项式,其系数保存系数在pCell中
polyCell = cell(10, 1);
for i = 1 : 10
polyCell{i} = polyfit(xTrain, tTrain, i);
end
%计算模型在训练集和测试集上的误差
rmsTrain = zeros(1, 10);
rmsTest = zeros(1, 10);
for i = 1 : 10
e = polyval(polyCell{i}, xTrain) - tTrain;
rmsTrain(i) = e*e'/11;
e = polyval(polyCell{i}, xTest) - tTest;
rmsTest(i) = e*e'/100;
end
%绘图
plot([1:10], rmsTrain, '-ob', 'LineWidth', 3, 'MarkerSize', 10)
hold on
plot([1:10], rmsTest, '-or', 'LineWidth', 3, 'MarkerSize', 10)
legend({'训练集', '测试集'}, 'fontsize', 15);
xlabel('模型阶数', 'fontsize', 15)
ylabel('均方误差', 'fontsize', 15)
从图中可以看出,随着阶数的增加,模型在训练集上的均方误差是逐渐下降的,但是在测试集上的误差在3阶达到最小值之后就逐渐上升。在阶数达到9阶时,模型在训练集上的均方误差达到了0,也就是拟合的曲线完美地穿过了训练样本点,但是模型在测试集上的表现却很差。也就是说,当模型过分地复杂时,模型在训练集上完美的拟合不能保证其具有好的泛化性能。
我们也可以观察不同阶数的多项式模型的系数。在上面一段代码中,模型的系数被保存在元胞数组pCell中,所以可以在MATLAB命令行中用以下命令查看第i个多项式的系数。
polyCell{i}
例如输入:
polyCell{10}
你可以看出当多项式的阶数为10时,模型的系数很大。通过这些很大的系数,模型的曲线完美地穿过了10个样本点,但是在这些样本点周围的位置,曲线的波动性很大,如图1第4个子图所示。也就是说,多项式模型的阶数越大,模型越灵活,拟合的曲线越容易适应随机的噪声。
我们说过,如何在实际应用中建模,我们不可能知道产生数据的真实函数是什么,那么如何评价模型的好坏呢?由于我们拟合曲线的目标是对新的x值做出好的预测。为了检验我们建立的模型的好坏,我们需要一个测试集,这个集合与我们训练模型的训练集相互独立。也就是说,测试集中的样本数据必须是在训练模型的时候,模型没有见过的样本数据。已经训练好的模型在遇见新的样本时的表现被称作泛化性能。
现在我们还是利用函数y=sin(2*pi*x)来产生数据。我们分别产生两个数据集,训练集和测试集。训练集的产生过程与上面的例子一样,包含11个样本点;测试集是在0到1的范围内随机产生100个输入样本x值,然后用与训练集一样叠加噪声项,产生目标输出值t。我们用1阶到10阶的多项式分别拟合11个训练集样本,再用拟合的模型在测试集上测试。这样我们可以得到模型在训练集和测试集上的误差大小。
我们用均方误差(mean square error)来定义误差的大小,它是残差平方和除以样本数。这样模型在不同样本数的样本集上的误差就有了可比性。相应的MATLAB代码如下,结果见图。
[plain]
view plaincopy
%产生训练集11个样本
xTrain = 0:0.1:1;
tTrain = sin(2*pi*xTrain) + normrnd(0, 0.3, 1, 11);
% 产生测试集100个样本
xTest = unifrnd(0, 1, 1, 100);
tTest = sin(2*pi*xTest) + normrnd(0, 0.3, 1, 100);
%用训练集拟合10个不同阶数的多项式,其系数保存系数在pCell中
polyCell = cell(10, 1);
for i = 1 : 10
polyCell{i} = polyfit(xTrain, tTrain, i);
end
%计算模型在训练集和测试集上的误差
rmsTrain = zeros(1, 10);
rmsTest = zeros(1, 10);
for i = 1 : 10
e = polyval(polyCell{i}, xTrain) - tTrain;
rmsTrain(i) = e*e'/11;
e = polyval(polyCell{i}, xTest) - tTest;
rmsTest(i) = e*e'/100;
end
%绘图
plot([1:10], rmsTrain, '-ob', 'LineWidth', 3, 'MarkerSize', 10)
hold on
plot([1:10], rmsTest, '-or', 'LineWidth', 3, 'MarkerSize', 10)
legend({'训练集', '测试集'}, 'fontsize', 15);
xlabel('模型阶数', 'fontsize', 15)
ylabel('均方误差', 'fontsize', 15)
从图中可以看出,随着阶数的增加,模型在训练集上的均方误差是逐渐下降的,但是在测试集上的误差在3阶达到最小值之后就逐渐上升。在阶数达到9阶时,模型在训练集上的均方误差达到了0,也就是拟合的曲线完美地穿过了训练样本点,但是模型在测试集上的表现却很差。也就是说,当模型过分地复杂时,模型在训练集上完美的拟合不能保证其具有好的泛化性能。
我们也可以观察不同阶数的多项式模型的系数。在上面一段代码中,模型的系数被保存在元胞数组pCell中,所以可以在MATLAB命令行中用以下命令查看第i个多项式的系数。
polyCell{i}
例如输入:
polyCell{10}
你可以看出当多项式的阶数为10时,模型的系数很大。通过这些很大的系数,模型的曲线完美地穿过了10个样本点,但是在这些样本点周围的位置,曲线的波动性很大,如图1第4个子图所示。也就是说,多项式模型的阶数越大,模型越灵活,拟合的曲线越容易适应随机的噪声。
相关文章推荐
- 对模型方差和偏差的解释之二:泛化误差
- 误差模型:过拟合,交叉验证,偏差-方差权衡
- 经验误差与泛化误差、偏差与方差、欠拟合与过拟合、交叉验证
- 模型评估与选择 ( Bias(偏差),Error(误差),和Variance(方差) )
- 【机器学习-西瓜书】二、偏差-方差分解;泛化误差
- 误差模型:过拟合,交叉验证,偏差-方差权衡
- 对模型方差和偏差的解释之一:过拟合
- 方差、偏差、噪声、泛化误差之间的关系
- 对模型方差和偏差的解释之一:过拟合
- bagging与boosting两种集成模型的偏差bias以及方差variance 的理解
- 偏差,方差,训练误差,测试误差的区别
- 总结:Bias(偏差),Error(误差),Variance(方差)及CV(交叉验证)
- 机器学习中的Bias(偏差),Error(误差),和Variance(方差)有什么区别和联系?
- 机器学习中的Bias(偏差),Error(误差),和Variance(方差)有什么区别和联系?
- 统计学总结之Bias(偏差),Error(误差),和Variance(方差)的区别
- 方差-偏差平衡(Bias-Variance Balance)与模型选择
- 人工智能里的数学修炼 | 是什么决定了你的学习算法泛化性能?偏差—方差分解(bias-variance decomposition)
- 《机器学习》第二章 模型评估与选择 笔记2 泛化误差的评估方法
- 斯坦福机器学习第六周(模型选择、高偏差、高方差、学习曲线)
- 机器学习中的偏差,方差,训练误差,测试误差相关