【问题标题】:Keras cross-validation overfitting: is my model carrying over information across different folds?Keras 交叉验证过度拟合:我的模型是否在不同折叠之间传递信息?
【发布时间】: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 行内。

我怀疑的原因:

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

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

谢谢

【问题讨论】:

    标签: python keras


    【解决方案1】:

    不,此代码未正确进行交叉验证,对于每个折叠,您都从头开始训练一个新模型,在这里您正在重用前一折叠的模型,这是不正确的。

    我会这样做:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-26
      • 2016-03-22
      • 2021-06-26
      • 2020-06-26
      • 2019-09-17
      • 2020-08-06
      • 2021-06-22
      • 2019-10-09
      相关资源
      最近更新 更多