Реализация наивного байеса с использованием документации SkLearn

Вопрос или проблема

Я изучаю метод классификации наивного Байеса из книги “Концепции и методы добычи данных” авторами Хан, Камбер, Пэй.

Есть пример того, как узнать вероятность класса, используя классификатор наивного Байеса.

Рассматриваемый набор данныхНабор данных

Вывод=вставьте описание изображения здесь

вставьте описание изображения здесь

Мне нравится реализовывать это с использованием SkLearn. Поэтому я прочитал документацию SkLearn для категориального наивного Байеса. вставьте описание изображения здесь

Основная формула:

$$P(x_i = t \mid y = c \: ;\, \alpha) = \frac{ N_{tic} + \alpha}{N_{c} +
\alpha n_i},$$

Мне нравится сравнивать это с формулой из книги.

$$P(x_i = t \mid y = c \: ;\, \alpha)$$ можно записать как P(возраст = молодежь | покупка_компьютера = да), потому что согласно определению SkLearn t является категорией для признака i. Таким образом, молодежь является категорией для признака возраст.

Правая сторона формулы:$$\frac{ N_{tic} + \alpha}{N_{c} +
\alpha n_i},$$

N_tic — это количество раз, когда категория t встречается в выборках x_i. Здесь из таблицы мы можем увидеть, что молодежь появляется 2 раза, когда покупка_компьютера = да. N_c — это количество выборок с классом c. Таким образом, для столбцов покупка_компьютера есть 9 случаев “да”.

$$P(x_i = t \mid y = c \: ;\, \alpha) = \frac{ N_{tic} + \alpha}{N_{c} +
\alpha n_i},$$
= (2+1)/(9+1*3) = 1/4 = 0.25 (по умолчанию значение alpha = 1.0) $$n_i$$ – количество доступных категорий в признаке i. Возраст имеет 3 категории.

Если мы рассмотрим математику из книги, P(Возраст=”Молодежь” | покупка_компьютера = да) = 0.222, что не равно 0.25.

Во-вторых, если я следую уравнению Scikit Learn, как я могу реализовать последнюю часть математического вывода из книги?

эта часть

Во-вторых, если я следую уравнению Scikit Learn, как я могу реализовать последнюю часть математического вывода из книги?

Расчеты, на которые вы ссылаетесь, выполняют 2 разные задачи:

  1. Первая половина расчета – это обучение модели путем вычисления вероятности $P(X|C_i)$ для каждого класса $C_i$. Авторы выполняют этот расчет, используя размеченные данные, представленные в таблице 8.1, на которую вы ссылаетесь в своем вопросе.
  2. Вторая половина расчета – это использование обученной модели для предсказания метки для размеченного кортежа $X=(молодежь, средний, да, хороший)$. Обратите внимание, что этот кортеж не появляется в таблице 8.1, поэтому он действительно неразмечен.

Сделать это в Scikit Learn можно так:

from sklearn.naive_bayes import CategoricalNB
clf = CategoricalNB()

## метод fit() обучает модель.
clf.fit(X_train, y_train)

## метод predict() предсказывает метки для неразмеченных данных
clf.predict(X_test)

В этом фрагменте кода я предполагаю, что вы уже разделили набор данных признаков на обучающие и тестовые наборы, используя train_test_split()

Ответ или решение

Реализация Наивного Байеса с использованием документации SkLearn

Наивный Байес — это один из популярных методов классификации, основанный на теореме Байеса и предположении о независимости признаков. В данном руководстве мы рассмотрим, как использовать библиотеку Scikit-learn для реализации Наивного Байеса, опираясь на примеры из книги «Data Mining: Concepts and Techniques» авторов Хана, Камбера и Пэя, а также на формулы из вашей задачи.

1. Введение в Наивный Байес

Наивный Байес эффективен в задачах классификации, основанных на вероятностных подходах. Он работает на основе априорной вероятности классов и вероятности признаков при условии класса. Важный аспект — это использование сглаживания для обработки редких категорий, что и отражает формула:

$$
P(xi = t \mid y = c \; ;\, \alpha) = \frac{N{tic} + \alpha}{N_{c} + \alpha n_i}
$$

где:

  • ( N_{tic} ) — количество появлений категории ( t ) в классе ( c ),
  • ( N_{c} ) — общее количество объектов в классе ( c ),
  • ( n_i ) — количество уникальных категорий признака ( i ),
  • ( \alpha ) — параметр сглаживания (обычно равен 1).

2. Подготовка данных

Для начала необходимо подготовить данные. Предположим, у вас есть таблица (как указано в вашем вопросе) с признаками и целевой переменной, например, «buy_computer». Давайте пройдёмся по шагам необходимым для реализации алгоритма:

  1. Импортируем необходимые библиотеки:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import CategoricalNB
  1. Загрузим и подготовим данные:
# Пример данных (пожалуйста, обновите в соответствии с вашим набором данных)
data = {
    'age': ['youth', 'youth', 'middle_aged', 'senior', 'senior', 'senior', 'middle_aged', 'youth', 'middle_aged'],
    'income': ['high', 'high', 'high', 'medium', 'medium', 'low', 'medium', 'medium', 'medium'],
    'student': ['no', 'no', 'no', 'no', 'yes', 'yes', 'yes', 'no', 'yes'],
    'credit_rating': ['fair', 'excellent', 'fair', 'fair', 'fair', 'excellent', 'excellent', 'fair', 'fair'],
    'buy_computer': ['yes', 'yes', 'no', 'no', 'no', 'yes', 'yes', 'no', 'yes']
}

df = pd.DataFrame(data)

# Преобразуем категориальные переменные в численные
X = df[['age', 'income', 'student', 'credit_rating']]
y = df['buy_computer']

# Кодируем категориальные переменные
X_encoded = pd.get_dummies(X)

# Делим данные на обучающую и тестовую выборку
X_train, X_test, y_train, y_test = train_test_split(X_encoded, y, test_size=0.2, random_state=42)

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

Теперь, когда данные подготовлены, можно обучить модель Наивного Байеса:

# Создаем и обучаем модель Классификатора Наивного Байеса
model = CategoricalNB(alpha=1.0)  # Параметр сглаживания по умолчанию
model.fit(X_train, y_train)

4. Прогнозирование

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

# Прогнозирование классов для тестовой выборки
predictions = model.predict(X_test)

# Выводим результаты
for pred in predictions:
    print(pred)

5. Сравнение с формулами из книги

Отметим, что ваша зрительная проверка привела к различиям в вероятностях между формулами из книги и расчетами в Scikit-learn. Это может быть связано с тем, как именно вы интерпретируете ( N{tic} ) и ( N{c} ) в контексте доступных данных, а также с самими данными, которые могут отличаться по контексту.

Если вы хотите получить конкретное значение ( P(Age="Youth" | buy_computer = yes) ), проведите аналогичные расчёты с предоставленными данными и убедитесь, что все значения и количество записей совпадают.

Заключение

С помощью библиотеки Scikit-learn вы можете легко реализовать метод Наивного Байеса на ваших данных. Этот алгоритм имеет широкое применение в областях классификации и предсказательной аналитики. Если у вас возникнут дополнительные вопросы или вам потребуется помощь в других аспектах обработки данных, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...