【问题标题】:Facing ValueError: Target is multiclass but average='binary'面对ValueError:目标是多类但平均='二进制'
【发布时间】:2019-02-15 13:27:42
【问题描述】:

我是 python 和机器学习的新手。根据我的要求,我正在尝试对我的数据集使用朴素贝叶斯算法。

我能够找出准确度,但试图找出准确度和召回率。但是,它抛出以下错误:

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

谁能建议我如何继续它。我尝试在精度和召回分数中使用 average ='micro'。它没有任何错误,但它给出的准确度、精度、召回分数相同。

我的数据集:

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') )

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    您需要添加'average' 参数。根据the documentation

    average : string, [None, ‘binary’ (默认), ‘micro’, ‘macro’, “样本”、“加权”]

    多类/多标签目标需要此参数。如果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',因为它无论如何都会被忽略。

    评论更新:

    是的,它们可以相等。它在user guide here 中给出:

    请注意,对于多类设置中的“微”平均,所有 包含的标签将产生相等的精度、召回率和 F,而 “加权”平均可能会产生不介于两者之间的 F 分数 准确率和召回率。

    【讨论】:

    • 我在准确率和召回率分数中添加了平均 ='micro',但我在准确率、准确率和召回率方面得到了相同的分数。上述三个参数是否有可能获得相同的分数?
    • 非常感谢您的建议。真的很有帮助。
    • 针对同一数据集的另一个查询。我在同一个数据集上使用了 onehot_enc、BernoulliNB 分类器。它给出了 90% 的准确率。但是上面使用的算法给出了 46% 的准确率。怎么可能?
    • @Intrigue777 这太宽泛了。这取决于数据集、预处理和代码。你说你在其他代码上使用了 onehot_enc 。在这里,您正在使用 countvectorizer。也许这有所作为。无论如何,您应该发布一个包含代码和数据集的新问题以供检查。
    • 非常感谢。它节省了我的时间
    猜你喜欢
    • 2019-09-12
    • 2021-12-05
    • 2020-11-08
    • 2020-12-16
    • 2022-01-25
    • 2018-02-08
    • 2014-06-30
    • 2018-04-21
    • 2017-04-04
    相关资源
    最近更新 更多