Статья Автор: Деникина Н.В., Деникин А.В.

Классификация спама

Рассмотрим конкретную задачу классификации: определение, является ли письмо спамом или нет (спам/не спам). Мы будем использовать Python и библиотеки, такие как scikit-learnpandas и numpy, чтобы создать модель классификации.



Мы будем использовать открытый датасет SMS Spam Collection Dataset, который содержит сообщения с метками "spam" (спам) и "ham" (не спам). Наша задача — обучить модель, которая сможет классифицировать новые сообщения как спам или не спам.

Шаги решения

1. Установка необходимых библиотек

Если у вас не установлены библиотеки, выполните:
 

pip install pandas scikit-learn numpy

2. Загрузка и предобработка данных

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer

# Загрузка данных
url = "https://raw.githubusercontent.com/justmarkham/pycon-2016-tutorial/master/data/sms.tsv"
data = pd.read_csv(url, sep='\t', header=None, names=['label', 'message'])

# Просмотр данных
print(data.head())

# Преобразование меток в бинарный формат: spam -> 1, ham -> 0
data['label'] = data['label'].map({'spam': 1, 'ham': 0})

# Разделение данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(data['message'], data['label'], test_size=0.2, random_state=42)

# Векторизация текста (преобразование текста в числовые признаки)
vectorizer = TfidfVectorizer(stop_words='english', max_features=5000)
X_train_vec = vectorizer.fit_transform(X_train)
X_test_vec = vectorizer.transform(X_test)

3. Обучение модели

Мы будем использовать логистическую регрессию для классификации.

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# Создание и обучение модели
model = LogisticRegression()
model.fit(X_train_vec, y_train)

# Предсказание на тестовых данных
y_pred = model.predict(X_test_vec)

# Оценка модели
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Classification Report:\n", classification_report(y_test, y_pred))
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))

4. Анализ результатов

Пример вывода:

Accuracy: 0.9838565022421525
Classification Report:
               precision    recall  f1-score   support

           0       0.98      1.00      0.99       965
           1       0.97      0.83      0.89       150

    accuracy                           0.98      1115
   macro avg       0.98      0.91      0.94      1115
weighted avg       0.98      0.98      0.98      1115

Confusion Matrix:
 [[965   0]
 [ 26 124]]
  • Accuracy: 98.4% — модель правильно классифицирует 98.4% сообщений.

  • Precision для спама: 97% — из всех сообщений, которые модель пометила как спам, 97% действительно являются спамом.

  • Recall для спама: 83% — модель правильно идентифицировала 83% всех спам-сообщений.


5. Применение модели на новых данных

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

def classify_message(message):
    # Преобразование сообщения в вектор
    message_vec = vectorizer.transform([message])
    # Предсказание
    prediction = model.predict(message_vec)
    return "spam" if prediction[0] == 1 else "ham"

# Пример использования
new_message = "Congratulations! You've won a $1000 Walmart gift card. Click here to claim your prize."
print(classify_message(new_message))  # Вывод: spam

new_message = "Hey, are we still meeting tomorrow at 5 PM?"
print(classify_message(new_message))  # Вывод: ham
 

Объяснение кода

  1. Загрузка данных:

    • Мы загрузили датасет с сообщениями и их метками.

    • Преобразовали метки в бинарный формат: "spam" → 1, "ham" → 0.

  2. Предобработка текста:

    • Использовали TfidfVectorizer для преобразования текста в числовые признаки. TF-IDF учитывает важность слов в сообщении.

  3. Обучение модели:

    • Обучили модель логистической регрессии на векторизованных данных.

  4. Оценка модели:

    • Использовали метрики accuracyprecisionrecallF1-score и confusion matrix для оценки качества модели.

  5. Применение модели:

    • Написали функцию для классификации новых сообщений.


Возможные улучшения

  1. Использование других моделей:

    • Можно попробовать другие алгоритмы, такие как Random Forest, Gradient Boosting или нейронные сети.

  2. Оптимизация гиперпараметров:

    • Используйте GridSearchCV или RandomizedSearchCV для поиска лучших гиперпараметров модели.

  3. Работа с дисбалансом классов:

    • Если в данных много "ham" и мало "spam", используйте методы балансировки классов (например, SMOTE).

  4. Улучшение предобработки текста:

    • Попробуйте другие методы векторизации, такие как word2vec или BERT.


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

Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать