MultinomialNB - 理论与实践

Posted

技术标签:

【中文标题】MultinomialNB - 理论与实践【英文标题】:MultinomialNB - Theory vs practice 【发布时间】:2017-06-27 19:07:54 【问题描述】:

好的,我正在学习 Andrew Ng 的机器学习课程。我目前正在阅读 this chapter 并想使用 SKLearn 和 Python 为自己尝试多项朴素贝叶斯(第 12 页底部)。所以 Andrew 提出了一种方法,在这种情况下,每封电子邮件都被编码为这样

我们让x_i 表示电子邮件中i-th 单词的身份。因此,x_i 现在是一个整数,取值在1, . . . , |V|,其中|V| 是 我们的词汇量(字典)。现在是一封包含 n 个单词的电子邮件 由长度为 n 的向量 (x1, x2, . . . , xn) 表示 注意 n 对于不同的文档可能会有所不同。例如,如果电子邮件开始 “A NIPS . . . ,” 然后 x_1 = 1 (“a” 是第一个单词 字典)和x2 = 35000(如果“nips”是第35000个单词 字典)。

查看亮点。

所以这也是我在 Python 中所做的。我有一个vocabulary,它是一个包含 502 个单词的列表,我对每个“电子邮件”进行了编码,因此它的表示方式与 Andrew 描述的相同,例如消息“这是斯巴达”由[495, 296, 359] 和“这不是斯巴达”[495, 296, 415, 359]

那么问题来了。

显然,SKLearn 的MultinomialNB 需要具有统一形状的输入(我对此不确定,但到目前为止,我收到了ValueError: setting an array element with a sequence.,我认为这是因为输入向量的大小不同) .

所以我的问题是,如何将MultinomialNB 用于多个长度的消息?可能吗?我错过了什么?

下面是我对代码所做的更多工作:

X = posts['wordsencoded'].values
y = posts['highview'].values
clf = MultinomialNB()
clf.fit(X, y)
MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
print(clf.predict())

输入的样子:

堆栈跟踪:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-933-dea987cd8603> in <module>()
      3 y = posts['highview'].values
      4 clf = MultinomialNB()
----> 5 clf.fit(X, y)
      6 MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
      7 print(clf.predict())

/usr/local/lib/python3.4/dist-packages/sklearn/naive_bayes.py in fit(self, X, y, sample_weight)
    525             Returns self.
    526         """
--> 527         X, y = check_X_y(X, y, 'csr')
    528         _, n_features = X.shape
    529 

/usr/local/lib/python3.4/dist-packages/sklearn/utils/validation.py in check_X_y(X, y, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, warn_on_dtype, estimator)
    508     X = check_array(X, accept_sparse, dtype, order, copy, force_all_finite,
    509                     ensure_2d, allow_nd, ensure_min_samples,
--> 510                     ensure_min_features, warn_on_dtype, estimator)
    511     if multi_output:
    512         y = check_array(y, 'csr', force_all_finite=True, ensure_2d=False,

/usr/local/lib/python3.4/dist-packages/sklearn/utils/validation.py in check_array(array, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    371                                       force_all_finite)
    372     else:
--> 373         array = np.array(array, dtype=dtype, order=order, copy=copy)
    374 
    375         if ensure_2d:

ValueError: setting an array element with a sequence.

【问题讨论】:

【参考方案1】:

是的,你的想法是对的。您必须使用固定长度的向量对每封邮件进行编码。对于训练集的每封电子邮件,该向量称为 502 维(在您的情况下)的字数向量。

每个单词计数向量包含训练文件中 502 个字典单词的频率。当然,您现在可能已经猜到它们中的大多数将为零。例如:“这不是斯巴达不是斯巴达”将被编码如下。 [0,0,0,0,0,.......0,0,2,0,0,0,......,0,0,2,0,0,...... 0,0,2,0,0,......2,0,0,0,0,0,0]

这里,所有四个 2 都放在 502 长度字数向量的第 296、359、415、495 索引处。

因此,将生成一个特征向量矩阵,其行表示训练集的文件数,列表示字典的 502 个单词。 索引“ij”处的值将是第 i 个字典中第 j 个单词在第 i 个文件中出现的次数。

生成的电子邮件编码(特征向量矩阵),可以提供给 MultinomialNB 进行训练。

在预测类别之前,您还必须为测试电子邮件生成类似的 502 长度编码。

您可以使用以下博客在 ling-spam 数据集上使用 multinomialNB 轻松构建垃圾邮件过滤器分类器。博文使用 sklearn 和 python 实现。

https://appliedmachinelearning.wordpress.com/2017/01/23/nlp-blog-post/

【讨论】:

谢谢!那么也许我链接的方法和 SKLearn multinomialNB 是不同的方法?在我链接的注释(和引用的)中,该算法可以使用不同的长度。 在您正在阅读的章节中,第 8 页给出了每个文档的固定长度编码,这就是 sklearn 在多项式 NB 中的实现方式。因此,Andrew Ng 在第 8 页描述了 sklearn 的方法。您在第 12-13 页链接的方法描述了文本分类的事件模型。这两种方法似乎不同。 嗯,在朴素贝叶斯子章节下(朴素贝叶斯是2,多项式事件模型是2.2章),所以我猜是NB的多项式变体。 SKLearn 文档还指出 multinomialNB 是“多项式朴素贝叶斯分类器”。 即使是链接在 SKLearn 文档中的论文摘要也引用了“一些使用多变量伯努利模型,即一个贝叶斯网络,单词和二进制单词特征之间没有依赖关系。其他人使用多项式模型,也就是说,具有整数字数的 uni-gram 语言模型。”。不过,在我看来,SKLearn 的 multinomialNB 仍然使用二进制字特征而不是整数字数,所以我有点困惑... 另外,第 8 页方法实现的是 Bernouilli NB,而不是多项式。

以上是关于MultinomialNB - 理论与实践的主要内容,如果未能解决你的问题,请参考以下文章

《分布式机器学习:算法理论与实践》——RE

理论与实践的碰撞,个人与团队的融合

Java 理论与实践: 处理 InterruptedException

《ROS理论与实践》学习笔记ROS通信编程

《ROS理论与实践》学习笔记机器人SLAM建图

《ROS理论与实践》学习笔记机器人SLAM建图