这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战
Jaccard相似系数
jaccard_score函数计算标签集对之间的 Jaccard 相似系数的平均值,也称为 Jaccard 指数。
第 i 个样本的 Jaccard 相似系数,具有真实标签集和预测标签集,其公式定义为:
jaccard_score的工作原理与precision_recall_fscore_support类似,它是一种集合式度量方式,适用于二分类问题,并可以通过使用average参数扩展到适用于多标签和多分类场景。
二分类场景的示例代码如下:
import numpy as np
from sklearn.metrics import jaccard_score
y_true = np.array([[0, 1, 1],
[1, 1, 0]])
y_pred = np.array([[1, 1, 1],
[1, 0, 0]])
print(jaccard_score(y_true[0], y_pred[0]))
print(jaccard_score(y_true[1], y_pred[1]))
运行结果:
0.6666666666666666
0.5
在具有二标签指示器的多标签场景下:
# (0.5+0.66666)/2 = 0.58333
print(jaccard_score(y_true, y_pred, average='samples'))
# (1/2+1/2+2/2)/3
print(jaccard_score(y_true, y_pred, average='macro'))
print(jaccard_score(y_true, y_pred, average=None))
运行结果:
0.5833333333333333
0.6666666666666666
[0.5 0.5 1. ]
多分类问题被二值化并像多标签问题一样处理:
y_pred = [0, 2, 1, 2]
y_true = [0, 1, 2, 2]
print(jaccard_score(y_true, y_pred, average=None)) # 1/1 0/2 1/3
print(jaccard_score(y_true, y_pred, average='macro')) # (1+0.333)/3=0.444
print(jaccard_score(y_true, y_pred, average='micro')) # (1+1)/(1+2+3)
运行结果:
[1. 0. 0.33333333]
0.4444444444444444
0.3333333333333333
铰链损失(Hinge loss)
hinge_loss函数使用铰链损失计算模型与数据之间的平均距离,铰链损失是一种仅考虑预测误差的单边度量。(铰链损失用于最大边缘分类器,例如支持向量机。)
如果标签用+1和-1编码,y是真实值,w是decision_function输出的预测决策,则铰链损失定义为:
如果有两个以上的标签,hinge_loss使用多分类变体。
如果 是真实标签的预测决策, 是所有其他标签的预测决策的最大值,其中预测决策由决策函数输出,则多分类铰链损失定义为:
这里有一个小例子,演示了二分类问题中在svm分类器下使用铰链损失函数:
from sklearn import svm
from sklearn.metrics import hinge_loss
X = [[0],
[1]]
y = [-1, 1]
est = svm.LinearSVC(random_state=0)
est.fit(X, y)
pred_decision = est.decision_function([[-2],
[3],
[0.5]])
print(pred_decision)
print(hinge_loss([-1, 1, 1], pred_decision))
运行结果:
[-2.18177944 2.36355888 0.09088972]
0.3030367603854425
这是一个示例,演示了在多分类问题中在带有svm分类器下使用铰链损失函数:
X = np.array([[0],
[1],
[2],
[3]])
Y = np.array([0, 1, 2, 3])
labels = np.array([0, 1, 2, 3])
est = svm.LinearSVC()
est.fit(X, Y)
pred_decision = est.decision_function([[-1],
[2],
[3]])
print(pred_decision)
y_true = [0, 2, 3]
print(hinge_loss(y_true, pred_decision, labels=labels))
运行结果:
[[ 1.27270694 0.03417093 -0.68376942 -1.4016749 ]
[-1.45454139 -0.58116657 -0.37610526 -0.17099403]
[-2.36362417 -0.78627908 -0.27355054 0.23923292]]
0.5641092543547738
对数损失(Log loss)
对数损失,也称为逻辑回归损失或交叉熵损失,是在概率估计上定义的。 它通常用于 (多项式)逻辑回归 和 神经网络 ,以及期望最大化(expectation-maximization,EM算法)的一些变体,并且可用于评估分类器的概率输出(predict_proba)而不是其离散预测。
对于具有真实标签 和概率估计 的二分类,每个样本的对数损失是给定真实标签的分类器的负对数似然:
从二分类扩展到多分类情况如下,让一组样本的真实标签被编码为1到K的二元指示矩阵Y,即,如果样本i的标签k来自一组K个标签,则。令P为概率估计矩阵,其中, 。 那么整个集合的对数损失为:
要了解这如何概括上面给出的二元对数损失,请注意在二分类情况下, 和 ,因此,在 上扩展内部总和给出二元对数损失。
log_loss函数计算对数损失,根据估计器的predict_proba方法返回的真实标签列表和概率矩阵。
示例代码:
from sklearn.metrics import log_loss
y_true = [0, 0, 1, 1]
y_pred = [[.9, .1], [.8, .2], [.3, .7], [.01, .99]]
print(log_loss(y_true, y_pred))
运行结果:
0.1738073366910675
其中,y_pred 中的第一个[.9, .1]表示第一个样本的标签为 0 的概率为 90%。对数损失是非负的。
总结
| 函数 | 说明 |
|---|---|
jaccard_score | 计算Jaccard 相似系数,适用于二分类、多分类和多标签场景。 |
log_loss | 计算对数损失,也称为逻辑损失或交叉熵损失,适用于二分类、多分类和多标签场景。 |
hinge_loss | 计算铰链损失,适用于二分类和多分类。 |