В этом задании вы сможете немного расслабиться после реализации случайного леса и градиентного бустинга по мотивам материалов прошлой недели. Все, что нужно будет делать — запускать методы из 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
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)
Для сдачи задания, ответьте на приведенные ниже вопросы.
Вопрос 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')