在遵循Coursera-Machine Learning课程时,我想测试我在另一个数据集上学到的内容,并绘制不同算法的学习曲线。
我(非常随机)选择Online News Popularity Data Set,并尝试对其应用线性回归。
注意:我知道这可能是一个糟糕的选择,但我想从线性注册开始,稍后会看到其他模型如何更适合。
我训练了线性回归并绘制了以下学习曲线:
这个结果对我来说特别令人惊讶,所以我对它有疑问:
这是我的代码(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个例子。
答案 0 :(得分:3)
这条曲线是否可以远程实现,或者我的代码是否必然存在缺陷?
这是可能的,但不太可能。您可能会一直在挑选难以预测的训练集实例和测试集的简单实例。确保随机播放数据,然后使用10 fold cross validation。
即使您完成了所有这些操作,它仍然可能发生,而不一定表明方法或实施方面存在问题。
如果它是正确的,那么在添加新的训练样例时,训练错误如何快速增长?交叉验证错误如何低于列车错误?
假设您的数据只能通过三次多项式正确拟合,并且您正在使用线性回归。这意味着您添加的数据越多,您的模型越不明显(更高的训练错误)。现在,如果您为测试集选择的实例很少,则误差会更小,因为对于此特定问题,对于太少的测试实例,线性与第3度可能不会显示出很大的差异。
例如,如果您对2D点进行一些回归,并且您总是为测试集选择2个点,则线性回归将始终为0。一个极端的例子,但你明白了。
你的测试设置有多大?
此外,确保您的测试集在整个绘制学习曲线时保持不变。只有火车才能增加。
如果不是,任何暗示我犯了错误的地方?
您的测试集可能不够大,或者您的火车和测试集可能无法正确随机化。您应该将数据混洗并使用10倍交叉验证。
您可能还想尝试查找有关该数据集的其他研究。其他人得到的结果是什么?
关于更新
我认为这更有意义。现在测试错误通常较高。但是,这些错误对我来说很重要。可能最重要的信息是,线性回归在拟合这些数据方面非常糟糕。
再次,我建议您对学习曲线进行10倍交叉验证。可以把它想象为将所有当前的情节平均为一个。在运行该过程之前也要对数据进行洗牌。