Следуя курсу обучения Coursera-Machine Learning, я хотел проверить, что я узнал на другом наборе данных, и рассчитать кривую обучения для разных алгоритмов.Интерпретация кривой обучения в машинном обучении
Я (довольно случайно) выбрал 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
Edit: если Я перетасовываю е весь набор данных перед разбиением поезд/проверки и делает кривую обучения, у меня есть очень разные результаты, как и 3 следующим образом:
Примечание: обучение размер набора всегда составляет около 24 тыс. примеров, а валидация - около 8 тыс. примеров.
Это крайне неверно. Ваша ошибка должна уменьшаться, а не увеличиваться. – lejlot
Спасибо @lejlot за отзыв. Любая идея, что могло пойти не так? Моя функция стоимости 'linearRegCostFunction' прошла проверку Coursera, поэтому, вероятно, это не причина ... –
Во-первых, что такое лямбда? Во-вторых, вы должны вычислить ошибку поезда на весь X (вы используете целую для обучения, так что это ошибка вашего маршрута) – lejlot