首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Scikit-学习稀疏字符串分类的朴素贝叶斯无法解释的结果

Scikit-学习稀疏字符串分类的朴素贝叶斯无法解释的结果
EN

Stack Overflow用户
提问于 2012-08-20 14:25:23
回答 1查看 1.4K关注 0票数 3

我正在尝试使用scikit学习模块进行文本分类。它是一个包含大量独特单词的数据集。它的性质将从下面的示例中显而易见,

代码语言:javascript
运行
复制
train_counts = count_vect.fit_transform(data)
train_counts.shape

print len(range(len(data)-1)) 

clf = MultinomialNB(alpha=1).fit(train_counts, range(len(data)) )

docs_new = ['Modern Warfare 2', 'Modern Warfare 3', 'Modern Warfare 1', 'Modern Warfare 4', 'Modern Warfare', 'Mahjong Kakutou Club', 'Mass Effect 2']

new_counts = count_vect.transform(docs_new)
predicted = clf.predict(new_counts)

for doc, category in zip(docs_new, predicted):
    print '%r => %s' % (doc, target_names[category])

输出如下所示。

代码语言:javascript
运行
复制
763
'Modern Warfare 2' => Call of Duty: Modern Warfare 3
'Modern Warfare 3' => Call of Duty: Modern Warfare 3
'Modern Warfare 1' => Call of Duty: Modern Warfare 3
'Modern Warfare 4' => Call of Duty: Modern Warfare 3
'Modern Warfare' => Call of Duty: Modern Warfare 3
'Mahjong Kakutou Club' => Mahjong Kakutou Club
'Mass Effect 2' => Mass Effect 2

这是一个多项式的例子,但我得到的结果与伯努利的例子相同。我已经尝试使用从0到1000000的alpha值。有人能给我解释一下为什么会这样吗?

编辑:我应该说清楚,以下职业存在使命召唤:现代战争,使命召唤:现代战争2…大多数其他游戏,所有play-station游戏的列表都取自维基百科。

此外,完整的版本,例如调用的职责:现代战争2作为测试字符串产生相同的结果

我最初使用的是NLTK分类器,但由于某种原因,它并没有赋予像"Kakutou“这样的词太多的价值,这些词在任何其他示例中都没有出现。(显然Scikit one有)它没有像scikit分类器那样的数字问题。

这里的任何指导或信息都是非常有价值的。

谢谢

编辑:数据集是从这里开始的,它是第一列,每个示例都有一个相同的标签和内容

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-08 09:29:58

代码没有显示count_vect是如何构造的,但如果它只是一个默认的初始化CountVectorizer,那么它会忽略字符标记(即序列号),使所有的“现代战争……”标题和“现代战争”是一样的:

代码语言:javascript
运行
复制
>>> from sklearn.feature_extraction.text import CountVectorizer as CV
>>> count_vect=CV()
>>> docs_new = ['Modern Warfare 2', 'Modern Warfare 3', 'Modern Warfare 1', 'Modern Warfare 4', 'Modern Warfare A', 'Modern Warfare 44', 'Modern Warfare AA', 'Modern Warfare', 'Mahjong Kakutou Club', 'Mass Effect 2']
>>> new_counts = count_vect.fit_transform(docs_new)
>>> count_vect.inverse_transform(new_counts)
[array([u'modern', u'warfare'], 
      dtype='<U7'), array([u'modern', u'warfare'], 
      dtype='<U7'), array([u'modern', u'warfare'], 
      dtype='<U7'), array([u'modern', u'warfare'], 
      dtype='<U7'), array([u'modern', u'warfare'], 
      dtype='<U7'), array([u'44', u'modern', u'warfare'], 
      dtype='<U7'), array([u'aa', u'modern', u'warfare'], 
      dtype='<U7'), array([u'modern', u'warfare'], 
      dtype='<U7'), array([u'club', u'kakutou', u'mahjong'], 
      dtype='<U7'), array([u'effect', u'mass'], 
      dtype='<U7')]

这是因为scikit向量化器具有默认设置token_pattern=r'(?u)\b\w\w+\b'模型只是随意打破了这种联系,因为无论是训练还是预测都看不到这些标题之间的任何区别。您可以通过使用token_pattern=r'(?u)\b\w+\b'来解决此问题

代码语言:javascript
运行
复制
>>> from sklearn.feature_extraction.text import CountVectorizer as CV
>>> count_vect=CV(token_pattern=r'(?u)\b\w+\b')
>>> docs_new = ['Modern Warfare 2', 'Modern Warfare 3', 'Modern Warfare 1', 'Modern Warfare 4', 'Modern Warfare A', 'Modern Warfare 44', 'Modern Warfare AA', 'Modern Warfare', 'Mahjong Kakutou Club', 'Mass Effect 2']
>>> new_counts = count_vect.fit_transform(docs_new)
>>> count_vect.inverse_transform(new_counts)
[array([u'2', u'modern', u'warfare'], 
      dtype='<U7'), array([u'3', u'modern', u'warfare'], 
      dtype='<U7'), array([u'1', u'modern', u'warfare'], 
      dtype='<U7'), array([u'4', u'modern', u'warfare'], 
      dtype='<U7'), array([u'a', u'modern', u'warfare'], 
      dtype='<U7'), array([u'44', u'modern', u'warfare'], 
      dtype='<U7'), array([u'aa', u'modern', u'warfare'], 
      dtype='<U7'), array([u'modern', u'warfare'], 
      dtype='<U7'), array([u'club', u'kakutou', u'mahjong'], 
      dtype='<U7'), array([u'2', u'effect', u'mass'], 
      dtype='<U7')]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12033086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档