Введение в анализ данных¶

Домашнее задание 2. Линейная регрессия.¶

Правила, прочитайте внимательно:

  1. Общее

    • Выполненную работу в формате ipynb нужно отправить <будет объявлено в чате и в боте>. Работы, присланные иным способом, не принимаются. Дедлайны указаны в боте, они являются строгими. Переносы дедлайнов осуществляются по установленным правилам.

    • Обязательно изучите руководство по оформлению ДЗ. В частности, оно содержит примеры случаев, когда могут быть снижены баллы.

    • Обратите внимание на правила использования ИИ-инструментов при решении домашнего задания.

    • Выполнять задание необходимо полностью самостоятельно. При обнаружении списывания (в т.ч. злоупотребление ИИ) всем участникам списывания дается штраф -3 скор-балла к итоговой оценке.

    • Решение теоретических задач оформляйте в markdown-ячейках формате $\LaTeX$. При решении можно использовать ИИ-инструменты только для оформления написанного самостоятельно решения. Например, написать черновик формул и попросить ИИ оформить эти формулы в $\LaTeX$.

    • Решение проверяется системой ИИ-проверки No description has been provided for this image ThetaGrader. Результат проверки валидируется и исправляется человеком, после чего комментарии отправляются студентам.

  2. Правила заполнения ноутбука

    • Запрещается удалять имеющиеся в ноутбуке ячейки, менять местами положения существующих ячеек.
    • Отвечайте на вопросы, а также добавляйте новые ячейки в любом количестве в предложенных местах, которые обозначены <...>.
    • Сохраняйте естественный линейный порядок повествования в ноутбуке сверху-вниз. Комментарии к решению пишите в markdown-ячейках.
    • Условия запрещается модифицировать.
    • При нарушении данных правил работа может получить 0 баллов.

Баллы за задание:

  • Задача 1 — 20 баллов;
  • Задача 2 — 80 баллов;
  • Задача 6 — 70 баллов;
  • Задача 7 — 50 баллов.
In [ ]:
# Bot check

# HW_ID: fpmi_ad2
# Бот проверит этот ID и предупредит, если случайно сдать что-то не то.

# Status: not final
# Перед отправкой в финальном решении удали "not" в строчке выше.
# Так бот проверит, что ты отправляешь финальную версию, а не промежуточную.
# Никакие значения в этой ячейке не влияют на факт сдачи работы.
In [ ]:
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

  1. ссылка
    • для чего использована
    • для чего использована
  2. ссылка
    • для чего использована

Задача 2

  1. ссылка
    • для чего использована

Привет!

Перед тобой увлекательная домашка по линейной регрессии и градиентным методам оптимизации. Надеемся, что тебе она понравится, ты точно найдешь в ней что-то интересное. В условии оставлены некоторые скрытые подсказки, будет хорошо, если ты сначала постараешься подумать самостоятельно, а затем раскроешь содержимое подсказки. Если у тебя будут вопросы по условию, можешь обратиться с ними в чат. Только очень желательно не делиться в чате фрагментами решения.

Успехов в решении!


Задача 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}$ методом наименьших квадратов по явной формуле. В ответе во всех пунктах могут оставаться суммы $n$ слагаемых, но не должно быть операций с векторами или матрицами.

...

2. Выпишите формулы итераций градиентного спуска (GD) и стохастического градиентного спуска (SGD) для поиска $\widehat{\theta}$. Не забудьте указать, как в SGD математически определяется батч (набор объектов на каждой итерации).

...

3. Опишите, что произойдет, если для некоторого $i$ ошибка $\varepsilon_i$ будет очень большой.

...


Задача 2.¶

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

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

Рассмотрим датасет Bike Sharing Dataset от компании Capital Bikeshare, располагающей автоматизированными пунктами проката велосипедов. В датасете по дням записаны календарная информация и погодные условия, а также число прокатов в этот день. Цель — предсказать количество арендованных велосипедов по остальным характеристикам.

No description has been provided for this image

Будем работать только со следующими признаками:

  • 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. Далее всю аналитику необходимо проводить только на обучающей части данных.

In [ ]:
...

1. Визуальный анализ¶

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

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

Какие признаки категориальные, а какие — вещественные? Учтите это при построении информативных графиков.


➡️ Кликни для показа подсказки Среди признаков есть такие, значения которых как-то упорядочены, и их относительно небольшое количество. Чтобы понять, являются ли они категориальными, попробуйте понять, как с их значениями будут работать линейные модели. Иначе говоря, допустимо ли с точки зрения природы данных выполнять арифметические операции между *любыми* значениями этого признака, согласуется ли это со смыслом, который несет в себе данный признак?
In [ ]:
...

