Рассмотрим конкретную задачу классификации: определение, является ли письмо спамом или нет (спам/не спам). Мы будем использовать Python и библиотеки, такие как scikit-learn
, pandas
и 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
Объяснение кода
-
Загрузка данных:
-
Мы загрузили датасет с сообщениями и их метками.
-
Преобразовали метки в бинарный формат: "spam" → 1, "ham" → 0.
-
Предобработка текста:
-
Обучение модели:
-
Оценка модели:
-
Использовали метрики accuracy
, precision
, recall
, F1-score
и confusion matrix
для оценки качества модели.
-
Применение модели:
Возможные улучшения
-
Использование других моделей:
-
Оптимизация гиперпараметров:
-
Работа с дисбалансом классов:
-
Улучшение предобработки текста:
Этот пример демонстрирует, как можно решить задачу классификации с использованием Python и библиотек машинного обучения. Вы можете адаптировать этот код для других задач классификации, таких как классификация текстов, изображений или медицинских данных.