2015-07-31 3 views
2

Следуя курсу обучения Coursera-Machine Learning, я хотел проверить, что я узнал на другом наборе данных, и рассчитать кривую обучения для разных алгоритмов.Интерпретация кривой обучения в машинном обучении

Я (довольно случайно) выбрал Online News Popularity Data Set и попытался применить к нему линейную регрессию.

Примечание: Я знаю, что это, вероятно, плохой выбор, но я хотел начать с линейного reg, чтобы позже увидеть, как другие модели будут лучше соответствовать.

я тренировалась линейной регрессии и график следующей кривой обучения:

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 

Edit: если Я перетасовываю е весь набор данных перед разбиением поезд/проверки и делает кривую обучения, у меня есть очень разные результаты, как и 3 следующим образом:

Learning curve after shuffle 1

Learning curve after shuffle 2

Learning curve after shuffle 3

Примечание: обучение размер набора всегда составляет около 24 тыс. примеров, а валидация - около 8 тыс. примеров.

+0

Это крайне неверно. Ваша ошибка должна уменьшаться, а не увеличиваться. – lejlot

+0

Спасибо @lejlot за отзыв. Любая идея, что могло пойти не так? Моя функция стоимости 'linearRegCostFunction' прошла проверку Coursera, поэтому, вероятно, это не причина ... –

+0

Во-первых, что такое лямбда? Во-вторых, вы должны вычислить ошибку поезда на весь X (вы используете целую для обучения, так что это ошибка вашего маршрута) – lejlot

ответ

3

Является ли эта кривая хотя бы дистанционно возможной или мой код обязательно испорчен?

Возможно, но не очень вероятно. Возможно, вы собираете трудно предсказать экземпляры для учебного набора и простые для тестового набора все время. Убедитесь, что вы перетасовываете свои данные и используете 10 fold cross validation.

Даже если вы сделаете все это, все еще возможно, что это произойдет, не обязательно указывая на проблему в методологии или реализации.

Если это правильно, как может образовательная ошибка настолько быстро расти при добавлении новых учебных примеров? Как ошибка перекрестной проверки будет ниже ошибки поезда?

Предположим, что ваши данные могут быть правильно установлены полиномом третьей степени, и вы используете линейную регрессию. Это означает, что чем больше данных вы добавите, тем более очевидно, что ваша модель неадекватна (более высокая ошибка обучения). Теперь, если вы выберете несколько экземпляров для тестового набора, ошибка будет меньше, потому что линейная и третья степени могут не показать большой разницы для слишком немногих экземпляров тестов для этой конкретной проблемы.

Например, если вы выполняете некоторую регрессию в 2D-точках и всегда выбираете 2 балла для своего тестового набора, у вас всегда будет 0 ошибок для линейной регрессии. Крайний пример, но вы получаете идею.

Насколько велик ваш тестовый набор?

Кроме того, убедитесь, что ваш тестовый набор остается постоянным во всем графике кривых обучения. Только набор поездов должен увеличиться.

Если это не так, то подскажите, где я совершил ошибку?

Ваш тестовый комплект может быть недостаточно большим, или ваши поезда и испытательные наборы могут быть неправильно рандомизированы. Вы должны перетасовать данные и использовать 10-кратное перекрестное подтверждение.

Возможно, вы захотите также найти другие исследования, касающиеся этого набора данных. Какие результаты получают другие люди?

Что касается обновления

Это делает немного больше смысла, я думаю. Ошибка теста, как правило, выше. Однако эти ошибки выглядят огромными для меня. Вероятно, самая важная информация, которую это дает вам, заключается в том, что линейная регрессия очень плоха при установке этих данных.

Еще раз предлагаю вам сделать 10-кратное перекрестное подтверждение для изучения кривых. Подумайте об этом как об усреднении всех ваших текущих сюжетов в один. Также перемешайте данные перед запуском процесса.

+0

Спасибо @IVlad за подробный ответ. Я изменил свой вопрос, чтобы показать различные кривые обучения после перетасовки набора данных. Кроме того, размер: 24k для обучения, 8k для проверки. Любые другие намеки? –

+1

@rom_j хорошо, это немного лучше, не так ли? Ошибка теста, как правило, выше. Однако эти ошибки выглядят огромными для меня. Вероятно, самая важная информация, которую это дает вам, заключается в том, что линейная регрессия очень плоха при установке этих данных. – IVlad

+0

Отлично, спасибо. Я попытаюсь установить другую модель и увидеть разницу в ошибке. Можете ли вы добавить свой последний комментарий в свой первоначальный ответ, чтобы я мог его принять? –

Смежные вопросы