类似度比#

sklearn.metrics.class_likelihood_ratios(y_true, y_pred, *, labels=None, sample_weight=None, raise_warning=True)[source]#

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

阳性似然比为 LR+ = sensitivity / (1 - specificity),其中灵敏度或召回率为 tp / (tp + fn),特异性为 tn / (tn + fp)。阴性似然比为 LR- = (1 - sensitivity) / specificity。这里 tp 是真阳性数,fp 是假阳性数,tn 是真阴性数,fn 是假阴性数。两种类别似然比都可用于根据测试前概率获得测试后概率。

LR+ 的取值范围从 1 到无穷大。LR+ 为 1 表示预测阳性类别的概率对于属于任一类别的样本都是相同的;因此,该测试毫无用处。LR+ 越大,与测试前概率相比,阳性预测越可能是真阳性。如果 LR+ 值小于 1,则无效,因为它表示样本为真阳性的几率相对于测试前几率会降低。

LR- 的取值范围从 0 到 1。它越接近 0,给定样本为假阴性的概率就越低。LR- 为 1 表示测试毫无用处,因为测试后患病几率没有变化。LR- 值大于 1 会使分类器失效,因为它表示在被分类为阴性后,样本属于阳性类的几率增加。当分类器系统地预测与真实标签相反的结果时,就会出现这种情况。

医学中的一个典型应用是将阳性/阴性类别分别识别为疾病的存在/不存在;分类器是一个诊断测试;个人患病的测试前概率可以是该疾病的患病率(特定人群中发现受某种疾病影响的比例);测试后概率将是给定阳性测试结果后疾病真正存在的概率。

更多信息请阅读 用户指南

参数:
y_true一维数组或标签指示符数组/稀疏矩阵

真实目标值。

y_pred一维数组或标签指示符数组/稀疏矩阵

分类器返回的估计目标值。

labels类数组,默认为 None

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

sample_weight形状为 (n_samples,) 的类数组,默认为 None

样本权重。

raise_warning布尔值,默认为 True

当出现零除法时是否引发特定情况的警告消息。即使没有引发错误,函数在这种情况下也会返回 nan。

返回值:
(positive_likelihood_ratio, negative_likelihood_ratio)元组

包含两个浮点数的元组,第一个是阳性似然比,第二个是阴性似然比。

警告:
false positive == 0 时,阳性似然比未定义。
true negative == 0 时,阴性似然比未定义。
true positive + false negative == 0 时,两个比率均未定义。
在这种情况下,如果 raise_warning=True,则会引发 UserWarning

参考文献

示例

>>> import numpy as np
>>> from sklearn.metrics import class_likelihood_ratios
>>> class_likelihood_ratios([0, 1, 0, 1, 0], [1, 1, 0, 0, 0])
(np.float64(1.5), np.float64(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)
(np.float64(1.33...), np.float64(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)
(np.float64(1.5), np.float64(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"])
(np.float64(1.5), np.float64(0.75))