Parsing and preprocessing data from .eml files, using them to train some models, and analyzing
Данный проект создан в целях изучения основ Machine Learning и Data Science
Возможности данного проекта:
- автоматизированный сбор данных (отправитель, получатель, дата письма, текст письма, метка спам/не спам) из файлов с расширением .eml (parsing)
- преобразование данных в .CSV (рекомендуется проверка целостности и точности переноса данных после преобразования)
- предподготовка данных для машинного обучения, включая векторизацию
- анализ преобразованных данных
- обучение моделей, основанных на логической регрессии, нейронной сети, методе опорных векторов, Байесовском алгоритме Бернулли
- вывод тестовых результатов каждой модели
Необходима версия Python не ниже 3.12.7
- Загрузить архив и распаковать в удобную директорию
- Для сбора данных и сохранения их в формат .CSV запустить parser.py
- Для анализа уже готового набора данных eml_dataset.csv запустить analysis.ipynb
- Для запуска процесса машинного обучения моделей следует запустить models.ipynb
eml_dataset.csv содержит основные сведения, необходимые для анализа данных и машинного обучения:
- отправитель: "From"
- получатель: "To"
- дата письма: "Date"
- текст письма: "Text"
- метка письма (спам/не спам): "Mark"
Основной статистический анализ
| Unnamed: 0 | From | To | Date | Text | Mark | |
|---|---|---|---|---|---|---|
| count | 1600.00000 | 1599 | 1544 | 1599 | 1583 | 1600 |
| unique | NaN | 1094 | 550 | 1551 | 1455 | 2 |
| top | NaN | boingboing <rssfeeds@example.com> | yyyy@example.com | Fri, 29 Mar 2002 05:01:01 +0000 | dear paypal member account randomly flagged sy... | spam |
| freq | NaN | 31 | 142 | 4 | 8 | 1000 |
| mean | 799.50000 | NaN | NaN | NaN | NaN | NaN |
| std | 462.02453 | NaN | NaN | NaN | NaN | NaN |
| min | 0.00000 | NaN | NaN | NaN | NaN | NaN |
| 25% | 399.75000 | NaN | NaN | NaN | NaN | NaN |
| 50% | 799.50000 | NaN | NaN | NaN | NaN | NaN |
| 75% | 1199.25000 | NaN | NaN | NaN | NaN | NaN |
| max | 1599.00000 | NaN | NaN | NaN | NaN | NaN |
По результатам основного анализа, можно выделить следующие ключевые элементы:
- общее кол-во файлов: 1600
- "From":
- Кол-во заполненных ячеек: 1599
- Уникальных значений: 1094
- Самое частое значение: boingboing rssfeeds@example.com
- Кол-во вхождений самого частого значения: 31
- "To":
- Кол-во заполненных ячеек: 1544
- Уникальных значений: 550
- Самое частое значение: yyyy@example.com
- Кол-во вхождений самого частого значения: 142
- "Date":
- Кол-во заполненных ячеек: 1599
- Уникальных значений: 1551
- Самое частое значение: Fri, 29 Mar 2002 05:01:01 +0000
- Кол-во вхождений самого частого значения: 4
- "Text":
- Кол-во заполненных ячеек: 1583
- Уникальных значений: 1455
- Самое частое значение: dear paypal member account randomly flagged sy...
- Кол-во вхождений самого частого значения: 8
- "Mark":
- Кол-во заполненных ячеек: 1600
- Уникальных значений: 2
- Самое частое значение: spam
- Кол-во вхождений самого частого значения: 1000
Cравнение кол-ва писем спам/не спам в наборе данных
Данный график отображает соотношение кол-ва обработанных писем спам/не спам, находящихся в файле eml_dataset.csv:
- spam: 1000
- not spam: 600
Самые частые отправители
На этом графике отображены сведения по 10 самым частым отправителям (отправитель, кол-во сообщений):
- boingboing rssfeeds@example.com: 31 письмо
- guardian rssfeeds@example.com: 27 писем
- Tom tomwhore@slack.net: 22 письма
- PayPal service@paypal.com: 17 писем
- Gary Lawrence Murphy garym@canada.cim: 14 писем
- tim.one@comcast.net: 14 писем
- gamasutra rssfeeds@example.com: 13 писем
- bugzilla-daemon@hughes-family.org: 13 писем
- fark rssfeeds@example.com: 13 писем
- Tim Chapman timc@2ubh.com: 11 писем
Рсапределние писем по частоте во времени
Этот график иллюстрирует частоту отправлений во временном диапазоне: Год самых частых отправлений писем, вне зависимости от их статуса - 2002: около 190 писем
Было создано две выборки: 75/25 и 80/20, также подготовленны гиперпараметры для проведения сравнения результатов обучения моделей.
В таблицах представленных ниже not spam соответствует классификатору "0", а spam - "1".
Neural Network (MLP) performance:
| precision | recall | f1-score | support | |
|---|---|---|---|---|
| 0 | 0.95 | 0.97 | 0.96 | 144 |
| 1 | 0.98 | 0.97 | 0.98 | 252 |
| accuracy | 0.97 | 396 | ||
| macro avg | 0.96 | 0.97 | 0.97 | 396 |
| weighted avg | 0.97 | 0.97 | 0.97 | 396 |
Общая точность определения среди всех параметров (accuracy): 97%
Доля истинно положительных объектов, среди всех распознанных как положительные (precision): not spam - 95%, spam - 98%
Доля истинно положительных объектах во всех положительных (recall): not spam - 97%, spam - 97%
Среднее гармоническое между presicion и recall (f1-score): not spam - 96%, spam - 98%
Logistic Regression performance:
| precision | recall | f1-score | support | |
|---|---|---|---|---|
| 0 | 0.90 | 0.95 | 0.93 | 144 |
| 1 | 0.97 | 0.94 | 0.96 | 252 |
| accuracy | 0.94 | 396 | ||
| macro avg | 0.94 | 0.95 | 0.94 | 396 |
| weighted avg | 0.95 | 0.94 | 0.94 | 396 |
Общая точность определения среди всех параметров (accuracy): 94%
Доля истинно положительных объектов, среди всех распознанных как положительные (precision): not spam - 90%, spam - 97%
Доля истинно положительных объектах во всех положительных (recall): not spam - 95%, spam - 94%
Среднее гармоническое между presicion и recall (f1-score): not spam - 93%, spam - 96%
SVM performance:
| precision | recall | f1-score | support | |
|---|---|---|---|---|
| 0 | 0.87 | 0.98 | 0.92 | 144 |
| 1 | 0.99 | 0.91 | 0.95 | 252 |
| accuracy | 0.94 | 396 | ||
| macro avg | 0.93 | 0.95 | 0.93 | 396 |
| weighted avg | 0.94 | 0.94 | 0.94 | 396 |
Общая точность определения среди всех параметров (accuracy): 94%
Доля истинно положительных объектов, среди всех распознанных как положительные (precision): not spam - 87%, spam - 99%
Доля истинно положительных объектах во всех положительных (recall): not spam - 98%, spam - 91%
Среднее гармоническое между presicion и recall (f1-score): not spam - 92%, spam - 95%
Bernoulli Naive Bayes performance:
| precision | recall | f1-score | support | |
|---|---|---|---|---|
| 0 | 0.81 | 0.99 | 0.89 | 144 |
| 1 | 1.00 | 0.87 | 0.93 | 252 |
| accuracy | 0.91 | 396 | ||
| macro avg | 0.90 | 0.93 | 0.91 | 396 |
| weighted avg | 0.93 | 0.91 | 0.91 | 396 |
Общая точность определения среди всех параметров (accuracy): 91%
Доля истинно положительных объектов, среди всех распознанных как положительные (precision): not spam - 81%, spam - 100%
Доля истинно положительных объектах во всех положительных (recall): not spam - 99%, spam - 87%
Среднее гармоническое между presicion и recall (f1-score): not spam - 89%, spam - 93%
Neural Network (MLP) performance:
| precision | recall | f1-score | support | |
|---|---|---|---|---|
| 0 | 0.94 | 0.97 | 0.96 | 119 |
| 1 | 0.98 | 0.96 | 0.97 | 198 |
| accuracy | 0.97 | 317 | ||
| macro avg | 0.96 | 0.97 | 0.97 | 317 |
| weighted avg | 0.97 | 0.97 | 0.97 | 317 |
Общая точность определения среди всех параметров (accuracy): 97%
Доля истинно положительных объектов, среди всех распознанных как положительные (precision): not spam - 94%, spam - 98%
Доля истинно положительных объектах во всех положительных (recall): not spam - 97%, spam - 96%
Среднее гармоническое между presicion и recall (f1-score): not spam - 96%, spam - 97%
Logistic Regression performance:
| precision | recall | f1-score | support | |
|---|---|---|---|---|
| 0 | 0.91 | 0.96 | 0.93 | 119 |
| 1 | 0.97 | 0.94 | 0.96 | 198 |
| accuracy | 0.95 | 317 | ||
| macro avg | 0.94 | 0.95 | 0.95 | 317 |
| weighted avg | 0.95 | 0.95 | 0.95 | 317 |
Общая точность определения среди всех параметров (accuracy): 95%
Доля истинно положительных объектов, среди всех распознанных как положительные (precision): not spam - 91%, spam - 97%
Доля истинно положительных объектах во всех положительных (recall): not spam - 96%, spam - 94%
Среднее гармоническое между presicion и recall (f1-score): not spam - 93%, spam - 96%
SVM performance:
| precision | recall | f1-score | support | |
|---|---|---|---|---|
| 0 | 0.88 | 0.98 | 0.93 | 119 |
| 1 | 0.99 | 0.92 | 0.95 | 198 |
| accuracy | 0.94 | 317 | ||
| macro avg | 0.93 | 0.95 | 0.94 | 317 |
| weighted avg | 0.95 | 0.94 | 0.94 | 317 |
Общая точность определения среди всех параметров (accuracy): 94%
Доля истинно положительных объектов, среди всех распознанных как положительные (precision): not spam - 88%, spam - 99%
Доля истинно положительных объектах во всех положительных (recall): not spam - 98%, spam - 92%
Среднее гармоническое между presicion и recall (f1-score): not spam - 93%, spam - 95%
Bernoulli Naive Bayes performance:
| precision | recall | f1-score | support | |
|---|---|---|---|---|
| 0 | 0.81 | 0.99 | 0.89 | 119 |
| 1 | 0.99 | 0.86 | 0.92 | 198 |
| accuracy | 0.91 | 317 | ||
| macro avg | 0.90 | 0.93 | 0.91 | 317 |
| weighted avg | 0.92 | 0.91 | 0.91 | 317 |
Общая точность определения среди всех параметров (accuracy): 91%
Доля истинно положительных объектов, среди всех распознанных как положительные (precision): not spam - 81%, spam - 99%
Доля истинно положительных объектах во всех положительных (recall): not spam - 99%, spam - 86%
Среднее гармоническое между presicion и recall (f1-score): not spam - 89%, spam - 92%
Neural Network (MLP) performance:
| precision | recall | f1-score | support | |
|---|---|---|---|---|
| 0 | 0.95 | 0.94 | 0.95 | 144 |
| 1 | 0.97 | 0.97 | 0.97 | 252 |
| accuracy | 0.96 | 396 | ||
| macro avg | 0.96 | 0.96 | 0.96 | 396 |
| weighted avg | 0.96 | 0.96 | 0.96 | 396 |
Общая точность определения среди всех параметров (accuracy): 96%
Доля истинно положительных объектов, среди всех распознанных как положительные (precision): not spam - 95%, spam - 97%
Доля истинно положительных объектах во всех положительных (recall): not spam - 94%, spam - 97%
Среднее гармоническое между presicion и recall (f1-score): not spam - 95%, spam - 97%
Logistic Regression performance:
| precision | recall | f1-score | support | |
|---|---|---|---|---|
| 0 | 0.97 | 0.97 | 0.97 | 144 |
| 1 | 0.98 | 0.98 | 0.98 | 252 |
| accuracy | 0.98 | 396 | ||
| macro avg | 0.98 | 0.98 | 0.98 | 396 |
| weighted avg | 0.98 | 0.98 | 0.98 | 396 |
Общая точность определения среди всех параметров (accuracy): 98%
Доля истинно положительных объектов, среди всех распознанных как положительные (precision): not spam - 97%, spam - 98%
Доля истинно положительных объектах во всех положительных (recall): not spam - 97%, spam - 98%
Среднее гармоническое между presicion и recall (f1-score): not spam - 97%, spam - 98%
SVM performance:
| precision | recall | f1-score | support | |
|---|---|---|---|---|
| 0 | 0.97 | 0.98 | 0.97 | 144 |
| 1 | 0.99 | 0.98 | 0.98 | 252 |
| accuracy | 0.98 | 396 | ||
| macro avg | 0.98 | 0.98 | 0.98 | 396 |
| weighted avg | 0.98 | 0.98 | 0.98 | 396 |
Общая точность определения среди всех параметров (accuracy): 98%
Доля истинно положительных объектов, среди всех распознанных как положительные (precision): not spam - 97%, spam - 99%
Доля истинно положительных объектах во всех положительных (recall): not spam - 98%, spam - 98%
Среднее гармоническое между presicion и recall (f1-score): not spam - 97%, spam - 98%
Bernoulli Naive Bayes performance:
| precision | recall | f1-score | support | |
|---|---|---|---|---|
| 0 | 0.93 | 0.94 | 0.93 | 144 |
| 1 | 0.97 | 0.96 | 0.96 | 252 |
| accuracy | 0.95 | 396 | ||
| macro avg | 0.95 | 0.95 | 0.95 | 396 |
| weighted avg | 0.95 | 0.95 | 0.95 | 396 |
Общая точность определения среди всех параметров (accuracy): 95%
Доля истинно положительных объектов, среди всех распознанных как положительные (precision): not spam - 93%, spam - 97%
Доля истинно положительных объектах во всех положительных (recall): not spam - 94%, spam - 96%
Среднее гармоническое между presicion и recall (f1-score): not spam - 93%, spam - 96%
Neural Network (MLP) performance:
| precision | recall | f1-score | support | |
|---|---|---|---|---|
| 0 | 0.95 | 0.97 | 0.96 | 119 |
| 1 | 0.98 | 0.97 | 0.98 | 198 |
| accuracy | 0.97 | 317 | ||
| macro avg | 0.97 | 0.97 | 0.97 | 317 |
| weighted avg | 0.97 | 0.97 | 0.97 | 317 |
Общая точность определения среди всех параметров (accuracy): 97%
Доля истинно положительных объектов, среди всех распознанных как положительные (precision): not spam - 95%, spam - 98%
Доля истинно положительных объектах во всех положительных (recall): not spam - 97%, spam - 97%
Среднее гармоническое между presicion и recall (f1-score): not spam - 96%, spam - 98%
Logistic Regression performance:
| precision | recall | f1-score | support | |
|---|---|---|---|---|
| 0 | 0.97 | 0.98 | 0.97 | 119 |
| 1 | 0.99 | 0.98 | 0.98 | 198 |
| accuracy | 0.98 | 317 | ||
| macro avg | 0.98 | 0.98 | 0.98 | 317 |
| weighted avg | 0.98 | 0.98 | 0.98 | 317 |
Общая точность определения среди всех параметров (accuracy): 98%
Доля истинно положительных объектов, среди всех распознанных как положительные (precision): not spam - 97%, spam - 99%
Доля истинно положительных объектах во всех положительных (recall): not spam - 98%, spam - 98%
Среднее гармоническое между presicion и recall (f1-score): not spam - 97%, spam - 98%
SVM performance:
| precision | recall | f1-score | support | |
|---|---|---|---|---|
| 0 | 0.97 | 0.98 | 0.97 | 119 |
| 1 | 0.99 | 0.98 | 0.98 | 198 |
| accuracy | 0.98 | 317 | ||
| macro avg | 0.98 | 0.98 | 0.98 | 317 |
| weighted avg | 0.98 | 0.98 | 0.98 | 317 |
Общая точность определения среди всех параметров (accuracy): 98%
Доля истинно положительных объектов, среди всех распознанных как положительные (precision): not spam - 97%, spam - 99%
Доля истинно положительных объектах во всех положительных (recall): not spam - 98%, spam - 98%
Среднее гармоническое между presicion и recall (f1-score): not spam - 97%, spam - 98%
Bernoulli Naive Bayes performance:
| precision | recall | f1-score | support | |
|---|---|---|---|---|
| 0 | 0.85 | 0.99 | 0.91 | 119 |
| 1 | 0.99 | 0.89 | 0.94 | 198 |
| accuracy | 0.93 | 317 | ||
| macro avg | 0.92 | 0.94 | 0.93 | 317 |
| weighted avg | 0.94 | 0.93 | 0.93 | 317 |
Общая точность определения среди всех параметров (accuracy): 93%
Доля истинно положительных объектов, среди всех распознанных как положительные (precision): not spam - 85%, spam - 99%
Доля истинно положительных объектах во всех положительных (recall): not spam - 99%, spam - 89%
Среднее гармоническое между presicion и recall (f1-score): not spam - 91%, spam - 94%
На основании данных эксперементов следует вывод в необходимости использования гиперпараметров при обучении моделей, а также грамотном распределении данных на обучающую и тестовую выборки.
Единственной моделью, не показавшей прироста при изменении выборки и(или) добавлении гипрепараметров, оказалась Neural Network (MLP).
Модели Logistic Regression и SVM стабильно улучшались и достигли показателя в 98% общей точности.
Bernoulli Naive Bayes при увеличении обучающей выборки показала уменьшение точности определения по тестовым данным примерно на 2%.
Краткая сводка минимальных и максимальных показателей обшей точности (accuracy) по результатам тестов:
| Мин. показатели | Макс. показатели | |
|---|---|---|
| Neural Network (MLP) | 0.96 | 0.97 |
| Logistic Regression | 0.94 | 0.98 |
| SVM | 0.94 | 0.98 |
| Bernoulli Naive Bayes | 0.91 | 0.95 |
Таким образом моделями, наилучшим образом показавшими свои возможности в задаче классификации писем на спам/не спам, оказались Logistic Regression и SVM с показателем в 98% и приростом 4% в процессе обучения и настройки.


