【问题标题】:Interpretation of a learning curve in machine learning机器学习中学习曲线的解释
【发布时间】:2015-10-23 04:01:34
【问题描述】:

在学习 Coursera-机器学习课程时,我想测试我在另一个数据集上学到的知识,并绘制不同算法的学习曲线。

我(相当随机地)选择了Online News Popularity Data Set,并尝试对其应用线性回归。

注意:我知道这可能是一个糟糕的选择,但我想先从线性 reg 开始,然后看看其他模型如何更好地适应。

我训练了一个线性回归并绘制了以下学习曲线:

这个结果对我来说特别令人惊讶,所以我对此有疑问:

  • 这条曲线是不是很可能,还是我的代码一定有缺陷?
  • 如果是正确的,在添加新的训练样例时,训练误差怎么会增长得如此之快?交叉验证误差如何低于训练误差?
  • 如果不是,有没有提示我哪里出错了?

这是我的代码(Octave / Matlab)以防万一:

剧情:

lambda = 0;
startPoint = 5000;
stepSize = 500;
[error_train, error_val] = ...
    learningCurve([ones(mTrain, 1) X_train], y_train, ...
                  [ones(size(X_val, 1), 1) X_val], y_val, ...
                  lambda, startPoint, stepSize);
plot(error_train(:,1),error_train(:,2),error_val(:,1),error_val(:,2))
title('Learning curve for linear regression')
legend('Train', 'Cross Validation')
xlabel('Number of training examples')
ylabel('Error')

学习曲线:

S = ['Reg with '];
for i = startPoint:stepSize:m
    temp_X = X(1:i,:);
    temp_y = y(1:i);
    % Initialize Theta
    initial_theta = zeros(size(X, 2), 1); 
    % Create "short hand" for the cost function to be minimized
    costFunction = @(t) linearRegCostFunction(X, y, t, lambda);
    % Now, costFunction is a function that takes in only one argument
    options = optimset('MaxIter', 50, 'GradObj', 'on');
    % Minimize using fmincg
    theta = fmincg(costFunction, initial_theta, options);
    [J, grad] = linearRegCostFunction(temp_X, temp_y, theta, 0);
    error_train = [error_train; [i J]];
    [J, grad] = linearRegCostFunction(Xval, yval, theta, 0);
    error_val = [error_val; [i J]];
    fprintf('%s %6i examples \r', S, i);
    fflush(stdout);
end

编辑:如果我在拆分训练/验证和学习曲线之前对整个数据集进行洗牌,我会得到非常不同的结果,如下 3 个:

注意:训练集大小始终在 24k 左右,验证集在 8k 左右。

【问题讨论】:

  • 这是非常有缺陷的。您的错误应该减少,而不是增加
  • 感谢@lejlot 的反馈。知道可能出了什么问题吗?我的成本函数linearRegCostFunction 通过了 Coursera 验证,所以可能不是原因...
  • 首先什么是lambda?其次,你应该计算整个 X 的训练误差(你使用整体进行训练,所以这就是你的训练误差)

标签: machine-learning


【解决方案1】:

这条曲线是不是很可能,还是我的代码一定有缺陷?

有可能,但可能性不大。您可能一直在为训练集选择难以预测的实例,而为测试集选择容易预测的实例。确保你打乱你的数据,并使用10 fold cross validation。

即使你做了所有这些,它仍然有可能发生,不一定表明方法或实施存在问题。

如果是正确的,那么在添加新的训练样例时,训练误差怎么会增长得如此之快?交叉验证误差如何低于训练误差?

假设您的数据只能通过 3 次多项式正确拟合,并且您使用的是线性回归。这意味着您添加的数据越多,您的模型就越明显不足(更高的训练误差)。现在,如果您为测试集选择少数实例,则误差会更小,因为对于这个特定问题,对于太少的测试实例,线性与 3 度可能不会显示出太大的差异。

例如,如果您对 2D 点进行一些回归,并且始终为测试集选择 2 个点,则线性回归的误差始终为 0。一个极端的例子,但你明白了。

你的测试集有多大?

此外,请确保您的测试集在整个学习曲线的绘制过程中保持不变。只有火车组应该增加。

如果不是,有没有提示我哪里出错了?

您的测试集可能不够大,或者您的训练集和测试集可能没有正确随机化。您应该打乱数据并使用 10 折交叉验证。

您可能还想尝试查找有关该数据集的其他研究。其他人得到了什么结果?

关于更新

我认为这更有意义。现在测试误差普遍较高。但是,这些错误对我来说看起来很大。这给你的最重要的信息可能是线性回归在拟合这些数据方面非常糟糕。

再一次,我建议您对学习曲线进行 10 折交叉验证。可以将其视为将所有当前绘图平均为一个。在运行进程之前还要对数据进行洗牌。

【讨论】:

  • 感谢@IVlad 的详细回答。我已经编辑了我的问题以在改组数据集后显示不同的学习曲线。此外,大小:24k 用于训练,8k 用于验证。还有其他提示吗?
  • @rom_j 好吧,这更有意义,不是吗?现在测试误差普遍较高。但是,这些错误对我来说看起来很大。这给你的最重要的信息可能是线性回归在拟合这些数据方面非常糟糕。
  • 太好了,谢谢。我将尝试拟合另一个模型并查看误差的差异。您能否在原始答案中添加您的最后一条评论,以便我接受?
  • @rom_j 完成。我添加了大约 10 折交叉验证。
猜你喜欢
  • 2011-06-04
  • 2023-03-12
  • 2019-05-04
  • 2019-06-17
  • 2011-01-21
  • 1970-01-01
  • 2015-11-05
  • 2016-01-19
  • 1970-01-01
相关资源
最近更新 更多