Разделение данных на обучение, тестирование и оценку при создании модели Keras

#python #tensorflow #machine-learning #keras #deep-learning

Вопрос:

Я немного смущен разделением набора данных, когда создаю и оцениваю модели машинного обучения Keras. Допустим, у меня есть набор данных из 1000 строк.

 features = df.iloc[:,:-1]
results = df.iloc[:,-1]
 

Теперь я хочу разделить эти данные на обучение и тестирование (33% данных для тестирования, 67% для обучения).:

 x_train, X_test, y_train, y_test = train_test_split(features, results, test_size=0.33)
 

Я читал в Интернете, что подгонка данных в модель должна выглядеть так:

 history = model.fit(features, results, validation_split = 0.2, epochs = 10, batch_size=50)
 

Поэтому я подгоняю полные данные (функции и результаты) к своей модели, и из этих данных я использую 20% данных для проверки: validation_split = 0.2 .
Таким образом, в основном моя модель будет обучена на 80% данных и протестирована на 20% данных.

Поэтому путаница начинается, когда мне нужно оценить модель:

 score = model.evaluate(x_test, y_test, batch_size=50)
 

Это правильно?
Я имею в виду, почему я должен разделять данные на обучение и тестирование, куда идут x_train и y_train?

Не могли бы вы, пожалуйста, объяснить мне, каков правильный порядок шагов для создания модели?

Ответ №1:

Как правило, во время обучения ( model. fit ) у вас есть два набора: один для набора обучения, а другой для набора проверки/настройки/разработки. С помощью обучающего набора вы обучаете модель, а с помощью набора проверки вам нужно найти наилучший набор гиперпараметров. И когда вы закончите, вы можете протестировать свою модель с помощью невидимого набора данных — набора, который был полностью скрыт от модели в отличие от набора для обучения или проверки.


Теперь, когда вы использовали

 X_train, X_test, y_train, y_test = train_test_split(features, results, test_size=0.33)
 

Таким образом, вы разделяете features и results на 33% данные для тестирования, 67% для обучения. Теперь вы можете сделать две вещи

  1. используйте ( X_test и y_test в качестве проверки, установленной в model.fit(...) . Или,
  2. используйте их для окончательного прогнозирования в model. predict(...)

Итак, если вы выберете эти наборы тестов в качестве набора проверки ( номер 1 ), вы сделаете следующее:

 model.fit(x=X_train, y=y_trian, 
         validation_data = (X_test, y_test), ...)
 

В журнале тренировок вы получите результаты проверки вместе с оценкой за обучение. Результаты проверки должны быть такими же, если вы позже вычислите model.evaluate(X_test, y_test) .


Теперь, если вы выберете этот набор тестов в качестве окончательного прогноза или окончательного оценочного набора ( номер 2 ), вам нужно заново выполнить набор проверки или использовать validation_split аргумент следующим образом:

 model.fit(x=X_train, y=y_trian, 
         validation_split = 0.2, ...)
 

Keras API будет принимать .2 процент обучающих данных ( X_train и y_train ) и использовать их для проверки. И, наконец, для окончательной оценки вашей модели вы можете сделать следующее:

 y_pred = model.predict(x_test, batch_size=50)
 

Теперь вы можете сравнить y_test и y_pred с некоторыми соответствующими показателями.

Комментарии:

1. но где же моя модель.оцените тогда? Для чего это?

2. если вы выберете номер 1, а также если вы установите x_test и y_test в качестве проверочного набора в model.fit — в этом случае вам не нужно использовать mdoel.evaluate . Потому что вы можете получить оценки ( loss или acc ) из журналов тренировок.

3. Но если вы выберете номер 2, где мы не используем x_test и y_test в mdoel.fit , то вы можете сделать model.evaluate (x_test, y_test) и также model.predict(x_test) , как показано выше.

4. к вашему сведению, В fit() , как обстоит дело с validation_split вычислено?

Ответ №2:

Как правило, вы хотели бы использовать свои данные X_train, y_train, которые вы разделили в качестве аргументов в методе fit. Так что это будет выглядеть примерно так:

history = model.fit(X_train, y_train, batch_size=50)

Хотя вы не разделяете свои данные перед тем, как добавить их в метод fit и добавить аргументы validation_split, также работают, просто будьте осторожны, чтобы обратиться к документации keras по аргументам validation_data и validation_split, чтобы убедиться, что вы разделяете их должным образом.

Здесь есть связанный с этим вопрос: https://datascience.stackexchange.com/questions/38955/how-does-the-validation-split-parameter-of-keras-fit-function-work

Документация Keras: https://keras.rstudio.com/reference/fit.html

Ответ №3:

Я читал в Интернете, что подгонка данных в модель должна выглядеть так:

Это означает, что вам нужно соответствовать функциям и надписям. Вы уже разделили их на x_train amp; y_train . Так что ваша посадка должна выглядеть так:

 history = model.fit(x_train, y_train, validation_split = 0.2, epochs = 10, batch_size=50)
 

Поэтому путаница начинается, когда мне нужно оценить модель:

оценка = модель.оценка(x_test, y_test, размер пакета=50) —> Это правильно?

Правильно, вы оцениваете модель с помощью функций тестирования и соответствующих меток. Кроме того, если вы хотите получить только, например, предсказанные метки, вы можете использовать:

 y_hat = model.predict(X_test)
 

Затем вы можете сравнить y_hat y_test , т. е. получить матрицу путаницы и т. Д.