Физтех.Статистика
Скачать ipynb
Введение в анализ данных¶
Домашнее задание 3. Линейная регрессия.¶
Правила, прочитайте внимательно:
- Выполненную работу нужно отправить телеграм-боту
@miptstats_ds24_bot
. Для начала работы с ботом каждый раз отправляйте/start
. Дождитесь подтверждения от бота, что он принял файл. Если подтверждения нет, то что-то не так. Работы, присланные иным способом, не принимаются. - Дедлайн см. в боте. После дедлайна работы не принимаются кроме случаев наличия уважительной причины.
- Прислать нужно ноутбук в формате
ipynb
. Если вы строите интерактивные графики, их стоит прислать в формате html. - Следите за размером файлов. Бот не может принимать файлы весом более 20 Мб. Если файл получается больше, заранее разделите его на несколько.
- Выполнять задание необходимо полностью самостоятельно. При обнаружении списывания все участники списывания будут сдавать устный зачет.
- Решения, размещенные на каких-либо интернет-ресурсах, не принимаются. Кроме того, публикация решения в открытом доступе может быть приравнена к предоставлении возможности списать.
- Для выполнения задания используйте этот ноутбук в качестве основы, ничего не удаляя из него. Можно добавлять необходимое количество ячеек.
- Комментарии к решению пишите в markdown-ячейках.
- Выполнение задания (ход решения, выводы и пр.) должно быть осуществлено на русском языке.
- Если код будет не понятен проверяющему, оценка может быть снижена.
- Никакой код из данного задания при проверке запускаться не будет. Если код студента не выполнен, недописан и т.д., то он не оценивается.
- Код из рассказанных на занятиях ноутбуков можно использовать без ограничений.
Правила оформления теоретических задач:
- Решения необходимо прислать одним из следующих способов:
- фотографиями в правильной ориентации, где все четко видно, а почерк разборчив,
- отправив их как файл (
pdf
/png
/jpg
) боту вместе с ноутбуком - или вставив ее в ноутбук посредством
Edit -> Insert Image
при редактировании markdown-ячейки (фото, вставленные ссылкой, не принимаются);
- отправив их как файл (
- в виде $\LaTeX$ в markdown-ячейках.
- фотографиями в правильной ориентации, где все четко видно, а почерк разборчив,
- Решения не проверяются, если какое-то требование не выполнено. Особенно внимательно все проверьте в случае выбора второго пункта (вставки фото в ноутбук). Неправильно вставленные фотографии могут не передаться при отправке. Для проверки попробуйте переместить
ipynb
в другую папку и открыть его там. - В решениях поясняйте, чем вы пользуетесь, хотя бы кратко. Например, если пользуетесь независимостью, то достаточно подписи вида "X и Y незав."
- Решение, в котором есть только ответ, и отсутствуют вычисления, оценивается в 0 баллов.
Баллы за задание:
Легкая часть (достаточно на "хор"):
- Задача 1 — 20 баллов
- Задача 2 — 80 баллов
Сложная часть (необходимо на "отл"):
- Задача 3 — 50 баллов
- Задача 4 — 60 баллов
- Задача 5 — 30 баллов
# Bot check
# HW_ID: fpmi_ad3
# Бот проверит этот ID и предупредит, если случайно сдать что-то не то.
# Status: not final
# Перед отправкой в финальном решении удали "not" в строчке выше.
# Так бот проверит, что ты отправляешь финальную версию, а не промежуточную.
# Никакие значения в этой ячейке не влияют на факт сдачи работы.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style='whitegrid', font_scale=1.3, palette='Set2')
При решении задания используйте sklearn
. Пропишите сюда необходимые импорты
Легкая часть¶
Задача 1.¶
Рассмотрим одномерную линейную регрессию без свободного параметра $y(x) = \theta x$, где $x\in \mathbb{R}$ и $\theta \in \mathbb{R}$. Предполагаем, что данные получены по правилу $$Y_i = \theta x_i + \varepsilon_i,$$ где $i \in \{1, ..., n\}$, числа $x_i \in \mathbb{R}$ неслучайны, а $\varepsilon_i$ — случайные ошибки.
1. Посчитайте оценку $\widehat{\theta}$ методом наименьших квадратов по явной формуле.
2. Выпишите формулы итераций градиентного спуска (GD) и стохастического градиентного спуска (SGD) для поиска $\widehat{\theta}$. Не забудьте указать, как в SGD математически определяется батч (набор объектов на каждой итерации).
Замечания.
- В ответе во всех пунктах могут оставаться суммы $n$ слагаемых, но не должно быть операций с векторами или матрицами.
- Прочитайте требования к формату решения в правилах сдачи задания.
Задача 2.¶
Скоро лето — идеальное время года для путешествий и прогулок на велосипедах. В крупных городах обычно развиты сети проката велосипедов, предоставляющие удобный сервис. Одной из важных задач таких компаний является прогнозирование количества арендованных велосипедов в зависимости от времени года и погодных условий.
Рассмотрим датасет Bike Sharing Dataset от компании Capital Bikeshare, располагающей автоматизированными пунктами проката велосипедов. В датасете по дням записаны календарная информация и погодные условия, а также число прокатов в этот день. Цель — предсказать количество арендованных велосипедов по остальным характеристикам.
Будем работать только со следующими признаками:
season
: время года: 1 — зима, 2 — весна, 3 — лето, 4 — осень;mnth
: месяц от 1 до 12;holiday
: является ли текущий день праздничным;weekday
: день недели от 0 до 6;workingday
: является ли текущий день рабочим или выходным;weathersit
: оценка благоприятности погоды от 1 (чистый, ясный день) до 4 (ливень, туман);temp
: температура в Цельсиях;atemp
: температура по ощущениям в Цельсиях;hum
: влажность воздуха;windspeed
: скорость ветра;cnt
: количество арендованных велосипедов в текущий день.
Перед выполнением задания обязательно посмотрите ноутбук с занятия по линейной регрессии.
Скачайте данные, загрузите их с помощью pandas
и разделите на обучающую и тестовую части в соотношении 4:1. Далее всю аналитику необходимо проводить только на обучающей части данных.
1. Визуальный анализ¶
Посмотрите по графикам, как целевой признак зависит от остальных и поймите характер этой зависимости. Старайтесь строить информативные графики, а из финального решения убирать те, которые не пригодились.
Какие признаки категориальные, а какие — вещественные? Учтите это при построении информативных графиков.
Указание. Среди признаков есть такие, значения которых как-то упорядочены, и их относительно небольшое количество. Чтобы понять, являются ли они категориальными, попробуйте понять, как с их значениями будут работать линейные модели. Иначе говоря, допустимо ли с точки зрения природы данных выполнять арифметические операции между любыми значениями этого признака, согласуется ли это со смыслом, который несет в себе данный признак?
Сделайте выводы по графикам. В частности, ответьте на следующие вопросы.
- Есть ли в данных явные выбросы, то есть точки, далеко находящиеся от основной массы точек?
- Стоит ли рассматривать какие-либо нелинейные функции от признаков? Не стоит придумывать сложные функции, достаточно рассмотреть $x^2$, $\log x$ и $I\{x > c\}$.
Выводы по графикам:
2. Подготовка данных¶
Опишите по шагам процедуру предобработки данных, которая будет включать работу с выбросами, преобразования вещественных и категориальных признаков, возможно, что-то еще. Обратите внимание, от того, насколько качественно вы проведете визуальный анализ и подготовку данных, будет зависеть качество ваших моделей на следующих шагах.
Процедура предобработки данных:
a). ...
Реализуйте данную процедуру.
3. Обучение модели и ее анализ¶
Обучите линейную регрессию из sklearn
на полученных данных и посмотрите на полученные оценки коэффициентов (в т.ч. свободный коэффициент).
Посчитайте ошибку предсказания на тестовой выборке по метрикам RMSE, MAE, MAPE. Подробнее можно почитать в ноутбуке с занятия.
Замечание. Если в тестовой части тоже есть "большие" выбросы, их стоит убрать. Наша модель не должна пытаться их предсказать (например, сбои в работе сервиса) но в то же время выбросы вносят существенный вклад в значение метрики.
Попробуйте посчитать оценку коэффициентов с помощью формулы, полученной на занятии. Не забудьте про константный признак. В чем заключается проблема?
Подсказка. Подумайте о зависимостях между признаками.
Исправьте эту проблему, посчитайте оценки коэффициентов, а также ошибку предсказания.
Сделайте выводы.
Выводы:
Замечание. Не расстраивайтесь, если у вас получится не очень хорошее качество, это нормально. Вы провели только небольшую предобработку данных и обучили простую модель. Более сложные методы обработки данных и обучения ждут вас впереди. Главное — с чего-то начать!
Сложная часть¶
Задача 3.¶
Как можно было увидеть ранее, оценки коэффициентов становятся слишком большими при наличии некоторых проблем с данными. Чтобы этого не происходило, часто выполняют процедуру регуляризации в модели.
Пусть $X \in \mathbb{R}^{n \times d}$ — матрица признаков, $Y \in \mathbb{R}^{n}$ — вектор значений целевого признака, $\theta \in \mathbb{R}^{d}$ — неизвестный вектор параметров. В методе наименьших квадратов решается задача $$\| Y - X\theta \|^2 \longrightarrow \min_\theta.$$ Регуляризация заключается в искусственном усечении значений вектора оценок коэффициентов путем добавления его нормы к оптимизируемому функционалу. Тем самым решается задача $$\| Y - X\theta \|^2 + \lambda \| \theta \|^2 \longrightarrow \min_\theta,$$ где $\lambda > 0$ — гиперпараметр модели, то есть число, которое задается пользователем. Такая модель называется Ridge-регрессией.
Замечание. Такая модель дает некоторое другое приближение неизвестной зависимости. Но неправильно думать, что она не может дать "правильный" ответ, потому как понятия "правильный ответ" в подобных задачах не существует. Можно получить только более качественное приближение согласно выбранной метрике, например, RMSE.
1. Найдите оценку $\theta$ в модели ridge-регрессии в матричном виде. Сравните ее с оценкой коэффициентов в методе наименьших квадратов. Помогает ли она избавиться от проблемы обратимости матрицы в МНК, которая обсуждалась на занятии?
2. Выпишите формулу поиска оценки коэффициентов методом градиентного спуска и стохастического градиентного спуска для модели ridge-регрессии в матричном виде. Не забудьте указать, как математически определяется батч (набор объектов на каждой итерации).
3. Многие модели машинного обучения требуют стандартизацию признаков. Существует множество различных способов стандартизации, из которых наиболее распространены два следующих.
StandardScaler . Пусть $x_{ij}$ — значение признака $j$ для объекта $i$. Обозначим $m_j$ — выборочное среднее значение признака $j$ (функцияnp.mean
), а $s^2_j$ — выборочную дисперсию признака $j$ (функцияnp.var
). Тогда стандартизацией является преобразование $$\widetilde{x}_{ij} = \frac{x_{ij} - m_j}{s_j}.$$MinMaxScaler . Пусть $x_{ij}$ — значение признака $j$ для объекта $i$. Обозначим $m_j$ и $M_j$ — минимальное и максимальное значения признака $j$ соответственно. Тогда стандартизацией является преобразование $$\widetilde{x}_{ij} = \frac{x_{ij} - m_j}{M_j - m_j}.$$
Для метода наименьших квадратов стандартизацию признаков можно не производить, однако для модели ridge-регрессии стандартизация необходима. Поясните это. Можно представить, что признаки имеют некоторые различные единицы измерения.
Задача 4.¶
В данной задаче мы продолжим анализировать данные велопроката из задачи 2, используя указанные в ней признаки.
Для начала реализуйте класс для работы с моделью ridge-регрессии, используя явную формулу из предыдущей задачи. Интерфейс этого класса соответствует стандарту библиотеки sklearn
, который использует также множество других библиотек.
class RidgeRegression:
def __init__(self, lambd=0.1, fit_intercept=True):
'''
Инициализация модели.
Аргументы:
lambd -- параметр регуляризации.
fit_intercept -- добавить ли константный признак.
'''
self.lambd = lambd
self.fit_intercept = fit_intercept
def fit(X, Y):
'''
Обучение модели ridge-регрессии.
Аргументы:
X -- numpy-матрица объект-признак размера (n, d);
Y -- numpy-вектор значений целевого признака размера (n,).
'''
# Посчитайте оценки коэффициентов и, возможно,
# еще что-то, что пригодится в predict.
<...>
return self
def predict(X):
'''
Вычисление предсказаний.
Аргументы:
X -- numpy-матрица объект-признак размера (n, d);
Возвращает:
predictions -- предсказания в виде numpy-вектора размера (n,).
'''
# Посчитайте предсказания
<...>
return predictions
Разделите данные на три части — обучающую, валидационную и тестовую в соотношении 3:1:1. На первой из них вам необходимо проводить всю аналитику и обучать все модели — регрессию, скалирование и т.д.. Вторую вы будете использовать для выбора оптимального значения гиперпараметра. Наконец, тестовую выборку необходимо использовать только для вычисления итогового значения метрик выбранной модели. Именно эти числа вам нужно говорить заказчику.
Подробнее посмотрите в презентации с занятия. Далее в данной задаче можно копировать код из предыдущих задач или использовать готовые инструменты.
Выполните необходимые преобразования признаков. Не забудьте, что обучить преобразования нужно только по обучающей выборке. Учтите все особенности, которые обсуждались ранее во второй задаче.
Определите сетку значений гиперпараметра $\lambda$ и обучите для каждого значения сетки модель ridge-регрессии. Обычно эффективнее брать сетку в логарифмическом масштабе, воспользовавшись np.logspace
.
Для каждой из них посчитайте ошибку по метрикам RMSE, MAE, MAPE по обучающей и валидационной выборкам. Подробнее можно почитать в ноутбуке с занятия.
Замечание. Если в тестовой части тоже есть "большие" выбросы, их стоит убрать. Наша модель не должна пытаться их предсказать (например, сбои в работе сервиса) но в то же время выбросы вносят существенный вклад в значение метрики.
Для каждой метрики постройте графики зависимости значений метрики от значения гиперпараметра. Сравните поведение значений метрик для обучающей и валидационной выборок.
Постройте также на одном графике кривые зависимости значений оценок коэффициентов от значений гиперпараметра. Какая наблюдается зависимость? Как вы это можете охарактеризовать?
Замечание. Возможно, будет информативнее рисовать графики в логарифмическом масштабе. Для наглядности можно также попробовать рисовать одним цветом все кривые, которые относятся к одному исходному признаку.
Выберите оптимальное значение гиперпараметра и посчитайте ошибку на тестовой выборке.
Сделайте выводы.
Задача 5.¶
Предположим, что имеющиеся у нас данные по велопрокату — большие данные. Конечно же в реальности это не так. Однако, для простой учебной задачи это в самый раз, чтобы ничего ни у кого не подвисало.
Выберите некоторое начальное приближение оценок коэффициентов, например, в начале координат.
Реализуйте самостоятельно процедуру стохастического градиентного спуска для поиска оценок коэффициентов в модели ridge-регрессии. Размер батча (набор объектов на каждой итерации) обычно берут кратно степени двойки, например, 128 или 256. Значение $\lambda$ можно взять из предыдущей задачи.
Обратите внимание, что при неудачном выборе величины шага градиентного спуска $\eta$ (learning rate) метод может не сойтись. Пример приводился на лекции.
Нарисуйте графики зависимости значений метрик RMSE, MAE, MAPE от номера итерации для обучающей и валидационной выборок. Сколько итераций пришлось совершить?
Посчитайте ошибку на тестовой выборке.
Сделайте выводы.