类别似然比#

sklearn.metrics.class_likelihood_ratios(y_true, y_pred, *, labels=None, sample_weight=None, raise_warning='deprecated', replace_undefined_by=nan)[source]#

计算二元分类的正似然比和负似然比。

正似然比为 LR+ = sensitivity / (1 - specificity),其中 sensitivity(或 recall)是比率 tp / (tp + fn),specificity 是 tn / (tn + fp)。负似然比为 LR- = (1 - sensitivity) / specificity。这里 tp 是真阳性数量,fp 是假阳性数量,tn 是真阴性数量,fn 是假阴性数量。两个类别似然比都可用于在给定预测试概率的情况下获得后测试概率。

LR+ 的范围是 1.0 到无穷大。 LR+ 为 1.0 表示预测阳性类别的概率对于属于任一类别的样本都是相同的;因此,该测试是无用的。 LR+ 越大,与预测试概率相比,阳性预测是真阳性的可能性就越大。低于 1.0 的 LR+ 值是无效的,因为它表示样本是真阳性的几率相对于预测试几率而言有所下降。

LR- 的范围是 0.0 到 1.0。它越接近 0.0,给定样本为假阴性的概率就越低。 LR- 为 1.0 意味着该测试是无用的,因为在测试后,具有该条件的几率没有改变。大于 1.0 的 LR- 值会使分类器无效,因为它表示在被分类为阴性后,样本属于阳性类别的几率增加了。当分类器系统性地预测与真实标签相反的结果时,就会出现这种情况。

医学中的一个典型应用是分别将阳性/阴性类别识别为疾病的存在/不存在;分类器作为诊断测试;个体患病的预测试概率可以是该疾病的患病率(特定人群中受医疗状况影响的比例);而后测试概率将是在给定阳性测试结果的情况下,该状况确实存在的概率。

用户指南中阅读更多内容。

参数:
y_true1D 数组状对象,或标签指示器数组/稀疏矩阵

真实(正确)的目标值。

y_pred1D 数组状对象,或标签指示器数组/稀疏矩阵

分类器返回的估计目标。

labels数组状对象,默认值=None

用于索引矩阵的标签列表。这可用于通过排序 labels=[negative_class, positive_class] 选择阳性类和阴性类。如果给定 None,则使用在 y_truey_pred 中至少出现一次的标签,并按排序顺序使用。

sample_weight形状为 (n_samples,) 的数组状对象,默认值=None

样本权重。

raise_warning布尔值,默认值=True

当出现除以零的情况时,是否引发特定情况的警告消息。

自 1.7 版起已弃用: raise_warning 在 1.7 版中已弃用,并将在 1.9 版中移除,届时在出现除以零的情况下,将始终引发 UndefinedMetricWarning

replace_undefined_bynp.nan, 1.0, 或 dict,默认值=np.nan

当出现除以零的情况时,设置 LR+ 和 LR- 的返回值。可取以下值:

  • np.nan 表示对 LR+LR- 都返回 np.nan

  • 1.0 表示返回最差得分: {"LR+": 1.0, "LR-": 1.0}

  • 格式为 {"LR+": value_1, "LR-": value_2} 的字典,其中值可以是似然比范围内的非负浮点数、 np.infnp.nan。例如, {"LR+": 1.0, "LR-": 1.0} 可用于返回最差分数,表示模型无用,而 {"LR+": np.inf, "LR-": 0.0} 可用于返回最佳分数,表示模型有用。

如果发生除以零,则只替换受影响的指标,其他指标照常计算。

在 1.7 版中新增。

返回:
(positive_likelihood_ratio, negative_likelihood_ratio)元组

一个包含两个浮点数的元组,第一个是正似然比(LR+),第二个是负似然比(LR-)。

警告:
y_true
y_pred 导致以下情况时,会引发 UndefinedMetricWarning
  • 假阳性数量为 0 且 raise_warning 设置为 True (默认):正似然比未定义。

  • 真阴性数量为 0 且 raise_warning 设置为 True (默认):负似然比未定义。

  • 真阳性与假阴性之和为 0(y_true 中不存在阳性类样本):两个似然比均未定义。

对于前两种情况,可以通过设置 replace_undefined_by 参数来定义未定义的指标。

参考文献

示例

>>> import numpy as np
>>> from sklearn.metrics import class_likelihood_ratios
>>> class_likelihood_ratios([0, 1, 0, 1, 0], [1, 1, 0, 0, 0])
(1.5, 0.75)
>>> y_true = np.array(["non-cat", "cat", "non-cat", "cat", "non-cat"])
>>> y_pred = np.array(["cat", "cat", "non-cat", "non-cat", "non-cat"])
>>> class_likelihood_ratios(y_true, y_pred)
(1.33, 0.66)
>>> y_true = np.array(["non-zebra", "zebra", "non-zebra", "zebra", "non-zebra"])
>>> y_pred = np.array(["zebra", "zebra", "non-zebra", "non-zebra", "non-zebra"])
>>> class_likelihood_ratios(y_true, y_pred)
(1.5, 0.75)

为避免歧义,请使用 labels=[negative_class, positive_class] 标记。

>>> y_true = np.array(["non-cat", "cat", "non-cat", "cat", "non-cat"])
>>> y_pred = np.array(["cat", "cat", "non-cat", "non-cat", "non-cat"])
>>> class_likelihood_ratios(y_true, y_pred, labels=["non-cat", "cat"])
(1.5, 0.75)