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

Python 如何从单个输入值获取分类报告,python,machine-learning,scikit-learn,nlp,Python,Machine Learning,Scikit Learn,Nlp,我使用NLP对我的数据进行分类,我已经训练了我的数据,现在我想知道单个输入值的分数。我的数据包含衣服和时装,它应该返回它所属的类别。我想从单个输入值检查分类分数。 所以我是这样做的: bow4 = bow_transformer.transform([message4]) tfidf4 = tfidf_transformer.transform(bow4) predicted = spam_detect_model.predict(tfidf4) from sklearn.metrics im

我使用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))
然后我收到以下错误

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

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

如何从单个预测值查看分类报告?我想这样做是因为我想创建一些web应用程序,用户可以在其中进行输入。例如,如果分类分数低于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))


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

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


只需使用
预测值

经过反复试验最终找到答案

所以基本上你有一个
spam\u detect\u model.classes\u
属性,在这里你可以看到类。 使用
predict\u 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 ```

请您将您的导入和模型实例化包括在内。这样我们可以进一步了解它,提供更直接的答案。嗨,我修改了我的问题,很好!我知道这不是你的问题,因为我还在通读代码。但是我注意到您正在加入单词,但是没有提供空格字符来加入它们。是吗?是的,没错!你试过打印tfidf4并检查它的长度吗?没有,这没有给我结果。如果我的数据集包含有关时尚的内容,并且我作为输入Car输入,则预测值包含一个类别。但问题是,这个类别是一个假阴性。不知何故,我需要给定输入的正确性,我不确定是否能理解。您想预测
消息4的类别。您可以使用值为
predicted
的ur代码执行此操作。你们想把预言类和真实类的句子进行比较吗?例如,您必须从您的数据库中获取它,或者创建一个变量
message4\U true\U class=“T-shirt”
。然后做一些类似于
message4\u true\u class==predicted
的事情,我想从message4预测类别。但是输入是未知的。用户可以输入任何内容。我的数据集是为时尚而训练的。但是如果一个用户输入电视,或者另一个时尚界未知的输入,它将得到一个类别。例如,电视将“内衣”列为一类。我的值不在数据库中。所以我能读到的是,不可能匹配未知值n,与我的数据集方式相反,这将给我一个未知输入的分数?