You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:32:38