【发布时间】: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