我们是不是评估 cross_val_score 的准确性,然后评估测试数据的准确性?

Posted

技术标签:

【中文标题】我们是不是评估 cross_val_score 的准确性,然后评估测试数据的准确性?【英文标题】:Do we evaluate accuracy on cross_val_score and then evaluate accuracy on test data?我们是否评估 cross_val_score 的准确性,然后评估测试数据的准确性? 【发布时间】:2021-01-01 02:12:01 【问题描述】:

您好,如果我们要使用以下方法评估 cv 准确性:

X_train, X_test, y_train, y_test = train_test_split(
    X, y, random_state=42)

model=RandomForestClassifier(random_state=0)

k_folds = KFold(n_splits=5)
splits = k_folds.split(X_train, y_train)
cv_acc = cross_val_score(model, X_train, y_train, cv=splits, scoring='accuracy')

然后在测试集上评估性能是否常见?

model=RandomForestClassifier(random_state=0)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
predictions = [round(value) for value in y_pred]
accuracy = accuracy_score(y_test, predictions)

在从cv_acc 到计算accuracy 之前,是否应该涉及任何明确的步骤。我们将哪个结果报告为正确的准确性?我在cv_accaccuracy 中的准确率分别为 92.5% 和 87.5%。

谢谢:)

【问题讨论】:

【参考方案1】:

交叉验证的目标是检查您计划使用的模型(模型 + 特定超参数)是否具有泛化性。您可以单独保留一个测试集以进行最终评估,并按照here 的建议仅对训练数据使用交叉验证。

仍应保留测试集以进行最终评估,但在进行 CV 时不再需要验证集。

以下是流程图的每个阶段的流程和我的 cmets -

    PARAMETERS:您已经选择了一个模型和一系列要建模的超参数,并且您正在尝试找出最通用的模型+参数组合。 CROSS-VALIDATION:您对这些模型+参数组合中的每一个使用交叉验证并检查 k-fold 准确性。
scores = cross_val_score(clf, X, y, cv=5)

#THIS IS GOOD! MODEL IS GENERALIZABLE ON k-FOLDS
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])

#THIS IS BAD! MODEL IS NOT GENERALIZABLE
array([0.68..., 0.42.  ..., 0.96..., 0.99..., 1.        ])
    最佳参数:您可以将交叉验证与网格搜索结合使用,以找到为您提供最通用模型的最佳参数。

常见混淆 - 请不要将最佳参数与作为 k 折模型之一的参数混淆。每个 k-fold 模型在数据的不同 k-folds 上使用相同的模型 + 参数。最佳参数只是您在网格搜索中选择的范围或手动选择的超参数。

    DATASET/TRAINING DATA/TEST DATA:现在获取数据集并将其拆分为测试并像往常一样进行训练(80 20 左右)

    重新训练模型:使用网格搜索和交叉验证确定最佳参数,在训练数据集上重新训练模型并在测试数据上评分

    最终评估:最终测试准确度(您应该报告)是您在测试数据上获得最佳参数模型后获得的准确度。

将网格搜索视为对模型参数的探索,将交叉验证视为对特定模型参数集如何通过 k 倍验证对给定数据进行泛化的探索。这两个过程都有助于模型选择,一旦您选择了正确的模型,您就可以在原始训练数据上对其进行重新训练,并从测试数据中获得验证准确性。

请阅读this link,因为它很好地解释了使用交叉验证的流程。

sklearn作者的话来说——

在评估估计器的不同设置(“超参数”)时,例如必须为 SVM 手动设置的 C 设置,仍然存在过度拟合测试集的风险,因为可以调整参数直到估计器执行最佳。这样,关于测试集的知识可以“泄漏”到模型中,并且评估指标不再报告泛化性能。为了解决这个问题,可以将数据集的另一部分作为所谓的“验证集”:在训练集上进行训练,然后对验证集进行评估,当实验似乎成功时,最终的评估可以在测试集上进行。


什么是交叉验证?

在称为 k-fold CV 的基本方法中,将训练集拆分为 k 个较小的集合(其他方法如下所述,但通常遵循相同的原则)。对于 k 个“折叠”中的每一个,都遵循以下过程:

使用折叠作为训练数据来训练模型;

生成的模型在数据的剩余部分上进行验证(即,它被用作测试集来计算准确度等性能指标)。

k 折交叉验证报告的性能度量是循环中计算的值的平均值。

这张图片应该总结了我上面讨论的所有内容。

【讨论】:

【参考方案2】:

最常见的方法是在训练集上运行它。你有官方文档here。

您对您的训练数据运行交叉验证,这样您就有几个不同的训练折叠,然后您获取这些参数并对其进行测试(无需在您的测试集上运行交叉验证,只需简单地使用来自交叉验证的参数训练数据)。

【讨论】:

以上是关于我们是不是评估 cross_val_score 的准确性,然后评估测试数据的准确性?的主要内容,如果未能解决你的问题,请参考以下文章

在 sklearn cross_val_score 上评估多个分数

如果我们在管道中包含转换器,来自 scikit-learn 的“cross_val_score”和“GridsearchCV”的 k 折交叉验证分数是不是存在偏差?

如何加快cross_val_score?

如何正确使用 GridSearchCV 和 cross_val_score?

cross_val_score的用法

模型的性能评估 用sklearn进行模型评估