如何从单个输入值中获取分类报告

Posted

技术标签:

【中文标题】如何从单个输入值中获取分类报告【英文标题】:How to get classification report from a single input value 【发布时间】:2020-04-12 20:19:08 【问题描述】:

我使用 NLP 对我的数据进行分类,我已经训练了我的数据,现在我想知道单个输入值的分数。我的数据包含衣服和时尚的东西,它应该返回它所属的类别。我想从单个输入值检查分类分数。 所以我这样做:

bow4 = bow_transformer.transform([message4])
tfidf4 = tfidf_transformer.transform(bow4)
predicted =  spam_detect_model.predict(tfidf4)
from sklearn.metrics import classification_report
print (classification_report(data['Category Path'], predicted))

然后我收到以下错误

“发现样本数量不一致的输入变量:”

那是因为预测值的数组大小与数据不匹配。

如何从单个预测值查看分类报告?我想这样做是因为我想创建一些用户可以输入的网络应用程序。例如,如果分类分数低于 x,那么它会给出错误。

谢谢!

我的代码看起来像这样

import pandas as pd
import seaborn as sns
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
import string
from nltk.corpus import stopwords
#open file
data = pd.read_csv('cats.csv',sep=';')
data['length'] = data['Product Name'].str.len()
#remove all puncs
def text_process(mess):
    # Check characters to see if they are in punctuation
    nopunc = [char for char in mess if char not in string.punctuation]
    # Join the characters again to form the string.
    nopunc = ''.join(nopunc)
    # Now just remove any stopwords
    return [word for word in nopunc.split() if word.lower() not in stopwords.words('english') if word.lower() not in stopwords.words('dutch')]
# Might take awhile...
bow_transformer = CountVectorizer(analyzer=text_process).fit(data['Product Name'])
# Print total number of vocab words
print(len(bow_transformer.vocabulary_))
messages_bow = bow_transformer.transform(data['Product Name'])


tfidf_transformer = TfidfTransformer().fit(messages_bow)
messages_tfidf = tfidf_transformer.transform(messages_bow)
from sklearn.naive_bayes import MultinomialNB
spam_detect_model = MultinomialNB().fit(messages_tfidf, data['Category Path'])


message4 = "some dummy data "
bow4 = bow_transformer.transform([message4])
tfidf4 = tfidf_transformer.transform(bow4)
predicted =  spam_detect_model.predict(tfidf4)

#errors here
from sklearn.metrics import classification_report
print (classification_report(data['Category Path'], predicted))

【问题讨论】:

能否请您包括您的导入和模型实例化。通过这种方式,我们可以进一步了解它以提供更直接的答案。 嗨,我稍微修改了一下我的问题, 不错!我知道这不是您的问题,因为我仍在阅读代码。但是我注意到您正在加入单词,但没有提供空格字符来加入它们。对吗? 是的,没错! 您是否尝试过打印 tfidf4 并检查其长度? 【参考方案1】:

对于多项朴素贝叶斯,您可以使用 predict_proba() 函数来获取每个输入的分数。

【讨论】:

【参考方案2】:

分类报告的目的是打印精度、召回率和 F1 分数。您无法仅使用一个值来计算这些指标。

只需使用来自predicted的值

【讨论】:

不,那不是我想要的结果。如果我的数据集包含有关时尚的内容,并且我输入 Car 作为输入,则预测值包含一个类别。但问题是,该类别是假阴性。不知何故,我需要给定输入的正确性 我不确定。您想预测message4 的类别。您可以使用值为predicted 的代码来执行此操作。您想将预测类别与句子的真实类别进行比较?例如,您必须从您的数据库中获取它或创建一个变量message4_true_class = "T-shirt"。然后就做类似message4_true_class ==predicted 我想从message4中预测类别。但是输入是未知的。用户可以输入任何内容。我的数据集是为时尚而训练的。但是,如果用户输入电视,或时尚未知的其他输入,它将获得一个类别。所以例如电视给出了“内衣”的类别。我的值不在数据库中。所以我可以读到它不可能匹配一个未知值 n,与我的数据集方式相匹配,这会给我一个未知输入的分数?【参考方案3】:

经过反复试验终于找到了答案。

所以基本上你有一个spam_detect_model.classes_attribute,你可以在其中看到课程。 使用predict_proba,您可以找到概率。所以现在你必须将它们附加在一起,所以你可以使用 Python 中的zip方法来做到这一点。

所以对于其他在外面苦苦挣扎的人来说,它看起来像这样:

bow4 = bow_transformer.transform([message4])
tfidf4 = tfidf_transformer.transform(bow4)
counter = 0
predicted = spam_detect_model.predict_proba(tfidf4)
for x in spam_detect_model.classes_: #classes_ gives you the labels,
  proba  = round(predicted[0][counter],2)
  if proba > 0.01: #only return the labels with a prob of larger then 0,10%
      print(x + ' probility '+ str(proba))
  counter +=1 ```

【讨论】:

以上是关于如何从单个输入值中获取分类报告的主要内容,如果未能解决你的问题,请参考以下文章

如何从内联样式属性中获取值并将其放入最接近的输入值中? jQuery

如何使用 CreateNativeQuery 从 SQL 数据库值中查询单个值?

如何将整数“范围”放入 OWL 文字值中?

如何从单个输入中获取多个文件输入

如何从字符串值中获取纬度?

如何从 QMultiMap 中的值中获取键?