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

Домашнее задание 3, легкая часть. Линейная и логистическая регрессии.¶

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

  • Выполненную работу нужно отправить телеграм-боту @thetahat_ds25_bot. Для начала работы с ботом каждый раз отправляйте /start. Дождитесь подтверждения от бота, что он принял файл. Если подтверждения нет, то что-то не так. Работы, присланные иным способом, не принимаются.
  • Дедлайн см. в боте. После дедлайна работы не принимаются кроме случаев наличия уважительной причины.
  • Прислать нужно ноутбук в формате ipynb. Если вы строите интерактивные графики, их стоит прислать в формате html.
  • Следите за размером файлов. Бот не может принимать файлы весом более 20 Мб. Если файл получается больше, заранее разделите его на несколько.
  • Выполнять задание необходимо полностью самостоятельно. При обнаружении списывания всем участникам списывания дается штраф -2 балла к итоговой оценке за семестр.
  • Решения, размещенные на каких-либо интернет-ресурсах, не принимаются. Кроме того, публикация решения в открытом доступе может быть приравнена к предоставлении возможности списать.
  • Обратите внимание на правила использования ИИ-инструментов при решении домашнего задания.
  • Код из рассказанных на занятиях ноутбуков можно использовать без ограничений.
  • Для выполнения задания используйте этот ноутбук в качестве основы, ничего не удаляя из него. Можно добавлять необходимое количество ячеек.
  • Комментарии к решению пишите в markdown-ячейках.
  • Выполнение задания (ход решения, выводы и пр.) должно быть осуществлено на русском языке.
  • Решение проверяется системой ИИ-проверки No description has been provided for this image ThetaGrader. Результат проверки валидируется и исправляется человеком, после чего комментарии отправляются студентам.
  • Если код будет не понятен проверяющему, оценка может быть снижена.
  • Никакой код из данного задания при проверке запускаться не будет. Если код студента не выполнен, недописан и т.д., то он не оценивается.
  • Код из рассказанных на занятиях ноутбуков можно использовать без ограничений.

Правила оформления теоретических задач:

  • Решения необходимо оформить в виде $\LaTeX$ в markdown-ячейках. Иные способы (в т.ч. фотографии) не принимаются.
  • Если вы не знаете $\LaTeX$, используйте ИИ-инструменты для оформления черновика решения. Примеры были показаны на лекции 2 по ИИ-инструментам.
  • В решениях поясняйте, чем вы пользуетесь, хотя бы кратко.
  • Решение, в котором есть только ответ, и отсутствуют вычисления, оценивается в 0 баллов.

Важно!!! Правила заполнения ноутбука:

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

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

Легкая часть (достаточно на "хор"):

  • Задача 1 — 20 баллов
  • Задача 2 — 80 баллов
  • Задача 3 — 30 баллов;
  • Задача 4 — 20 баллов;

Сложная часть (необходимо на "отл"):

  • Задачи 5-7: скачайте второй ноутбук с условием задания со страницы курса.

Баллы учитываются в обязательной части курса и не влияют на оценку по факультативной части.

In [ ]:
# Bot check

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

# Status: not final
# Перед отправкой в финальном решении удали "not" в строчке выше.
# Так бот проверит, что ты отправляешь финальную версию, а не промежуточную.
# Никакие значения в этой ячейке не влияют на факт сдачи работы.
In [ ]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

sns.set(style="whitegrid", palette="Set2")

При решении задания используйте sklearn. Пропишите сюда необходимые импорты

In [ ]:
...

Легкая часть¶


Задача 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 математически определяется батч (набор объектов на каждой итерации).

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

Замечания.

  1. Это теоретическая задача, не перепутайте 😄
  2. В ответе во всех пунктах могут оставаться суммы $n$ слагаемых, но не должно быть операций с векторами или матрицами.
  3. Прочитайте требования к формату решения в правилах сдачи задания.

Решение:

...


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

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

In [ ]:
...

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

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

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

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

In [ ]:
...

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

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

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

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

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

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

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

a). ...

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

In [ ]:
...

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

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

In [ ]:
...

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

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

In [ ]:
...

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

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

...

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

In [ ]:
...

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

Выводы:

...

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

No description has been provided for this image

