MultinomialNB - 理论与实践
MultinomialNB - Theory vs practice
好的,我正在学习 Andrew Ng 的机器学习课程。我目前正在阅读 this chapter 并想使用 SKLearn 和 Python 为自己尝试多项式朴素贝叶斯(第 12 页底部)。所以安德鲁提出了一种方法,在这种情况下,每封电子邮件都是这样编码的
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 个单词的列表,我对每个 "email" 进行了编码,以便它的表示方式与 Andrew 描述的相同,例如消息 "this is sparta" 由 [495, 296, 359]
和 "this is not sparta" 通过 [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.
是的,您的想法是正确的。您必须使用固定长度的向量对每封邮件进行编码。对于训练集的每封电子邮件,此向量称为 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]
这里,所有4个2都放在502长度的字数统计向量的第296、359、415、495索引处。
因此,将生成一个特征向量矩阵,其行表示训练集的文件数,列表示字典的502个单词。
索引‘ij’处的值将是字典中第j个单词在第i个文件中出现的次数。
这个生成的邮件编码(特征向量矩阵),可以给MultinomialNB训练。
在预测 class 之前,您还必须为测试电子邮件生成类似的 502 长度编码。
您可以使用以下博客在 ling-spam 数据集上使用 multinomialNB 轻松构建垃圾邮件过滤器 classifier。 blog-post 使用 sklearn 和 python 实现。
https://appliedmachinelearning.wordpress.com/2017/01/23/nlp-blog-post/
好的,我正在学习 Andrew Ng 的机器学习课程。我目前正在阅读 this chapter 并想使用 SKLearn 和 Python 为自己尝试多项式朴素贝叶斯(第 12 页底部)。所以安德鲁提出了一种方法,在这种情况下,每封电子邮件都是这样编码的
We let
x_i
denote the identity of thei
-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 lengthn
note that n can vary for different documents. For instance, if an email starts with“A NIPS . . . ,”
thenx_1 = 1
(“a”
is the first word in the dictionary), andx2 = 35000
(if“nips”
is the 35000th word in the dictionary).
查看亮点。
所以这也是我在 Python 中所做的。我有一个 vocabulary
,它是一个包含 502 个单词的列表,我对每个 "email" 进行了编码,以便它的表示方式与 Andrew 描述的相同,例如消息 "this is sparta" 由 [495, 296, 359]
和 "this is not sparta" 通过 [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.
是的,您的想法是正确的。您必须使用固定长度的向量对每封邮件进行编码。对于训练集的每封电子邮件,此向量称为 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]
这里,所有4个2都放在502长度的字数统计向量的第296、359、415、495索引处。
因此,将生成一个特征向量矩阵,其行表示训练集的文件数,列表示字典的502个单词。 索引‘ij’处的值将是字典中第j个单词在第i个文件中出现的次数。
这个生成的邮件编码(特征向量矩阵),可以给MultinomialNB训练。
在预测 class 之前,您还必须为测试电子邮件生成类似的 502 长度编码。
您可以使用以下博客在 ling-spam 数据集上使用 multinomialNB 轻松构建垃圾邮件过滤器 classifier。 blog-post 使用 sklearn 和 python 实现。
https://appliedmachinelearning.wordpress.com/2017/01/23/nlp-blog-post/