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 is
与 dog
相关。它可能不是您想要的,但它是一个有效的关联(如果您不懂英语,您是否不会犯同样的错误?)。您过度拟合了训练数据。默认 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 的网格搜索以优化预测变量的超参数。使用默认值几乎从来都不是你能做的最好的事情。
我在下面写了一个示例代码
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()
也会给出相同的结果。
尝试以最后一个训练实例this is jack jack
为例,那么它会给human
for this is jack
,因为单词jack
会更多"powerful" 作为 human
.
另一种方法是在分类器中设置 alpha
参数:
clf = MultinomialNB(alpha=0.1).fit( idfX, ["dog" , "dog", "human"])
这将正确分类您自己的所有训练实例。
查看 scikit 的网格搜索以优化预测变量的超参数。使用默认值几乎从来都不是你能做的最好的事情。