在Sklearn中交叉验证Keras包装器估计器时如何访问History对象?
获取KerasClassifier交叉验证中每个折的训练History
这确实是个常见的痛点——sklearn的cross_validate为了封装性,默认不会保留每个折的训练历史记录。不过有个很直观的解决办法:手动实现交叉验证循环,这样你就能完全掌控每个折的训练过程,轻松捕获每一轮的history。
方法一:手动实现KFold交叉验证
直接用sklearn的KFold拆分数据,然后逐个折训练模型并保存history,步骤如下:
1. 导入依赖并定义模型构建函数
from sklearn.model_selection import KFold from keras.wrappers.scikit_learn import KerasClassifier from keras.models import Sequential from keras.layers import Dense import numpy as np
先定义你的Keras模型构建函数(和你用KerasClassifier时的函数一致):
def create_model(): # 这里替换成你的模型结构 model = Sequential() model.add(Dense(12, input_dim=8, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) return model
2. 手动执行交叉验证并保存每个折的History
# 假设X和y是你的训练数据 X = np.random.rand(100, 8) # 示例输入数据 y = np.random.randint(0, 2, 100) # 示例标签 # 初始化KFold拆分器 kfold = KFold(n_splits=5, shuffle=True, random_state=42) fold_histories = [] # 用来存储每个折的history # 遍历每个折 for train_idx, val_idx in kfold.split(X): # 拆分训练集和验证集 X_train, X_val = X[train_idx], X[val_idx] y_train, y_val = y[train_idx], y[val_idx] # 初始化KerasClassifier model = KerasClassifier(build_fn=create_model, epochs=15, batch_size=10, verbose=0) # 训练模型并获取history # 注意这里传入validation_data,这样history会包含验证集的指标 history = model.fit(X_train, y_train, validation_data=(X_val, y_val)) # 将当前折的history字典存入列表 fold_histories.append(history.history)
3. 查看结果
fold_histories是一个列表,每个元素对应一个折的训练历史字典。比如你要查看第1个折的训练损失变化:
# 第1个折的训练损失(每个epoch的值) print(fold_histories[0]['loss']) # 第1个折的验证准确率变化 print(fold_histories[0]['val_accuracy'])
为什么这个方法有效?
KerasClassifier的fit方法本身就会返回训练的history对象,只是cross_validate在内部调用fit后没有把这个对象暴露出来。手动循环每个折,我们就能直接捕获并保存每个训练过程的历史数据,完全满足你查看每个split每个epoch损失/误差变化的需求。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

