- 首先查看metrics官方文档:https://scikit-learn.org/stable/api/sklearn.metrics.html
weighted/macro/micro/samples的区别
weighted 和 samples
weighted 这个参数在 roc_auc_score
函数中,其实就是考虑了 true instance
的情况(也就是需要传一个sample_weights的参数?)。
-
官方文档的原文:when average=weighted, calculate metrics for each label, and find their average, weighted by support (the number of true instances for each label).
-
我做了几次实验,average=samples的时候,auc比macro/micro/weighted都要高几个点,这是正常的吗?
def case_multilabels():
print("case_multilabels")
output = []
target = []
weights = []
for i in range(100):
weights.append(np.random.randint(10, 100))
prob = np.random.rand(3)
prob_norm = prob / np.sum(prob)
output.append(prob_norm)
label = [0, 0, np.random.randint(0, 2)]
label[i%3] = 1
# if i == 0:
# label = [1, 1, 1] # average=samples不能有全1的样本?
target.append(label)
target = np.array(target)
output = np.array(output)
auc_weights = roc_auc_score(target, output, average='weighted', sample_weight=weights, multi_class='ovo')
auc_binary = roc_auc_score(target, output, average='weighted', multi_class='ovo')
auc_macro = roc_auc_score(target, output, average='macro')
auc_micro = roc_auc_score(target, output, average='micro')
auc_sample = roc_auc_score(target, output, average='samples')
print("auc_weights: ", auc_weights)
print("auc_binary: ", auc_binary)
print("auc_macro: ", auc_macro)
print("auc_micro: ", auc_micro)
print("auc_sample: ", auc_sample)
macro 和 micro 的区别
样本1:实际标签为 A,预测为 [0.6, 0.2, 0.2]
样本2:实际标签为 B,预测为 [0.1, 0.7, 0.2]
样本3:实际标签为 C,预测为 [0.2, 0.1, 0.7]
构建的标签指示矩阵可能如下所示:
macro是单独计算每个类别的auc/f1/recall/precision/混淆矩阵,然后最后平均。
- 混淆矩阵是求和,不是平均!
micro是求出了上面的全局0-1矩阵之后,全局地计算auc/f1/recall/porecision。
- 即变成了下面的情况再计算auc/f1/混淆矩阵。
- 概率矩阵为 [0.6, 0.2, 0.2, … , 0.2, 0.1, 0.7]
- 标签矩阵为 [1, 0, 0, …, 0, 0, 1]
F1/Recall/Precision
- 二分类使用
binary
和macro
计算得到的结果是一样的,默认是binary
- 多分类的时候使用
macro
就可以了 - 多标签任务的时候,也可以使用
macro
- average参数可以设置为
None
,这个时候就会返回各个类的指标。 - 默认是
multi_class='ovr'
,不需要改动
AUC
- 二分类的时候,使用
weighted
或者macro
计算出来的结果都是一样的,不过默认选择macro
就好了 roc_auc_score
默认使用macro
- 不管是多分类还是多标签,
macro
就没错了。 - average参数可以设置为
None
,这个时候就会返回各个类的指标。 - 默认是
multi_class='ovr'
,不需要改动
ovo (one vs. one) 和 ovr (one vs. rest) 的区别
ovo和ovr都是把多分类转成二分类问题的方法。
在计算指标的过程中,选取第
i
i
i 类为正类,其它类则为负类的时候,则属于 ovr
。
而 ovo 则是投票的计算方法:
- 我也不知道auc/f1计算的时候选上
multiclass='ovo'
有什么用