区間予測の評価指標#
D2 pinball score#
\(D^2\)は決定係数\(R^2\)の一般化
\[
D^2(y, \hat{y}) = 1 - \frac{\text{dev}(y, \hat{y})}{\text{dev}(y, y_{\text{null}})}
\]
ここで\(y_{\text{null}}\)は切片のみのモデルの最適解(例:二乗誤差なら\(y\)の平均値、絶対誤差なら\(y\)の中央値、pinball lossなら\(y\)の指定されたquantile)
この\(D^2\)に
\[\begin{split}
\text{dev}(y, \hat{y})
= \text{pinball}(y, \hat{y})
= \begin{cases}
(\tau - 1) (y - \hat{y}) & \text{ if } (y - \hat{y}) \leq 0\\
\tau (y - \hat{y}) & \text{ if } (y - \hat{y}) > 0\\
\end{cases}
\end{split}\]
を代入したものが\(D^2\) pinball score
(参考:3.3. Metrics and scoring: quantifying the quality of predictions — scikit-learn 1.4.1 documentation)
interval score#
\((1 - \alpha)\times 100\text{%}\)予測区間を\([l, u]=[\frac{\alpha}{2}, 1 - \frac{\alpha}{2}]\) quantileで構築したとする。
interval scoreは真の値を\(x\)として
\[
S_{\alpha}(l, u; x)
= (u - l)
+ \frac{2}{\alpha} (l - x) \mathbb{1}\{ x < l \}
+ \frac{2}{\alpha} (x - u) \mathbb{1}\{ x > u \}
\]
となる。(スコアが小さいほうが良いモデルを意味する)
import numpy as np
def interval_score(l, u, x, alpha):
return (u - l) + (2 / alpha) * (l - x) * (x < l) + (2 / alpha) * (x - u) * (x > u)
alpha = 0.05
true_values = 5
# 予測1
lower, upper = (1, 10)
s1 = interval_score(lower, upper, true_values, alpha)
# 予測2
lower, upper = (4, 6)
s2 = interval_score(lower, upper, true_values, alpha)
print(f"{s1=}, {s2=}")
s1=9.0, s2=2.0