1. ホーム
  2. python

[解決済み] ValueErrorに直面している。対象はマルチクラスだが、平均は「バイナリ」。

2022-02-04 13:04:43

質問

私はpythonと機械学習の初心者です。私の要件に従って、私は私のデータセットにナイーブベイズアルゴリズムを使用しようとしています。

精度を求めることはできますが、同じように精度と再現率を求めようとしています。しかし、次のようなエラーを投げています。

   "choose another average setting." % y_type)
ValueError: Target is multiclass but average='binary'. Please choose another average setting.

どなたか、どのように進めればよいかご指摘いただけないでしょうか。私は、精度と想起スコアに平均 ='マイクロ'を使用して試してみました。

私のデータセット

train_data.csv:

review,label
Colors & clarity is superb,positive
Sadly the picture is not nearly as clear or bright as my 40 inch Samsung,negative

test_data.csv:

review,label
The picture is clear and beautiful,positive
Picture is not clear,negative

私のコード

from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import BernoulliNB
from sklearn.metrics import confusion_matrix
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score


def load_data(filename):
    reviews = list()
    labels = list()
    with open(filename) as file:
        file.readline()
        for line in file:
            line = line.strip().split(',')
            labels.append(line[1])
            reviews.append(line[0])

    return reviews, labels

X_train, y_train = load_data('/Users/abc/Sep_10/train_data.csv')
X_test, y_test = load_data('/Users/abc/Sep_10/test_data.csv')

vec = CountVectorizer() 

X_train_transformed =  vec.fit_transform(X_train) 

X_test_transformed = vec.transform(X_test)

clf= MultinomialNB()
clf.fit(X_train_transformed, y_train)

score = clf.score(X_test_transformed, y_test)
print("score of Naive Bayes algo is :" , score)

y_pred = clf.predict(X_test_transformed)
print(confusion_matrix(y_test,y_pred))

print("Precision Score : ",precision_score(y_test,y_pred,pos_label='positive'))
print("Recall Score :" , recall_score(y_test, y_pred, pos_label='positive') )

解決方法は?

を追加する必要があります。 'average' パラメータを使用します。によると ドキュメント :

平均的な: string, [None, 'binary' (default), 'micro', 'macro', 'サンプル', '加重']。

このパラメータは、multiclass/multilabelターゲットに必要です。もし None を使用します。 各クラスの点数が返される。そうでない場合は,この は、データに対して行われる平均化の種類を決定する。

こうしてください。

print("Precision Score : ",precision_score(y_test, y_pred, 
                                           pos_label='positive'
                                           average='micro'))
print("Recall Score : ",recall_score(y_test, y_pred, 
                                           pos_label='positive'
                                           average='micro'))

交換 'micro' を除く上記のオプションのいずれかを指定します。 'binary' . また、マルチクラス設定において 'pos_label' どうせ無視されるからです。

コメントを更新しました。

はい、同じにすることができます。その場合は ユーザーガイドはこちら :

マイクロ "平均化では、多クラス設定におけるすべての ラベルが含まれる場合、精度、再現性、Fが等しくなる。 「加重」平均は、Fスコアの間にないFスコアを生成することがあります。 精度とリコール