Спам или нежелательные сообщения / электронные письма не несут никакой ценной информации. Они просто СПАМ в наш почтовый ящик. Итак, нам нужен способ их отфильтровать. Точно так же, как GOOGLE делает это с GMAIL. Они используют некоторые методы прогнозного моделирования в сочетании с искусственным интеллектом, чтобы перенаправлять такие нежелательные сообщения прямо в нашу папку для спама, чтобы нам не приходилось иметь дело с ненужными сообщениями. Здесь, в статье, я не буду вдаваться в подробности ИИ, но мы, безусловно, можем разработать некоторую модель / методику, которая поможет нам определить, какие письма / сообщения являются спамом, а какие - не-спамом (Ham). Итак, давайте погрузимся в проблему.

Весь код вместе с данными можно найти здесь.

Мы выполним следующие шаги, чтобы построить нашу модель классификации [Ой, я не упоминал об этом раньше ??? Это алгоритм классификации, который позволяет нам прогнозировать нежелательную или нежелательную почту (Верно / Неверно; Да / Нет)]

1. Установка и импорт необходимых библиотек

В записной книжке есть код для всех библиотек, которые использовались в анализе.

Загрузка данных и описания

Данные содержат 5572 строки и всего 2 столбца. «V1» - это наша целевая переменная, в которой хранится класс каждого текстового сообщения (v2), который в основном является нашей объясняющей (функциональной / независимой) переменной.

Итак, по сути, мы должны использовать текстовые данные, чтобы классифицировать новое сообщение либо как СПАМ, либо как радиолюбитель.

Примечание: пустых строк нет (НЕТ НУЛЕВЫХ ЗНАЧЕНИЙ)

2. Предварительная обработка данных

Ах!! Это очень важный шаг. Чтобы запустить любой алгоритм, нам нужно сначала обработать и подготовить (этот шаг показан в следующих разделах) данные. Здесь я сделал 3 этапа предварительной обработки.

Переименование столбцов

Это совсем не обязательно, но просто для облегчения идентификации.

Назначьте тип данных String столбцу Text

Это делается, поскольку dtype для столбца «Сообщение» сохраняется как «объект», в то время как на самом деле это «строка». Если дальше по строке будут выполняться строковые операции, возникнут ошибки, поэтому мы преобразуем его в строковый тип данных.

Очистите столбец сообщения

Это самый важный этап предварительной обработки. Мы удаляем из сообщений все ненужные числа, знаки препинания и пробелы. Кроме того, мы переводим все слова в нижний регистр, чтобы при разработке модели не было путаницы между, например, словом «окончательный» и словом «окончательный». Машины тупые. Они не поймут, что оба эти слова одинаковы. Они будут рассматривать их как разные слова. Мы этого не хотим. Следовательно, предварительная обработка становится настолько важной.

Очищенные данные теперь хранятся в столбце «Clean_Message». Надеюсь, вы заметите различия !!!

Удалите стоп-слова и используйте стемминг

Вышеупомянутый столбец Clean_Message действительно не совсем чистый. Для получения более точных результатов нам нужно удалить определенные слова и преобразовать слова в их базовые формы.

Удаление слов, не содержащих дополнительной информации и являющихся в основном шумом, известно как «стоп-слова», например [a, the, an, is, are,… ..].

По сути, основание - это преобразование слов в их базовые формы, поскольку в большинстве случаев мы не получаем никакой дополнительной информации из различных форм одного и того же слова.

Примечание. Существует еще один метод преобразования слов в их базовую форму, известный как лемматизация, но здесь я использую Stemming, хотя также можно использовать лемматизацию. Ознакомьтесь с концепцией в моей записной книжке.

3. Исследовательский анализ данных

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

Итак, мы видим, что 87% сообщений - это Ham, в то время как только 13% - это спам. Это указывает на несбалансированный набор данных, и вы можете использовать методы для его преодоления перед моделированием. Однако я не буду делать этого здесь, поскольку алгоритмы, которые я использовал здесь, не сильно подвержены дисбалансу.

