Описание. Этот проект направлен на разработку модели машинного обучения, которая сможет точно отличать спам-сообщения от сообщений, не являющихся спамом.
В сегодняшнюю цифровую эпоху спам-сообщения стали повсеместной неприятностью. Они загромождают наши почтовые ящики, вторгаются в нашу личную жизнь и тратят наше время. Однако с помощью машинного обучения мы можем разработать интеллектуальные модели, чтобы отличать спам от законных сообщений, что избавит нас от хлопот. В этом проекте мы рассмотрим процесс построения модели классификации спам-сообщений и достижения высокой точности наших прогнозов.
Мой подход:
- Сбор данных: соберите набор данных помеченных сообщений, где каждое сообщение классифицируется как спам или не спам.
- Предварительная обработка данных: очищайте сообщения, удаляя ненужные символы, переводя их в нижний регистр и удаляя стоп-слова.
- Извлечение признаков: преобразуйте текстовые сообщения в векторы числовых признаков, используя такие методы, как 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