Переоснащение перекрестной проверки Keras: переносит ли моя модель информацию по разным сгибам?

#python #keras

#python #keras

Вопрос:

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

Структура моего кода обычно выглядит следующим образом:

 def get_model():
    ....
    #code to create a Keras Neural network model using the functional API

kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
splits = list(enumerate(kfold.split(X, y))) #X is the train feature matrix, y the target
model= get_model() #LINE A
model.compile(...) #LINE B

for k in range(0, len(splits)): #LINE C
   split = splits[k]
   X_split_train = ... #slice X into corresponding training parts
   X_split_test
   y_split_train = ... #slice y into corresponding parts
   model.fit(X_split_train, y_split_train, ...)
   prediction_prob = model.predict(X_split_test)
   #... code for evaluating the result for this fold
  

И я подозреваю, что мой код неверен. В частности, строки A и B должны находиться внутри цикла, строка C.

Причины моих подозрений:

  1. Просматривая журнал обучения, сгенерированный для всех эпох, кажется, что производительность модели сохраняется по разным сгибам. Допустим, при первом сгибе модель получает точность 75%. Во втором сгибе он начинает сообщать о повышении точности на 75.x%
  2. модель, похоже, переоснащается, поскольку вскоре выдает точность обучения 1.0
  3. для некоторых редких классов, которые имеют только 1 экземпляр в наборе данных, в некоторых случаях модель даже сообщала о 100% F1 для этих классов, и это не имеет смысла.

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

Спасибо

Ответ №1:

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

Я бы сделал это следующим образом:

 for k in range(0, len(splits)): #LINE C
   model= get_model() #LINE A
   model.compile(...) #LINE B

   split = splits[k]
   X_split_train = ... #slice X into corresponding training parts
   X_split_test
   y_split_train = ... #slice y into corresponding parts
   model.fit(X_split_train, y_split_train, ...)
   prediction_prob = model.predict(X_split_test)

   del model