Но, конечно, попробуйте применить различные методы передискретизации

Облако слов для радиолюбительских сообщений

Облако слов для СПАМ-СООБЩЕНИЙ

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

4. Подготовка данных для анализа.

Чтобы построить модель для будущей классификации сообщений SPAM / HAM, нам сначала нужно подготовить данные в формате, который требуется нашим алгоритмом. Мы не можем передавать текстовые данные в наш алгоритм, так как он их не поймет. Следовательно, нам нужен способ конвертировать его в числа, и это именно то, что я сделал ниже.

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

Пакет слов: в этом методе все уникальные слова из всех сообщений (т. е. все строки столбца Clean_Message) собираются и преобразуются в матрицу документа, где каждое слово теперь является столбцом. и каждая строка определяет каждое сообщение (документ) из исходного фрейма данных. Он присваивает значение 1, если слово появляется в документе, и 0 в противном случае. Если слово встречается несколько раз, оно просто добавляет к нему 1. Ниже приведен снимок типичной матрицы документа при применении BoW.

Частота термина - обратная частота документа: TF-IDF в основном совпадает с BoW с точки зрения приведенного выше представления матрицы документов, но между ними есть разница. В методе BoW значения присваиваются на основании их наличия или отсутствия, но не принимается во внимание важность самого слова. TF-IDF учитывает это и присваивает соответствующие значения.

Мы не будем вдаваться в математику. В сети есть множество материалов. Не стесняйтесь погуглить, чтобы получить более подробные сведения

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

Разделение данных на обучающие и тестовые

Во-первых, мы отделяем ярлыки от сообщений.

Затем мы разделяем данные поезда и тестирования и применяем BoW к набору данных поезда.

5. Разработка модели

Как упоминалось ранее, для решения этой проблемы я буду использовать наивный байесовский классификатор и классификатор опорных векторов. Вместо того, чтобы применять сначала технику BoW, а затем алгоритм, я буду использовать функцию под названием «Pipeline», которая будет хранить эти 2 шага в последовательности. sklearn имеет модуль, называемый конвейером, который выполняет требование.

Теперь мы используем этот объект конвейера для соответствия нашим обучающим данным.

Точно так же мы применим SVC к данным поезда.

6. Оценка модели

После подгонки NB и SVC к данным поезда теперь нам нужно оценить модели на невидимых данных (тестовых данных), чтобы понять точность и обобщающую способность моделей. Однако слепое использование точности здесь не годится, поскольку наш набор данных несбалансирован. Он всегда будет немного предвзято относиться к классу большинства (Хэм). Следовательно, мы можем посмотреть на точность, отзыв или оценку f1, чтобы лучше понять характеристики моделей. И все эти показатели можно рассчитать с помощью знаменитой «Матрицы путаницы».

Точность как для NB, так и для SVC составляет примерно 98%. Однако нас интересуют точность, отзывчивость или результат f1. Теперь f1 одинаков для обеих моделей, но «Отзыв» (прогнозирование спама как спама) выше для Наивного Байеса (от 91% до 84%). Следовательно, если наша цель - правильно предсказать спам как спам, даже если несколько любительских сообщений неправильно классифицированы как спам, мы выберем наивный байесовский метод. Итак, в целом, мы можем сделать вывод, что наивный байесовский метод - это путь вперед в решении этой проблемы классификации. Но опять же, это зависит от нашей цели. Если снижение FP и FN важно, мы выберем модель, которая имеет наивысший балл f1 по тестовым данным.

Это все, ребята. Загрузите данные, попробуйте и дайте мне знать, если у вас возникнут какие-либо вопросы. Удачного машинного обучения !!

Заключение

Честно говоря, в машинном обучении никогда не бывает конкретного вывода, к которому мы можем прийти. Мы всегда можем сказать, что с заданными данными и используемыми ресурсами (этапами подготовки и разработки модели) алгоритм XYZ работает лучше, чем ABC. Это изменится, когда мы будем тренироваться на другом наборе данных или использовать разные наборы тестов для оценки. Итак, все дело в непрерывном процессе изучения и понимания.