Оригинал статьи опубликован на моем сайте.

С последних нескольких месяцев я начал работать над онлайн-курсом Специализация по машинному обучению, предоставляемым Вашингтонским университетом. Первый курс был посвящен основам машинного обучения, второй - линейной регрессии, а третий курс, по которому я сейчас нахожусь, посвящен классификации. . Курсы понравились почти во всех аспектах, так как они обучают реализации алгоритмов машинного обучения с нуля. Это было моей целью, когда я решил исследовать эту область более глубоко. Но, честно говоря, я чувствовал, что есть пробел, потому что многие вопросы остались без ответов. Затем, прочитав о том, как начать с машинного обучения, я обнаружил, что в большинстве статей подчеркивается важность сочетания курсов с практическими проектами, чтобы применить полученные знания и лучше усвоить. .. и это правда! Вам просто нужно попытаться совместить и то, и другое, и вы скоро заметите разницу!

Итак, я нахожусь в своем первом практическом приложении! : D Я решил попробовать Фильтр спама в электронной почте, поскольку это очень частая тема в прикладной классификации. Это легко понять, потому что мы ежедневно сталкиваемся с фильтрацией спама в наших сообщениях электронной почты.

Я последовал простому начальному руководству: Фильтрация спама в электронной почте: реализация Python с помощью Scikit-learn. Вскоре после его завершения мой мозг начал анализировать шаги, и в голову засыпала куча вопросов!

Почему «равное количество спамовых и неспамовых писем»? Что останавливает? Есть ли другие методы очистки данных, кроме удаления стоп-слов и лемматизации? Как производится разделение обучающей выборки и тестовой выборки? Почему не установлена ​​валидация? Почему были специально использованы наивный байесовский классификатор и SVM (машины опорных векторов)? Что делает наивный байесовский метод столь популярным для решения проблем классификации документов? так далее..

Как сказал Уильям Берроуз: «Ваш разум ответит на большинство вопросов, если вы научитесь расслабляться и ждать ответа».

Я перевел дыхание и начал отвечать вопрос за вопросом, иногда выполняя поиск в сети, экспериментируя с некоторыми изменениями в коде и анализируя вывод. И я с радостью делюсь результатами:

1) Необходимые нам данные

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

2) Очистка данных

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

3) Наивный байесовский

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

Как наивный байесовский метод прост и легок? Наивный Байес основан на «теореме Байеса» и называется «Наивным», потому что предполагает, что функции независимы друг от друга в зависимости от класса (нет / небольшая корреляция между функциями), т.е. не реально. Таким образом, наивный байесовский метод может узнать важность отдельных функций, но не может определить взаимосвязь между функциями. Кроме того, время обучения с помощью Naive Bayes значительно меньше по сравнению с альтернативными методами и не требует большого количества данных для обучения.

Почему полиномиальный наивный байесовский метод? А как насчет других моделей, таких как Gaussian Naive Bayes или Bernoulli Naive Bayes?

Итак, Полиномиальный NB учитывает частоту подсчет (вхождений) функции (в нашем случае слова), в то время как Bernoulli NB заботится только о наличии или отсутствии определенной функции (слова) в документе. Последний подходит для функций с двоичными значениями (Бернулли, логическое значение). Принимая во внимание, что с Gaussian NB, функции являются действительными или непрерывными, а их распределение - по Гауссу, набор данных Iris Flower является примером с непрерывными функциями. .

4) Машины опорных векторов (SVM)

Почему использовалась SVM? Я не нашел для этого конкретной причины, но узнал, что SVM обеспечивает высокую точность результатов, поскольку использует процедуру оптимизации. SVM создает классификатор, ища разделяющую гиперплоскость (оптимальную гиперплоскость), которая является оптимальной и максимизирует маржу, разделяющую категории (в нашем случае спам и хам). Таким образом, SVM имеет преимущество надежности в целом и эффективности, когда количество измерений больше, чем количество выборок.

