Если вы хотите стать мастером классификации, то вам обязательно стоит освоить наивный байесовский классификатор. Он прост в применении, быстрый и, несмотря на свою «наивность», может показать потрясающие результаты. В этой статье мы разберем, как работать с наивным байесовским классификатором на Python, а также покажем примеры с реальными задачами.
Так что устраивайтесь поудобнее, мы начинаем! 🎉
Что такое наивный байесовский классификатор?
Наивный байесовский классификатор — это алгоритм машинного обучения, основанный на теореме Байеса. Суть метода в том, что он делает предположение о независимости признаков, что, если быть честным, довольно сильно упрощает реальность. Но даже с этим "наивным" предположением классификатор часто дает отличные результаты, особенно в задачах, где признаки действительно могут быть независимыми (например, в обработке текста).
Задача 1: Классификация цветов ирисов
Для начала давайте возьмем классический набор данных — Ирисы Фишера. Это набор данных, который содержит информацию о трех видах ирисов (setosa, versicolor, virginica), включая длину и ширину их лепестков и чашелистиков.
Импортируем нужные библиотеки
# Импортируем библиотеки, которые нам понадобятся
from sklearn.datasets import load_iris # Для загрузки набора данных
from sklearn.model_selection import train_test_split # Для разделения данных на обучающую и тестовую выборки
from sklearn.naive_bayes import GaussianNB # Наивный байесовский классификатор для непрерывных признаков
from sklearn.metrics import accuracy_score # Для оценки точности
- load_iris() — загружает известный набор данных ирисов.
- train_test_split() — помогает разделить данные на обучающую и тестовую выборки, чтобы потом оценить, как хорошо работает модель.
- GaussianNB() — наивный байесовский классификатор для нормальных распределений.
- accuracy_score() — для того, чтобы понять, насколько точен наш классификатор.
Загрузка данных и их разделение
Теперь загрузим данные о цветах ирисов и разделим их на обучающую и тестовую выборки.
# Загружаем данные о цветах ирисов
data = load_iris()
X = data.data # Признаки: длина и ширина лепестков и чашелистиков
y = data.target # Целевая переменная: виды ирисов (0, 1, 2)
# Разделяем данные на обучающую (80%) и тестовую (20%) выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print(f'Размер обучающей выборки: {X_train.shape}')
print(f'Размер тестовой выборки: {X_test.shape}')
- data.data — это матрица признаков, где каждый цветок представлен длиной и шириной лепестков и чашелистиков.
- data.target — это метки классов, то есть виды ирисов.
- train_test_split() разбивает данные на две части: 80% для обучения и 20% для тестирования.
Обучение модели
Теперь обучим наш наивный байесовский классификатор. Поскольку признаки у нас нормальные (длина и ширина), используем GaussianNB, который предполагает, что данные следуют нормальному распределению.
# Создаем модель наивного байеса
nb_classifier = GaussianNB()
# Обучаем модель на обучающих данных
nb_classifier.fit(X_train, y_train)
- GaussianNB() создаёт классификатор, который подходит для работы с непрерывными признаками.
- fit(X_train, y_train) обучает модель на данных.
Прогнозирование и оценка
После того как модель обучена, давайте протестируем ее на тестовых данных и посмотрим, как она справляется.
# Делаем прогнозы на тестовой выборке
y_pred = nb_classifier.predict(X_test)
# Оценка точности
accuracy = accuracy_score(y_test, y_pred)
print(f'Точность модели: {accuracy * 100:.2f}%')
- predict(X_test) — это метод, который делает предсказания на основе тестовых данных.
- accuracy_score(y_test, y_pred) — оценивает, насколько точно модель предсказала классы на тестовых данных.
Что мы получаем?
При запуске этого кода, скорее всего, точность модели будет высокой, потому что набор данных ирисов довольно хорошо подходит для наивного байесовского классификатора. Мы получим точность в районе 95% или выше.
Задача 2: Классификация отзывов о фильмах (спам или не спам)
Теперь давайте возьмем задачу классификации текстов. Предположим, у нас есть набор данных с отзывами о фильмах, и мы хотим классифицировать их как спам или не спам. Тексты — это отличная задача для наивного байесовского классификатора, потому что он хорошо работает с текстами, где слова (признаки) часто считаются независимыми.
Импортируем нужные библиотеки
from sklearn.feature_extraction.text import CountVectorizer # Для преобразования текста в признаки
from sklearn.model_selection import train_test_split # Для разделения данных
from sklearn.naive_bayes import MultinomialNB # Многоклассовая версия наивного байеса для дискретных признаков
from sklearn.metrics import accuracy_score # Для оценки точности
- CountVectorizer — превращает текст в числовые данные (векторизует текст).
- MultinomialNB — версия наивного байеса, которая применяется для классификации текстов.
Подготовка данных
Теперь создадим пример с отзывами и метками, где «1» будет означать спам, а «0» — не спам.
# Пример текста (отзывы о фильмах)
texts = [
"Отличный фильм, очень понравился!", # не спам
"Не рекомендую смотреть, скучно", # не спам
"Купи 10 билетов по цене одного!", # спам
"Подробный обзор на фильм, рекомендую!", # не спам
"Большие скидки на кинофильмы, кликай здесь!", # спам
]
# Метки для классов
labels = [0, 0, 1, 0, 1] # 0 - не спам, 1 - спам
# Преобразуем текст в числовые данные
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(texts)
# Разделяем данные на обучающие и тестовые
X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.2, random_state=42)
- CountVectorizer() превращает каждый текст в вектор чисел, где каждый элемент вектора представляет собой количество вхождений конкретного слова в текст.
- Мы разделяем данные на обучающую и тестовую выборки.
Обучение модели
Теперь обучим классификатор наивного байеса для текста.
# Создаем и обучаем модель
nb_classifier = MultinomialNB()
nb_classifier.fit(X_train, y_train)
- MultinomialNB() — используется для классификации текстов, где признаки (слова) могут быть представлены как целые числа (количественные данные).
Прогнозирование и оценка
Теперь протестируем модель на тестовых данных.
# Делаем прогнозы
y_pred = nb_classifier.predict(X_test)
# Оценка точности
accuracy = accuracy_score(y_test, y_pred)
print(f'Точность модели: {accuracy * 100:.2f}%')
- Прогнозируем метки для тестовых данных и оцениваем точность модели.
Результат
Скорее всего, модель покажет хорошую точность, особенно если вы используете разнообразные данные для тренировки. Для более сложных задач с текстами можно использовать более продвинутые методы векторизации, такие как TF-IDF или word embeddings.
Заключение
Наивный байесовский классификатор — это отличный инструмент, особенно если вам нужно быстро получить модель, которая решает задачу классификации. Он не требует много данных и часто дает хорошие результаты даже при сильных упрощениях, например, при допущении независимости признаков.
Мы рассмотрели два примера: классификацию видов ирисов и классификацию текстов (спам/не спам). Если вам понравился этот подход, не стесняйтесь попробовать наивный байесовский классификатор в других задачах!
Пусть ваш путь в мир машинного обучения будет успешным и полным интересных открытий! 🚀