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

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

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

Теорема Байеса определяется следующим образом:

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

Для этого конкретного сценария мы ищем ответ - какова вероятность того, что клиент отменит свое бронирование в отеле с учетом предыдущих вероятностей?

В этом случае для классификации применяется гауссовский наивный байесовский алгоритм. Несмотря на то, что переменная результата является категориальной (1 = отмена, 0 = без отмены), многие из функций, включенных в модель, являются непрерывными. Поэтому предполагается, что эти непрерывные элементы распределены согласно нормальному (гауссовскому) распределению.

Манипуляция данными

В связи с этим выбор функций не будет проводиться до запуска модели Наивного Байеса. Модель построена с использованием следующих функций:

  1. время выполнения
  2. дата прибытия
  3. arrivaldateweekno
  4. Дата прибытия: месяц
  5. ночевка в выходные
  6. ночевка в неделю
  7. взрослые
  8. младенцы
  9. isrepeatedguest
  10. предыдущие отмены
  11. предыдущие бронирования не отменены
  12. изменения бронирования
  13. dayswaitinglist
  14. адрес
  15. rcps
  16. totalsqr
  17. дата прибытия
  18. еда
  19. страна
  20. сегмент рынка
  21. канал распространения
  22. тип зарезервированной комнаты
  23. назначенный тип помещения
  24. тип депозита
  25. тип клиента

Определены интервалы (или непрерывные случайные величины). В качестве двух примеров:

leadtime = train_df['LeadTime']
adr = train_df['ADR']

Переменные с категориальным компонентом определяются с помощью ‘’ ’cat.codes’ ’’.

В качестве еще двух примеров:

deposittypecat=train_df.DepositType.astype("category").cat.codes
deposittypecat=pd.Series(deposittypecat)
customertypecat=train_df.CustomerType.astype("category").cat.codes
customertypecat=pd.Series(customertypecat)

Стек столбцов numpy сформулирован для независимых переменных (как непрерывных, так и категориальных):

x1 = np.column_stack((leadtime,arrivaldateyear,arrivaldateweekno,arrivaldatedayofmonth,staysweekendnights,staysweeknights,adults,babies,isrepeatedguestcat,previouscancellations,previousbookingsnotcanceled,bookingchanges,dayswaitinglist,adr,rcps,totalsqr,arrivaldatemonthcat,mealcat,countrycat,marketsegmentcat,distributionchannelcat,reservedroomtypecat,assignedroomtypecat,deposittypecat,customertypecat))
x1 = sm.add_constant(x1, prepend=True)

Затем данные разделяются на наборы для обучения и проверки:

X_train, X_val, y_train, y_val = train_test_split(x1, y1)

Точность против отзыва и результат f1

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

Сравнивая оценки точности, мы видим, что в каждой матрице неточностей представлены многочисленные показания.

Precision = ((True Positive)/(True Positive + False Positive))
Recall = ((True Positive)/(True Positive + False Negative))

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

Оценка идеальной метрики для использования в значительной степени зависит от конкретных анализируемых данных. Например, скрининг на выявление рака, который дает ложноотрицательные результаты (т. Е. Указывает, что у пациентов нет рака, хотя на самом деле он есть), является большим запретом. В этом случае отзыв является идеальной метрикой.

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

Оценка f1 учитывает как точность, так и отзывчивость при разработке более общей оценки.

Что было бы более важным для прогнозирования отмены бронирования в отелях?

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

Конфигурация модели и результаты

Соответствующие функции, как описано выше, включены для определения того, отменяет ли клиент свое бронирование.

Библиотека GaussianNB импортирована из scikit-learn:

from sklearn.naive_bayes import GaussianNB

Определяется гауссовская наивная байесовская модель:

>>> gnb = GaussianNB()
>>> gnb
GaussianNB(priors=None, var_smoothing=1e-09)

Прогнозы генерируются по набору проверки:

>>> y_pred = gnb.fit(x1_train, y1_train).predict(x1_val)
>>> y_pred
array([1, 1, 0, ..., 0, 1, 1])

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

>>> from sklearn.metrics import classification_report,confusion_matrix
>>> print(confusion_matrix(y1_val,y_pred))
>>> print(classification_report(y1_val,y_pred))
[[2842 4424]
 [ 165 2584]]
              precision    recall  f1-score   support
           0       0.95      0.39      0.55      7266
           1       0.37      0.94      0.53      2749
    accuracy                           0.54     10015
   macro avg       0.66      0.67      0.54     10015
weighted avg       0.79      0.54      0.55     10015

Напоминание для класса 1 составляет 94%, а точность показателя f1 составляет 54%. Теперь давайте проверим эффективность прогнозирования на H2 (тестовом наборе).

[[ 7863 38365]
 [ 2722 30380]]
              precision    recall  f1-score   support
           0       0.74      0.17      0.28     46228
           1       0.44      0.92      0.60     33102
    accuracy                           0.48     79330
   macro avg       0.59      0.54      0.44     79330
weighted avg       0.62      0.48      0.41     79330

Мы видим, что отзывчивость для класса 1 немного снизилась до 92%, а точность по шкале f1 составила 48%.

Очевидно, что существует компромисс между более высоким уровнем отзыва и общей более высокой точностью. Учитывая, что большинство записей в наборе данных равны 0 (без отмены), логично предположить, что модель с общей высокой степенью точности будет достаточно хорошо работать при прогнозировании неотменений, но плохо при прогнозировании 1 записей (отмен).

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

[[25217 21011]
 [ 8436 24666]]
              precision    recall  f1-score   support
           0       0.75      0.55      0.63     46228
           1       0.54      0.75      0.63     33102
    accuracy                           0.63     79330
   macro avg       0.64      0.65      0.63     79330
weighted avg       0.66      0.63      0.63     79330

Мы видим, что точность оценки f1 составляет до 63%, но отзывчивость для класса 1 упала до 75%.

В этом отношении, если кто-то желает сделать идентификацию отмены приоритетной, а не максимизировать общую точность, то можно утверждать, что модель Наивного Байеса работает лучше в этом случае. Однако следует помнить, что максимальное запоминание работает только до определенного момента. Если отзыв был 100%, то все бронирования можно было бы классифицировать как отмену, и это не дает никаких сведений о различиях между клиентами, которые отменяют, и теми, кто этого не делает.

Ограничения

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

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

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

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

Вывод

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

Наборы данных и записные книжки для этого примера доступны в репозитории MGCodesandStats GitHub вместе с дополнительными исследованиями по этой теме.

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

использованная литература