【问题标题】:Same accuracy and F1 score while doing multi label classification进行多标签分类时的准确率和 F1 分数相同
【发布时间】:2019-01-19 18:27:13
【问题描述】:

我根据这个site写了一段代码,做了不同的多标签分类器。

我想根据每个班级的准确度和每个班级的 F1 测量来评估我的模型。

问题是我在所有模型中的准确度和 f1 测量值都相同。

我怀疑我做错了什么。我想知道在什么情况下会发生这种情况。

代码与网站完全相同,我这样计算 f1 测量值:

print('Logistic Test accuracy is {} '.format(accuracy_score(test[category], prediction)))
    print 'Logistic f1 measurement is {} '.format(f1_score(test[category], prediction, average='micro'))

更新 1

这是整个代码,

df = pd.read_csv("finalupdatedothers.csv")
categories = ['ADR','WD','EF','INF','SSI','DI','others']

train,test = train_test_split(df,random_state=42,test_size=0.3,shuffle=True)
X_train = train.sentences
X_test = test.sentences

NB_pipeline = Pipeline([('tfidf', TfidfVectorizer(stop_words=stop_words)),
                        ('clf',OneVsRestClassifier(MultinomialNB(fit_prior=True,class_prior=None))),])
for category in categories:
    print 'processing {} '.format(category)
    NB_pipeline.fit(X_train,train[category])
    prediction = NB_pipeline.predict(X_test)
    print 'NB test accuracy is {} '.format(accuracy_score(test[category],prediction))
    print 'NB f1 measurement is {} '.format(f1_score(test[category],prediction,average='micro'))
    print "\n"

这是输出:

processing ADR 
NB test accuracy is 0.821963394343 
NB f1 measurement is 0.821963394343 

这就是我的数据的外观:

,sentences,ADR,WD,EF,INF,SSI,DI,others
0,"extreme weight gain, short-term memory loss, hair loss.",1,0,0,0,0,0,0
1,I am detoxing from Lexapro now.,0,0,0,0,0,0,1
2,I slowly cut my dosage over several months and took vitamin supplements to help.,0,0,0,0,0,0,1
3,I am now 10 days completely off and OMG is it rough.,0,0,0,0,0,0,1
4,"I have flu-like symptoms, dizziness, major mood swings, lots of anxiety, tiredness.",0,1,0,0,0,0,0
5,I have no idea when this will end.,1,0,0,0,0,0,1

为什么我得到相同的号码?

谢谢。

【问题讨论】:

  • 你能分享一下你写了什么代码,你得到了什么输出?
  • 感谢您的评论,确定我正在更新
  • @user2906838 更新为一种模式和该模式的输出。感谢关注:)
  • 您是在所有类别中获得相同的准确度和 f1_score 还是仅在这一类别中获得?
  • @AkshayNevrekar 感谢您的评论。我对所有模型都获得了相同的精度和 f1。就像我得到的 svm ...处理 ADR SVM 线性测试精度为 0.814753189129 SVM 线性 f1 测量值为 0.814753189129

标签: python machine-learning scikit-learn svm multilabel-classification


【解决方案1】:

通过这样做:

for category in categories:
...
...

您实际上是将问题从多标签转变为二进制。如果您想继续此操作,则不需要OneVsRestClassifier。您可以直接使用MultinomialNB。或者你可以直接使用OneVsRestClassifier

# Send all labels at once.
NB_pipeline.fit(X_train,train[categories])
prediction = NB_pipeline.predict(X_test)
print 'NB test accuracy is {} '.format(accuracy_score(test[categories],prediction))
print 'NB f1 measurement is {} '.format(f1_score(test[categories],prediction, average='micro'))

它可能会针对所有训练数据中存在的某些标签发出一些警告,但那是因为您发布的样本数据太小。

@user2906838,你对分数是正确的。当average='micro' 时,产生的结果将是相等的。这是mentioned in documentation here

请注意,对于多类设置中的“微”平均,所有 包含的标签将产生相同的精度、召回率和 F,

它在那里写的是多类,但我怀疑它对于二进制也一样。请参阅用户手动计算所有分数的类似问题:Multi-class Clasification (multiclassification): Micro-Average Accuracy, Precision, Recall and F Score All Equal

【讨论】:

  • 谢谢你的回答,我没有得到你的答案的第一部分,你能给我一个解释清楚的链接吗?实际上,我从一个我在问题中提到的网站得到了这个想法,所以这就是为什么我有点困惑。另外,当我应用您的方法时,我得到了这个错误: raise ValueError("Unknown label type: %s" % repr(ys)) ValueError: Unknown label type: ( ADR WD EF INF SSI DI others
  • 另外我应该提一下,我需要分别对每个类别进行准确度和 F1 测量,这就是我将每个类别传递到模型中的原因。你觉得还是我没有那部分吗?感谢以下。此外,如果您的代码部分也能正常工作,那将非常好,因为我可以很容易地获得整体准确性和 f1
  • @sariaGoudarzi 我不能保证您使用的文章的正确性。我的意思是,您的代码一次使用单个 categorytrain 数据,并且在单个类别中,您只有 1 或 0。所以在 for 循环中,这是一个简单的二进制问题(针对该类别)。
  • 我知道我在想,因为它是 onevsrest,所以它通过考虑其他类来训练分类器,但是它只计算该类的准确度。我想应用您的代码,但它会引发错误。你知道如何解决它吗?
  • 它引发了这个引发 ValueError("Unknown label type: %s" % repr(ys)) ValueError: Unknown label type: ( ADR WD EF INF SSI DI others
【解决方案2】:

嗯,这可能是因为 accuracy_scoref1_score 都返回相同的分数。尽管它们的计算方式和结果之间存在差异。如果你想了解更多关于它们是如何计算的,这里已经有答案了:How to compute precision, recall, accuracy and f1-score for the multiclass case with scikit learn?

关于你当前的同分题,请将average的值从micro改为weighted。这应该从根本上改变你的分数。正如我在评论中指出的那样。

【讨论】:

  • 在这种情况下仍然NB给我同样的结果,这有什么具体的事情吗?
  • 你的意思是MultinomialNB by NB?
  • 我的意思是 MultinomialNB :)
  • 好的,这是因为它们本质上返回的是相同的东西,尝试使用不同的数据,你应该得到不同的输出。
  • 所以我的意思是为什么 MultinomialNB 返回相同的东西。这背后有什么理由吗?谢谢:)
猜你喜欢
  • 2020-06-29
  • 2020-08-16
  • 2018-03-25
  • 2020-05-04
  • 2018-11-14
  • 1970-01-01
  • 2017-12-30
  • 2019-10-12
  • 2019-03-23
相关资源
最近更新 更多