В отличие от наивного Байеса, SVM - это не вероятностный алгоритм.

В чем разница между LinearSVC и SVC (Scikit-learn)? Разница в том, что они не принимают одинаковые параметры. Например, LinearSVC не принимает параметр ядра как предполагаемый линейный. SVC поддерживает больше параметров (C, гамма, ..), поскольку он содержит все возможные ядерные функции (линейная, полиномиальная, rbf или радиальная базисная функция, сигмоид).

Как можно настроить параметры SVM? Настройка параметров SVM улучшает производительность алгоритма. Некоторые из них имеют более сильное воздействие:

-Kernel: ядро ​​похоже на функцию подобия. Это способ вычисления скалярного произведения двух векторов в, возможно, многомерном пространстве признаков с использованием преобразований данных на основе некоторых предоставленных ограничений в более сложное пространство. Функции ядра иногда называют «обобщенным скалярным произведением».

-Гамма: коэффициент ядра для rbf, poly и sigmoid. Более высокое значение гаммы будет пытаться точно соответствовать набору обучающих данных, то есть ошибка обобщения и вызовет проблему чрезмерной подгонки.

-C: коэффициент C в (3.15) - это параметр, который позволяет найти компромисс между ошибкой обучения и сложностью модели. Небольшое значение для C увеличит количество ошибок обучения, а большое C приведет к поведению, аналогичному поведению SVM с жесткими полями ». Иоахим (2002), стр. 40

5) Анализ результатов в разных случаях

Что, если я изменю размер словаря?

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

Я протестировал размер = {3000,5000,6000,7000} и обнаружил, что при размере = 7000 классификация SVM начинает немного снижаться (ложная идентификация), в то время как наивный байесовский метод дает те же результаты, несмотря на различия в размере.

Я думаю, что в этот момент, возможно, целевые классы начали перекрываться или переобучать данные обучения. Я еще не уверен в объяснении результата.

Что, если я попробую по Гауссу и Бернулли?

Очевидно, что введение Бернулли не поможет, потому что, как я объяснил выше, в нашем случае он не дает достаточно информации, нам нужно количество слов, а не их наличие / отсутствие.

Полиномиальный NB:
[[129 1]
[9 121]]
Гауссов NB:
[[129 1]
[11 119]]
Бернулли NB:
[[130 0]
[53 77]]

Как мы видим, Multinomial NB превзошел как Gaussian NB, так и Bernoulli NB.

Что, если я попробую GridSearch на SVM, чтобы настроить параметры SVM?
Params GridSearch: param_grid = {'C': [0,1,1,10,100,1000], 'gamma' : [1,0.1,0.01,0.001,0.0001]}
Найдены лучшие параметры: Гамма: 0,0001; С: 100

Линейный SVM:
[[126 4]
[5 125]]
Полиномиальный NB:
[[129 1]
[9 121]]
SVM:
[[129 1]
[62 68]]
GridSearch на SVM:
[[126 4]
[2 128]]

Параметры настройки SVM с помощью GridSearch позволили добиться лучших результатов.

Заключение

Итак, это были мои первые шаги в приложении Email-Spam Filtering! Надеюсь, это будет полезно, если вы подумываете о создании проекта классификации текста! И я буду продолжать делиться различными размышлениями и экспериментами по пути. В следующий раз я подробнее расскажу об улучшении / изменении обучающих данных и функций.

Проект тоже есть на Github.

Полезные ресурсы:

[1] Наивный байесовский кодекс и классификация текстов.
[2] Наивный байесовский метод на примере.
[3] Эндрю Нг, объяснение наивного байесовского видео 1 и видео 2
[4] Пожалуйста, объясните SVM, как будто мне 5 лет.
[5] Понимание машин опорных векторов на примерах.

Расскажите о своем опыте работы с классификацией текста? В чем вы это применили? Какие методы вы предлагаете применить? Какие проблемы?