繁体   English   中英

Keras交叉验证过度拟合:我的模型是否跨越不同的折叠信息?

[英]Keras cross-validation overfitting: is my model carrying over information across different folds?

我想确保运行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行。

我怀疑的原因:

  1. 查看为所有时期生成的训练日志,似乎在不同的折叠上继续模型性能。 说对于第一次折叠,模型获得75%的准确度。 在第二次折叠中,它开始向上报告75.x%的准确度
  2. 该模型似乎过度拟合,因为它很快就会输出1.0的训练精度
  3. 对于一些在数据集中只有1个实例的稀有类,在某些情况下,模型甚至报告了这些类的100%F1,这没有意义。

所有这些似乎表明模型参数和学习类分布似乎在折叠之间进行。 我认为解决这个问题的唯一方法是在每个折叠中重新创建模型。 这个对吗?

谢谢

不,这段代码没有正确地进行交叉验证,对于从头开始训练新模型的每个折叠,这里你重复使用前一个折叠的模型,这是不正确的。

我会这样做:

for k in range(0, len(splits)): #LINE C
   model= get_model() #LINE A
   model.compile(...) #LINE B

   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)

   del model

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM