【问题标题】:How to test unseen sentences for a new classifier in scikit learn如何在 scikit learn 中为新分类器测试看不见的句子
【发布时间】:2019-08-10 17:21:19
【问题描述】:

我已经使用这个数据集创建了一个模型,我想插入一些句子来看看它们是如何分类的。我该怎么做?

这是制作模型的代码:

from sklearn.datasets import fetch_20newsgroups
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn import metrics

cats = ['sci.space','rec.autos']
newsgroups_train = fetch_20newsgroups(subset='train',
                   remove=('headers', 'footers', 'quotes'), categories = cats)
newsgroups_test = fetch_20newsgroups(subset='test',
                   remove=('headers', 'footers', 'quotes'), categories = cats)

vectors_test = vectorizer.transform(newsgroups_test.data)
vectorizer = TfidfVectorizer()
vectors = vectorizer.fit_transform(newsgroups_train.data)
clf = MultinomialNB(alpha=.01)
clf.fit(vectors, newsgroups_train.target)
vectors_test = vectorizer.transform(newsgroups_test.data)
pred = clf.predict(vectors_test)
metrics.f1_score(newsgroups_test.target, pred, average='macro')

返回的准确率是:0.97,表示存在过拟合。

如前所述,我想测试未见数据的分类是如何发生的。我该如何继续?

我试过的例子:

texts = ["The space shuttle is made in 2018", 
         "The exhaust is noisy.",
         "the windows are transparent."]
text_features = tfidf.transform(texts)
predictions = model.predict(text_features)
for text, predicted in zip(texts, predictions):
  print('"{}"'.format(text))
  print("  - Predicted as: '{}'".format(id_to_category[predicted]))
  print("")
 #this does not work as it is

它应该将每个句子分类到两个(sci.space、rec.autos)类别之一。

此外,欢迎您对整个代码提出任何其他建议。我想很好地学习这些过程。

【问题讨论】:

    标签: python scikit-learn nlp


    【解决方案1】:

    您使用的变量名称似乎与您在上面定义的名称不同。

    在您制作模型的代码中: - 你的模型叫做 clf,所以当你之后使用它时,你应该写 clf.predict(不是 model.predict) - 你的 TfidfVectorizer 被称为矢量化器,所以当你以后使用它时使用相同的变量名(不是像 tfidf 这样的新变量)

    你的例子变成了:

    texts = ["The space shuttle is made in 2018", 
         "The exhaust is noisy.",
         "the windows are transparent."]
    text_features = vectorizer.transform(texts)
    predictions = clf.predict(text_features)
    for text, predicted in zip(texts, predictions):
       print('"{}"'.format(text))
       print("  - Predicted as: '{}'".format(predicted))
       print("")
    

    运行正常:

    “航天飞机是 2018 年制造的” - 预测为:'1'

    “排气很吵。” - 预测为:'0'

    “窗户是透明的。” - 预测为:'1'

    在您的培训代码中,请确保这 3 行的顺序正确:

    vectorizer = TfidfVectorizer()
    vectors = vectorizer.fit_transform(newsgroups_train.data)
    vectors_test = vectorizer.transform(newsgroups_test.data)
    

    【讨论】:

    • 如何使用结果中类别的实际名称?而不是“预测为'1'”,它怎么能说:“预测为rec.autos”?
    • 您可以创建一个 python 字典(例如,在上面的示例中称为 id_to_category)。
    猜你喜欢
    • 2018-08-01
    • 2013-12-19
    • 1970-01-01
    • 2015-03-01
    • 2021-06-20
    • 2020-06-25
    • 2015-01-12
    • 2015-06-08
    • 2015-05-09
    相关资源
    最近更新 更多