Машинное обучение стало самым востребованным навыком на рынке. Очень важно знать различные алгоритмы машинного обучения и то, как они работают. В этой статье о наивном байесовском методе R я хочу помочь вам узнать, как работает наивный байесовский алгоритм и как его можно реализовать с помощью языка R.
В этой статье рассматриваются следующие темы:
- Что такое наивный Байес?
- Математика наивного Байеса
- Теорема Байеса для наивного алгоритма Байеса
- Как работает наивный байесовский метод?
- Практическая реализация наивного байесовского метода в R
Что такое наивный Байес?
Наивный байесовский алгоритм - это алгоритм машинного обучения с учителем, основанный на теореме Байеса, который используется для решения проблем классификации с помощью вероятностного подхода. Он основан на идее, что переменные-предикторы в модели Машинное обучение не зависят друг от друга. Это означает, что результат модели зависит от набора независимых переменных, которые не имеют ничего общего друг с другом.
Но почему наивный Байес называют «наивным»?
В реальных задачах переменные-предикторы не всегда независимы друг от друга, между ними всегда есть некоторая корреляция. Поскольку наивный байесовский метод считает каждую переменную-предиктор независимой от любой другой переменной в модели, это называется «наивным».
Теперь давайте разберемся с логикой наивного байесовского алгоритма.
Математика наивного Байеса
Принцип, лежащий в основе наивного Байеса, - это теорема Байеса, также известная как правило Байеса. Теорема Байеса используется для вычисления условной вероятности, которая представляет собой не что иное, как вероятность возникновения события на основе информации о событиях в прошлом. Математически теорема Байеса представлена как:
В приведенном выше уравнении:
- P (A | B): условная вероятность наступления события A с учетом события B
- P (A): вероятность наступления события A
- P (B): вероятность наступления события B
- P (B | A): условная вероятность наступления события B, учитывая событие A
Формально терминология теоремы Байеса выглядит следующим образом:
- A известен как предложение, а B - это свидетельство
- P (A) представляет априорную вероятность предложения
- P (B) представляет собой априорную вероятность доказательства
- P (A | B) называется апостериорной
- P (B | A) - вероятность
Таким образом, теорему Байеса можно резюмировать следующим образом:
Апостериорная = (Вероятность). (Априорная вероятность утверждения) / Априорная вероятность доказательства
Это также можно рассматривать следующим образом:
Учитывая гипотезу H и свидетельство E, теорема Байеса утверждает, что соотношение между вероятностью гипотезы до получения свидетельства P (H) и вероятностью гипотезы после получения свидетельства P (H | E) составляет:
Теперь, когда вы знаете, что такое теорема Байеса, давайте посмотрим, как ее можно вывести.
Вывод теоремы Байеса.
Основная цель теоремы Байеса - вычислить условную вероятность. Правило Байеса можно вывести из следующих двух уравнений:
Приведенное ниже уравнение представляет условную вероятность A при заданном B:
Приведенное ниже уравнение представляет условную вероятность B при заданном A:
Следовательно, объединив два приведенных выше уравнения, мы получим теорему Байеса:
Теорема Байеса для наивного алгоритма Байеса
Вышеупомянутое уравнение было для одной переменной-предиктора, однако в реальных приложениях существует более одной переменной-предиктора, а для задачи классификации существует более одного выходного класса. Классы могут быть представлены как C1, C2,…, Ck, а переменные-предикторы могут быть представлены как вектор, x1, x2,…, xn.
Целью наивного байесовского алгоритма является измерение условной вероятности события с вектором признаков x1, x2,…, xn, принадлежащим определенному классу Ci,
Вычислив приведенное выше уравнение, мы получаем:
Однако условная вероятность, то есть P (xj | xj + 1,…, xn, Ci), суммируется до P (xj | Ci), поскольку каждая переменная-предиктор независима в наивном байесовском методе.
Окончательное уравнение сводится к следующему:
Здесь P (x1, x2,…, xn) постоянно для всех классов, поэтому мы получаем:
Как работает наивный байесовский метод?
Чтобы лучше понять, как работает наивный байесовский метод, давайте рассмотрим пример.
Рассмотрим набор данных с 1500 наблюдениями и следующими выходными классами:
- Кот
- Попугай
- Черепаха
Переменные-предикторы по своей природе категоричны, то есть они хранят два значения: Истина или Ложь:
- Плавать
- Крылья
- Зеленого цвета
- Острые зубы
Из приведенной выше таблицы мы можем резюмировать это:
Класс типичных кошек показывает, что:
- Из 500, 450 (90%) кошек умеют плавать
- 0 у кошек есть крылья
- 0 количество кошек зеленого цвета
- У всех 500 кошек острые зубы
Класс типа Parrot показывает, что:
- 50 (10%) попугаев имеют настоящую ценность для плавания
- У всех 500 попугаев есть крылья
- Из 500 попугаев 400 (80%) имеют зеленый цвет.
- У попугаев нет острых зубов
Класс типа Turtle показывает:
- Все 500 черепах умеют плавать
- 0 количество черепах с крыльями
- Из 500 100 (20%) черепах зеленого цвета.
- 50 из 500 (10%) черепах имеют острые зубы
Теперь, имея доступные данные, давайте классифицируем следующее наблюдение в один из выходных классов (кошки, попугай или черепаха) с помощью наивного байесовского классификатора.
Цель здесь - предсказать, является ли животное кошкой, попугаем или черепахой, на основе определенных переменных-предикторов (плавание, крылья, зеленый цвет, острые зубы).
Чтобы решить эту проблему, мы будем использовать наивный байесовский подход,
P (H | Multiple Evidences) = P (C1 | H) * P (C2 | H) …… * P (Cn | H) * P (H) / P (множественные доказательства)
В наблюдении переменные Swim и Green верны, и результатом может быть любое из животных (кошка, попугай, черепаха).
Чтобы проверить, является ли животное кошкой:
P (Кошка | Плавать, Зеленый) = P (Плавать | Кошка) * P (Зеленый | Кошка) * P (Кошка) / P (плавание, зеленый)
= 0,9 * 0 * 0,333 / P (плавание, зеленый)
= 0
Чтобы проверить, является ли животное попугаем:
P (попугай | плавать, зеленый) = P (плавать | попугай) * P (зеленый | попугай) * P (попугай) / P (плавание, зеленый)
= 0,1 * 0,80 * 0,333 / P (плавание, зеленый)
= 0,0264 / P (плавание, зеленый )
Чтобы проверить, является ли животное черепахой:
P (черепаха | плавать, зеленый) = P (плавать | черепаха) * P (зеленый | черепаха) * P (черепаха) / P (плавание, зеленый)
= 1 * 0,2 * 0,333 / P (плавание, зеленый)
= 0,0666 / P (плавание, зеленый )
Для всех приведенных выше расчетов знаменатель один и тот же, то есть P (Swim, Green). Значение P (Turtle | Swim, Green) больше, чем P (Parrot | Swim, Green), поэтому мы можем правильно предсказать класс животного как Turtle.
Теперь давайте посмотрим, как можно реализовать наивный байесовский метод с помощью языка R.
Практическая реализация наивного байесовского метода в R
Постановка проблемы: изучить набор данных о диабете и построить модель машинного обучения, которая позволяет прогнозировать, болен ли человек диабетом.
Описание набора данных: данный набор данных содержит 100 наблюдений за пациентами, а также сведения об их состоянии здоровья. Вот список переменных-предикторов, которые помогут нам классифицировать пациента как диабетика или нормального:
- Беременности: количество беременностей на данный момент.
- Глюкоза: концентрация глюкозы в плазме
- Кровяное давление: диастолическое кровяное давление (мм рт. Ст.)
- SkinThickness: Толщина кожной складки трицепса (мм)
- Инсулин: 2-часовой сывороточный инсулин (мкЕ / мл)
- BMI: Индекс массы тела (вес в кг / (рост в м) ²)
- Диабет родословнойФункция: Диабет родословная функция
- Возраст: Возраст (лет)
Переменная ответа или выходная переменная:
- Результат: переменная класса (0 или 1)
Логика: построить наивную байесовскую модель, чтобы классифицировать пациентов как диабетиков или нормальных, изучая их медицинские записи, такие как уровень глюкозы, возраст, ИМТ и т. д.
Теперь, когда вы знаете цель этой демонстрации, давайте поработаем наш мозг и приступим к программированию. В этой демонстрации я буду использовать язык R, чтобы построить модель.
А теперь приступим.
Шаг 1. Установите и загрузите требуемые пакеты
#Loading required packages install.packages('tidyverse') library(tidyverse) install.packages('ggplot2') library(ggplot2) install.packages('caret') library(caret) install.packages('caretEnsemble') library(caretEnsemble) install.packages('psych') library(psych) install.packages('Amelia') library(Amelia) install.packages('mice') library(mice) install.packages('GGally') library(GGally) install.packages('rpart') library(rpart) install.packages('randomForest') library(randomForest)
Шаг 2: Импортируйте набор данных.
#Reading data into R data<- read.csv("/Users/Zulaikha_Geer/Desktop/NaiveBayesData/diabetes.csv")
Прежде чем изучать набор данных, давайте преобразуем выходную переменную («Результат») в категориальные переменные. Это необходимо, потому что наш вывод будет в виде двух классов: True или False. Где истина будет обозначать, что у пациента диабет, а ложь означает, что человек не страдает диабетом.
#Setting outcome variables as categorical data$Outcome <- factor(data$Outcome, levels = c(0,1), labels = c("False", "True"))
Шаг 3. Изучение набора данных
#Studying the structure of the data str(data)
head(data)
describe(data)
Шаг 4. Очистка данных
Анализируя структуру набора данных, мы видим, что минимальные значения для глюкозы, артериального давления, толщины кожи, инсулина и ИМТ равны нулю. Это не идеально, поскольку ни у кого не может быть нулевого значения для глюкозы, артериального давления и т. Д. Следовательно, такие значения обрабатываются как отсутствующие наблюдения.
В приведенном ниже фрагменте кода мы устанавливаем нулевые значения на NA:
#Convert '0' values into NA data[, 2:7][data[, 2:7] == 0] <- NA
Чтобы проверить, сколько у нас сейчас пропущенных значений, давайте визуализируем данные:
#visualize the missing data missmap(data)
Приведенные выше иллюстрации показывают, что в нашем наборе данных много пропущенных значений, и удаление всех из них оставит нам еще меньший набор данных, поэтому мы можем выполнять вменения с помощью пакета mice в R.
#Use mice package to predict missing values mice_mod <- mice(data[, c("Glucose","BloodPressure","SkinThickness","Insulin","BMI")], method='rf') mice_complete <- complete(mice_mod) iter imp variable 1 1 Glucose BloodPressure SkinThickness Insulin BMI 1 2 Glucose BloodPressure SkinThickness Insulin BMI 1 3 Glucose BloodPressure SkinThickness Insulin BMI 1 4 Glucose BloodPressure SkinThickness Insulin BMI 1 5 Glucose BloodPressure SkinThickness Insulin BMI 2 1 Glucose BloodPressure SkinThickness Insulin BMI 2 2 Glucose BloodPressure SkinThickness Insulin BMI 2 3 Glucose BloodPressure SkinThickness Insulin BMI 2 4 Glucose BloodPressure SkinThickness Insulin BMI 2 5 Glucose BloodPressure SkinThickness Insulin BMI #Transfer the predicted missing values into the main data set data$Glucose <- mice_complete$Glucose data$BloodPressure <- mice_complete$BloodPressure data$SkinThickness <- mice_complete$SkinThickness data$Insulin<- mice_complete$Insulin data$BMI <- mice_complete$BMI
Чтобы проверить, есть ли еще какие-либо пропущенные значения, давайте воспользуемся графиком с ошибками:
missmap(data)
Результат выглядит хорошо, недостающих данных нет.
Шаг 5: Исследовательский анализ данных
Теперь давайте выполним несколько визуализаций, чтобы лучше рассмотреть каждую переменную. Этот этап важен для понимания значимости каждой переменной-предиктора.
#Data Visualization #Visual 1 ggplot(data, aes(Age, colour = Outcome)) + geom_freqpoly(binwidth = 1) + labs(title=”Age Distribution by Outcome”)
#visual 2 c <- ggplot(data, aes(x=Pregnancies, fill=Outcome, color=Outcome)) + geom_histogram(binwidth = 1) + labs(title="Pregnancy Distribution by Outcome") c + theme_bw()
#visual 3 P <- ggplot(data, aes(x=BMI, fill=Outcome, color=Outcome)) + geom_histogram(binwidth = 1) + labs(title="BMI Distribution by Outcome") P + theme_bw()
#visual 4 ggplot(data, aes(Glucose, colour = Outcome)) + geom_freqpoly(binwidth = 1) + labs(title="Glucose Distribution by Outcome")
#visual 5
ggpairs(data)
Шаг 6. Моделирование данных
- Этот этап начинается с процесса, называемого объединением данных, в котором набор данных делится на две части:
- Обучающий набор: эта часть набора данных используется для построения и обучения модели машинного обучения.
- Набор для тестирования: эта часть набора данных используется для оценки эффективности модели.
Этот этап начинается с процесса, называемого объединением данных, в котором набор данных делится на две части:
#Building a model #split data into training and test data sets indxTrain <- createDataPartition(y = data$Outcome,p = 0.75,list = FALSE) training <- data[indxTrain,] testing <- data[-indxTrain,] #Check dimensions of the split > prop.table(table(data$Outcome)) * 100 False True 65.10417 34.89583 > prop.table(table(training$Outcome)) * 100 False True 65.10417 34.89583 > prop.table(table(testing$Outcome)) * 100 False True 65.10417 34.89583
Для сравнения результатов этапов обучения и тестирования давайте создадим отдельные переменные, в которых хранится значение переменной ответа:
#create objects x which holds the predictor variables and y which holds the response variables x = training[,-9] y = training$Outcome
Пришло время загрузить пакет e1071, содержащий наивную байесовскую функцию. Это встроенная функция, предоставляемая R.
library(e1071)
После загрузки пакета приведенный ниже фрагмент кода создаст наивную байесовскую модель с использованием набора обучающих данных:
model = train(x,y,'nb',trControl=trainControl(method='cv',number=10)) > model Naive Bayes 576 samples 8 predictor 2 classes: 'False', 'True' No pre-processing Resampling: Cross-Validated (10 fold) Summary of sample sizes: 518, 518, 519, 518, 519, 518, ... Resampling results across tuning parameters: usekernel Accuracy Kappa FALSE 0.7413793 0.4224519 TRUE 0.7622505 0.4749285 Tuning parameter 'fL' was held constant at a value of 0 Tuning parameter 'adjust' was held constant at a value of 1 Accuracy was used to select the optimal model using the largest value. The final values used for the model were fL = 0, usekernel = TRUE and adjust = 1.
Таким образом, мы создали прогностическую модель с помощью наивного байесовского классификатора.
Шаг 7. Оценка модели
Чтобы проверить эффективность модели, мы собираемся запустить набор данных тестирования для модели, после чего мы оценим точность модели с помощью матрицы путаницы.
#Model Evaluation #Predict testing set Predict <- predict(model,newdata = testing ) #Get the confusion matrix to see accuracy value and other parameter values > confusionMatrix(Predict, testing$Outcome ) Confusion Matrix and Statistics Reference Prediction False True False 91 18 True 34 49 Accuracy : 0.7292 95% CI : (0.6605, 0.7906) No Information Rate : 0.651 P-Value [Acc > NIR] : 0.01287 Kappa : 0.4352 Mcnemar's Test P-Value : 0.03751 Sensitivity : 0.7280 Specificity : 0.7313 Pos Pred Value : 0.8349 Neg Pred Value : 0.5904 Prevalence : 0.6510 Detection Rate : 0.4740 Detection Prevalence : 0.5677 Balanced Accuracy : 0.7297 'Positive' Class : False
Окончательный результат показывает, что мы построили наивный байесовский классификатор, который может предсказать, болен ли человек диабетом или нет, с точностью примерно 73%.
#Plot Variable performance X <- varImp(model) plot(X)
Подводя итог демонстрации, давайте нарисуем график, который показывает, как каждая переменная-предиктор независимо отвечает за прогнозирование результата.
Из приведенной выше иллюстрации ясно, что «глюкоза» является наиболее значимой переменной для прогнозирования результата. На этом мы подошли к концу данной статьи.
Если вы хотите ознакомиться с другими статьями о самых популярных технологиях на рынке, таких как Python, DevOps, Ethical Hacking, посетите официальный сайт Edureka.
Обязательно обратите внимание на другие статьи в этой серии, которые объяснят различные другие аспекты Data Science.
17. R против Python
18. Искусственный интеллект против машинного обучения против глубокого обучения
21. Инструменты для анализа данных и машинного обучения для непрограммистов
Первоначально опубликовано на https://www.edureka.co 22 апреля 2019 г.