Задание по программированию: Выбор семейства распределений в наивном байесе

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

Загрузите датасеты digits и breast_cancer из sklearn.datasets. Выведите несколько строчек из обучающих выборок и посмотрите на признаки. С помощью sklearn.cross_validation.cross_val_score c настройками по умолчанию и вызова метода mean() у возвращаемого этой функцией numpy.ndarray, сравните качество работы наивных байесовских классификаторов на этих двух датасетах. Для сравнения предлагается использовать BernoulliNB, MultinomialNB и GaussianNB. Насколько полученные результаты согласуются с рекомендациями из лекций?

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


In [1]:
from sklearn                  import datasets
from sklearn.cross_validation import cross_val_score
from sklearn.naive_bayes      import BernoulliNB, MultinomialNB, GaussianNB

import numpy as np


/home/ubuntuser/anaconda3/lib/python3.6/site-packages/sklearn/cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
  "This module will be removed in 0.20.", DeprecationWarning)

In [2]:
digits        = datasets.load_digits()
breast_cancer = datasets.load_breast_cancer()

In [3]:
X_digits = digits.data
y_digits = digits.target

X_breast_cancer = breast_cancer.data
y_breast_cancer = breast_cancer.target

In [4]:
BernoulliNB_clf   = BernoulliNB()
MultinomialNB_clf = MultinomialNB()
GaussianNB_clf    = GaussianNB()

In [5]:
x_val_score_BernoulliNB_digits   = cross_val_score(BernoulliNB_clf,   X_digits, y_digits).mean()
x_val_score_MultinomialNB_digits = cross_val_score(MultinomialNB_clf, X_digits, y_digits).mean()
x_val_score_GaussianNB_digits    = cross_val_score(GaussianNB_clf,    X_digits, y_digits).mean()

x_val_score_BernoulliNB_breast_cancer   = cross_val_score(BernoulliNB_clf,   X_breast_cancer, y_breast_cancer).mean()
x_val_score_MultinomialNB_breast_cancer = cross_val_score(MultinomialNB_clf, X_breast_cancer, y_breast_cancer).mean()
x_val_score_GaussianNB_breast_cancer    = cross_val_score(GaussianNB_clf,    X_breast_cancer, y_breast_cancer).mean()

In [6]:
print('x_val_score_BernoulliNB_digits   = ', x_val_score_BernoulliNB_digits)
print('x_val_score_MultinomialNB_digits = ', x_val_score_MultinomialNB_digits)
print('x_val_score_GaussianNB_digits    = ', x_val_score_GaussianNB_digits)

print('x_val_score_BernoulliNB_breast_cancer   = ', x_val_score_BernoulliNB_breast_cancer)
print('x_val_score_MultinomialNB_breast_cancer = ', x_val_score_MultinomialNB_breast_cancer)
print('x_val_score_GaussianNB_breast_cancer    = ', x_val_score_GaussianNB_breast_cancer)


x_val_score_BernoulliNB_digits   =  0.825823650778
x_val_score_MultinomialNB_digits =  0.870877148974
x_val_score_GaussianNB_digits    =  0.818600380355
x_val_score_BernoulliNB_breast_cancer   =  0.627420402859
x_val_score_MultinomialNB_breast_cancer =  0.894579040193
x_val_score_GaussianNB_breast_cancer    =  0.936749280609

Для сдачи задания, ответьте на приведенные ниже вопросы.

Вопрос 1

Каким получилось максимальное качество классификации на датасете breast_cancer?

Вопрос 2

Каким получилось максимальное качество классификации на датасете digits?

Вопрос 3

Выберите верные утверждения и запишите их номера через пробел (в порядке возрастания номера):

1) На вещественных признаках лучше всего сработал наивный байесовский классификатор с распределением Бернулли

2) На вещественных признаках лучше всего сработал наивный байесовский классификатор с мультиномиальным распределением

3) Мультиномиальное распределение лучше показало себя на выборке с целыми неотрицательными значениями признаков

4) На вещественных признаках лучше всего сработало нормальное распределение


In [7]:
def write_answer(answer, file_name):
    with open(file_name, 'w') as fout:
        fout.write(answer)

answer_1 = '0.936749280609'
answer_2 = '0.870877148974'
answer_3 = '3 4'

write_answer(answer_1, 'answer_1.txt')
write_answer(answer_2, 'answer_2.txt')
write_answer(answer_3, 'answer_3.txt')