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

scikit : Wrong prediction for this case

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

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 isdog 相关。它可能不是您想要的,但它是一个有效的关联(如果您不懂英语,您是否不会犯同样的错误?)。您过度拟合了训练数据。默认 SVC() 也会给出相同的结果。

尝试以最后一个训练实例this is jack jack为例,那么它会给human for this is jack,因为单词jack会更多"powerful" 作为 human.

的标识符

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

clf = MultinomialNB(alpha=0.1).fit( idfX, ["dog" , "dog", "human"])

这将正确分类您自己的所有训练实例。

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