解释机器学习中的学习曲线

时间:2015-07-31 12:56:27

标签: machine-learning

在遵循Coursera-Machine Learning课程时,我想测试我在另一个数据集上学到的内容,并绘制不同算法的学习曲线。

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

注意:我知道这可能是一个糟糕的选择,但我想从线性注册开始,稍后会看到其他模型如何更适合。

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

enter image description here

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

  • 这条曲线是否可以远程实现,或者我的代码是否一定存在缺陷?
  • 如果正确,在添加新的培训示例时,如何快速增长培训错误?交叉验证错误如何低于列车错误?
  • 如果不是,任何暗示我犯了错误的地方?

这是我的代码(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个:

Learning curve after shuffle 1

Learning curve after shuffle 2

Learning curve after shuffle 3

注意:训练集大小总是大约24k个例子,验证集大约是8k个例子。

1 个答案:

答案 0 :(得分:3)

  

这条曲线是否可以远程实现,或者我的代码是否必然存在缺陷?

这是可能的,但不太可能。您可能会一直在挑选难以预测的训练集实例和测试集的简单实例。确保随机播放数据,然后使用10 fold cross validation

即使您完成了所有这些操作,它仍然可能发生,而不一定表明方法或实施方面存在问题。

  

如果它是正确的,那么在添加新的训练样例时,训练错误如何快速增长?交叉验证错误如何低于列车错误?

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

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

你的测试设置有多大?

此外,确保您的测试集在整个绘制学习曲线时保持不变。只有火车才能增加。

  

如果不是,任何暗示我犯了错误的地方?

您的测试集可能不够大,或者您的火车和测试集可能无法正确随机化。您应该将数据混洗并使用10倍交叉验证。

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

关于更新

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

再次,我建议您对学习曲线进行10倍交叉验证。可以把它想象为将所有当前的情节平均为一个。在运行该过程之前也要对数据进行洗牌。