Привет! Не так давно я сидел на своем компьютере, ожидая письма от продавца с большим заказом на покупку. После того, как я забеспокоился к концу дня, я позвонил этому парню и объяснил причину задержки. Он заверил меня, что отправил его утром, несмотря на то, что я не мог найти его в своем почтовом ящике. Достаточно озадаченный, я начал просматривать все свои папки и, к своему изумлению, обнаружил, что они лежат в папке «Спам». Мне стало любопытно, и в итоге я узнал, как Google автоматически классифицирует все мои электронные письма, не сообщая мне об этом. Можно с уверенностью предположить, что это могло случиться со многими из нас. Поэтому я решил создать для себя классификатор спама или радиолюбителя и посмотреть, как заставить его работать. Продолжайте читать, если хотите научиться делать его для себя!

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

Что такое спам-сообщения?

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

О проекте

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

Данные

Я использую набор данных Spambase из UCI’s ML Repository, который можно скачать по ссылке.

Последний столбец «spambase.data» указывает, считалось ли электронное письмо спамом (1) или нет (0), то есть нежелательным коммерческим электронным письмом. Большинство атрибутов указывают, часто ли в электронном письме встречается конкретное слово или символ. Атрибуты длины серии (55–57) измеряют длину последовательностей следующих друг за другом заглавных букв. Вот определения атрибутов:

  • 48 непрерывных вещественных [0,100] атрибутов типа word_freq_WORD = процент слов в электронном письме, соответствующих WORD, т.е. 100 * (количество раз, когда СЛОВО появляется в электронном письме) / общее количество слов в электронном письме. «Слово» в этом случае - это любая строка буквенно-цифровых символов, ограниченная не буквенно-цифровыми символами или концом строки.
  • 6 непрерывных вещественных [0,100] атрибутов типа char_freq_CHAR] = процент символов в электронном письме, соответствующих CHAR, т.е. 100 * (количество появлений CHAR) / общее количество символов в электронном письме
  • 1 непрерывный вещественный [1,…] атрибут типа capital_run_length_average = средняя длина непрерывных последовательностей заглавных букв
  • 1 непрерывный целочисленный атрибут [1,…] типа capital_run_length_longest = длина самой длинной непрерывной последовательности заглавных букв
  • 1 непрерывный целочисленный атрибут [1,…] типа capital_run_length_total = сумма длины непрерывных последовательностей заглавных букв = общее количество заглавных букв в электронном письме
  • 1 номинальный атрибут класса {0,1} типа spam = указывает, считалось ли электронное письмо спамом (1) или нет (0), то есть нежелательным коммерческим электронным письмом.

Модель

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

Полиномиальный наивный байесовский классификатор

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

Регрессор XGBoost

XGBoost - это оптимизированная распределенная библиотека повышения градиента, разработанная для обеспечения высокой эффективности, гибкости и портативности. Он реализует алгоритмы машинного обучения в рамках платформы Gradient Boosting. XGBoost обеспечивает усиление параллельного дерева (также известное как GBDT, GBM), которое решает многие задачи науки о данных быстрым и точным способом. Один и тот же код работает в основной распределенной среде (Hadoop, SGE, MPI) и может решать проблемы, выходящие за рамки миллиардов примеров. "читать далее.."

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

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

import pandas as pd
import numpy as np
import re
data = pd.read_csv('spambase_data', names=cols, header=None)
X = data.iloc[:, :-1]
y = data.classified
print('Data Table \n')
display(X)
print('\n\nTags Table')
display(y)

Вывод:

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

Шаг 2. Разделите набор данных на обучающие и тестовые подмножества.

from sklearn.model_selection import train_test_split as tts

X_train, X_test, y_train, y_test = tts(X, y, test_size=0.3, random_state=0)

Шаг 3. Построение модели классификатора MultinomialNB с использованием обучающего подмножества и последующее тестирование эффективности модели на тестовом наборе.

from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score

mnb = MultinomialNB()
mnb.fit(X_train, y_train)

predicted = mnb.predict(X_test)

