Байесовский классификатор с использованием нормального распределения Гаусса + реализация на Python

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

Для этого используется классический набор данных Fisher’s Iris, содержащий измерения длины и ширины чашелистиков и лепестков 150 цветков. Набор данных Fisher’s Iris — настолько классический пример, что он включен в библиотеки машинного обучения, поэтому каждый может получить его, импортировав набор данных из библиотеки scikit-learn.

Разделение и построение данных

Первый шаг — получение набора данных, который легко импортировать, и присвоение ему имени iris:

Переменная iris теперь содержит все виды информации, но наиболее важными атрибутами являются target и data, которые содержат метки и точки данных для 150 цветы. Поэтому я извлек эти атрибуты и создал матрицу X с данными и вектор R с целями. Используя вектор R, теперь можно разделить матрицу X на разные классы, например так:

Чтобы получить представление о корреляциях и разделимости набора данных, мы должны построить эти данные. Используя библиотеку seaborn, можно визуализировать распределения для каждой отдельной функции, а также диаграммы рассеяния с использованием двух функций в качестве осей x и y:

Глядя на эти графики, можно сделать вывод, что вид setosa легче отделить, чем другие виды. Это показывает, что многие характеристики других видов, versicolor и virginica, коррелируют друг с другом.

Ковариация

Одной из мер корреляции между переменными является ковариация. Ковариация между двумя совместно распределенными действительными случайными величинами X и Y определяется как ожидаемый продукт их отклонений от их индивидуальных ожидаемых значений:

Когда ковариация положительна, переменные положительно коррелированы: когда значение одной переменной увеличивается, значение другой, вероятно, также увеличивается. Но когда ковариация отрицательна, переменные будут иметь отрицательную корреляцию: когда одна переменная увеличивается, значение другой, вероятно, уменьшается. Наконец, когда ковариация близка к нулю, между переменными нет корреляции.

Байесовский классификатор

После ознакомления с данными теперь можно построить модель, которая будет предсказывать, к какому классу (в данном случае виды ириса) принадлежит данная точка данных на основе других переменных. Чтобы определить, насколько хорошо модель соответствует данным, воспользуемся методом Перекрестная проверка. В качестве вдохновения я использовал функцию validation_split из части III, но эта validation_split немного отличается:

Используя эту функцию для каждого из 3-х классов с коэффициентом 0,7 для каждого, вы получите:

Из приведенных выше диаграмм рассеивания можно сделать вывод, что разделение различных классов будет намного проще на основе данных о лепестках (ширина лепестков и длина лепестков), чем на данных о чашелистиках, поскольку на этом графике легче различать разные кластеры. Я решил сузить его еще больше и сначала сосредоточиться только на одной переменной, а именно на длине лепестка. Эта переменная очень полезна сама по себе и уже значительно упрощает модель.

Используя обучающие наборы всех трех классов, я начал вычислять среднее значение и стандартное отклонение для атрибута длины лепестка для каждого класса. Для этих вычислений будут полезны встроенные функции Numpy для среднего и стандартного отклонения:

Теперь, когда мы оценили среднее значение и стандартное отклонение длины лепестка для каждого из трех классов, мы можем вычислить функцию плотности вероятности (PDF):

Реализация на Python выглядит так:

Затем функции плотности вероятности всех трех классов можно вычислить и визуализировать с помощью linspace, как и в Части II, для диапазона значений x и вычислить соответствующие значения y, применив функция PDF:

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

Это уравнение можно еще больше упростить, выделив общий априор:

Теперь апостериорные значения можно вычислить с помощью функции апостериорных значений. Чтобы упростить код, я сделал векторы M и S со всеми средними значениями и всеми стандартными отклонениями каждого класса. С этими векторами будет достаточно параметра, чтобы указать класс, из которого должен быть вычислен апостериор:

Визуализация задних отделов приводит к:

Теперь доступны все инструменты, необходимые для создания классификатора! Классификатор Байеса определяется как:

Реализация этого на Python требует двух функций, а именно classify и validate. classify функция классифицирует одну точку данных x как один из 3 классов, возвращая 0, 1 или 2 в зависимости от того, к какому классу она принадлежит. Функция validate получает проверочный набор со всеми спрогнозированными классами для каждой точки данных и возвращает, сколько из них было спрогнозировано правильно:

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

Что привело к:

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