python - MultinomialNB - 理论与实践

标签 python machine-learning scikit-learn text-classification multinomial

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

We let x_i denote the identity of the i-th word in the email. Thus, x_i is now an integer taking values in {1, . . . , |V|}, where |V| is the size of our vocabulary (dictionary). An email of n words is now represented by a vector (x1, x2, . . . , xn) of length n note that n can vary for different documents. For instance, if an email starts with “A NIPS . . . ,” then x_1 = 1 (“a” is the first word in the dictionary), and x2 = 35000 (if “nips” is the 35000th word in the dictionary).

查看亮点。

所以这也是我在 Python 中所做的。我有一个 vocabulary,它是一个包含 502 个单词的列表,我对每个“电子邮件”进行了编码,使其以与 Andrew 描述的方式相同的方式表示,例如消息“this is sparta”表示为[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())

输入的样子:enter image description here enter image description here enter image description here

堆栈跟踪:

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

最佳答案

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

每个单词计数向量包含训练文件中 502 个词典单词的频率。当然,您现在可能已经猜到它们中的大多数将为零。例如:“this is not sparta not is this sparta”将被编码如下。 [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”处的值将是字典中第 j 个单词在第 i 个文件中出现的次数。

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

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

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

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

关于python - MultinomialNB - 理论与实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42142366/

相关文章:

python - web2py下载失败时如何在 View 中显示Flash错误消息?

python - 使用 Python、Phantomjs/PyQt/Ghost 将 URL 转换为 PDF

python - python中是否有没有结果的 map ?

python - 使用 django-reversion 获取所有修订

python - 根据预测,我加载的模型给了我一个 AttributeError

python - 如何从github有效地将代码导入ipython

r - "best tune"和 "Resampling results across tuning parameters"插入符 R 包不一致

python - 类数,4,与 target_names 的大小不匹配,6。尝试指定标签参数

python - 在 Windows 上使用 Scipy 的 AMD64 版本调用 scikit-learn 时出错

python - 我们如何将 Python Pandas DataFrame reshape 为 C-Contiguous 内存?