文章目录
前言
在气象预报、短临降水预测、强对流天气预报等领域,评价一个预报系统好坏,不是看一眼“准不准”就完了。尤其对于降水有无、雷暴有无这类 二分类事件,业界有一整套约定俗成的检验指标,比如大家经常听到的 TS评分(Threat Score)、 命中率(POD)、 虚警率(FAR)、 ETS公平评分等等。
如果你正在做气象智能预报、机器学习后处理,或是跑WRF/数值模式结果检验,这篇文章能帮你把这些指标彻底理清,并直接拿去用(文末有完整Python代码)。
1. 二分类预报的“四格表”
任何检验都从一张列联表(Contingency Table)开始。假设我们要检验“未来1小时有无降水”(≥0.1mm为有),将实况和预报做比对:
| 实况:有 | 实况:无 | |
|---|---|---|
| 预报:有 | 命中 (a) | 空报 (b) |
| 预报:无 | 漏报 © | 正确否定 (d) |
- a (Hit):报有,且确实下了。
- b (False Alarm):报了有,但没下——空报。
- c (Miss):报了无,但下了——漏报。
- d (Correct Negative):报了无,确实没下——无事发生的安宁。
所有常用指标都由这四个数组合而来。有了这张表,我们开始“盘”指标。
2. 核心指标大盘点
2.1 准确率(Accuracy)
A
C
C
=
a
+
d
a
+
b
+
c
+
d
ACC = \frac{a+d}{a+b+c+d}
ACC=a+b+c+da+d
缺点非常致命:当事件本身稀少时(比如暴雨网格点占1%),就算全部报“无”,准确率也能达到99%,毫无意义。气象中很少单独用它。
2.2 TS评分(Threat Score, CSI)
TS评分,学名Critical Success Index,也叫威胁评分,是气象业务最常用的“硬指标”之一:
T
S
=
a
a
+
b
+
c
TS = \frac{a}{a+b+c}
TS=a+b+ca
- 含义:在所有“预报有”或“实况有”的事件里,正确命中的比例。
- 范围:0~1,越接近1越好。
- 特点:不考虑“正确否定(d)”,因此不会被大量“无事件”样本稀释,更专注于预报有事件的真实水平。
- 注意:TS评分对命中率和空报一视同仁,而且受事件频率影响,不可跨季节、跨区域直接横向比较。完美TS=1,但无事件时分母为0,无定义。
📌 业务小贴士:通常降水TS评分为0.2~0.4属于还不错,短临强对流能到0.3以上就可以发文章了,但要根据具体阈值来。
2.3 命中率 POD (Probability of Detection)
P O D = a a + c POD = \frac{a}{a+c} POD=a+ca
- 含义:实况出现了,你报出来的概率。完美为1。
- 弥补了TS对漏报的“粗放”,但单独看POD可能会很高,如果你“天天报有”,那a很大,c很小,POD接近1,但空报会爆炸。
2.4 虚警率 FAR (False Alarm Ratio)
F A R = b a + b FAR = \frac{b}{a+b} FAR=a+bb
- 含义:你只要报了“有”,其中多少是空报。完美为0。
- 与POD是一对博弈关系,提高POD往往以增加FAR为代价。
⚠️ 容易混淆的概念:False Alarm Rate 也叫 POFD = b/(b+d),表示无事件时你乱报的概率。本文FAR特指气象常用的“空报率”。
2.5 漏报率 MAR (Miss Alarm Ratio)
M
A
R
=
c
a
+
c
=
1
−
P
O
D
MAR = \frac{c}{a+c} = 1 - POD
MAR=a+cc=1−POD
实况发生了,你却漏掉的比例。
2.6 预报偏差 Bias
B i a s = a + b a + c Bias = \frac{a+b}{a+c} Bias=a+ca+b
- Bias >1:预报发生的次数比实况多,过度预报,容易空报。
- Bias <1:预报次数少于实况,过于保守,容易漏报。
- Bias = 1 表示预报次数和实况次数一致(并不代表完全准确,只是总数相当)。
2.7 ETS公平技巧评分 (Equitable Threat Score)
TS评分的一个缺陷是未排除随机命中的贡献。ETS则扣除了随机期望:
a
r
=
(
a
+
b
)
(
a
+
c
)
n
,
n
=
a
+
b
+
c
+
d
a_r = \frac{(a+b)(a+c)}{n}, \quad n=a+b+c+d
ar=n(a+b)(a+c),n=a+b+c+d
E
T
S
=
a
−
a
r
a
+
b
+
c
−
a
r
ETS = \frac{a - a_r}{a+b+c - a_r}
ETS=a+b+c−ara−ar
- 范围:-1/3 ~ 1,0表示无技巧。
- 优点:更公平,可对不同样本量进行对比。强对流、降水概率预报的“标准答案”之一。
2.8 HSS海德克技巧评分 (Heidke Skill Score)
也是常用技巧评分,考虑了a、b、c、d全部信息:
H
S
S
=
2
(
a
d
−
b
c
)
(
a
+
c
)
(
c
+
d
)
+
(
a
+
b
)
(
b
+
d
)
HSS = \frac{2(ad - bc)}{(a+c)(c+d)+(a+b)(b+d)}
HSS=(a+c)(c+d)+(a+b)(b+d)2(ad−bc)
完美为1,0表示无技巧,负值比随机还差。
3. Python实战:一键计算所有指标
下面给出一个函数,输入四个数,直接返回一个包含TS、POD、FAR、Bias、ETS、HSS等字典。可以直接用在你的后处理脚本里。
def calc_verification(a, b, c, d):
"""
计算二分类预报检验指标
:param a: 命中 Hit
:param b: 空报 False Alarm
:param c: 漏报 Miss
:param d: 正确否定 Correct Negative
:return: dict
"""
n = a + b + c + d
metrics = {}
# 准确率
metrics['ACC'] = (a + d) / n if n > 0 else float('nan')
# TS评分 (CSI)
denom_ts = a + b + c
metrics['TS'] = a / denom_ts if denom_ts > 0 else float('nan')
# 命中率 POD
denom_pod = a + c
metrics['POD'] = a / denom_pod if denom_pod > 0 else float('nan')
# 虚警率 FAR (空报率)
denom_far = a + b
metrics['FAR'] = b / denom_far if denom_far > 0 else float('nan')
# 漏报率 MAR
metrics['MAR'] = c / denom_pod if denom_pod > 0 else float('nan')
# 预报偏差 Bias
metrics['Bias'] = (a + b) / denom_pod if denom_pod > 0 else float('nan')
# ETS公平TS
if n > 0 and denom_ts > 0:
ar = (a + b) * (a + c) / n
metrics['ETS'] = (a - ar) / (denom_ts - ar) if denom_ts != ar else float('nan')
else:
metrics['ETS'] = float('nan')
# HSS
if n > 0:
num = 2 * (a*d - b*c)
denom_hss = (a+c)*(c+d) + (a+b)*(b+d)
metrics['HSS'] = num / denom_hss if denom_hss != 0 else float('nan')
else:
metrics['HSS'] = float('nan')
return metrics
# 示例:假设有1000个格点/样本
a, b, c, d = 80, 30, 20, 870
res = calc_verification(a, b, c, d)
for k, v in res.items():
print(f"{k}: {v:.3f}")
输出如下:
ACC: 0.950
TS: 0.615
POD: 0.800
FAR: 0.273
MAR: 0.200
Bias: 1.100
ETS: 0.517
HSS: 0.674
解读:准确率虽高,但那是d多造成的;TS=0.615算是相当不错;POD 0.8说明80%的实况降水都被捕捉到;FAR 0.273代表报了四次有降水,大约有一次是空报;偏差1.1稍微有点“偏向多报”,总体可以接受。
4. 业务中多指标怎么组合看?
- TS + Bias:经典组合,TS看准确,Bias看倾向。TS高而Bias远离1,可能是有系统的空报/漏报。
- POD + FAR:直接反映命中与虚警的平衡。在降水检验图上常画POD-FAR曲线(类似ROC)。
- ETS:当你需要在不同样本、不同季节间比较模型技巧,用ETS比TS更公平。
- HSS:同样适合公平比较,尤其是在“全报无”也能高分的情景下,HSS会把这种懒惰模型打回原形。
实际检验往往还用到降水量级分级检验(小雨、中雨、大雨……),对每一级降水分别算TS等。本质上还是这个框架。
5. 小结
写气象预报算法时,别再说“我模型准确率90%”这种容易被怼的话了。老老实实把列联表算出来,一票指标跑一遍。尤其 TS评分,是气象入门的必修课。
上面这段Python代码,你可以封装到自己的检验模块里,搭配pandas批量计算不同时段、不同站点的指标,一键出图,非常实用。
希望这篇文章帮你理清了 TS、POD、FAR、ETS…… 那些眼花缭乱的符号。下一步,拿起你的预报场和观测场,去算一算模型的“真实水平”吧!
📊 觉得有用?点个赞、收藏,防丢备用。
(气象检验系列持续更新,下次聊聊概率预报的Brier评分和可靠性图)
&spm=1001.2101.3001.5002&articleId=161472535&d=1&t=3&u=71fcf5577f3a4e3da2576ce500a68fd9)
816

被折叠的 条评论
为什么被折叠?



