Дата выдачи: 09.02.2016
Срок сдачи: 1.03.2016 09:00MSK
Лабораторная работа №2 направлена на реализацию одного из методов решения задачи линейной регрессии.
Каждая из задач имеет определенную «стоимость» (указана в скобках около задачи). Максимально допустимая оценка за работу — 10 баллов. Обратите внимание, что только за реализацию функций без подтверждения их корректной работы оценка выставляться не будет.
Сдавать задание после указанного срока сдачи нельзя. При выставлении неполного балла за задание в связи с наличием ошибок на усмотрение проверяющего предусмотрена возможность исправить задание на указанных в ответном письме условиях.
Задание выполняется САМОСТОЯТЕЛЬНО. «Похожие» решения считаются плагиатом и все задействованные студенты (в том числе те, у кого списали) не могут получить за него больше 0 баллов. Если вы нашли решение какого-то из заданий в открытом источнике, необходимо прислать ссылку на этот источник (скорее всего вы будете не единственным, кто это нашел, поэтому чтобы исключить подозрение в плагиате, необходима ссылка на источник).
Если вы будете решать задание на виртуальной машине, учтите, что его могут видеть все. К тому же недоступность виртуальной машины не является уважительной причиной для продления дедлайна.
Для сдачи задания переименуйте получившийся файл *.ipynb в соответствии со следующим форматом: Username_(group)_Lab2.ipynb, где Username — ваша фамилия на латинице, group — название группы (например, Kozlova_IAD-11_Lab1.ipynb). Далее отправьте этот файл на используемую в Вашей группе почту курса (hse.minor.dm@gmail.com) c темой письма [ИАД-NN] - Лабораторная работа 2 - Фамилия Имя Отчество.
В данном задании вам будет предложено реализовать метод градиентного спуска для задачи линейной регрессии. Подробное описание самого метода можно найти в материалах лекций и семинаров.
Задание будет состоять из двух частей: вам будет необходимо реализовать градиентный спуск и протестировать его на небольших данных, после чего решить задачу линейной регрессии для реальных данных.
Во всех частях задания будет использоваться квадратичный функционал качества:
$$Q(w) = \sum_{i=1}^l(\langle w, x_i \rangle - y_i)^2$$Для начала вам необходимо будет реализовать вспомогательные функции:
Далее реализуйте функцию градиентного спуска grad_descent(X, y, w, step, grad, iters), параметры которой:
Функция должна находить последовательно оптимальный вектор методом градиентного спуска, пока не будет выполнено хотя бы одно из условий:
Функиця должна возвращать два параметра:
Обратите внимание, что реализация не должна напрямую зависеть от числа признаков (чтобы ее можно было использовать в дальнейшем).
(4 балла) Линейная регрессия. Отладка градиентного метода
Сгенерируйте 200 точек с помощью функции generate_linear_data, на вход которой передается количество точек.
def generate_linear_data(n):
np.random.seed(42)
x = np.linspace(0, 10, n) + np.random.normal(0, 3, n)
y = 2 * x + 5 + np.random.normal(0, 2, n)
return x, y
Протестируйте вашу реализацию на сгенерированных точках. Не забудьте добавить констатный признак к данным (вы же помните, что мы хотим найти уравнение вида y = ax + b?). Ограничьте количество итераций 10000. Начальный вектор весов — нулевой. Протестируйте обе функции: const_step и decreasing_step что они работают корректно. Для функции const_step подберите оптимальный шаг из списка [1.0, 0.1, 0.01, 0.001]. Оптимальным шагом в данном случае будем считать тот, на котором достигается наименьшее значение квадратичного функционала качества. Обратите внимание, что в решении должны присутствовать код и комментарии, по которым можно понять как вы подобрали оптимальный шаг.
Для оптимального шага из предыдущего пункта постройте два графика:
Для построения графиков можно воспользоваться функциями scatter и plot.
Как понять что ваша реализация работает корректно?
Если не выполнено хотя бы одно из этих условий, то рекомендуется больше времени уделить этой части задания, пока все пункты не будут выполнены.
Выставление баллов по этому заданию:
(6 баллов) Предсказание качества вина
А также quality — эмпирическая оценка (от 0 до 10), которую необходимо предсказать. 2. Преобразуйте данные к типу numpy.array (поле values у датафрейма) и сразу же к типу np.float32 (функция astype(np.float32)). 3. Выделите целевую переменную, которая находится в последней колонке, в переменную y, а все признаки — в numpy.array X. 4. Убедитесь, что среди признаков нет зависимых. Если вы нашли такие признаки, то удалите их. 5. Запустите градиентный спуск для данной выборке при максимальном числе итераций 10000. Начальный вектор весов — нулевой. Попробуйте разный шаг: константный в интервале [0.001, 0.0001, 0.00001, 0.000001], а так же убывающий с номером итерации. 6. Найдите при каком шаге достигается наименьшее значение функционала качества и постройте график зависимости качества от номера итерации. 7. Какой признак имеет наибольший вес для наилучшей модели? 8. Посчитайте корреляцию Пирсона для исходных данных (для этого можно воспользоваться функциями numpy или методами датафрейма). Какой признак лучше всего коррелирует с целевой переменной? Согласуется ли это с тем, что вы получили в предыдущем пункте? Верно ли, что признаки, имеющие больший вес, имеют более высокую корреляцию с целевой переменной? Если вы пропустили пункт 4, попробуйте посмотреть внимательней на коэффициенты корреляции и в случае чего вернитесь к пункту 4.
Выставление баллов по этому заданию: