SQL 中的混淆矩阵

问题描述 投票:0回答:1

我有一些规则,如果流程的标准得到满足,这些规则就会被解雇。我正在以混淆矩阵的形式计算这些规则的性能。

如果规则被解雇,则意味着该过程被预测为积极的。因此,如果这个过程实际上是积极的,那么这将是一个真正的积极场景
如果规则被解雇,则意味着该过程被预测为积极的。因此,如果该过程实际上不是积极的,那么这将是一个误报场景
如果rule_name为NULL,则意味着没有任何规则被触发,因此,如果该过程实际上是否定的,那就是假阴性场景。

注意:如果规则名称中的进程为空,则对于每个规则来说都是漏报,因为当进程实际失败时没有任何规则被触发。

id 规则名称 真实标签 预测标签
1 规则1 积极 积极
2 规则1 积极 积极
3 规则1 负面 积极
4 积极 积极
5 积极 积极
6 负面 积极
7 规则2 积极 积极
8 规则2 负面 积极
9 规则2 负面 积极

我的结果集应该如下所示:

真阳性 误报 真阴性 假阴性
规则1 1 1 1 2
规则2 1 2 1 2

我正在 SQL 中执行此操作。我可以通过过滤每个规则名称来做到这一点,即


select 'rule1' as rule
    , count(case when rule_name = 'rule1' and true_label = 'positive' and predicted_label = 'positive' then 1 else null  end)as tp_count
    , count(case when rule_name = 'rule1' and true_label != 'positive' and predicted_label = 'positive' then 1 else null  end)as fp_count
    , count(case when (rule_name != 'rule1' or rule_name is null) and and true_label != 'positive' then 1 else null end) as tn_count
from table
;

我有多个这样的规则,所以,我不想用

union all
对每个规则进行计算,我正在寻找一种更好的方法来进行此计算。我的主要挑战是计算真负数,同时我还需要计算
rule_name
NULL。

sql postgresql data-science confusion-matrix
1个回答
0
投票

为了在 SQL(特别是 PostgreSQL)中以更动态、更高效的方式解决这个问题,可以结合使用 GROUP BY、CASE 和窗口函数。这是一个解决方案,可以避免手动过滤每个规则并在单个查询中动态处理所有规则。

SQL查询:

WITH rule_performance AS (
SELECT
    COALESCE(rule_name, 'no_rule') AS rule_name,
    COUNT(CASE WHEN true_label = 'positive' AND predicted_label = 'positive' THEN 1 END) AS tp_count,
    COUNT(CASE WHEN true_label != 'positive' AND predicted_label = 'positive' THEN 1 END) AS fp_count,
    COUNT(CASE WHEN (rule_name != r.rule_name OR rule_name IS NULL) AND true_label != 'positive' THEN 1 END) AS tn_count,
    COUNT(CASE WHEN rule_name IS NULL AND true_label = 'positive' THEN 1 END) AS fn_count
FROM
    your_table t
LEFT JOIN 
    (SELECT DISTINCT rule_name FROM your_table WHERE rule_name IS NOT NULL) r 
ON 
    t.rule_name = r.rule_name OR t.rule_name IS NULL
GROUP BY
    COALESCE(rule_name, 'no_rule')

) 选择 规则名称, tp_count, fp_计数, tn_计数, fn_计数 从 规则性能 订购依据 规则名称;

现在试试这个代码。

© www.soinside.com 2019 - 2024. All rights reserved.