【问题标题】:fitting model when using cross validation to evaluate performance使用交叉验证评估性能时的拟合模型
【发布时间】:2019-10-01 10:33:30
【问题描述】:

我目前正在尝试比较多个模型。 我制作了一个脚本,使用 10 折交叉验证来评估性能,以获得最真实的性能。 我的问题是,它适合什么样的训练和测试数据重要吗?例如我应该找到提供最佳性能的训练和测试集并在之后再次拟合模型吗

CV = model_selection.KFold(n_splits=K, shuffle=True)
# Split data

for train_index, test_index in CV.split(X, y):

    for model in models:

        # splitting up data set
        X_train = X.iloc[train_index]
        y_train = y.iloc[train_index]
        X_test = X.iloc[test_index]
        y_test = y.iloc[test_index]

        model.fit(X_train, y_train)
        print(model.score(X_test, y_test) * 100)

【问题讨论】:

  • model 变量将始终是最近拟合的变量。因此,在双循环内,您应该可以进行评估,但一旦在循环外,您必须再次选择并重新调整您的模型,以确保您拥有正确的模型并适合。
  • 是的,我对正确的模型选择没有问题。这只是合适的。它适用于哪些训练和测试数据是否重要?例如我应该找到提供最佳性能的训练和测试集并在之后再次拟合模型吗?
  • 是的,这很重要。但是您应该(也)更新您的问题,但目前在评论中询问您的实际问题。对我来说,这个问题本身提出了一些不同的问题。
  • 在一个 CV 之后,我们通常适合 整个 训练集 - 我们不会选择具有最佳性能的 CV fold 数据...
  • 谢谢你们! Desertnaut - 我知道这可能有点偏离原始问题,但如果我想稍后重新评估性能怎么办。这可能是在我调整模型之后。然后我已经将我的模型拟合到整个训练数据中

标签: python scikit-learn cross-validation


【解决方案1】:

在我看来,这个问题更适合Cross Validated Stack Exchange 社区来回答(并且有很多posts on cross validation)。

但是,既然你在 Stack Overflow 上问过它... 正如用户 9769953 评论的那样:这很重要。

在我看来,交叉验证有两个主要用途:

  1. 检查数据是否在一个折叠中显着不同,以扭曲模型的训练。
  2. 验证未见数据的性能(左侧折叠)。

预期的结果是您将得到不同的结果(每次折叠的相同结果应该会让您对数据或模型训练过程产生怀疑)。

交叉验证的性能仅作为所有折叠结果的平均值才有意义。与“1 倍验证”(即在从中学习的数据上运行模型)相比,这是一个更现实的性能值,因为通常您将在模型未见过的数据上运行模型。

【讨论】:

  • 谢谢!使用平均值而不是中位数是有意义的。
猜你喜欢
  • 2018-12-17
  • 2021-06-13
  • 1970-01-01
  • 2019-09-17
  • 2020-03-26
  • 2017-10-23
  • 2021-06-03
  • 1970-01-01
  • 2017-01-02
相关资源
最近更新 更多