我有一些规则,如果流程的标准得到满足,这些规则就会被解雇。我正在以混淆矩阵的形式计算这些规则的性能。
如果规则被解雇,则意味着该过程被预测为积极的。因此,如果这个过程实际上是积极的,那么这将是一个真正的积极场景
如果规则被解雇,则意味着该过程被预测为积极的。因此,如果该过程实际上不是积极的,那么这将是一个误报场景
如果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)中以更动态、更高效的方式解决这个问题,可以结合使用 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_计数 从 规则性能 订购依据 规则名称;
现在试试这个代码。