Обучение модели с помощью цикла train_test_split и обучение без цикла - PullRequest
1 голос
/ 03 февраля 2020

Я новичок в python, и Керас, пожалуйста, ответьте на мой вопрос.

  1. Я недавно создал модель в Керасе, обучил ее и получил пост "Среднеквадратическая ошибка MSE" прогнозирование. Я использовал функцию train_test_split для используемого набора данных.

  2. Затем я создал время l oop с 50 итерациями и применил его к вышеупомянутой модели. Однако я сохранил функцию train_test_split (* random_number не указан) внутри l oop, чтобы на каждой итерации у меня был новый набор значений X_train, y_train, X_test и y_test. Я получил 50 значений MSE в качестве выходных данных и рассчитал их «среднее» и «стандартное» отклонение. Мой запрос был: правильно ли я поступил, поместив функцию train_test_split в l oop? Влияет ли это на мою цель, состоящую в том, чтобы увидеть различные значения MSE, сгенерированные для моего набора данных?

  3. Если бы я поместил функцию train_test_split вне моего while l oop и выполнил вышеуказанное активность, не будут ли значения X_train, y_train, X_test и y_test оставаться неизменными на протяжении всех моих 50 итераций? Не приведет ли это к переоснащению моей модели?

Буду очень признателен за ваш отзыв.

Мой фрагмент кода:

from sklearn.model_selection import train_test_split
from sklearn import metrics
import numpy as np

MSE=np.zeros(50)

for i in range(50):
    predictors_train,predictors_test,target_train,target_test=train_test_split(predictors,target,test_size=0.3)
    model=regression_model()
    model.fit(predictors_train,target_train,validation_data=(predictors_test,target_test),epochs=50,verbose=0)
    model.evaluate(predictors_test,target_test, verbose=0)
    target_predicted=model.predict(predictors_test)
    MSE[i]=metrics.mean_squared_error(target_test, target_predicted)
    print("Test set MSE for {} cycle:{}".format(i+1,MSE[i]))

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Метод, который вы реализуете, называется перекрестной проверкой, он позволяет вашей модели лучше «просматривать» ваши данные и снижает вероятность того, что ваши тренировочные данные были «слишком совершенными» или «слишком шумными».

Таким образом, добавив train_test_set в l oop, вы получите новые тренировочные партии из ваших исходных данных, и, имея в виду результаты, вы получите то, что вам нужно. Если вы поместите train_test_set снаружи, пакет данных тренировки останется неизменным для всех ваших тренировок l oop, что приведет к переобучению, как вы сказали.

Однако train_test_split является случайным, поэтому вы можете иметь два случайная партия, которая весьма вероятна, поэтому этот метод не является оптимальным.

Лучше всего использовать перекрестную проверку k-кратных значений:

from sklearn.model_selection import StratifiedKFold

kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)

MSE = []

for train, test in kfold.split(X, Y):

   model = regression_model()
   model.fit(X[train],y[train],validation_data= (X[test],y[test]),epochs=50,verbose=0)
   model.evaluate(X[test],y[test], verbose=0)
   target_predicted = model.predict(predictors_test)
   MSE.append(metrics.mean_squared_error(y[test], target_predicted))
   print("Test set MSE for {} cycle:{}".format(i+1,MSE[i]))

print("Mean MSE for {}-fold cross validation : {}".format(len(MSE), np.mean(MSE)) 

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

Вы можете получить больше информации здесь: https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html

Надеюсь, это поможет вам!

РЕДАКТИРОВАТЬ ДЛЯ ТОЧНОСТИ

В самом деле, не используйте этот метод для ваших данных TEST, но только для ваших данных VALIDATION !! Ваша модель никогда не должна видеть ваши данные TEST раньше!

0 голосов
/ 03 февраля 2020

Вы вообще не хотите использовать тестовый набор во время тренировки. Вы будете настраивать модель до такой степени, что она начнет «переоснащаться» даже на тестовом наборе, и ваши оценки ошибок будут слишком оптимистичными c.

Да, если вы поместите train_test_split вне этого для l oop, ваши сеты останутся неизменными на протяжении всей тренировки, и это может привести к переобучению. Вот почему у вас есть набор валидации, который используется не для обучения, а для валидации, в основном, чтобы выяснить, соответствует ли ваша модель комплекту поезда или нет. Если это переобучение, вы должны решить эту проблему путем настройки вашей модели (сделать ее менее сложной, реализовать регуляризацию, досрочную остановку ...).

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

Итак, общие шаги, которые необходимо выполнить:

  1. split ваш набор данных в набор тестов и «другой» набор, отложите набор тестов и не показывайте его своей модели, пока не будете готовы к финальному тестированию => только тогда, когда вы уже обучили и настроили свою модель

  2. выберите, хотите ли вы осуществить перекрестную проверку в k-кратном порядке или нет. Если нет, то разбейте свои данные на набор для обучения и проверки и используйте их на протяжении всего обучения => набор для обучения и набор для проверки

  3. , если вы хотите реализовать k-fold Затем выполните перекрестную проверку, выполнив шаг 2, измерьте метрику ошибки c, которую вы хотите отследить, снова выберите другой набор, разбейте его на другой набор обучения и набор проверки и снова выполните все обучение. Повторите это несколько раз и возьмите среднее значение метрик ошибок, измеренных в течение этих циклов, чтобы получить лучшую (среднюю) оценку ошибок

  4. настроить вашу модель и повторять шаги 2 и 3, пока вы не будете счастливы с результатами

  5. измерить погрешность вашей окончательной модели на тестовом наборе, чтобы увидеть, хорошо ли она обобщает

Обратите внимание, что при реализации k- В целом, перекрестная проверка правильности является хорошей идеей, такой подход может оказаться невозможным для больших нейронных сетей, поскольку он может значительно увеличить время, необходимое для их обучения. Если это так, вы можете придерживаться только одного обучающего набора и одного проверочного набора или установить k (в k-кратных сгибах) на некоторое меньшее число, например 3.

...