Метод, который вы реализуете, называется перекрестной проверкой, он позволяет вашей модели лучше «просматривать» ваши данные и снижает вероятность того, что ваши тренировочные данные были «слишком совершенными» или «слишком шумными».
Таким образом, добавив 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 раньше!