[Перевод] Наивный байесовский классификатор в Sklearn

искусственный интеллект Программа перевода самородков Python GitHub

Распределение Гаусса, реализованное с помощью bean-машины

эторуководствоподробныйНаивный байесовский классификаторалгоритм, егопринципиПреимущества и недостатки, и обеспечивает использованиеБиблиотека Склеарнапример.

задний план

известныйНабор данных жертв ТитаникаНапример. Он собирал личную информацию о пассажирах Титаника и о том, выжили ли они после кораблекрушения. Попробуем по стоимости билета пассажира предсказать, выживет ли он.

500 пассажиров на Титанике

Предположим, вы выбираете 500 пассажиров наугад. Среди этих образцов,30%людей выжили. Средний тариф для выживших пассажиров составляет100 долларов, а средний тариф за убитых пассажиров составил50 долларов США. Теперь, допустим, у вас новый пассажир. Вы не знаете, выжил ли он, но вы знаете, что он купил его30 долларовбилет через Атлантику. Пожалуйста, предскажите, выживет ли пассажир.

принцип

Ну, вы могли бы ответить, что пассажирне выжил. Зачем? Поскольку согласно информации, содержащейся в взятом выше случайном подмножестве пассажиров,Шансы на выживание изначально низкие (30%), а шансы на выживание для бедных еще ниже.. вы бы посадили этого пассажираскорее всего группа(низкая тарифная группа). Это то, для чего предназначен наивный байесовский классификатор.

анализировать

Наивные байесовские классификаторы используют условные вероятности для агрегирования информации и предполагают относительную независимость между функциями. Что это означает? Это означает, например, что мы должны исходить из того, что комфорт в номере Титаника не имеет ничего общего с стоимостью проезда. Очевидно, что это предположение неверно, поэтому мы называем это предположениепросто(Наивная) причина. Наивное предположение упрощает вычисления даже на очень больших наборах данных. Давайте разберемся.

Наивный байесовский классификатор, по сути, ищет функцию, которая может описать вероятность принадлежности к определенной категории с учетом характеристик Эта функция записывается какP(Выживание | f1,…, fn). Мы используемтеорема Байесадля упрощения расчета:

Уравнение 1: Теорема Байеса

P(Survival)Его легко вычислить, и нам не нужно использовать его для построения нашего классификатора.P(f1,…,fn), поэтому проблема возвращается к вычислениюP(f1,…,fn | Выживание)появиться. мы применяемФормула условной вероятностиЧтобы еще раз упростить расчет:

Формула 2: Начальное расширение

Для вычисления каждого члена в последней строке приведенного выше уравнения требуется набор данных, содержащий все условия. Чтобы вычислить вероятность fn при {Survival, f_1, …, f_n-1} (т.е.P(fn | Выживание, f_1, …, f_n-1)), нам нужно иметь достаточно различных значений fn, удовлетворяющих условию {Survival, f_1, …, f_n-1}. Это требует большого количества данных и приводит кпространственная катастрофа. В настоящее времянаивная гипотезаВыделены преимущества (Наивного предположения). Предполагая, что признаки независимы, мы можем упростить расчет, считая, что вероятность условия {Выживание, f_1, …, f_n-1} равна вероятности {Выживания}:

Уравнение 3: Применение наивного предположения

Наконец, чтобы создать новый вектор признаков для классификации, нам просто нужно выбратьвыживатьЗначение (1 или 0), пусть P(f1, …, fn|Survival) будет максимальным, что и является окончательным результатом классификации:

Уравнение 4: классификатор argmax

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

Найдите подходящую функцию распределения

Последним шагом является реализация классификатора. Как смоделировать функцию вероятности P(f_i|Выживание)? В библиотеке Sklearn есть три модели:

нормальное распределение

биномиальное распределение

Код Python

Далее, на основе набора данных Titanic Victims, мы реализуем классическийГауссовский наивный байесовский метод. Мы будем использовать такую ​​информацию, как класс обслуживания, пол, возраст, количество братьев и сестер, количество родителей/детей, стоимость проезда и порт посадки.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import time
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB, BernoulliNB, MultinomialNB

# 导入数据集
data = pd.read_csv("data/train.csv")

# 将分类变量转换为数字
data["Sex_cleaned"]=np.where(data["Sex"]=="male",0,1)
data["Embarked_cleaned"]=np.where(data["Embarked"]=="S",0,
                                  np.where(data["Embarked"]=="C",1,
                                           np.where(data["Embarked"]=="Q",2,3)
                                          )
                                 )
# 清除数据集中的非数字值(NaN)
data=data[[
    "Survived",
    "Pclass",
    "Sex_cleaned",
    "Age",
    "SibSp",
    "Parch",
    "Fare",
    "Embarked_cleaned"
]].dropna(axis=0, how='any')

# 将数据集拆分成训练集和测试集
X_train, X_test = train_test_split(data, test_size=0.5, random_state=int(time.time()))
# 实例化分类器
gnb = GaussianNB()
used_features =[
    "Pclass",
    "Sex_cleaned",
    "Age",
    "SibSp",
    "Parch",
    "Fare",
    "Embarked_cleaned"
]

# 训练分类器
gnb.fit(
    X_train[used_features].values,
    X_train["Survived"]
)
y_pred = gnb.predict(X_test[used_features])

# 打印结果
print("Number of mislabeled points out of a total {} points : {}, performance {:05.2f}%"
      .format(
          X_test.shape[0],
          (X_test["Survived"] != y_pred).sum(),
          100*(1-(X_test["Survived"] != y_pred).sum()/X_test.shape[0])
))

