Понимание наивного байесовского алгоритма и решение известной проблемы набора данных IRIS путем реализации модели наивной байесовской классификации

В предыдущих рассказах я давал объяснение программы для реализации различных моделей регрессии. Также я описал реализацию модели логистической регрессии, классификации KNN и SVM. В этой статье мы рассмотрим алгоритм известной модели наивной байесовской классификации на примере.

Обзор наивной байесовской классификации

Наивный Байесовский алгоритм - один из таких алгоритмов классификации, который нельзя упускать из виду из-за его особой характеристики - «наивности». Предполагается, что характеристики измерения не зависят друг от друга.

Например, животное можно считать кошкой, если у него кошачьи глаза, усы и длинный хвост. Даже если эти характеристики зависят друг от друга или от наличия других характеристик, все эти свойства независимо друг от друга способствуют увеличению вероятности того, что это животное является кошкой, и поэтому оно известно как «наивное».

Согласно теореме Байеса, различные функции взаимно независимы. Для двух независимых событий P(A,B) = P(A)P(B). Это предположение теоремы Байеса, вероятно, никогда не встречается на практике, поэтому оно составляет «наивную» часть наивного Байеса. Теорема Байеса формулируется как: P (a | b) = (P (b | a) * P (a)) / P (b). где P (a | b) - вероятность заданного b.

Давайте разберемся с этим алгоритмом на простом примере. Студент будет пропуском, если в день экзамена будет одет в платье «красного» цвета. Мы можем решить ее, используя рассмотренный выше метод апостериорной вероятности.

По теореме Байеса P (Pass | Red) = P (Red | Pass) * P (Pass) / P (Red).

Исходя из значений, предположим, что P (красный | пройден) = 3/9 = 0,33, P (красный) = 5/14 = 0,36, P (прошел) = 9/14 = 0,64. Теперь P (Pass | Red) = 0,33 * 0,64 / 0,36 = 0,60, что имеет более высокую вероятность.

Таким образом, наивный байесовский метод использует аналогичный метод для прогнозирования вероятности разных классов на основе различных атрибутов.

Анализ проблемы

Чтобы реализовать наивную байесовскую классификацию, мы будем использовать очень известный набор данных цветов ириса, который состоит из 3 классов цветов. В нем есть 4 независимые переменные, а именно, sepal_length, sepal_width, petal_length и petal_width. Зависимая переменная - это вид, который мы будем предсказать, используя четыре независимых признака цветов.

Существует 3 класса видов, а именно setosa, versicolor и virginica. Этот набор данных был впервые представлен в 1936 году Рональдом Фишером. Используя различные характеристики цветка (независимые переменные), мы должны классифицировать данный цветок, используя модель наивной байесовской классификации.

Шаг 1. Импорт библиотек

Как всегда, первый шаг всегда будет включать в себя импорт библиотек NumPy, Pandas и Matplotlib.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

Шаг 2: Импорт набора данных

На этом этапе мы импортируем набор данных Iris Flower, который хранится в моем репозитории github как IrisDataset.csv, и сохраним его в переменной dataset. . После этого мы присваиваем 4 независимые переменные X , а зависимая переменная "разновидности" - на Y. Отображаются первые 5 строк набора данных.

dataset = pd.read_csv('https://raw.githubusercontent.com/mk-gurucharan/Classification/master/IrisDataset.csv')
X = dataset.iloc[:,:4].values
y = dataset['species'].values
dataset.head(5)
>>
sepal_length  sepal_width  petal_length  petal_width   species
5.1           3.5          1.4           0.2           setosa
4.9           3.0          1.4           0.2           setosa
4.7           3.2          1.3           0.2           setosa
4.6           3.1          1.5           0.2           setosa
5.0           3.6          1.4           0.2           setosa

Шаг 3. Разделение набора данных на обучающий набор и тестовый набор.

Как только мы получили наш набор данных, мы должны разделить данные на обучающий набор и тестовый набор. В этом наборе данных 150 строк по 50 строк каждого из 3 классов. Поскольку каждый класс задается в непрерывном порядке, нам нужно случайным образом разделить набор данных. Здесь у нас есть test_size=0.2, что означает, что 20% набора данных будет использоваться для целей тестирования в качестве набора тестов , а оставшиеся 80% будут использоваться в качестве обучающего набора для обучения модели классификации Наивного Байеса. .

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)

Шаг 4: масштабирование функций

Набор данных масштабируется до меньшего диапазона с помощью параметра «Масштабирование объекта». При этом значения X_train и X_test уменьшаются до меньших значений, чтобы повысить скорость работы программы.

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

Шаг 5: Обучение модели наивной байесовской классификации на обучающем наборе

На этом этапе мы представляем класс GaussianNB, который используется из библиотеки sklearn.naive_bayes. Здесь мы использовали гауссовскую модель, есть несколько других моделей, таких как Бернулли, категориальная и полиномиальная. Здесь мы назначаем класс GaussianNB переменной classifier и подгоняем к нему значения X_train и y_train для целей обучения.

from sklearn.naive_bayes import GaussianNB
classifier = GaussianNB()
classifier.fit(X_train, y_train)

Шаг 6: Прогнозирование результатов набора тестов

После обучения модели мы используем classifier.predict() для прогнозирования значений для тестового набора, и прогнозируемые значения сохраняются в переменной y_pred..

y_pred = classifier.predict(X_test) 
y_pred

Шаг 7: матрица неточностей и точность

Этот шаг чаще всего используется в методах классификации. Здесь мы видим точность обученной модели и строим матрицу неточностей.

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

Истинные значения - это количество сделанных правильных прогнозов.

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
from sklearn.metrics import accuracy_score 
print ("Accuracy : ", accuracy_score(y_test, y_pred))
cm
>>Accuracy :  0.9666666666666667
>>array([[14,  0,  0],
       [ 0,  7,  0],
       [ 0,  1,  8]])

Из приведенной выше матрицы путаницы мы делаем вывод, что из 30 данных набора тестов 29 были правильно классифицированы и только 1 классифицирован неправильно. Это дает нам высокую точность 96,67%.

Шаг 8: Сравнение реальных значений с прогнозируемыми значениями

На этом этапе создается Pandas DataFrame для сравнения классифицированных значений как исходного набора тестов (y_test), так и прогнозируемых результатов (y_pred ).

df = pd.DataFrame({'Real Values':y_test, 'Predicted Values':y_pred})
df
>> 
Real Values   Predicted Values
setosa        setosa
setosa        setosa
virginica     virginica
versicolor    versicolor
setosa        setosa
setosa        setosa
...  ...   ...  ...  ...
virginica     versicolor
virginica     virginica
setosa        setosa
setosa        setosa
versicolor    versicolor
versicolor    versicolor

Этот шаг является дополнительным шагом, который не так информативен, как матрица путаницы, и в основном используется в регрессии для проверки точности предсказанного значения.

Как видите, есть одно неверное предсказание, в котором предсказывается versicolor вместо virginica.

Вывод -

Таким образом, в этой истории мы успешно смогли построить модель Наивной байесовской классификации, которая способна классифицировать цветок по 4 характерным признакам. Эта модель может быть реализована и протестирована с несколькими другими наборами данных классификации, доступными в сети.

Я также прикрепляю ссылку на свой репозиторий GitHub, где вы можете загрузить эту записную книжку Google Colab и файлы данных для справки.



Вы также можете найти объяснение программы для других моделей классификации ниже:

В следующих статьях мы познакомимся с более сложными моделями регрессии, классификации и кластеризации. А пока желаю счастливого машинного обучения!