好吧,我只是在学习Andrew Ng的机器学习课程。我目前正在阅读this chapter,并且想使用SKLearn和Python尝试Multinomial朴素贝叶斯(第12页底部)。所以安德鲁提出了一种方法,在这种情况下,每个电子邮件进行编码,MultinomialNB - Theory vs practice
我们让
x_i
表示在电子邮件中i
个字的身份。因此,现在x_i
是整数取值在{1, . . . , |V|}
,其中|V|
是 我们的词汇(字典)的大小。由n个词组成的电子邮件现在为 ,由长度为n
的矢量(x1, x2, . . . , xn)
表示,注意,对于不同文档,n 可以不同。举例来说,如果电子邮件开始 与“A NIPS . . . ,”
然后x_1 = 1
(“a”
是在 字典中的第一个字),并x2 = 35000
(如果“nips”
是第三万五千字在字典 )。
见的亮点。
所以这也是我在Python一样。我有一个vocabulary
,这是一个502字的列表,我编码每个“电子邮件”,以便它与Andrew所描述的相同的方式,例如消息“这是sparta”由[495, 296, 359]
和“这不是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.
谢谢!所以也许我链接的方法和SKLearn multinomialNB是不同的方法?在笔记我链接(和引用),该算法可以使用不同的长度。 –
在您正在阅读的章节中,每个文档的固定长度编码在第8页中给出,那就是sklearn如何在Multinomial NB中实现它。因此,第8页的Andrew Ng描述了sklearn的方法。您在第12-13页链接的方法描述了文本分类的事件模型。这两种方法看起来不同。 –
嗯,它在朴素贝叶斯子章节之下(朴素贝叶斯是2,多项事件模型是2.2章),所以我猜想它是NB的多项式变体。 SKLearn文档还指出multinomialNB是“多项式朴素贝叶斯分类器”。 –