什么是pr查询,掌握pr查询方法

什么是PR查询,掌握PR查询方法

1. PR查询简介

什么是pr查询,掌握pr查询方法

PR(Precision-Recall)是一种用于评估分类模型性能的指标,主要用于衡量模型在召回率(Recall)和精确度(Precision)之间的平衡,PR查询是指通过计算不同阈值下的PR值,来确定最佳阈值的方法,这种方法可以帮助我们找到一个既能满足精确度要求,又能达到较高召回率的阈值。

2. PR查询方法

PR查询主要包括以下几个步骤:

2.1 准备数据

什么是pr查询,掌握pr查询方法

我们需要准备一个包含真实标签和预测标签的数据集,数据集通常是一个二维数组,其中每一行表示一个样本,第一列是真实标签,第二列是预测标签。

import numpy as np
data = np.array([
    ['A', 'B'],
    ['B', 'A'],
    ['A', 'A'],
    ['B', 'B']
])

2.2 计算混淆矩阵

接下来,我们需要计算混淆矩阵,混淆矩阵是一个二维数组,其中行表示实际类别,列表示预测类别,对于每个样本,我们可以将其真实标签和预测标签填入混淆矩阵中。

def confusion_matrix(data):
    y_true = [row[0] for row in data]
    y_pred = [row[1] for row in data]
    return np.histogram2d(y_true, y_pred, bins=[2, 2])[0] / len(data)
cm = confusion_matrix(data)
print("Confusion Matrix:")
print(cm)

2.3 计算PR值

什么是pr查询,掌握pr查询方法

有了混淆矩阵后,我们可以计算PR值,PR值是一个二维数组,其中每个元素表示对应阈值下的PR值,我们可以通过遍历所有可能的阈值来计算这些值。

def pr_values(cm):
    n = cm.shape[0] * cm.shape[1]
    precision = np.zeros((n, n))
    recall = np.zeros((n, n))
    tp = np.diag(cm)
    fp = np.sum(cm, axis=0) tp
    fn = np.sum(cm, axis=1) tp
    for i in range(n):
        for j in range(n):
            if i == j:
                precision[i][j] = (tp[i] + tp[j]) / (tp[i] + fp[i] + fn[j]) if (tp[i] + tp[j]) > 0 else 0.5
                recall[i][j] = tp[i] / (tp[i] + fn[j]) if (tp[i] + fn[j]) > 0 else 0.5
            elif i < j:
                precision[i][j] = precision[j][i] = (tp[j] + tp[i]) / (tp[j] + fp[j] + fn[i]) if (tp[j] + tp[i]) > 0 else 0.5
                recall[i][j] = recall[j][i] = (tp[j] + tp[i]) / (tp[j] + fn[i]) if (tp[j] + fn[i]) > 0 else 0.5
            else:
                continue
    idxs = np.argsort(recall[:, ::-1], axis=1)[:, ::-1].flatten()
    max_idx = np.argmax(precision) if precision.any() else None
    max_recall = recall[idxs, max_idx] if max_idx is not None else None
    max_precision = precision[idxs, max_idx] if max_idx is not None else None
    max_fscore = max_precision * max_recall if max_precision and max_recall else None
    max_idxes = [np.unravel_index(idxs == i, recall.shape) for i in range(len(idxs)) if i != max_idx] if max_idx is not None else []
    max_pr = [(precision[r], recall[r], fscore) for r in max_idxes] if max_idxes else []
    return max_pr, max_recall, max_precision, max_fscore, max_idxes, cm[:, ::-1].T @ cm[:, ::-1].T == np.eye(2) * n

原创文章,作者:酷盾叔,如若转载,请注明出处:https://www.kdun.com/ask/95145.html

(0)
酷盾叔订阅
上一篇 2023-12-15 01:50
下一篇 2023-12-15 01:52

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

云产品限时秒杀。精选云产品高防服务器,20M大带宽限量抢购  >>点击进入