欢迎光临
我们一直在努力

一文讲透气象预报检验指标:TS评分、命中率、虚警率……(附Python实战)

文章目录

    • 1. 二分类预报的“四格表”
    • 2. 核心指标大盘点
      • 2.1 准确率(Accuracy)
      • 2.2 TS评分(Threat Score, CSI)
      • 2.3 命中率 POD (Probability of Detection)
      • 2.4 虚警率 FAR (False Alarm Ratio)
      • 2.5 漏报率 MAR (Miss Alarm Ratio)
      • 2.6 预报偏差 Bias
      • 2.7 ETS公平技巧评分 (Equitable Threat Score)
      • 2.8 HSS海德克技巧评分 (Heidke Skill Score)
    • 3. Python实战:一键计算所有指标
    • 4. 业务中多指标怎么组合看?
    • 5. 小结

前言
在气象预报、短临降水预测、强对流天气预报等领域,评价一个预报系统好坏,不是看一眼“准不准”就完了。尤其对于降水有无、雷暴有无这类
二分类事件,业界有一整套约定俗成的检验指标,比如大家经常听到的
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=1POD 实况发生了,你却漏掉的比例。

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+caraar

  • 范围:-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(adbc) 完美为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评分和可靠性图)

赞(0)
未经允许不得转载:171主机测评 » 一文讲透气象预报检验指标:TS评分、命中率、虚警率……(附Python实战)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址