猿问

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

这里我有一段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 呢?


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


holdtom
浏览 133回答 3
3回答

小唯快跑啊

好问题!答案是......您不必每次都创建模型。你的直觉是正确的。请随意移至model = LogisticRegression()循环外部的顶部,然后重新运行以确认。model.fit(X_train, y_train)无论哪种方式,每次循环后存在的模型对象都是相同的。

莫回无

简短的回答是肯定的。原因是因为这是k折交叉验证简而言之,这意味着您正在训练k多个模型,评估每个模型的结果并一起求平均值。我们在没有单独的训练和测试数据集的情况下这样做。交叉验证将训练数据分割成k子组,每个子组都包含自己的测试/训练分割(我们称之为折叠)。然后,我们在第一折叠的训练数据上训练模型并在测试数据上进行测试。对每个折叠使用新模型重复所有折叠,现在我们对完整数据集有了正确的预测。

墨色风雨

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        ...
随时随地看视频慕课网APP

相关分类

Python
我要回答