サブセットの精度は確かに厳しいメトリックです。0.29がどれだけ良いか悪いかの感覚をつかむために、いくつかのアイデアがあります:
- 各サンプルの平均ラベル数を調べます
- 可能な場合は、アノテーター間の合意を確認します(利用できない場合は、分類者であるときにどのサブセットの精度が得られたかを確認してください)
- トピックが明確に定義されているかどうかを考える
- 各ラベルにいくつのサンプルがあるかを見てください
また、ハミングスコアを計算して、分類器が無知であるかどうかを確認することもできます。以下を参照して、ハミングスコアを計算してください。
同時に、理解したことから、scikit.metricsをOneVsRestClassifierで使用できないので、何が間違っているかを把握するために、どのようにいくつかのメトリック(F1、Precision、Recallなど)を取得できますか?
マルチクラス-マルチラベル分類の精度/リコールの計算方法を参照してください?。私はsklearnがそれをサポートしているかどうか忘れていました。例えば、sklearnは混同行列のマルチラベルをサポートしていません。これらの数字を実際に見るのは良い考えです。
ハミングスコア:
でマルチラベル分類設定、sklearn.metrics.accuracy_score
のみ計算サブセット精度すなわち正確y_trueのラベルの対応するセットと一致している必要があり、試料について予測ラベルのセット:(3)。
精度を計算するこの方法は、正確な一致率(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。「マルチラベル分類の識別方法。」知識発見とデータマイニングの進歩。スプリンガーベルリンハイデルベルク、2004年。