Майнор по Анализу Данных, Группа ИАД-2

Домашнее задание №2: Классификация текстовых данных

<hr> Общая информация

Срок сдачи: 19 апреля 2017, 23:59 <br>

При отправлении ДЗ на почту [email protected] указывайте фамилию в названии файла, а тему письма оформляйте в следующем виде:<br> [ИАД-2] {Фамилия} {Имя} ДЗ{Номер} <br>

Сопровождайте ваш код изображеними, комментариями и выводами. <br> Иммейте ввиду, что на некоторые задачи нет единственного верного и полного ответа. Чем больше информации вы сможете извлечь, аргументированных выводов сформулировать, тем лучше.

Используйте данный Ipython Notebook при оформлении домашнего задания.

<hr>

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

In [9]:
surname = u"Иванов" #Ваша фамилия

variant = (hash(surname.lower()) % 2 + 1)
print "Ваш вариант - ", variant
Ваш вариант -  2

Варианты

  • Набор SMS сообщений (sms) - спам/не спам - источник - файл c данными: data/SMSSpamCollection</li> </ol>
  • Набор рецензий на фильмы (reviews) - positive/negative - источник - файл c данными: data/reviews.tsv</li> </ol>

Задача 1

Классификация текстовых сообщений (2 балла)

  1. Загрузите исходные данные
  2. Разбейте загруженные данные на обучающее (train) и тестовое подможества (test)
  3. Переведите текстовые данные в векторный вид. Для этого воcпользуйтесь средствами sklearn для конвертации текста в векторы TF-IDF (настроить на обучающем подмножестве, n-gram=1, слова в нижний регистр)
  4. Постройте на обучающем подмножестве следующие модели классификации:
    • K-ближайших соседей ($n=5$)
    • Логистическая регрессия ($C=1$)
    • Мультиномиальный наивный Байес ($\alpha=1$)
  5. Определите качество классификации (по доле правильных классификаций) на тестовом подмножестве
  6. Определите с помощью timeit время обучения и предсказания (на тестовом подмножестве)
In [ ]:
random_state = 123 # для всех объектов/методов/моделей
In [ ]:
# Параметры логистической регрессии
penalty="l2", fit_intercept=True, max_iter=100, C=1, solver="lbfgs", random_state=12345
In [ ]:
# Ваш код

Задача 2.

Применение k-folds (3 балла)

Повторите решение задачи 1, но с ипользованием k-folds (k=4) для разделения исходных данных, обучения и тестирования.

In [ ]:
random_state = 123 # для всех объектов/методов/моделей
In [ ]:
# Ваш код

Задача 3.

Выбор модели (5 баллов)

1. Используя данные из задачи 1, разбейте обучающее подмножество (train) с использованием k-folds (k=4)
2. Обучите и протестируйте на разбитом обучающем подмножестве классификаторы со следующими параметрами:

K-ближайших соседей

In [ ]:
ns = np.arange(1, 150, 20) # количество соседей

Логистическая регрессия

In [ ]:
cs = np.logspace(-2, 10, 8, base=10) # параметр регуляризации

Мультиномиальный наивный Байес

In [ ]:
alphas = np.logspace(-4, 1, 8, base=10) # сглаживающий параметр

3. Постройте графики (параметры модели)-(доля правильных классификаций) при обучении и валидации
4. Выберите лучшую модель для каждого метода, используя значение качества классификации (использовать долю правильных классификаций)
5. Выбранные модели обучите на обучающем подмножестве (train) и протестируйте на тестовом (test). Определите время обучения и предсказания (см. задачу 1 п. 6)
6. Повторите шаги 2-4 для n-gram=2
7. Выведите итоговые данные по всем методам для лучших моделей (метод, n-gram, значение параметра модели, время обучения, время предсказания, доля правильных классификаций)
8. Сделайте выводы по полученным результатам (преимущества и недостатки методов)

In [ ]:
random_state = 123 # для всех объектов/методов/моделей
In [ ]:
# Ваш код

Задача 4. (опционально)

Исследование влияния количества признаков FeatureHasher на качество классификации (5 баллов к сумме по всем ДЗ)

Как будет меняться качество классификации для обозначенных ранее методов при использовании FeatureHasher (или HashingVectorizer) из пакета sklearn перед TF-IDF преобразованием, если

In [ ]:
n_features = np.logspace(1, 5, 5, base=10) # количество признаков
non_negative=True

Можно воспользоваться GridSearchCV

In [ ]: