3

好吧,我只是在学习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()) 

输入的样子:enter image description here enter image description hereenter 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. 

回答

1

是的,你是思考的权利。你必须用固定长度的矢量来编码每个邮件。这个向量被称为训练集的每个电子邮件的502维度的字数统计向量(在你的情况下)。

每个字计数矢量包含在训练文件502个字典中的单词的频率。当然,你现在可能已经猜到,他们中的大多数将是零。例如:“这不是sparta不是这个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被放置在第296,359,第415, 502长度字数向量的第495个索引。

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

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

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

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

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

+0

谢谢!所以也许我链接的方法和SKLearn multinomialNB是不同的方法?在笔记我链接(和引用),该算法可以使用不同的长度。 –

+0

在您正在阅读的章节中,每个文档的固定长度编码在第8页中给出,那就是sklearn如何在Multinomial NB中实现它。因此,第8页的Andrew Ng描述了sklearn的方法。您在第12-13页链接的方法描述了文本分类的事件模型。这两种方法看起来不同。 –

+0

嗯,它在朴素贝叶斯子章节之下(朴素贝叶斯是2,多项事件模型是2.2章),所以我猜想它是NB的多项式变体。 SKLearn文档还指出multinomialNB是“多项式朴素贝叶斯分类器”。 –

相关问题