Как я могу получить историю различных совпадений при использовании перекрестной проверки через KerasRegressor? - PullRequest
0 голосов
/ 05 ноября 2019

У меня проблема с регрессией, и я использую полностью связанный слой keras для моделирования своей проблемы. Я использую cross_val_score, и мой вопрос: как я могу извлечь модель и историю каждой комбинации поезд / проверка, которую делает cross_val_score?

Принимая этот пример:

from sklearn import datasets
from sklearn.model_selection import cross_val_score, KFold
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor
seed = 1

diabetes = datasets.load_diabetes()
X = diabetes.data[:150]
y = diabetes.target[:150]

def baseline_model():
    model = Sequential()
    model.add(Dense(10, input_dim=10, activation='relu'))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer='adam')
    return model

estimator = KerasRegressor(build_fn=baseline_model, nb_epoch=100, batch_size=100, verbose=False)
kfold = KFold(n_splits=10, random_state=seed)
results = cross_val_score(estimator, X, y, cv=kfold)
print("Results: %.2f (%.2f) MSE" % (results.mean(), results.std()))


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

Если не использовать kfold, а просто разделить поезд / проверку, то можно сделать:

hist = model.fit(X_tr, y_tr, validation_data=val_data,
                  epochs=100, batch_size=100,
                  verbose=1)

plt.plot(history.history['loss'])
plt.plot(history.history['loss'])

Это вернет график, представляющий эволюцию mse wrt к эпохам для поездаи проверочные наборы данных, позволяющие определить пере / недостаточное оснащение. Любые идеи, как сделать это для каждого сгиба при использовании перекрестной проверки?

1 Ответ

1 голос
/ 05 ноября 2019

Вы можете пойти на «ручную» процедуру CV и построить график потерь (или любой другой доступной метрики, которую вы, возможно, захотите использовать) для каждого фолда, т.е. что-то вроде этого:

from sklearn.metrics import mean_squared_error
cv_mse = []

for train_index, val_index in kfold.split(X):
    history = estimator.fit(X[train_index], y[train_index])
    pred = estimator.predict(X[val_index])
    err = mean_squared_error(y[val_index], pred)
    cv_mse.append(err)
    plt.plot(history.history['loss'])

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

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