Введение в анализ данных¶
Домашнее задание 3, легкая часть. Линейная и логистическая регрессии.¶
Правила, прочитайте внимательно:
- Выполненную работу нужно отправить телеграм-боту
@thetahat_ds25_bot
. Для начала работы с ботом каждый раз отправляйте/start
. Дождитесь подтверждения от бота, что он принял файл. Если подтверждения нет, то что-то не так. Работы, присланные иным способом, не принимаются. - Дедлайн см. в боте. После дедлайна работы не принимаются кроме случаев наличия уважительной причины.
- Прислать нужно ноутбук в формате
ipynb
. Если вы строите интерактивные графики, их стоит прислать в формате html. - Следите за размером файлов. Бот не может принимать файлы весом более 20 Мб. Если файл получается больше, заранее разделите его на несколько.
- Выполнять задание необходимо полностью самостоятельно. При обнаружении списывания всем участникам списывания дается штраф -2 балла к итоговой оценке за семестр.
- Решения, размещенные на каких-либо интернет-ресурсах, не принимаются. Кроме того, публикация решения в открытом доступе может быть приравнена к предоставлении возможности списать.
- Обратите внимание на правила использования ИИ-инструментов при решении домашнего задания.
- Код из рассказанных на занятиях ноутбуков можно использовать без ограничений.
- Для выполнения задания используйте этот ноутбук в качестве основы, ничего не удаляя из него. Можно добавлять необходимое количество ячеек.
- Комментарии к решению пишите в markdown-ячейках.
- Выполнение задания (ход решения, выводы и пр.) должно быть осуществлено на русском языке.
- Решение проверяется системой ИИ-проверки
ThetaGrader. Результат проверки валидируется и исправляется человеком, после чего комментарии отправляются студентам.
- Если код будет не понятен проверяющему, оценка может быть снижена.
- Никакой код из данного задания при проверке запускаться не будет. Если код студента не выполнен, недописан и т.д., то он не оценивается.
- Код из рассказанных на занятиях ноутбуков можно использовать без ограничений.
Правила оформления теоретических задач:
- Решения необходимо оформить в виде $\LaTeX$ в markdown-ячейках. Иные способы (в т.ч. фотографии) не принимаются.
- Если вы не знаете $\LaTeX$, используйте ИИ-инструменты для оформления черновика решения. Примеры были показаны на лекции 2 по ИИ-инструментам.
- В решениях поясняйте, чем вы пользуетесь, хотя бы кратко.
- Решение, в котором есть только ответ, и отсутствуют вычисления, оценивается в 0 баллов.
Важно!!! Правила заполнения ноутбука:
- Запрещается удалять имеющиеся в ноутбуке ячейки, менять местами положения задач.
- Сохраняйте естественный линейный порядок повествования в ноутбуке сверху-вниз.
- Отвечайте на вопросы, а также добавляйте новые ячейки в предложенных местах, которые обозначены
<...>
. - В markdown-ячейка, содержащих описание задачи, находятся специальные отметки, которые запрещается модифицировать.
- При нарушении данных правил работа может получить 0 баллов.
Баллы за задание:
Легкая часть (достаточно на "хор"):
- Задача 1 — 20 баллов
- Задача 2 — 80 баллов
- Задача 3 — 30 баллов;
- Задача 4 — 20 баллов;
Сложная часть (необходимо на "отл"):
- Задачи 5-7: скачайте второй ноутбук с условием задания со страницы курса.
Баллы учитываются в обязательной части курса и не влияют на оценку по факультативной части.
# Bot check
# HW_ID: fpmi_ad3_part1
# Бот проверит этот 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", 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 математически определяется батч (набор объектов на каждой итерации).
3. Опишите, что произойдет, если для некоторого $i$ ошибка $\varepsilon_i$ будет очень большой.
Замечания.
- Это теоретическая задача, не перепутайте 😄
- В ответе во всех пунктах могут оставаться суммы $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$ и соответствующее предсказание вероятности $\widehat{p}(x)$ для класса 1. Если взять небольшую окрестность объекта $x$, то доля объектов класса 1 в этой окрестности будет приблизительно равна $\widehat{p}(x)$.
Далее проверим это свойство на конкретных примерах.
С помощью кода ниже сгенерируйте данные, состоящие из одного вещественного признака и бинарного таргета.
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'
.
...
Напечатайте оценку коэффициентов
...
Ниже объявлена сетка значений признака. По этой сетке постройте
- предсказания классов,
- предсказания вероятностей класса 1.
Визуализируйте эти предсказания. На график стоит нанести также обучающую выборку.
X_grid = np.linspace(-4, 4, 10000).reshape((-1, 1))
...
Разбейте отрезок $[-4, 4]$ на одинаковые бины длины длины 0.2 и посчитайте в каждом бине долю объектов класса 1. Полученные значения добавьте на график предсказаний вероятностей и сравните эти графики. Проинтерпретируйте полученные результаты.
Подсказка: может помочь np.digitize
и метод groupby
для таблиц pandas
. Рекомендуем посмотреть обучающие ноутбуки по библиотекам.
...
Повторите проведенное исследование для следующих данных и сравните результаты.
# Признаки
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.¶
Продолжим исследовать модель логистической регрессии. Сгенерируем данные, состоящие из двух бинарных признаков и бинарного таргета
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
. Рекомендуем посмотреть обучающие ноутбуки по библиотекам.
...
Обучите логистическую регрессию с penalty='none'
и получите предсказания вероятностей для этих четырех типов объектов. Представьте результаты в таком виде, чтобы их удобно было сравнивать с частотами, посчитанными ранее.
...
Почему результаты не совпадают?
Для ответа на этот вопрос распишите формулу, которая задает модель логистической регрессии, указав все параметры. Какое предположение о данных при этом делает логистическая регрессия?
...
Предложите и реализуйте способ построения модели логистической регрессии так, чтобы она точнее предсказывала частоты, посчитанные ранее.
Опишите ваше предложение:
...
Реализация:
...
Выводы:
...
Сложная часть¶
Задачи 5-7: скачайте второй ноутбук с условием задания со страницы курса.