Задача 3.¶

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

Одно из интересных свойств модели логистической регрессии — при соблюдении её предположений она дает возможность получать несмещенные оценки вероятностей принадлежности объекта к определенному классу.
Для пояснения рассмотрим объект $x$ и соответствующее предсказание вероятности $\widehat{p}(x)$ для класса 1. Если взять небольшую окрестность объекта $x$, то доля объектов класса 1 в этой окрестности будет приблизительно равна $\widehat{p}(x)$.

Далее проверим это свойство на конкретных примерах.

С помощью кода ниже сгенерируйте данные, состоящие из одного вещественного признака и бинарного таргета.

In [ ]:
sample_size = 3000  # Размер выборки

# Признаки
X = np.random.uniform(low=-4, high=4, size=(sample_size, 1))

# Таргет
y_mean_true = 1 / (1 + np.exp(1 - 2 * X.ravel()))
y = np.random.binomial(n=1, p=y_mean_true)

plt.figure(figsize=(10, 3))
plt.scatter(X, y_mean_true, marker=".", s=1, label="Реальные вероятности\n(мы их не знаем)")
plt.scatter(X, y, marker="|", alpha=0.1, label="Данные")
plt.xlabel("Признак")
plt.ylabel("Класс объекта")
plt.legend();

Обучите логистическую регрессию, используя реализацию из sklearn, при этом свободный коэффициент должен присутствовать в модели. Укажите также penalty='none'.

In [ ]:
...

Напечатайте оценку коэффициентов

In [ ]:
...

Ниже объявлена сетка значений признака. По этой сетке постройте

  • предсказания классов,
  • предсказания вероятностей класса 1.

Визуализируйте эти предсказания. На график стоит нанести также обучающую выборку.

In [ ]:
X_grid = np.linspace(-4, 4, 10000).reshape((-1, 1))
...

Разбейте отрезок $[-4, 4]$ на одинаковые бины длины длины 0.2 и посчитайте в каждом бине долю объектов класса 1. Полученные значения добавьте на график предсказаний вероятностей и сравните эти графики. Проинтерпретируйте полученные результаты.

Подсказка: может помочь np.digitize и метод groupby для таблиц pandas. Рекомендуем посмотреть обучающие ноутбуки по библиотекам.

In [ ]:
...

Повторите проведенное исследование для следующих данных и сравните результаты.

In [ ]:
# Признаки
X = np.random.uniform(low=-4, high=4, size=(sample_size, 1))

# Таргет
y_mean_true = 1 / (1 + np.exp(-100 * X.ravel()))
y = np.random.binomial(n=1, p=y_mean_true)

plt.figure(figsize=(10, 3))
plt.scatter(X, y_mean_true, marker=".", s=1, label="Реальные вероятности")
plt.scatter(X, y, marker="|", alpha=0.1, label="Данные")
plt.xlabel("Признак")
plt.ylabel("Класс объекта")
plt.legend();

Выводы:

...


Задача 4.¶

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

In [ ]:
probs = np.random.uniform(size=8)
probs /= probs.sum()
probs

x = np.random.choice(np.arange(8), p=probs, size=10000)
data = pd.DataFrame(
    np.unpackbits(np.array(x.reshape(-1, 1), dtype=">i8").view(np.uint8), axis=1)[:, -3:],
    columns=["feature_1", "feature_2", "target"],
)
data.head()

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

Сначала для сравнения посчитайте долю класса 1 для каждой категории объектов.

Подсказка: используйте pd.pivot_table. Рекомендуем посмотреть обучающие ноутбуки по библиотекам.

In [ ]:
...

Обучите логистическую регрессию с penalty='none' и получите предсказания вероятностей для этих четырех типов объектов. Представьте результаты в таком виде, чтобы их удобно было сравнивать с частотами, посчитанными ранее.

In [ ]:
...

Почему результаты не совпадают?

Для ответа на этот вопрос распишите формулу, которая задает модель логистической регрессии, указав все параметры. Какое предположение о данных при этом делает логистическая регрессия?

...

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

Опишите ваше предложение:

...

Реализация:

In [ ]:
...

Выводы:

...


Сложная часть¶

Задачи 5-7: скачайте второй ноутбук с условием задания со страницы курса.