Введение

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

Набор данных

Прежде чем мы углубимся в код, давайте взглянем на набор данных, который мы будем использовать. Данные состоят из SMS-сообщений, помеченных как «спам» или «ветчина» (т. е. не спам). Мы будем использовать эти данные для обучения модели машинного обучения, чтобы предсказать, является ли новое сообщение спамом или ветчиной.

Код

Во-первых, давайте импортируем необходимые библиотеки:

javascriptCopy codeimport numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

Далее мы загрузим данные из файла CSV в DataFrame pandas:

raw_mail_data = pd.read_csv('/content/mail_data.csv')

Файл mail_data.csv должен находиться в том же каталоге, что и ваш скрипт Python. Если нет, вам нужно обновить путь к файлу.

Мы преобразуем столбец label из строк в целые числа, где 0 означает «спам», а 1 — «ветчина»:

mail_data = raw_mail_data.copy()
mail_data.loc[mail_data['Category'] == 'spam', 'Category',] = 0
mail_data.loc[mail_data['Category'] == 'ham', 'Category',] = 1

Далее мы разделим данные на текст (X) и метку (Y):

X = mail_data['Message']
Y = mail_data['Category']

Мы разделим данные на обучающий набор и тестовый набор:

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=3)

Мы преобразуем текстовые данные в векторы признаков, которые можно использовать в качестве входных данных для модели машинного обучения:

feature_extraction = TfidfVectorizer(min_df=1, stop_words='english', lowercase=True)
X_train_features = feature_extraction.fit_transform(X_train)
X_test_features = feature_extraction.transform(X_test)

Мы преобразуем значения Y_train и Y_test в целые числа:

Y_train = Y_train.astype('int')
Y_test = Y_test.astype('int')

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

model = LogisticRegression()
model.fit(X_train_features, Y_train)

Оценим точность модели на обучающей выборке:

train_predictions = model.predict(X_train_features)
train_accuracy = accuracy_score(Y_train, train_predictions)
print('Accuracy on training data: ', train_accuracy)

И оценим точность модели на тестовом наборе:

test_predictions = model.predict(X_test_features)
test_accuracy = accuracy_score(Y_test, test_predictions)
print('Accuracy on test data: ', test_accuracy)

Наконец, мы сделаем прогноз для нового входного сообщения:

input_mail = ["I've been searching for the right words to thank you for this breather. I promise I won't take your help for granted and will fulfil my promise"]