我们是不是评估 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_acc
和accuracy
中的准确率分别为 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 折交叉验证分数是不是存在偏差?