#!/usr/bin/env python # coding: utf-8 # # Майнор по Анализу Данных, Группа ИАД-2 # ## Домашнее задание №2: Классификация текстовых данных # # **Общая информация** # # **Срок сдачи:** 19 апреля 2017, 23:59 # # При отправлении ДЗ на почту `hse.minor.dm+2@gmail.com` указывайте фамилию в названии файла, а тему письма оформляйте в следующем виде: # ** [ИАД-2] *{Фамилия}* *{Имя}* ДЗ*{Номер}* ** # # Сопровождайте ваш код изображеними, комментариями и выводами. # Иммейте ввиду, что на некоторые задачи нет единственного верного и полного ответа. Чем больше информации вы сможете извлечь, аргументированных выводов сформулировать, тем лучше. # # Используйте данный Ipython Notebook при оформлении домашнего задания. # #

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

# In[9]: surname = u"Иванов" #Ваша фамилия variant = (hash(surname.lower()) % 2 + 1) print "Ваш вариант - ", variant #

Варианты

# * Набор SMS сообщений (sms) - спам/не спам - источник - файл c данными: data/SMSSpamCollection # # * Набор рецензий на фильмы (reviews) - positive/negative - источник - файл c данными: data/reviews.tsv # # ## Задача 1 # #### Классификация текстовых сообщений (2 балла) #
    #
  1. Загрузите исходные данные
  2. #
  3. Разбейте загруженные данные на обучающее (train) и тестовое подможества (test)
  4. #
  5. Переведите текстовые данные в векторный вид. Для этого воcпользуйтесь средствами sklearn для конвертации текста в векторы TF-IDF (настроить на обучающем подмножестве, n-gram=1, слова в нижний регистр)
  6. #
  7. Постройте на обучающем подмножестве следующие модели классификации: #
      #
    • K-ближайших соседей ($n=5$)
    • #
    • Логистическая регрессия ($C=1$)
    • #
    • Мультиномиальный наивный Байес ($\alpha=1$)
    • #
    #
  8. #
  9. Определите качество классификации (по доле правильных классификаций) на тестовом подмножестве
  10. #
  11. Определите с помощью timeit время обучения и предсказания (на тестовом подмножестве)
  12. #
# 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[ ]: