Как использовать метод fit с массивом сообщений - PullRequest
1 голос
/ 10 мая 2019

Я пытаюсь обучить и протестировать многочленные байесы на наборе данных, разделенных соответственно.После обработки данных у меня есть массив сообщений и массив меток.Я пытаюсь использовать .fit () и .predict () с этими данными, но они не работают.

Мои данные выглядят так:

emails = ['example mail', 'another example mail', ..]
labels = ['ham', 'spam', ..]

Это то, что я 'м в настоящее время пытается:

bayes = sklearn.linear_model.MultinomialNB().fit(emails, labels)

Ответы [ 3 ]

0 голосов
/ 10 мая 2019

Пожалуйста, оставьте полную информацию, например, фактическая ошибка

Прежде всего, Sklearn .fit () принимает два аргумента: 1) двумерный массив обучающих данных и 2) одномерный массив меток / целей. Поэтому вам нужно переформатировать входную переменную в список списков (даже если у вас есть только одна переменная предиктора)

from sklearn.naive_bayes import MultinomialNB

model = MultinomialNB()
emails = [['example mail'], ['another example mail']]
labels = ['ham', 'spam']
model.fit(emails, labels)

После запуска вы получите еще одну ошибку:

TypeError: '<' not supported between instances of 'numpy.ndarray' and 'int'

Потому что вы передаете слова в математическое уравнение. В соответствии со связанными подробностями реализации в документации https://nlp.stanford.edu/IR-book/html/htmledition/naive-bayes-text-classification-1.html вы должны строить свои собственные параметры из входных текстов (например, подсчет слов, анализ настроений, бинаризованные функции (присутствует или отсутствует) и т. Д.

Если вы правильно отформатируете свои данные, генерируя количество символов и слов для каждого письма, у вас может быть что-то работоспособное:

from sklearn.naive_bayes import MultinomialNB

model = MultinomialNB()
emails = [['example mail'], ['another example mail']]
emails = [[len(x[0]), len(x[0].split())] for x in emails]
labels = ['ham', 'spam']
model.fit(emails, labels)

тогда, если вы передадите тестовые данные аналогичным образом, вы получите вывод

emails = [['test mail'], ['another test mail']]
emails = [[len(x[0]), len(x[0].split())] for x in emails]
model.predict(emails)

Out[17]: array(['ham', 'spam'], dtype='<U4')

Так как в обоих тестовых письмах одинаковое количество слов и одинаковое количество символов, вы получите ожидаемый выход ветчины / спама

0 голосов
/ 10 мая 2019

Ни один алгоритм машинного обучения не может обрабатывать текст как ввод или вывод. Оба всегда будут числовыми. Вам нужно найти способ сопоставить ваши входные данные (электронные письма) и выходные данные (метки) с числовыми значениями таким образом, чтобы сохранить информацию .

Что касается ваших меток, вам, вероятно, нужно сопоставить каждую метку с другим целым числом, а затем использовать их для обучения классификатора:

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
encoded_labels = le.fit_transform(labels)

Модели Sklearn могут выполнять эту работу самостоятельно, хотя в этом нет необходимости.

Что касается ваших входных данных, это может быть намного сложнее. Вот где ваша настоящая проблема .

Вы могли бы выполнить кодирование в горячем режиме, но это было бы очень плохой идеей, потому что тогда две почты могут быть либо одинаковыми, либо разными (и в большинстве случаев они будут разными), независимо от того, насколько они похожи , а также ваш вклад будет очень большой размер.

word2vec (https://radimrehurek.com/gensim/models/word2vec.html) - это способ сопоставить слова с векторами, анализируя логику между словами ваших предложений. В отличие от горячего кодирования, подобные письма будут включать в себя одни и те же слова или структуры предложений и будет близко в скрытом пространстве, даже если они не совсем равны. Это означает, что информация может быть сохранена.

Вам просто нужно найти способ сопоставить ваши предложения с векторами, поскольку ваши предложения являются вашими входными данными, основанными на векторах слов. Возможно, объедините векторы слов в вашем предложении и используйте 0-отступ, чтобы все предложения, даже с разным количеством слов, были сопоставлены с вектором одинаковой длины.

Но это может не сработать, и неочевидно найти способ сопоставить ваши предложения векторам таким образом, чтобы сохранить информацию, даже если вы отобразили свои слова с помощью word2vec. Смотрите этот пост: Как рассчитать сходство предложений, используя модель gensim word2vec с python .

Другим способом было бы попробовать реализацию doc2vec вместо word2vec. Это предназначено для отображения целых предложений на векторы, а не просто слова, и это именно то, что вы хотите сделать.

0 голосов
/ 10 мая 2019

Вам необходимо еще немного обработать ваши данные, прежде чем приступить к обучению вашей модели.Модель не будет работать напрямую на чистых строках.Вы можете использовать любые библиотеки nlp (я рекомендую Spacy или nltk stanford) для обработки ваших данных (например, токенизация, лемматизация и получение общего представления о абзаце ...) Я предлагаю вам добавить одну горячуюкодировка get_dummies ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...