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

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

Мой подход:

  1. Сбор данных: соберите набор данных помеченных сообщений, где каждое сообщение классифицируется как спам или не спам.
  2. Предварительная обработка данных: очищайте сообщения, удаляя ненужные символы, переводя их в нижний регистр и удаляя стоп-слова.
  3. Извлечение признаков: преобразуйте текстовые сообщения в векторы числовых признаков, используя такие методы, как TF-IDF или встраивание слов.
#Random Forest
classifier = Pipeline([("tfidf", TfidfVectorizer()) , ("classifier", RandomForestClassifier(n_estimators=100))])
#SVM
svm = Pipeline([("tfidf", TfidfVectorizer()) , ("classifier", SVC(C = 100, gamma='auto'))])

4. Выбор модели. Для классификации я выбрал алгоритмы машинного обучения: машины опорных векторов (SVM) и случайные леса.

Случайные леса и машины опорных векторов (SVM) — популярные и эффективные алгоритмы машинного обучения для классификации спам-сообщений. Вот почему они обычно применяются в этом проекте:

Случайные леса:

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

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

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

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

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

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

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

5. Обучение модели: разделите набор данных на наборы для обучения и тестирования. Обучите выбранную модель на тренировочном наборе.

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test =  train_test_split(data['message'], data['label'], test_size = 0.3, random_state =  0, shuffle = True )

6. Оценка модели: оцените производительность обученной модели на тестовом наборе, используя такие показатели, как точность, воспроизводимость и балл F1.

#Random Forest 
y_pred = classifier.predict(x_test)
from sklearn .metrics import classification_report, accuracy_score, confusion_matrix
accuracy_score(y_test, y_pred)
confusion_matrix(y_test, y_pred)
print(classification_report(y_test, y_pred))

#SVM
y_pred = svm.predict(x_test)
accuracy_score(y_test, y_pred)
confusion_matrix(y_test, y_pred)
print(classification_report(y_test, y_pred))

Конечный результат: с помощью Random Forest я смог достичь показателя точности 94,8%, а с помощью SVM я смог добиться показателя точности 94,6%.

#Classification Report for Random Forest
+--------------+---------+---------+-------------+-----------+--+---------+--------+
|              |precision|  recall |    f1-score |   support |  |         |        |
+--------------+---------+---------+-------------+-----------+--+---------+--------+
| ham          |    0.91 |    0.99 |        0.95 |       227 |  |         |        |
| spam         |    0.99 |    0.91 |        0.95 |       222 |  |         |        |
| accuracy     |         |         |             |           |  |    0.95 |    449 |
| macro avg    |    0.95 |    0.95 |        0.95 |       449 |  |         |        |
| weighted avg |    0.95 |    0.95 |        0.95 |       449 |  |         |        |
+--------------+---------+---------+-------------+-----------+--+---------+--------+
#Classification Report for SVM
+--------------+---------+--------+------------+----------+--+---------+--------+
|              |precision| recall |   f1-score |  support |  |         |        |
+--------------+---------+--------+------------+----------+--+---------+--------+
| ham          |    0.92 |   0.97 |       0.95 |      227 |  |         |        |
| spam         |    0.97 |   0.92 |       0.94 |      222 |  |         |        |
| accuracy     |         |        |            |          |  |    0.95 |    449 |
| macro avg    |    0.95 |   0.95 |       0.95 |      449 |  |         |        |
| weighted avg |    0.95 |   0.95 |       0.95 |      449 |  |         |        |

Github (ссылка на проект): https://github.com/errordube/Spam-Message-Classification