子集精度确实是一个苛刻的指标。为了了解0.29的好坏,一些想法:
- 看一下每个样本平均有多少个标签
- 查看注释者之间的协议(如果可用)(如果不可行,请尝试一下,看看您是分类器时获得了什么子集准确性)
- 考虑主题是否定义明确
- 看看每个标签有多少样本
您可能还需要计算汉明分数,以查看分类器是否无能为力,还是不错,但在正确预测所有标签方面存在问题。参见下文以计算汉明得分。
同时,据我了解,我无法将scikit.metrics与OneVsRestClassifier一起使用,因此如何获取一些指标(F1,Precision,Recall等)以找出问题所在?
请参阅如何为多类-多标签分类计算精度/召回率?。我忘了sklearn是否支持它,我记得它有一些局限性,例如sklearn不支持混淆矩阵的多标签。确实看到这些数字将是一个好主意。
海明得分:
在多标签分类设置中,sklearn.metrics.accuracy_score
仅计算子集准确性(3):即,为样本预测的标签集必须与y_true中的相应标签集完全匹配。
这种计算准确性的方法有时被称为精确匹配率(1),可能不太明确:
计算精度的另一种典型方法是在(1)和(2)中定义,并且不太明确地称为汉明得分(4)(因为它与汉明损耗密切相关)或基于标签的精度。计算如下:
这是一个计算汉明分数的python方法:
# Code by /programming//users/1953100/william
# Source: /programming//a/32239764/395857
# License: cc by-sa 3.0 with attribution required
import numpy as np
y_true = np.array([[0,1,0],
[0,1,1],
[1,0,1],
[0,0,1]])
y_pred = np.array([[0,1,1],
[0,1,1],
[0,1,0],
[0,0,0]])
def hamming_score(y_true, y_pred, normalize=True, sample_weight=None):
'''
Compute the Hamming score (a.k.a. label-based accuracy) for the multi-label case
/programming//q/32239577/395857
'''
acc_list = []
for i in range(y_true.shape[0]):
set_true = set( np.where(y_true[i])[0] )
set_pred = set( np.where(y_pred[i])[0] )
#print('\nset_true: {0}'.format(set_true))
#print('set_pred: {0}'.format(set_pred))
tmp_a = None
if len(set_true) == 0 and len(set_pred) == 0:
tmp_a = 1
else:
tmp_a = len(set_true.intersection(set_pred))/\
float( len(set_true.union(set_pred)) )
#print('tmp_a: {0}'.format(tmp_a))
acc_list.append(tmp_a)
return np.mean(acc_list)
if __name__ == "__main__":
print('Hamming score: {0}'.format(hamming_score(y_true, y_pred))) # 0.375 (= (0.5+1+0+0)/4)
# For comparison sake:
import sklearn.metrics
# Subset accuracy
# 0.25 (= 0+1+0+0 / 4) --> 1 if the prediction for one sample fully matches the gold. 0 otherwise.
print('Subset accuracy: {0}'.format(sklearn.metrics.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)))
# Hamming loss (smaller is better)
# $$ \text{HammingLoss}(x_i, y_i) = \frac{1}{|D|} \sum_{i=1}^{|D|} \frac{xor(x_i, y_i)}{|L|}, $$
# where
# - \\(|D|\\) is the number of samples
# - \\(|L|\\) is the number of labels
# - \\(y_i\\) is the ground truth
# - \\(x_i\\) is the prediction.
# 0.416666666667 (= (1+0+3+1) / (3*4) )
print('Hamming loss: {0}'.format(sklearn.metrics.hamming_loss(y_true, y_pred)))
输出:
Hamming score: 0.375
Subset accuracy: 0.25
Hamming loss: 0.416666666667
(1)Sorower,Mohammad S.“ 关于多标签学习算法的文献调查。 ”俄勒冈州立大学,科瓦利斯(2010)。
(2)Tsoumakas,Grigorios和Ioannis Katakis。“ 多标签分类:概述。 ”希腊塞萨洛尼基亚里斯多德大学信息学系(2006年)。
(3)Ghamrawi,Nadia和Andrew McCallum。“ 集体多标签分类。 ”第14届ACM信息和知识管理国际会议论文集。ACM,2005年。
(4)Godbole,Shantanu和Sunita Sarawagi。“ 多标签分类的判别方法。 ”知识发现和数据挖掘的进展。Springer Berlin Heidelberg,2004年。22-30。