score = accuracy_score(y_test, predicted)
print('Accuracy Score: \n', (100*score))

Вывод:

Accuracy Score: 80.95582910934105

Мы получили оценку ~ 81%. Это означает, что около 20% ваших писем будут классифицированы неправильно.

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

Шаг 4: Создание отчета о классификации и матрицы неточностей (я использовал библиотеку seabron для создания более наглядного вывода матрицы неточностей, вы также можете использовать представление по умолчанию sklearn.confusion_matrix ()), чтобы оцените, как работает наша модель:

import seaborn as sn
from sklearn.metrics import confusion_matrix as cm
from sklearn.metrics import classification_report as cr

cm1 = cm(y_test, predicted, labels=[0, 1])
df_cm = pd.DataFrame(cm1, range(2), range(2))
sn.set(font_scale=1)
sn.heatmap(df_cm, annot=True, annot_kws={'size':14}, fmt='d').set_title('Confusion Matrix')

print('\nClassification Report: \n', cr(y_test, predicted))

Вывод:

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

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

Шаг 5. Создание модели XGBoost с обучающим набором, тестирование на тестовом наборе и распечатка отчета о классификации и матрицы неточностей.

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

from xgboost import XGBRegressor

xgb = XGBRegressor(n_estimators=120, leanring_rate=0.075)
xgb.fit(X_train, y_train)
#xgb.fit(X_train, y_train, early_stopping_rounds=10, eval_set=[(X_test, y_test)], verbose=False)

predicted1 = xgb.predict(X_test)
score1 = accuracy_score(y_test, (predicted1 > 0.5))
print('Accuracy Score on XGBoost: \n', (100*score1))
cm2 = cm(y_test, predicted1 > 0.5, labels=[0, 1])
df_cm = pd.DataFrame(cm2, range(2), range(2))
sn.set(font_scale=1)
sn.heatmap(df_cm, annot=True, annot_kws={'size':14}, fmt='d').set_title('Confusion Matrix')
print('\nClassification Report: \n', cr(y_test, (predicted1 > 0.5)))

Вывод:

Accuracy Score on XGBoost: 
 94.6415640839971

Используя XGBoost Regressor, мы снизили классификацию ложноположительных результатов до менее 3%. Более того, мы сократили всю ложную классификацию до менее 6%, повысили точность до ~ 95%.

Несмотря на высокую точность, может оказаться неприемлемым, чтобы 3% любительских писем были помечены как спам. И чтобы решить эту проблему, мы теперь ограничим любые ложноположительные результаты.

Шаг 6: мы повторим шаг 5 как есть, только с одним небольшим изменением. При преобразовании прогнозируемых выходных данных в вероятности мы дадим модели указание классифицировать только те, которые с вероятностью более 0,9 будут отмечены как спам.

score1 = accuracy_score(y_test, (predicted1 > 0.9))
print('Accuracy Score on XGBoost: \n', (100*score1))
cm2 = cm(y_test, predicted1 > 0.9, labels=[0, 1])
df_cm = pd.DataFrame(cm2, range(2), range(2))
sn.set(font_scale=1)
sn.heatmap(df_cm, annot=True, annot_kws={'size':14}, fmt='d').set_title('Confusion Matrix')
print('\nClassification Report: \n', cr(y_test, (predicted1 > 0.9)))

Вывод:

Accuracy Score on XGBoost: 
 87.97972483707458

Сохраняя ошибочную классификацию ветчины как спама, мы отказались от нашей точности и снизились до 88%. Я считаю, что лучше прочитать несколько лишних писем, чем пропустить некоторые очень важные электронные письма, например, заказ на покупку!

Результат

Мы успешно создали и внедрили модель машинного обучения с использованием двух разных алгоритмов. Мы определили, что в нашем случае алгоритм ансамблевого случайного леса XGBoost работает лучше, чем полиномиальный алгоритм наивного Байеса.

Мы видели, как точность и аккуратность работают обратно пропорционально, когда достижение одного приводит к потере другого.

Будущая работа

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

Ссылка

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

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

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

Спасибо.