【问题标题】:Why do we need to recreate the model every time?为什么我们每次都需要重新创建模型?
【发布时间】:2020-12-28 08:04:19
【问题描述】:

我这里有一段 Python 代码,取自 SoloLearn,

scores = []
kf = KFold(n_splits=5, shuffle=True)
for train_index, test_index in kf.split(X):
   X_train, X_test = X[train_index], X[test_index]
   y_train, y_test = y[train_index], y[test_index]
   model = LogisticRegression()
   model.fit(X_train, y_train)
   scores.append(model.score(X_test, y_test))
print(scores)
print(np.mean(scores))

那么我的问题是,我是否需要在每次拆分时都创建一个新模型? 为什么我们不在 for 之前创建一个 LogisticRegression?

我会把它放在前面以节省计算时间,但既然它是这样呈现的,我认为这是有原因的。

【问题讨论】:

    标签: python logistic-regression k-fold


    【解决方案1】:

    好问题!答案是……您不必每次都创建模型。你的直觉是正确的。随意将 model = LogisticRegression() 移到顶部,循环外,然后重新运行以确认。

    model.fit(X_train, y_train) 之后的模型对象每次循环都一样。

    【讨论】:

    • 虽然这没问题,但我不建议将model = LogisticRegression() 移出循环。该代码将起作用,但对于您的模型实际上是哪个变量并不直观。我建议用model = LogisticRegression().fit(X_train, y_train) 制作两行。这在 sklearn 中是推荐的,比在之前训练过的模型上调用 model.fit() 更快
    • 有趣。我非常不同意在 kfold 循环之外实例化模型对象是“不直观的”,但我猜是不同的笔画。如果model.fit() 被重复调用,你有没有可以指出的关于它被“推荐在sklearn 中”以在每次调用model.fit() 之前实例化一个新模型对象的来源?
    • 我刚找到这个github.com/keras-team/keras/issues/4446,是同一个问题吗?看起来,它说重复 model.fit() 增量训练模型,所以这对 KFold 来说不是一件好事。
    • 建议在 sklearn 中每次都实例化一个新的模型对象,虽然不是必需的,以避免与其他库混淆。在 Tensorflow/karas 调用 model.fit() 后跟第二个 model.fit() continues 训练。例如,model.fit(train_images, train_labels, epochs=10) 后跟 model.fit(train_images, train_labels, epochs=8) 与训练 18 个 epoch 相同。查看相关 - stackoverflow.com/questions/62120508/…
    • Matte - 这是针对 Keras,而不是 sklearn,我假设您使用的是基于您正在使用的 API 并且您的模型是 Logistic Regression。
    【解决方案2】:

    简短的回答是肯定的。

    之所以会这样,是因为这是k-fold cross validation

    简单地说,这意味着您正在训练k 个模型,评估每个模型的结果并一起取平均值。

    如果我们没有单独的训练测试数据集,我们会这样做。交叉验证将训练数据拆分为k 子组,每个子组都包含自己的测试/训练拆分(我们称之为折叠)。然后我们在第一折的训练数据上训练一个模型,并在测试数据上进行测试。对所有折叠重复,每个折叠都有一个新模型,现在我们对整个数据集有了正确的预测。

    这里是交叉验证详细说明的链接 - https://machinelearningmastery.com/k-fold-cross-validation/

    【讨论】:

    • 如果你想改变这一行,我建议将两行合并成model = LogisticRegression().fit(X_train, y_train)
    【解决方案3】:

    KFold 用于交叉验证,即训练模型并对其进行评估。

    Here 是有关该主题的文档示例。

    这样做时,您显然需要两个数据集:一个训练数据集和一个评估数据集。

    使用KFold 时,您将训练集拆分为折叠数(在您的示例中为 5 个)并运行五个模型,每次使用五分之一作为验证集,将数据集的其余部分作为训练集。

    现在,为了回答这个问题:您每次都需要一个新模型,因为您有五个模型,因为第五次您有一个不同的训练集和一个不同的验证集。您必须在 scikit learn 中创建一个新模型,因为当您运行 model.fit() 时,该模型是在特定数据集上训练的,因此您不能将其用于另一个训练数据集。

    如果你只想创建一次,你可以复制例如:

    model = LogisticRegression(**params)
    
    def parse_kfold(model)
        kf = KFold(n_splits=5, shuffle=True)
        for train_index, test_index in kf.split(X):
            model_fold = model
            ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-23
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多