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

问题描述

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

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

解决方法

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

每次model.fit(X_train,y_train)之后存在的模型对象都是相同的。

,

答案是肯定的。

之所以这样,是因为这是 k倍交叉验证

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

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

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

,

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
        ...

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...