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

时间:2020-09-14 10:56:16

标签: python pandas dataframe scikit-learn classification

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

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中的准确度约为92.5%,在accuracy中的准确度约为87.5%。

谢谢:)

2 个答案:

答案 0 :(得分:2)

交叉验证的目的是检查您计划使用的模型(模型+特定的超参数)是否可以推广。您可以按照建议here的要求将测试集分开进行最终评估,并仅对训练数据使用交叉验证。

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

下面是流程和我在图表的每个阶段的注释-

enter image description here

  1. 参数:您已经选择了要建模的模型和一系列超参数,并试图找到最通用的模型+参数组合。
  2. 交叉验证:您对这些模型+参数组合中的每一个使用交叉验证,并检查k倍准确性。
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.        ])
  1. 最佳参数:您可以将交叉验证与网格搜索结合使用,以找到可为您提供最通用化模型的最佳参数。

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

  1. 数据集/训练数据/测试数据:现在,像往常一样(80 20左右)将数据集分成测试并训练

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

  3. 最终评估:最终测试准确性(应报告)是在测试数据上对最佳参数模型评分后获得的结果。

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

请阅读this link,因为它在解释使用交叉验证的流程方面做得很好。

sklearn位作者的话-

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


什么是交叉验证?

在称为k倍CV的基本方法中,将训练集分为k个较小的集(下面介绍了其他方法,但通常遵循相同的原理)。 k个“折叠”中的每一个都遵循以下过程:

  • 使用褶皱作为训练数据训练模型;

  • 生成的模型在数据的其余部分上得到验证(即,它用作测试集以计算性能指标(例如准确性)。

通过k倍交叉验证报告的性能指标就是循环中计算出的值的平均值。

此图像应总结我上面讨论的所有内容。

enter image description here

答案 1 :(得分:0)

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

enter image description here

您对训练数据进行交叉验证,因此您需要进行多次折叠训练,然后采用该参数进行测试(无需在测试集上运行交叉验证,只需简单地使用交叉验证中的参数即可)您的训练数据)。