【发布时间】:2019-07-28 14:23:33
【问题描述】:
我想确保我用于运行 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 行内。
我怀疑的原因:
- 查看为所有 epoch 生成的训练日志,模型性能似乎在不同的倍数上持续存在。说对于第一次折叠,模型获得了 75% 的准确度。在第二折中,它开始报告准确率 75.x% 以上
- 该模型似乎过度拟合,因为它很快就会输出 1.0 的训练准确度
- 对于一些在数据集中只有 1 个实例的稀有类,在某些情况下,模型甚至报告这些类的 F1 为 100%,这没有任何意义。
所有这些似乎都表明模型参数和学习到的类分布似乎在折叠之间进行了继承。我想解决这个问题的唯一方法是在每个折叠中重新创建模型。这是正确的吗?
谢谢
【问题讨论】: