Вопрос или проблема
Я изучаю метод классификации наивного Байеса из книги “Концепции и методы добычи данных” авторами Хан, Камбер, Пэй.
Есть пример того, как узнать вероятность класса, используя классификатор наивного Байеса.
Мне нравится реализовывать это с использованием 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 разные задачи:
- Первая половина расчета – это обучение модели путем вычисления вероятности $P(X|C_i)$ для каждого класса $C_i$. Авторы выполняют этот расчет, используя размеченные данные, представленные в таблице 8.1, на которую вы ссылаетесь в своем вопросе.
- Вторая половина расчета – это использование обученной модели для предсказания метки для размеченного кортежа $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». Давайте пройдёмся по шагам необходимым для реализации алгоритма:
- Импортируем необходимые библиотеки:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import CategoricalNB
- Загрузим и подготовим данные:
# Пример данных (пожалуйста, обновите в соответствии с вашим набором данных)
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 вы можете легко реализовать метод Наивного Байеса на ваших данных. Этот алгоритм имеет широкое применение в областях классификации и предсказательной аналитики. Если у вас возникнут дополнительные вопросы или вам потребуется помощь в других аспектах обработки данных, не стесняйтесь спрашивать!