我在下面写了一个示例代码
BLOB
对于上述结果,即使受过训练的数据与测试数据相同,我也会得到import numpy as np
import pandas as pd
import csv
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import MultinomialNB
text = ["this is dog" , "this is bull dog" , "this is jack"]
countVector = CountVectorizer()
countmatrix = countVector.fit_transform(text)
print countVector.vocabulary_
print countmatrix.toarray()
tfidf_transformer = TfidfTransformer()
idfX = tfidf_transformer.fit_transform(countmatrix)
#print tfidf_transformer.vocabulary_
print idfX.toarray()
clf = MultinomialNB().fit( idfX, ["dog" , "dog" , "human"])
test = ["this is jack"]
testCountMatrix = countVector.transform(test)
testidfX = tfidf_transformer.transform(testCountMatrix)
print testidfX.toarray()
print clf.predict(testidfX)
作为预测。
我在哪里错了?
答案 0 :(得分:2)
对于您编写的代码,这是预期的(或至少不是那么意外)行为:您有两个标记为dog
的实例,其中您有术语this is
,因此算法了解到this is
与dog
相关。它可能不是你所追求的,但它是一个有效的关联(如果你不懂英语,你不会容易犯同样的错误吗?)。你的训练数据过于丰富了。默认SVC()
也会产生相同的结果。
尝试制作最后一个培训实例this is jack jack
,然后它会为human
提供this is jack
,因为单词jack
将更具“强大”作为标识符human
。
另一种方法是在分类器中设置alpha
参数:
clf = MultinomialNB(alpha=0.1).fit( idfX, ["dog" , "dog", "human"])
这将正确分类您自己的所有训练实例。
查看scikit的网格搜索,以优化预测变量的超参数。使用默认值几乎不是你能做的最好的事情。