代码之家  ›  专栏  ›  技术社区  ›  carousallie

没有模型估计器的ROC曲线?

  •  0
  • carousallie  · 技术社区  · 11 月前

    我创建了一个人工智能工具,可以从图像中提取内容,然后检查内容的完整性和准确性。我正在尝试评估此工具的性能,并收集相关指标。

    我有一个结果表,如下所示;真实值来自对文档的手动地面真实性审查,预测值是工具的实际输出。

    ID | true | predicted |
    -----------------------
    1  |  0   |      1    |
    2  |  0   |      0    |
    3  |  1   |      1    |
    4  |  1   |      0    |
    

    我已经能够使用 true predicted 使用以下代码获取各种指标:

    def calculate_metrics(df, true, predicted):
        accuracy = accuracy_score(df[true], df[predicted])
        precision = precision_score(df[true], df[predicted])
        recall = recall_score(df[true], df[predicted])
        f1 = f1_score(df[true], df[predicted])
        roc_auc = roc_auc_score(df[true], df[predicted])
        return print(f"accuracy: {accuracy}\nprecision: {precision}\nrecall: {recall}\nf1: {f1}\nroc_auc: {roc_auc}")
    

    此外,我想绘制一条ROC曲线。我能够获得roc_auc分数,并假设我可以从那里绘制,但我很难理解如何准确地绘制。看起来我需要一个模型估计器来确定概率,然后从那里我可以创建图,但我不清楚如何用我获得的数据来绘制图。

    是否有可能使用我的结果创建ROC曲线?如果有,我该怎么做?

    2 回复  |  直到 11 月前
        1
  •  2
  •   Sachin Hosmani    11 月前

    这取决于你的 predicted 是实际概率还是阈值概率。我看到0和1 预测 所以很有可能它们已经被阈值化了,所以你失去了原始的概率,所以不可能准确地绘制ROC曲线。

    但是,如果产生这种结果的任何模型实际上只产生0或1的概率(例如,决策树模型可以学习预测这样的离散输出),那么你就可以很好地用它来生成ROC曲线。它可能没有用(因为不需要选择阈值),而且它可能看起来不平滑,可能看起来像这样:

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.metrics import roc_curve, auc
    
    data = [
        {'ID': 1, 'true': 0, 'predicted': 1},
        {'ID': 2, 'true': 0, 'predicted': 0},
        {'ID': 3, 'true': 1, 'predicted': 1},
        {'ID': 4, 'true': 1, 'predicted': 0},
        {'ID': 5, 'true': 0, 'predicted': 0},
        {'ID': 6, 'true': 1, 'predicted': 1},
        {'ID': 7, 'true': 1, 'predicted': 1},
        {'ID': 8, 'true': 0, 'predicted': 1},
        {'ID': 9, 'true': 1, 'predicted': 0},
        {'ID': 10, 'true': 0, 'predicted': 0}
    ]
    
    true_labels = np.array([item['true'] for item in data])
    predicted_probs = np.array([item['predicted'] for item in data])
    
    fpr, tpr, thresholds = roc_curve(true_labels, predicted_probs)
    roc_auc = auc(fpr, tpr)
    
    plt.figure()
    plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (area = {roc_auc:.2f})')
    plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver Operating Characteristic')
    plt.legend(loc='lower right')
    plt.show()
    

    enter image description here

        2
  •  1
  •   Nick ODell    11 月前

    是否有可能使用我的结果创建ROC曲线?如果有,我该怎么做?

    不需要。你需要让模型产生观察值落入某个类别的概率,而不是预测的类别。ROC曲线的要点是,它允许您可视化确定数据属于任何一类的概率的不同阈值如何影响真阳性率和假阳性率。

    然而,这些数据是在阈值处理后得到的,这意味着你无法想象不同阈值的效果。为了执行此可视化,您需要模型输出概率而不是预测类。