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是「多項式樸素貝葉斯分類器」。 –

相關問題