Python 我们是否评估交叉评分的准确性,然后评估测试数据的准确性?

Python 我们是否评估交叉评分的准确性,然后评估测试数据的准确性?,python,pandas,dataframe,scikit-learn,classification,Python,Pandas,Dataframe,Scikit Learn,Classification,嗨,如果我们使用以下方法评估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

嗨,如果我们使用以下方法评估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\u acc
到计算
精度之前,是否有明确的步骤。我们将报告哪个结果为正确的准确性?我在
cv_acc
中获得了大约92.5%的准确率,在
中获得了87.5%的准确率


谢谢:)

最常见的方法是在培训集中运行它。你有官方文件


您可以对培训数据运行交叉验证,这样您就可以对培训进行多个不同的折叠,然后获取该参数并对其进行测试(无需对测试集运行交叉验证,只需简单地使用培训数据交叉验证中的参数即可).

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

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

下面是流程图的每个阶段以及我的评论-

  • 参数:您已经选择了一个模型和一系列要建模的超参数,并且正在尝试找出哪种模型+参数组合最具普遍性
  • 交叉验证:对每个模型+参数组合使用交叉验证,并检查k倍精度
  • 最佳参数:您可以将交叉验证与网格搜索结合使用,以找到提供最通用模型的最佳参数
  • 常见混淆-请不要将最佳参数与k折叠模型之一的参数混淆。每个k折叠模型在数据的不同k折叠上使用相同的模型+参数。最好的参数只是您在网格搜索中选择作为范围或手动选择的超参数

  • 数据集/训练数据/测试数据:现在获取数据集并将其拆分为测试,然后像通常那样进行训练(80或20左右)

  • 再培训模型:使用网格搜索和交叉验证确定最佳参数,在列车数据集上再培训模型,并在测试数据上评分

  • 最终评估:最终测试精度(您应该报告)是您在测试数据上对最佳参数模型评分后得到的精度

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

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

    sklearn
    作者的话来说-

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


    什么是交叉验证?

    在称为k-fold CV的基本方法中,训练集被分成k个较小的集合(其他方法如下所述,但通常遵循相同的原则)。每个k“褶皱”都遵循以下程序:

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

    • 结果模型在数据的剩余部分上进行验证(即,将其用作测试集,以计算精度等性能度量)

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