Python scikit:对这种情况的错误预测

Python scikit:对这种情况的错误预测,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,我在下面编写了一个示例代码 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 i

我在下面编写了一个示例代码

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)
对于上述结果,我得到的预测值为
“Dog”
,即使训练数据与测试数据相同

这一点我错在哪里?

这是您编写的代码的预期(或至少不是那么意外)行为:您有两个标记为
dog
的实例,其中有术语
this is
,因此算法了解到
this is
dog
相关。这可能不是你想要的,但这是一种有效的联系(如果你不懂英语,你不会犯同样的错误吗?)。你过度拟合了训练数据。默认的
SVC()
也会给出相同的结果

例如,尝试制作最后一个训练实例
这是杰克
,然后它将为
这是杰克
提供
人类
,因为
杰克
这个词作为人类的标识符将更加“强大”

另一种方法是在分类器中设置
alpha
参数:

clf = MultinomialNB(alpha=0.1).fit( idfX, ["dog" , "dog", "human"])
这将正确地对您自己的所有培训实例进行分类


查看scikit的网格搜索,以优化预测值的超参数。使用默认设置几乎从来都不是你能做的最好的事情。

这很奇怪。你也试过其他分类器吗?我得试一下。。您能告诉我代码是否正确吗?@cfh:我试过SGDClassizer,它给了我正确的结果。谢谢。。但只有在添加(alpha=0.1)之后,它才起作用。你能解释一下它是干什么的吗?我试着读它,但不明白-术语的正则化?@voila-这是一个平滑参数,它的作用类似于正则化。你可以看到它是如何在源代码中使用的:@voila:我认为比源代码更好的参考是: