Проект по анализу данных

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

Дата выдачи: 05.06.2016

Срок сдачи: 19.06.2016 09:00MSK

О задании

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

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

Оценивание и штрафы

Каждая из задач имеет определенную «стоимость» (указана в скобках около задачи). Максимально допустимая оценка за работу — 10 баллов. Помимо кода вам также требуется написать развернутые ответы на вопросы.

Сдавать задание после указанного срока сдачи нельзя. При выставлении неполного балла за задание в связи с наличием ошибок на усмотрение проверяющего предусмотрена возможность исправить задание на указанных в ответном письме условиях.

Задание выполняется САМОСТОЯТЕЛЬНО. «Похожие» решения считаются плагиатом и все задействованные студенты (в том числе те, у кого списали) не могут получить за него больше 0 баллов. Если вы нашли решение какого-то из заданий в открытом источнике, необходимо прислать ссылку на этот источник (скорее всего вы будете не единственным, кто это нашел, поэтому чтобы исключить подозрение в плагиате, необходима ссылка на источник).

Если вы будете решать задание на виртуальной машине, учтите, что его могут видеть все. К тому же недоступность виртуальной машины не является уважительной причиной для продления дедлайна.

Обратите внимание, что на устном зачете в конце семестра некотоые вопросы могут быть связаны с проектом.

Доп. баллы

В данном проекте вам будет предложено рассмотреть некоторые интересные закономерности в данных. Если вы обнаружите что-то интересное (например, в последнем пункте), либо у вас есть идеи как можно работать с данным датасетом — присылайте, это будет поощряться дополнительными баллами. Кроме того, вы можете выступить со своим личным исследованием на семинаре, это также не останется незамеченным.

Формат сдачи

Для сдачи задания переименуйте получившийся файл *.ipynb в соответствии со следующим форматом: Username_(group)_Project.ipynb, где Username — ваша фамилия на латинице, group — название группы (например, Kozlova_IAD-11_Project.ipynb). Далее отправьте этот файл на используемую в Вашей группе почту курса ([email protected]) c темой письма [ИАД-NN] - Проект - Фамилия Имя Отчество.

Определение итоговой оценки студента

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

In [ ]:
def get_dataset_name(email):
    return 'student-mat.csv' if sum(ord(c) for c in email) % 2 else 'student-por.csv'

Выполните код ниже, передав на вход строку с адресом электронной почты:

In [ ]:
get_dataset_name('')

Датасеты имеют следующий набор признаков:

  • school - тип школы ("GP" - Gabriel Pereira или "MS" - Mousinho da Silveira)
  • sex - пол ("F" - female или "M" - male)
  • age - возраст (от 15 до 22)
  • address - откуда студент ("U" - urban или "R" - rural)
  • famsize - размер семьи ("LE3" - меньше или равно 3 или "GT3" - больше 3)
  • Pstatus - в каких отношениях родители ("T" - живут вместе "A" - раздельно)
  • Medu - образование матери (0 - никакого, 1 - начальное образование (4 класса), 2 – от 5 до 9 классов, 3 – среднеспециальное или 4 – высшее)
  • Fedu - образование отца (0 - никакого, 1 - начальное образование (4 класса), 2 – от 5 до 9 классов, 3 – среднеспециальное или 4 – высшее)
  • Mjob - работа матери ("teacher", "health" care related, civil "services" (e.g. administrative or police), "at_home" or "other")
  • Fjob - работа отца ("teacher", "health" care related, civil "services" (e.g. administrative or police), "at_home" or "other")
  • reason - причина выбора школы (близко к дому — "home", репутация школы — "reputation", "course" предпочтение некоторым предметам или "other")
  • guardian - опекун ("mother", "father" или "other")
  • traveltime - время от дома до школы (1 - меньше 15 мин., 2 - 15 до 30 мин., 3 - 30 мин. до 1 часа, или 4 - больше 1 часа)
  • studytime - количество часов обучения в неделю (1 - меньше 2 часов, 2 - от 2 до 5 часов, 3 - от 5 до 10 часов, или 4 - больше 10 часов)
  • failures - колисечтво ранее не сданных предметов (n if 1 <= n < 3, else 4)
  • schoolsup - дополнительные занятия (yes or no)
  • famsup - помощь от семьи при выполнении заданий (yes or no)
  • paid - дополнительные платные занятия (yes or no)
  • activities - внеклассная деятельность (yes or no)
  • nursery - посещал детский сад (yes or no)
  • higher - желание высшего образования (yes or no)
  • internet - домашний интернет (yes or no)
  • romantic - состоит в романтических отношениях (yes or no)
  • famrel - насколько хорошо отношения в семье (от 1 - очень плохие до 5 - превосходные)
  • freetime - наличие свободного времени после школы (от 1 - очень мало до 5 - очень много)
  • goout - гуляет с друзьями (от 1 - редко до 5 - очень часто)
  • Dalc - употребление алкоголя в будние дни (от 1 - очень редко до 5 - очень часто)
  • Walc - употребление алкоголя в выходные (от 1 - очень редко до 5 - очень часто)
  • health - текущее состояние здоровья (от 1 - очень плохое до 5 - очень хорошее)
  • absences - количество школьных пропусков (от 0 до 93)

