gpt4 book ai didi

python - 稀疏字符串分类的 Scikit-learn 朴素贝叶斯莫名其妙的结果

转载 作者:行者123 更新时间:2023-11-28 18:51:41 28 4
gpt4 key购买 nike

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

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])

输出看起来像这样。

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 值。谁能向我解释为什么会这样?

编辑:我应该说清楚,以下类别存在 使命召唤:现代 war 、使命召唤:现代 war 2... 大多数其他游戏,所有游戏站游戏列表均来自维基百科。

此外,完整版本,例如《使命召唤:现代 war 2》作为测试字符串会产生相同的结果

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

这里的任何指导或信息都将非常有值(value)。

谢谢

编辑:数据集来自这里http://en.wikipedia.org/wiki/List_of_PlayStation_3_games它的第一列,每个示例都有一个标签和相同的内容

最佳答案

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

>>> 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'

解决此问题
>>> 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')]

关于python - 稀疏字符串分类的 Scikit-learn 朴素贝叶斯莫名其妙的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12033086/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com