为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我们每次都需要重新创建模型?

为什么我们每次都需要重新创建模型?

holdtom 2023-07-27 16:02:26
这里我有一段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 呢?我会把它放在前面以节省计算时间,但既然它是以这种方式呈现的,我认为这是有原因的。
查看完整描述

3 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

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

model.fit(X_train, y_train)无论哪种方式,每次循环后存在的模型对象都是相同的。


查看完整回答
反对 回复 2023-07-27
?
莫回无

TA贡献1865条经验 获得超7个赞

简短的回答是肯定的。

原因是因为这是k折交叉验证

简而言之,这意味着您正在训练k多个模型,评估每个模型的结果并一起求平均值。

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

查看完整回答
反对 回复 2023-07-27
?
墨色风雨

TA贡献1853条经验 获得超6个赞

KFold用于交叉验证,这意味着训练模型并评估它。

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

使用时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

        ...


查看完整回答
反对 回复 2023-07-27
  • 3 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信