【问题标题】:Is it correct to evaluate a classifier on cross_val_predict output?在 cross_val_predict 输出上评估分类器是否正确?
【发布时间】:2020-08-05 09:06:41
【问题描述】:

我有一些分类器。我想用classification_report获取分类器的指标

我使用cross_val_predict 获取预测,然后将它们传递给classification_report。 我还使用cross_val_predict 的输出来绘制混淆矩阵。

labels = get_labels() #ground truth
result = cross_val_predict(classifier, features, labels, cv=KFold(n_splits=10, shuffle=True, random_state=seed))
report = classification_report(labels, result, digits=3, target_names=['no', 'yes'], output_dict=True)
cm = confusion_matrix(result, labels, [no, yes])

cross_val_predict 文档中:

将这些预测传递到评估指标中可能不是衡量泛化性能的有效方法。结果可能与 cross_validate 和 cross_val_score 不同,除非所有测试集的大小都相同,并且指标在样本上分解。

那么,这是错误的做法吗?我该怎么做?

【问题讨论】:

    标签: python scikit-learn classification


    【解决方案1】:

    我会说你的进程应该看起来像这样:

    1. 火车/测试分裂 Li>
    2. 使用(交叉)验证集
    3. 的模型选择
    4. 使用整个列车设置恢复模型
    5. 评估从步骤1 Li>的测试分裂

    如果您没有大量数据,则使用kfold的培训应给您更可靠的结果,而不是单列火车/测试分割,而是作为拇指的规则,考虑您应该在未出现的数据集/拆分上进行评估之前使用过,即使它仅用于模型选择或早期停止。

    返回您的问题,cross_val_predict 987654321实际上在K splits和使用所有训练的CV模型来预测5个预测分裂,然后组合在一起。我认为你可以使用它来获得交叉验证结果的一般思想(例如,如果您想绘制它们或计算额外的指标),但绝对不评估您的模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 2017-06-10
      • 2019-04-30
      • 2016-08-22
      • 2018-02-18
      • 2019-10-07
      • 1970-01-01
      相关资源
      最近更新 更多