Number of mislabeled points out of a total 357 points: 68, performance 80.95%

Точность этого классификатора80.95%.

Используйте одно описание функции

Давайте попробуем ограничить классификатор, используя только информацию о тарифах. Ниже мы вычисляем вероятность P(Survival = 1) и P(Survival = 0):

mean_survival=np.mean(X_train["Survived"])
mean_not_survival=1-mean_survival
print("Survival prob = {:03.2f}%, Not survival prob = {:03.2f}%"
      .format(100*mean_survival,100*mean_not_survival))

Survival prob = 39.50%, Not survival prob = 60.50%

Затем, в соответствии с уравнением 3, нам нужно только получить функции распределения вероятностей P (плата за проезд | выживание = 0) и P (плата за проезд | выживание = 1). Мы выбрали гауссовский наивный байесовский классификатор, поэтому данные следует считать гауссовскими.

Уравнение 5: формула Гаусса (σ: стандартное отклонение / μ: среднее значение)

Затем нам нужно рассчитатьвыживатьСреднее значение и стандартное отклонение набора данных о тарифах, когда значения разные. Получаем следующие результаты:

mean_fare_survived = np.mean(X_train[X_train["Survived"]==1]["Fare"])
std_fare_survived = np.std(X_train[X_train["Survived"]==1]["Fare"])
mean_fare_not_survived = np.mean(X_train[X_train["Survived"]==0]["Fare"])
std_fare_not_survived = np.std(X_train[X_train["Survived"]==0]["Fare"])

print("mean_fare_survived = {:03.2f}".format(mean_fare_survived))
print("std_fare_survived = {:03.2f}".format(std_fare_survived))
print("mean_fare_not_survived = {:03.2f}".format(mean_fare_not_survived))
print("std_fare_not_survived = {:03.2f}".format(std_fare_not_survived))
mean_fare_survived = 54.75
std_fare_survived = 66.91
mean_fare_not_survived = 24.61
std_fare_not_survived = 36.29

Давайте посмотрим овыживатьине выжилПолученное распределение гистограмм:

Рисунок 1: РазличныевыживатьГистограмма тарифа и распределение значений по Гауссу (уровни масштабирования не соответствуют)

Можно обнаружить, что распределение и набор данных нехорошо приспособленный. Перед внедрением модели рекомендуется убедиться, что распределение функций соответствует одной из трех вышеперечисленных моделей. Если непрерывные функции не имеют нормального распределения, вы должны использоватьтрансформироватьили по-другомуПреобразовать в нормальное распределение. В целях иллюстрации мы будем рассматривать распределение как обычное. применениеФормула 1теоремы Байеса можно получить следующий классификатор:

Рисунок 2: Классификатор Гаусса

Если значение классификатора тарифа превышает 78 (классификатор(Тариф) ≥ ~78), то P(тариф|Выживаемость = 1) ≥ P(тариф|Выживаемость = 0), мы классифицируем человека каквыживать. В противном случае мы будем классифицировать его какне выжил. Мы получили классификатор с точностью 64,15%.

Если мы тренируемся на одном и том же наборе данныхСклеарн Гауссов наивный байесовскийклассификатор, получит точно такой же результат:

from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
used_features =["Fare"]
y_pred = gnb.fit(X_train[used_features].values, X_train["Survived"]).predict(X_test[used_features])
print("Number of mislabeled points out of a total {} points : {}, performance {:05.2f}%"
      .format(
          X_test.shape[0],
          (X_test["Survived"] != y_pred).sum(),
          100*(1-(X_test["Survived"] != y_pred).sum()/X_test.shape[0])
))
print("Std Fare not_survived {:05.2f}".format(np.sqrt(gnb.sigma_)[0][0]))
print("Std Fare survived: {:05.2f}".format(np.sqrt(gnb.sigma_)[1][0]))
print("Mean Fare not_survived {:05.2f}".format(gnb.theta_[0][0]))
print("Mean Fare survived: {:05.2f}".format(gnb.theta_[1][0]))
Number of mislabeled points out of a total 357 points: 128, performance 64.15%
Std Fare not_survived 36.29
Std Fare survived: 66.91
Mean Fare not_survived 24.61
Mean Fare survived: 54.75

Преимущества и недостатки наивных байесовских классификаторов

преимущество:

  • Рассчитать быстро
  • Простота реализации
  • Хорошо работает на небольших наборах данных
  • Хорошо работает с многомерными данными
  • Несмотря на тонаивная гипотезаВы можете хорошо работать, не будучи полностью удовлетворенным. Во многих случаях для построения хорошего классификатора достаточно лишь приблизительных данных.

недостаток:

  • необходимостьУдалить связанные функции, поскольку в модели они будут вычисляться дважды, что приведет к переоценке важности этого признака.
  • Если категория категориальной переменной отсутствует в обучающем наборе в тестовом наборе, то модель установит это какнулевая вероятность. Он не сможет делать прогнозы. Это часто называют «Нулевая частота'. Мы можем использовать методы сглаживания, чтобы решить эту проблему. Один из простейших методов сглаживания называетсясглаживание по Лапласу. Когда вы обучаете наивный байесовский классификатор,SklearnАлгоритм сглаживания Лапласа используется по умолчанию.

Эпилог

Большое спасибовы читаете эту статью. Я надеюсь, что это поможет вам понятьНаивный байесовский классификаторконцепция и еепреимущество.

СпасибоAntoine Toubhans,Flavian Hautbois,Adil BaajиРафаэль Медек.

Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из ИнтернетаНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.