brier_score_loss#

sklearn.metrics.brier_score_loss(y_true, y_proba, *, sample_weight=None, pos_label=None, labels=None, scale_by_half='auto')[source]#

计算 Brier 分数损失。

布里尔分数损失越小越好,因此以“损失”命名。布里尔分数衡量预测概率与实际结果之间的均方差。布里尔分数是一种严格的适当评分规则。

用户指南中了解更多信息。

参数:
y_true形状为 (n_samples,) 的 array-like

真实目标值。

y_proba形状为 (n_samples,) 或 (n_samples, n_classes) 的类似数组对象

预测概率。如果 y_proba.shape = (n_samples,),则提供的概率被假定为正类的概率。如果 y_proba.shape = (n_samples, n_classes),则 y_proba 中的列被假定对应于按字母顺序排列的标签,这与 LabelBinarizer 的做法一致。

sample_weightshape 为 (n_samples,) 的 array-like, default=None

样本权重。

pos_labelint, float, bool or str, default=None

y_proba.shape = (n_samples,) 时,正类的标签。如果未提供,pos_label 将按以下方式推断:

  • 如果 y_true 在 {-1, 1} 或 {0, 1} 中,pos_label 默认为 1;

  • 否则,如果 y_true 包含字符串,将引发错误,且应明确指定 pos_label

  • 否则,pos_label 默认为较大的标签,即 np.unique(y_true)[-1]

labels形状为 (n_classes,) 的类数组对象, 默认为 None

y_proba.shape = (n_samples, n_classes) 时,类标签。如果未提供,标签将从 y_true 推断。

在版本 1.7 中新增。

scale_by_halfbool 或 “auto”, default=”auto”

当为 True 时,将布里尔分数除以 1/2,使其范围位于 [0, 1] 而不是 [0, 2]。默认的 “auto” 选项仅对二分类(习惯上如此)进行重新缩放至 [0, 1],但保留多分类的原始 [0, 2] 范围。

在版本 1.7 中新增。

返回:
scorefloat

布里尔分数损失。

注意事项

对于 \(N\) 个观测值,标签来自 \(C\) 个可能的类别,布里尔分数定义为

\[\frac{1}{N}\sum_{i=1}^{N}\sum_{c=1}^{C}(y_{ic} - \hat{p}_{ic})^{2}\]

其中 \(y_{ic}\) 如果观测值 i 属于类别 c 则为 1,否则为 0;\(\hat{p}_{ic}\) 是观测值 i 属于类别 c 的预测概率。布里尔分数范围在 \([0, 2]\) 之间。

在二分类任务中,布里尔分数通常除以二,然后范围在 \([0, 1]\) 之间。它也可以写成

\[\frac{1}{N}\sum_{i=1}^{N}(y_{i} - \hat{p}_{i})^{2}\]

其中 \(y_{i}\) 是二元目标,\(\hat{p}_{i}\) 是正类的预测概率。

References

示例

>>> import numpy as np
>>> from sklearn.metrics import brier_score_loss
>>> y_true = np.array([0, 1, 1, 0])
>>> y_true_categorical = np.array(["spam", "ham", "ham", "spam"])
>>> y_prob = np.array([0.1, 0.9, 0.8, 0.3])
>>> brier_score_loss(y_true, y_prob)
0.0375
>>> brier_score_loss(y_true, 1-y_prob, pos_label=0)
0.0375
>>> brier_score_loss(y_true_categorical, y_prob, pos_label="ham")
0.0375
>>> brier_score_loss(y_true, np.array(y_prob) > 0.5)
0.0
>>> brier_score_loss(y_true, y_prob, scale_by_half=False)
0.075
>>> brier_score_loss(
...    ["eggs", "ham", "spam"],
...    [[0.8, 0.1, 0.1], [0.2, 0.7, 0.1], [0.2, 0.2, 0.6]],
...    labels=["eggs", "ham", "spam"]
... )
0.146