Машинное обучение стало самым востребованным навыком на рынке. Очень важно знать различные алгоритмы машинного обучения и то, как они работают. В этой статье о наивном байесовском методе R я хочу помочь вам узнать, как работает наивный байесовский алгоритм и как его можно реализовать с помощью языка R.

В этой статье рассматриваются следующие темы:

  1. Что такое наивный Байес?
  2. Математика наивного Байеса
  3. Теорема Байеса для наивного алгоритма Байеса
  4. Как работает наивный байесовский метод?
  5. Практическая реализация наивного байесовского метода в 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.

1. Учебник по науке о данных

2. Математика и статистика для науки о данных

3. Линейная регрессия в R

4. Учебник по науке о данных

5. Логистическая регрессия в R

6. Алгоритмы классификации

7. Случайный лес в R

8. Дерево решений в R

9. 5 лучших алгоритмов машинного обучения

10. Введение в машинное обучение

11. Статистика и вероятность

12. Как создать идеальное дерево решений?

13. 10 главных мифов о роли специалистов по данным

14. Лучшие проекты в области науки о данных

15. Data Analyst vs Data Engineer vs Data Scientist

16. Типы искусственного интеллекта

17. R против Python

18. Искусственный интеллект против машинного обучения против глубокого обучения

19. Проекты машинного обучения

20. Интервью с аналитиком данных: вопросы и ответы

21. Инструменты для анализа данных и машинного обучения для непрограммистов

22. 10 лучших фреймворков машинного обучения

23. Статистика машинного обучения

24. Случайный лес в R

25. Алгоритм поиска в ширину

26. Линейный дискриминантный анализ в R

27. Предпосылки для машинного обучения

28. Интерактивные веб-приложения с использованием R Shiny

29. 10 лучших книг по машинному обучению

30. Обучение без учителя

31.1 0 лучших книг по науке о данных

32. Обучение с учителем

Первоначально опубликовано на https://www.edureka.co 22 апреля 2019 г.