3

ОК, поэтому я просто изучаю курс машинного обучения Эндрю Нг. Я сейчас читаю this chapter и хочу попробовать Multinomial Naive Bayes (внизу страницы 12) для себя, используя SKLearn и Python. Так Эндрю предлагает способ, в котором каждая электронной почте в этом случае кодируется такMultinomialNB - Теория против практики

Мы позволяем x_i обозначать личность i -й слова в электронной почте. Таким образом, x_i теперь является целым числом, принимающим значения в {1, . . . , |V|}, где |V| составляет размер нашей лексики (словаря). Электронная почта n слов теперь , представленная вектором (x1, x2, . . . , xn) длины nОбратите внимание, что n может отличаться для разных документов. Например, если письмо начинается с “A NIPS . . . ,” затем x_1 = 1 (“a” это первое слово в словаре ) и x2 = 35000 (если “nips” является 35000th слово в словаре ).

См. Основные моменты.

Так что это то, что я сделал в Python. У меня есть vocabulary, который представляет собой список из 502 слов, и я закодировал каждое «электронное письмо» так, чтобы оно было представлено так же, как описывает Эндрю, например, сообщение «это спарта» представлено [495, 296, 359] и «это не спартанца "по [495, 296, 415, 359].

Так что возникает проблема.

По-видимому, для ввода 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 словаря слова в файле тренировки. Конечно, возможно, вы уже догадались, что большинство из них будут равны нулю. например: «это не спарта, а не эта спарта» будет закодировано, как показано ниже. [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, 495-й указатель вектора слов длины 502.

Таким образом, будет создана матрица векторных функций, чьи строки обозначают количество файлов обучающего набора и столбцов, обозначающих 502 словаря словаря. Значение в индексе 'ij' будет числом вхождений j-го слова словаря в i-м файле.

Эта генерируемая кодировка электронных писем (векторная матрица объектов) может быть предоставлена ​​MultinomialNB для обучения.

Вам также придется генерировать аналогичную длину длиной 502 для тестового сообщения электронной почты и перед предсказанием класса.

Вы можете легко создать классификатор спам-фильтра с multinomialNB в наборе данных ling-spam, используя следующий блог. Блог-пост использует sklearn и python для реализации.

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

+0

Спасибо! Так что, может быть, метод, который я связал, и многочлены NN SKLearn - это разные методы? В примечаниях, которые я связывал (и как цитировал), алгоритм может работать с разными длинами. –

+0

В той главе, которую вы читали, фиксированная длина каждого документа указана на стр. 8, и то, как sklearn реализует его в Multinomial NB. Таким образом, метод sklearn описан Andrew Ng на стр. 8. Метод, который вы здесь связали, который находится на странице 12-13, описывает модель события для классификации текста. Эти два метода кажутся разными. –

+0

Ну, это под подразделением Наивного Байеса (Naive Bayes - 2, модель мультиномиального события - глава 2.2), поэтому я догадался, что это была многочлена вариации NB. Документация SKLearn также гласит, что multinomialNB является «многокомпонентным классификатором Naive Bayes». –

Смежные вопросы