Сделайте выводы по графикам. В частности, ответьте на следующие вопросы.

  • Есть ли в данных явные выбросы, то есть точки, далеко находящиеся от основной массы точек?
  • Стоит ли рассматривать какие-либо нелинейные функции от признаков? Не стоит придумывать сложные функции, достаточно рассмотреть $x^2, \log x, I\{x > c\}$.
  • Не стоит сильно закапываться в анализ графиков и подбор функций. Время у всех ограничено, а есть более интересные задачи. Достаточно сделать 2-4 содержательных вывода и рассмотреть возможность добавления небольшого количества признаков.

Выводы по графикам:

2. Подготовка данных¶

Опишите по шагам процедуру предобработки данных, которая будет включать работу с выбросами, преобразования вещественных и категориальных признаков, возможно, создание каких-либо новых признаков (посмотрите пример с занятия). То, как именно выполнять подготовку данных, является целым исскуством. Здесь нет "правильного" подхода, здесь есть метрика качества на тестовом множестве, которая в последствии оценит качество вашей модели.

Обратите внимание, от того, насколько качественно вы проведете визуальный анализ и подготовку данных, будет зависеть качество ваших моделей на следующих шагах.

Процедура предобработки данных:

a). ...

...

Реализуйте данную процедуру.

In [ ]:
...

3. Обучение модели и ее анализ¶

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

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

In [ ]:
...

Посчитайте ошибку предсказания на тестовой выборке по метрикам RMSE, MAE, MAPE. Подробнее можно почитать в ноутбуке с занятия.

Замечание. Если в тестовой части тоже есть "большие" выбросы, их стоит убрать. Наша модель не должна пытаться их предсказать (например, сбои в работе сервиса), но в то же время выбросы вносят существенный вклад в значение метрики. Особенно стоит обратить на это внимание в случае высоких значений метрик, например, значения MAPE $\approx$ 100% — точно плохо.

In [ ]:
...

Попробуйте посчитать оценку коэффициентов с помощью точной аналитической формулы, полученной на занятии (самостоятельно реализуйте ее). Не забудьте про константный признак.

In [ ]:
...

Посчитайте также определить матрицы $X^T X$

In [ ]:
...

Наблюдается ли какая-то проблема?


➡️ Кликни для показа подсказки Подумайте о зависимостях между признаками. Есть ли среди них сильно зависимые признаки?

Причем, возможно, вы уже могли решить эту проблему на предыдущих этапах. Тогда все хорошо :)

...

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

In [ ]:
...

Сделайте выводы.

Выводы:

...

Замечание. Не расстраивайтесь, если у вас получится не очень хорошее качество, это нормально. Вы провели только небольшую предобработку данных и обучили простую модель. Более сложные методы обработки данных и обучения ждут вас впереди. Главное — с чего-то начать!

No description has been provided for this image

Ты молодец, уже две задачи позади! 🎉

Впереди еще лве задачи, но не пугайся, они тебе понравятся! А пока сделай перерыв, возьми чай или кофе 😊


Задача 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)$

In [ ]:
...

В чем польза выбора такой функции потерь?


➡️ Кликни для показа подсказки
  1. Подумайте, что происходит в случае больших отклонений предсказаний от истины? Что это за точки?

  2. Обратите внимание на поведение $R(x)$ в точке $x=c$.

...

Выпишите математические формулы градиентного спуска (GD) и стохастического градиентного спуска (SGD).

...

Хочется что-то закодить? Поехали!

2. Реализуем теперь класс. При реализации класса запрещено пользоваться ИИ-инструментами.

In [ ]:
# При реализации класса запрещено пользоваться ИИ-инструментами.


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. Не забудьте, что всю аналитику, а также процесс обучения и подбор гиперпараметров необходимо выполнять на обучающей выборке.

In [ ]:
...

Посмотрите на зависимость целевой переменной от каждого признака.

In [ ]:
...

Что можно сказать о наличии возможных выбросов? Какое влияние они могут оказать?

...

4. Обучите простую линейную регрессию и посчитайте качество на тестовой выборке по метрике MSE.

In [ ]:
...

Что можно сказать о качестве нашей модели?

...

5. Теперь обучите линейную регресcию Хьюбера и посчитайте качество на тестовой части по метрикe MSE.

In [ ]:
...

Что изменилось?

...

6. Для обучающей выборки постройте два графика (по графику на каждую модель), на которых изобразите зависимость истинного и предсказанного значения таргета от каждого признака.

In [ ]:
...

Что можно заметить на этих графиках?

...

7. Обучите регрессию Хьюбера на данных из задачи 2 и сравните качество модели с простой линейной регрессией, которую вы построили в задаче 2.

In [ ]:
...

Вывод:

...


Задача 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 для ВвАД