好吧,我只是在學習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是「多項式樸素貝葉斯分類器」。 –