Я до сих пор помню свой первый день в классе машинного обучения. Первым примером, который был предоставлен для объяснения того, как работает машинное обучение, был «Обнаружение спама». Я думаю, что в большинстве курсов по машинному обучению преподаватели приводят один и тот же пример, но на скольких курсах вы действительно сможете реализовать модель? Мы рассказываем, как машинное обучение участвует в обнаружении спама, а затем переходим к другим вещам.

Вступление

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

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

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

Обнаружение спама в Gmail

Все мы знаем, что данные, которыми располагает Google, явно не находятся в бумажных файлах. У них есть центры обработки данных, в которых хранятся данные о клиентах. Прежде чем Google / Gmail решит разделить электронные письма на спам или не спам, прежде чем они попадут в ваш почтовый ящик, к этим письмам в центрах обработки данных применяются сотни правил. Эти правила описывают свойства спама. Gmail / Google использует распространенные типы спам-фильтров:

Явная блокировка - удаляет электронные письма еще до того, как они попадут во входящие.

Массовый фильтр электронной почты. Этот фильтр помогает фильтровать электронные письма, которые проходят через другие категории, но являются спамом.

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

Null Sender Disposition - Удалите все сообщения без адреса отправителя конверта SMTP. Помните, когда вы получаете электронное письмо с сообщением «Не доставлено на адрес xyz».

Проверка тега заголовка нулевого отправителя. Проверяйте сообщения, проверяя цифровую подпись безопасности.

Есть способы избежать фильтрации спама и отправлять электронные письма прямо во входящие. Чтобы узнать больше о спам-фильтре Gmail, посмотрите это информационное видео от Google.

Создание детектора спама: предварительная обработка

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

Изображение выше - это снимок электронной почты с тегами, собранных для исследования спама. Он содержит один набор сообщений на английском языке из 5 574 электронных писем, помеченных как законные (любительские) или спам.

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

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

def text_preprocess(text):
    text = text.translate(str.maketrans('', '', string.punctuation))
    text = [word for word in text.split() if word.lower() not in  stopwords.words('english')]
    return " ".join(text)

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

vectorizer = TfidfVectorizer("english")
message_mat = vectorizer.fit_transform(message_data_copy)
message_mat

Эту векторную матрицу можно использовать для создания разделения поездов / тестов. Это поможет нам научить модель / машину быть умными и проверить точность ее результатов.

message_train, message_test, spam_nospam_train, spam_nospam_test = train_test_split(message_mat, message_data['Spam/Not_Spam'], test_size=0.3, random_state=20)                                                  

Выбор модели

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

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

Логистическая регрессия

Согласно определению Википедии,

Логистическая регрессия измеряет взаимосвязь между категориальной зависимой переменной и одной или несколькими независимыми переменными путем оценки вероятностей с помощью логистической функции.

Судя по определению, логистическая функция играет здесь важную роль в классификации, но нам нужно понимать, что такое логистическая функция и как она помогает в оценке вероятности нахождения в классе.

Формула, упомянутая на изображении выше, известна как логистическая функция или сигмовидная функция, а кривая - сигмовидная кривая. Сигмовидная функция дает S-образную кривую. Выход сигмоидной функции стремится к 1 при z → ∞ и стремится к 0 при z → −∞. Следовательно, сигмоидальная / логистическая функция производит значение зависимой переменной, которое всегда будет находиться в диапазоне [0,1], то есть вероятность нахождения в классе.

Моделирование

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

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

Spam_model = LogisticRegression(solver='liblinear', penalty='l1')
Spam_model.fit(message_train, spam_nospam_train)
pred = Spam_model.predict(message_test)
accuracy_score(spam_nospam_test,pred)

Итак, сначала мы определяем модель, а затем подбираем данные поезда - этот этап называется обучением вашей модели. После завершения фазы обучения мы можем использовать разделение тестов и прогнозировать результаты. Чтобы проверить точность нашей модели, мы можем использовать показатель точности. Этот показатель сравнивает предсказанные результаты с полученными истинными результатами. После запуска кода, приведенного выше, мы получили точность 93%.

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

Резюме

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

Ссылка :

  1. Набор данных обнаружения спама Kaggle
  2. Github Repo
  3. НЛП - Тематическое моделирование
  4. Обнаружение спама в Gmail