2

私は文カテゴリ検出問題に取り組んでいます。各文が複数のカテゴリに属する​​例:

"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 スコア (マイクロ平均化を使用)、精度、再現率も計算したいと考えています。グラウンド トゥルース ラベルがあり、予測をそれらのグラウンド トゥルース ラベルと一致させる必要があります。しかし、このようなタイプのマルチラベル分類の問題にどのように取り組むべきかわかりません。Pythonでscikit-learnまたはその他のライブラリを使用できますか?

4

3 に答える 3

3

予測ラベルのマトリックスを作成しましたが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

だから、私はこの方法で結果を計算しています!

于 2016-04-16T11:44:40.167 に答える
1

MultiLabelBinarizerマルチラベル シナリオの場合、予測またはグラウンド トゥルース ラベルの幅が一定でない場合に備えて、も参照することをお勧めします。これは基本的に、それらをゼロと 1 の固定長配列に変換します。

from sklearn.metrics import classification_report
from sklearn.preprocessing import MultiLabelBinarizer

y_true = [(12, 2, 4, 5),
          (5, 2),
          (12,)
         ]

y_pred = [(4, 5),
          (5, 2),
          (5, 4)
         ]

mlb = MultiLabelBinarizer()

y_true_binarized = mlb.fit_transform(y_true)
y_pred_binarized = mlb.transform(y_pred)

print(classification_report(y_true_binarized, y_pred_binarized, 
                            target_names=[str(cls) for cls in mlb.classes_]))
于 2020-11-04T14:52:38.563 に答える