1

私は文カテゴリ検出の問題に取り組んでいます。各文章が複数のカテゴリに属する​​ことができる例:マルチラベル分類でF1測定値を計算するにはどうすればよいですか?

"It has great sushi and even better service." 
True Label: [[ 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1.]] 
Pred Label: [[ 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1.]] 
Correct Prediction! 
Output: ['FOOD#QUALITY' 'SERVICE#GENERAL'] 

私は複数のカテゴリを予測できる分類子を実装しています。私は複数のカテゴリに属する​​合計587の文章を持っています。私は2つの方法で精度スコアを計算しました。

例のすべてのラベルが予測されるかどうかを確認しますか?

コード:

print "<------------ZERO one ERROR------------>" 
print "Total Examples:",(truePred+falsePred) ,"True Pred:",truePred, "False Pred:", falsePred, "Accuracy:", truePred/(truePred+falsePred) 

出力:正しく、すべての例のために予測されているどのように多くのラベル

<------------ZERO one ERROR------------> 
Total Examples: 587 True Pred: 353 False Pred: 234 Accuracy: 0.60136286201 

コード:

print "\n<------------Correct and inccorrect predictions------------>" 
print "Total Labels:",len(total[0]),"Predicted Labels:", corrPred, "Accuracy:", corrPred/len(total[0]) 

出力:

<------------Correct and inccorrect predictions------------> 
Total Labels: 743 Predicted Labels: 522 Accuracy: 0.702557200538 

問題: これらのグランドトゥルースラベルを予測スコアを比較することによって計算され、すべての精度のスコアです。しかし、私はF1のスコア(マイクロ平均化を使用して)、精度とリコールも計算したい。私は真実のラベルを粉砕しているので、私はそれらの粉砕真理のラベルと私の予測を一致させる必要があります。しかし、私はどのように私はこの種のマルチラベル分類問題に取り組んでいるのか分かりません。 scikit-learnやその他のライブラリをPythonで使用できますか?

答えて

1

私は予測したラベルpredictedlabelの行列を作り、私はすでにy_testで私の結果を比較するために、正しいカテゴリを持っていた

。だから、私は次のコードを試してみました:

from sklearn.metrics import classification_report 
from sklearn.metrics import f1_score 
from sklearn.metrics import roc_auc_score 

print "Classification report: \n", (classification_report(y_test, predictedlabel)) 
print "F1 micro averaging:",(f1_score(y_test, predictedlabel, average='micro')) 
print "ROC: ",(roc_auc_score(y_test, predictedlabel)) 

を、私は次のような結果だ:だから

 precision recall f1-score support 

     0  0.74  0.93  0.82  57 
     1  0.00  0.00  0.00   3 
     2  0.57  0.38  0.46  21 
     3  0.75  0.75  0.75  12 
     4  0.44  0.68  0.54  22 
     5  0.81  0.93  0.87  226 
     6  0.57  0.54  0.55  48 
     7  0.71  0.38  0.50  13 
     8  0.70  0.72  0.71  142 
     9  0.33  0.33  0.33  33 
    10  0.42  0.52  0.47  21 
    11  0.80  0.91  0.85  145 

    av/total 0.71  0.78  0.74  743 

F1 micro averaging: 0.746153846154 
ROC: 0.77407943841 

を、私はこのように私の結果を計算しています!

1

既にsklearnで利用可能なmetricsを見て、それらを理解してください。これらはマルチラベルマルチラベル分類には使用できないため、独自のラベルを作成したり、カテゴリをラベルにマップすることができます。

[ 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1.] => 0 
[ 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.] => 1 
... 

あなたは、このソリューションが意味するものを理解する必要があります。例では、4つのクラスを持っている場合、あなたは4のうち、3を持っている場合、正しくの予測として同じになりますaccuracy_scoreを使用して、予測しました0のうち0は正しく予測された。

エラーです。ここでは例

>>> from sklearn.metrics import accuracy_score 
>>> y_pred = [0, 2, 1, 3] 
>>> y_true = [0, 1, 2, 3] 
>>> accuracy_score(y_true, y_pred) 
0.5 
+1

本当のラベル[0,1,0,1]と予測ラベル[0,1,1,0]があれば教えてください。次に、この単一の例の精度とリコールは何ですか?または、TN、TP、FN、FPとは何でしょうか。 –

+0

私が前に示唆したようにすれば、あなたの真のラベルは0になり、あなたの予測は1になります。正確さとリコールは0になります。それらを平均化する。 – dooms

+0

したがって、例x x trueラベル[0,1,0,1]と予測ラベル[0,1,1,0]は、1と0の位置だけを見てFP、TP、TNとTPを計算することはできませんか? –

関連する問題