在 KerasRegressor 上使用交叉验证时,如何获取不同拟合的历史记录?

How can I get the history of the different fits when using cross vaidation over a KerasRegressor?

我有一个回归问题,我正在使用 keras 全连接层来模拟我的问题。我正在使用 cross_val_score,我的问题是:如何提取 cross_val_score 所做的每个 train/validation 组合的模型和历史记录?

假设这个例子:

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,而是简单的train/validation分割时,可以这样:

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'])

这将 return 代表 mse w.r.t 演变的图。到训练和验证数据集的时期,允许发现 over/underfitting。 使用交叉验证时,有什么想法如何对每个折叠执行此操作吗?

您可以进行 "manual" 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,并且您还可以获得每次折叠每个时期的演变的相应图。