Признаки ниже связаны с курсом (математика/португальский)

  • G1 - оценка за первый семестр (от 0 до 20)
  • G2 - оценка за второй семестр (от 0 до 20)
  • [целевая переменная] G3 - итоговая оценка (от 0 до 20)
In [ ]:
import numpy as np
import pandas as pd
import scipy as sp
import pylab as plt

%matplotlib inline

Для начала загрузите данные. Обратите внимание, чтобы данные были загружены верно (был указан верный разделитель, а так же корректно отображались названия столбцов). Чтобы это проверить, а также посмотреть, что представляют из себя данные, можно вывести первые несколько строк загруженного датасета на экран.

In [ ]:
 

Разделите признаки и целевую зависимость в две отдельные переменные X и y.

In [ ]:
 

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

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

In [ ]:
 

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

  • коэффициент детерминации r2
  • MAE
  • MSE

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

  • линейную регрессию LinearRegression
  • регуляризованную линейную регрессию — одну из моделей Ridge или Lasso
  • случайный лес RandomForest со 100 деревьями
  • метод ближайших соседей KNeighborsRegressor

Для следующих моделей вам нужно подобрать оптимальные гиперпараметры с помощью 5-fold кросс-валидации:

  • коэффициент при регуляризаторе в случае Ridge и Lasso
  • максимальную глубину деревьев для RandomForest
  • количество соседей для KNeighborsRegressor

Вы можете перебрать несколько (3-5) значений соответствующего параметра. Скорее всего вам удобно будет воспользоваться:

  • классом KFold чтобы создать объект для кросс-валидации
  • классом GridSearchCV имеющим параметры:

    • estimator некоторая модель, например, KNeighborsRegressor()
    • param_grid — словарь с оптимизируемыми параметрыми, например, {'n_neighbors': [1, 3, 5, 15]}
    • scoring — название оптимизируемой метрики (r2_score, mean_squared_error либо mean_absolute_error) в зависимости от того, какую метрику вы выбрали
    • cv — схема кросс-валидации (здесь можно указать созданный ранее объект KFold)

    после создания объекта вам нужно вызвать метод fit, после чего у обученного объекта посмотреть поле best_params_, где будут сохранены оптимальные в данном случае параметры. Пример использования.

(4 балла) Подберите оптимальные значения гиперпараметров для указанных выше моделей.

In [ ]:
 

(2 балла) Теперь измерьте качество на кросс-валидации для каждой модели с оптимальными параметрами. Для этого удобно воспользоваться функцией cross_val_score, имеющую параметры, аналогичные GridSearchCV.

In [ ]:
 

(1 балл) Вернемся к отложенной матрице категориальных признаков. Так как алгоритмы не умеют работать со строковыми данными, преобразуйте их с помощью функции get_dummies в числовую матрицу, где значение каждого признака будет закодировано как бинарное. Сколько признаков теперь получилось?

In [ ]:
 

Объедините две матрицы: с числовыми признаками и закодированными категориальными в полную матрицу признаков. Для этого удобно воспользоваться функцией concat, указав первым аргументов массив датафреймов, а также axis=1.

In [ ]:
 

(1 балл) Обучите модели с оптимальными параметрами из предыдущего пункта и измерьте качество на полной матрице признаков с помощью функции cross_val_score.

In [ ]:
 

(2 балла) Ответьте на следующие вопросы:

  • какая из моделей имеет наилучшее качество в первом случае, а какая — во втором?
  • есть ли модели, для которых добавление категориальных признаков дало прирост в качестве?
  • какая из использованных моделей кажется вам наиболее сложной и почему?
In [ ]:
 

(1 дополнительный балл) Обучите случайный лес на полной матрице признаков и найдите топ3 наиболее важных признаков. Можно ли дать интерпретацию почему эти признаки оказались наиболее информативными в рамках данной задачи?

In [ ]: