Введение в анализ данных¶
Домашнее задание 2. Линейная регрессия.¶
Правила, прочитайте внимательно:
Общее
Выполненную работу в формате
ipynbнужно отправить <будет объявлено в чате и в боте>. Работы, присланные иным способом, не принимаются. Дедлайны указаны в боте, они являются строгими. Переносы дедлайнов осуществляются по установленным правилам.Обязательно изучите руководство по оформлению ДЗ. В частности, оно содержит примеры случаев, когда могут быть снижены баллы.
Обратите внимание на правила использования ИИ-инструментов при решении домашнего задания.
Выполнять задание необходимо полностью самостоятельно. При обнаружении списывания (в т.ч. злоупотребление ИИ) всем участникам списывания дается штраф -3 скор-балла к итоговой оценке.
Решение теоретических задач оформляйте в markdown-ячейках формате $\LaTeX$. При решении можно использовать ИИ-инструменты только для оформления написанного самостоятельно решения. Например, написать черновик формул и попросить ИИ оформить эти формулы в $\LaTeX$.
Решение проверяется системой ИИ-проверки
ThetaGrader. Результат проверки валидируется и исправляется человеком, после чего комментарии отправляются студентам.
Правила заполнения ноутбука
- Запрещается удалять имеющиеся в ноутбуке ячейки, менять местами положения существующих ячеек.
- Отвечайте на вопросы, а также добавляйте новые ячейки в любом количестве в предложенных местах, которые обозначены
<...>. - Сохраняйте естественный линейный порядок повествования в ноутбуке сверху-вниз. Комментарии к решению пишите в markdown-ячейках.
- Условия запрещается модифицировать.
- При нарушении данных правил работа может получить 0 баллов.
Баллы за задание:
- Задача 1 — 20 баллов;
- Задача 2 — 80 баллов;
- Задача 6 — 70 баллов;
- Задача 7 — 50 баллов.
# Bot check
# HW_ID: fpmi_ad2
# Бот проверит этот ID и предупредит, если случайно сдать что-то не то.
# Status: not final
# Перед отправкой в финальном решении удали "not" в строчке выше.
# Так бот проверит, что ты отправляешь финальную версию, а не промежуточную.
# Никакие значения в этой ячейке не влияют на факт сдачи работы.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.base import BaseEstimator
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
... # допиши необходимые импорты
sns.set(style="whitegrid", palette="Set2")
Ссылки на использование ИИ¶
Если при решении задач использовался ИИ, укажи здесь публичные ссылки на все чаты с ИИ и поясни, для каких целей он применялся. Обрати внимание на правила.
Задача 1
- ссылка
- для чего использована
- для чего использована
- ссылка
- для чего использована
Задача 2
- ссылка
- для чего использована
Привет!
Перед тобой увлекательная домашка по линейной регрессии и градиентным методам оптимизации. Надеемся, что тебе она понравится, ты точно найдешь в ней что-то интересное. В условии оставлены некоторые скрытые подсказки, будет хорошо, если ты сначала постараешься подумать самостоятельно, а затем раскроешь содержимое подсказки. Если у тебя будут вопросы по условию, можешь обратиться с ними в чат. Только очень желательно не делиться в чате фрагментами решения.
Успехов в решении!
Рассмотрим модель одномерной линейной регрессии без свободного параметра $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}$ методом наименьших квадратов по явной формуле. В ответе во всех пунктах могут оставаться суммы $n$ слагаемых, но не должно быть операций с векторами или матрицами.
...
2. Выпишите формулы итераций градиентного спуска (GD) и стохастического градиентного спуска (SGD) для поиска $\widehat{\theta}$. Не забудьте указать, как в SGD математически определяется батч (набор объектов на каждой итерации).
...
3. Опишите, что произойдет, если для некоторого $i$ ошибка $\varepsilon_i$ будет очень большой.
...
Задача 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: количество арендованных велосипедов за текущий день.
Скачайте данные, загрузите файл day.csv с помощью pandas и разделите на обучающую и тестовую части в соотношении 4:1. Далее всю аналитику необходимо проводить только на обучающей части данных.
...
1. Визуальный анализ¶
Помочь в выполнении может ноутбук по линейной регрессии с занятия 2 и ноутбук по EDA с занятия 1.
Посмотрите по графикам, как целевой признак зависит от остальных и поймите характер этой зависимости. Старайтесь строить информативные графики, а из финального решения убирать те, которые не пригодились.
Какие признаки категориальные, а какие — вещественные? Учтите это при построении информативных графиков.
...
Сделайте выводы по графикам. В частности, ответьте на следующие вопросы.
- Есть ли в данных явные выбросы, то есть точки, далеко находящиеся от основной массы точек?
- Стоит ли рассматривать какие-либо нелинейные функции от признаков? Не стоит придумывать сложные функции, достаточно рассмотреть $x^2, \log x, I\{x > c\}$.
- Не стоит сильно закапываться в анализ графиков и подбор функций. Время у всех ограничено, а есть более интересные задачи. Достаточно сделать 2-4 содержательных вывода и рассмотреть возможность добавления небольшого количества признаков.
Выводы по графикам:
2. Подготовка данных¶
Опишите по шагам процедуру предобработки данных, которая будет включать работу с выбросами, преобразования вещественных и категориальных признаков, возможно, создание каких-либо новых признаков (посмотрите пример с занятия). То, как именно выполнять подготовку данных, является целым исскуством. Здесь нет "правильного" подхода, здесь есть метрика качества на тестовом множестве, которая в последствии оценит качество вашей модели.
Обратите внимание, от того, насколько качественно вы проведете визуальный анализ и подготовку данных, будет зависеть качество ваших моделей на следующих шагах.
Процедура предобработки данных:
a). ...
...
Реализуйте данную процедуру.
...
3. Обучение модели и ее анализ¶
Помочь в выполнении может ноутбук по линейной регрессии с занятия 2.
Обучите линейную регрессию из sklearn на полученных данных и посмотрите на полученные оценки коэффициентов (в т.ч. свободный коэффициент).
...
Посчитайте ошибку предсказания на тестовой выборке по метрикам RMSE, MAE, MAPE. Подробнее можно почитать в ноутбуке с занятия.
Замечание. Если в тестовой части тоже есть "большие" выбросы, их стоит убрать. Наша модель не должна пытаться их предсказать (например, сбои в работе сервиса), но в то же время выбросы вносят существенный вклад в значение метрики. Особенно стоит обратить на это внимание в случае высоких значений метрик, например, значения MAPE $\approx$ 100% — точно плохо.
...
Попробуйте посчитать оценку коэффициентов с помощью точной аналитической формулы, полученной на занятии (самостоятельно реализуйте ее). Не забудьте про константный признак.
...
Посчитайте также определить матрицы $X^T X$
...
Наблюдается ли какая-то проблема?
Причем, возможно, вы уже могли решить эту проблему на предыдущих этапах. Тогда все хорошо :)
...
Если выше была проблема, исправьте ее проблему, посчитайте оценки коэффициентов, а также ошибку предсказания.
...
Сделайте выводы.
Выводы:
...
Замечание. Не расстраивайтесь, если у вас получится не очень хорошее качество, это нормально. Вы провели только небольшую предобработку данных и обучили простую модель. Более сложные методы обработки данных и обучения ждут вас впереди. Главное — с чего-то начать!
Ты молодец, уже две задачи позади! 🎉
Впереди еще лве задачи, но не пугайся, они тебе понравятся! А пока сделай перерыв, возьми чай или кофе 😊
Задача 3.¶
Теперь давайте углубимся в теорию градиентных методов оптимизации. Эти подходы будут часто встречаться, поэтому важно освоить их применение. Для этого применим градиентные методы в другом методе обучения линейной регрессии.
В этой задаче вам предлагается реализовать регрессию Хьюбера, а также применить ее к данным с выбросами. Для начала реализуйте класс по шаблону снизу. Обратите внимание, что класс HuberRegression — наследник класса BaseEstimator, это с легкостью позволит использовать наш класс в различных пайплайнах библиотеки sklearn.
1. Рассмотрим линейную регрессию $y(x) = x^T \theta$, причем для оценки $\theta$ будем рассматривать функцию потерь Хьюбера $$R(x) = \frac{x^2}{2} I\{|x| \leqslant c\} + c\left(|x| - \frac{c}{2}\right)I\{|x| > c\}.$$
Тем самым задача оптимизации имеет вид $$\sum_{i=1}^n R(Y_i - x_i^T \theta) \longrightarrow \min_{\theta \in \mathbb{R}^d}.$$
Нарисуйте график $R(x)$
...
В чем польза выбора такой функции потерь?
Подумайте, что происходит в случае больших отклонений предсказаний от истины? Что это за точки?
Обратите внимание на поведение $R(x)$ в точке $x=c$.
...
Выпишите математические формулы градиентного спуска (GD) и стохастического градиентного спуска (SGD).
...
Хочется что-то закодить? Поехали!
2. Реализуем теперь класс. При реализации класса запрещено пользоваться ИИ-инструментами.
# При реализации класса запрещено пользоваться ИИ-инструментами.
class HuberRegression(BaseEstimator):
"""Класс, реализующий линейную регрессию с функцией потерь Хьюбера."""
def __init__(self, c: float = 1.0, fit_intercept: bool = True, max_iter: int = 1000) -> None:
"""Инициализирует модель.
Параметры: c (float): Константа из функции потерь Хьюбера.
fit_intercept (bool): Добавлять ли константный признак. max_iter
(int): Максимальное число итераций оптимизации.
"""
self.c = c
self.fit_intercept = fit_intercept
self.max_iter = max_iter
def fit(self, X: np.ndarray, y: np.ndarray) -> "HuberRegression":
"""Обучает модель.
Параметры:
X (np.ndarray): Матрица признаков.
y (np.ndarray): Вектор целевой переменной.
Возвращает:
HuberRegression: Обученная модель.
"""
if X.shape[0] != y.shape[0]:
raise ValueError("Количество строк в X и y должно совпадать")
...
self.coef_ = ... # Коэффициенты модели
self.intercept_ = ... # Свободный коэффициент
self.n_iter_ = ... # Число итераций
return self
def predict(self, X: np.ndarray) -> np.ndarray:
"""Делает предсказание на новых данных.
Параметры: X (np.ndarray): Матрица признаков.
Возвращает: np.ndarray: Вектор предсказанных значений.
"""
if X_copy.shape[1] != self.coef_.shape[0]:
raise ValueError("Число признаков в X не соответствует числу коэффициентов модели")
...
return pred
3. Загрузите данные из файлов train.csv, test.csv. Не забудьте, что всю аналитику, а также процесс обучения и подбор гиперпараметров необходимо выполнять на обучающей выборке.
...
Посмотрите на зависимость целевой переменной от каждого признака.
...
Что можно сказать о наличии возможных выбросов? Какое влияние они могут оказать?
...
4. Обучите простую линейную регрессию и посчитайте качество на тестовой выборке по метрике MSE.
...
Что можно сказать о качестве нашей модели?
...
5. Теперь обучите линейную регресcию Хьюбера и посчитайте качество на тестовой части по метрикe MSE.
...
Что изменилось?
...
6. Для обучающей выборки постройте два графика (по графику на каждую модель), на которых изобразите зависимость истинного и предсказанного значения таргета от каждого признака.
...
Что можно заметить на этих графиках?
...
7. Обучите регрессию Хьюбера на данных из задачи 2 и сравните качество модели с простой линейной регрессией, которую вы построили в задаче 2.
...
Вывод:
...
Задача 4.¶
Наконец, давайте исследуем еще один метод обучения линейных моделей. Эта задача теоретическая, кодить ничего не требуется. Мы рассмотрим только случай простой модели, потому как в более сложном случае решение существенно усложняется.
Рассмотрим модель одномерной регрессии $y(x) = \theta x$, где $x \in \mathbb{R}$ — одномерный признак, $y \in \mathbb{R}$ — целевой признак, $\theta \in \mathbb{R}$ — неизвестный параметр. Имеется выборка размера $n$, полученная по правилу $$Y_i = \theta x_i + \varepsilon_i,\ \ \ i=1,...,n,$$ где $\varepsilon_i$ — случайная ошибка измерений.
Оценку параметра $\theta$ будем искать методом наименьших модулей, то есть $$\sum_{i=1}^n \left|Y_i - \theta x_i\right| \to \min_\theta.$$
Какие преимущества и недостатки такой модели по сравнению с методом наименьших квадратов?
...
Предложите точный алгоритм поиска оценки параметра $\theta$, работающий за время $O(n \log n)$. Приведите его описание и теоретическое обоснование.
...
Надеемся, что ты все успел, и тебе понравилось! Ждем тебя на следующей лекции!
© 2026 команда ThetaHat для ВвАД