#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.
Причины моих подозрений:
- Просматривая журнал обучения, сгенерированный для всех эпох, кажется, что производительность модели сохраняется по разным сгибам. Допустим, при первом сгибе модель получает точность 75%. Во втором сгибе он начинает сообщать о повышении точности на 75.x%
- модель, похоже, переоснащается, поскольку вскоре выдает точность обучения 1.0
- для некоторых редких классов, которые имеют только 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