Физтех.Статистика
Скачать ipynb
Phystech@DataScience¶
Домашнее задание 3¶
Правила, прочитайте внимательно:
- Выполненную работу нужно отправить телеграм-боту
@miptstats_pds_bot
. Для начала работы с ботом каждый раз отправляйте/start
. Работы, присланные иным способом, не принимаются. - Дедлайн см. в боте. После дедлайна работы не принимаются кроме случаев наличия уважительной причины.
- Прислать нужно ноутбук в формате
ipynb
. - Выполнять задание необходимо полностью самостоятельно. При обнаружении списывания все участники списывания будут сдавать устный зачет.
- Решения, размещенные на каких-либо интернет-ресурсах, не принимаются. Кроме того, публикация решения в открытом доступе может быть приравнена к предоставлении возможности списать.
- Для выполнения задания используйте этот ноутбук в качестве основы, ничего не удаляя из него. Можно добавлять необходимое количество ячеек.
- Комментарии к решению пишите в markdown-ячейках.
- Выполнение задания (ход решения, выводы и пр.) должно быть осуществлено на русском языке.
- Если код будет не понятен проверяющему, оценка может быть снижена.
- Никакой код из данного задания при проверке запускаться не будет. Если код студента не выполнен, недописан и т.д., то он не оценивается.
- Код из рассказанных на занятиях ноутбуков можно использовать без ограничений.
Правила оформления теоретических задач:
- Решения необходимо прислать одним из следующих способов:
- фотографией в правильной ориентации, где все четко видно, а почерк разборчив,
- отправив ее как файл боту вместе с ноутбуком или
- вставив ее в ноутбук посредством
Edit -> Insert Image
(фото, вставленные ссылкой, не принимаются);
- в виде $\LaTeX$ в markdown-ячейках.
- фотографией в правильной ориентации, где все четко видно, а почерк разборчив,
- Решения не проверяются, если какое-то требование не выполнено. Особенно внимательно все проверьте в случае выбора второго пункта (вставки фото в ноутбук). Неправильно вставленные фотографии могут не передаться при отправке. Для проверки попробуйте переместить
ipynb
в другую папку и открыть его там. - В решениях поясняйте, чем вы пользуетесь, хотя бы кратко. Например, если пользуетесь независимостью, то достаточно подписи вида "X и Y незав."
- Решение, в котором есть только ответ, и отсутствуют вычисления, оценивается в 0 баллов.
Баллы за задание:
Легкая часть (достаточно на "хор"):
- Задача 1 — 70 баллов
Сложная часть (необходимо на "отл"):
- Задача 2 — 30 баллов
- Задача 3 — 30 баллов
# Bot check
# HW_ID: phds_hw3
# Бот проверит этот ID и предупредит, если случайно сдать что-то не то.
# Status: not final
# Перед отправкой в финальном решении удали "not" в строчке выше.
# Так бот проверит, что ты отправляешь финальную версию, а не промежуточную.
# Никакие значения в этой ячейке не влияют на факт сдачи работы.
import numpy as np
import pandas as pd
from sklearn.metrics import mean_squared_error, mean_absolute_error, mean_absolute_percentage_error, r2_score
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import OneHotEncoder
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
sns.set(font_scale=1.3)
Задача 1¶
Датасет penguins¶
В первой части задания мы познакомимся с новым для нас датасетом
penguins = pd.read_csv('penguins.csv')
penguins.head()
⚠️ Warning: Лучше не нажимать на пингвинов
Здесь содержатся данные о морфололгии пингвинов трех различных видов: Adelie
, Chinstrap
, и Gentoo
.
Колонки: bill_length_mm
, bill_depth_mm
, flipper_length_mm
, body_mass_g
описывают морфологию каждого пингвина.
Как мы видим в данном датасете присутствуют категориальные переменные species
, island
и sex
, которые не могут быть оценены моделью линейной регресии. Примините к ним преобразование OneHotEncoder
(Обратите внимание на параметр drop
).
cat_features = [...]
one_hot_encoder = <...>
penguins_encoded = penguins.drop(cat_features, axis=1).join(<...>)
Выберем в качестве таргета вес пингвинов (body_mass_g
), и разделим нашу выборку на тренировочную и тестовую в соотношении 8:2
X, y = penguins_encoded.drop('body_mass_g', axis=1), penguins_encoded['body_mass_g']
<...>
Реализуйте линейную регрессию самостоятельно, используя формулы с лекции.
Вам нужно только заполнить прочерки в методах fit
и predict
.
class MyLinearRegression:
"""
Класс, реализующий линейную регрессию c помощью МНК.
"""
def __init__(self):
pass
def fit(self, X, Y):
"""
Функция обучения модели.
Предполагается модель Y = X * theta + epsilon.
где X --- регрессор (матрица размера n x d),
Y --- отклик (матрица размера n x 1),
epsilon-ы имеют нормальное распределение
Обратите внимание, здесь нет intercept_
"""
self.n, self.d = X.shape[0], X.shape[1]
self.theta = <МНК-оценка>
return <...>
def predict(self, X):
"""
Возвращает предсказание отклика на новых объектах X
и опционально доверительный/предсказательный интервал.
X --- матрица объектов размера n x d
"""
y_pred = <...>
return <...>
Обучите вашу модель на датасете о пингвинах без добавления свободного члена.
Распечатайте коэффициенты и сравните их с коэффициентами модели из sklearn
.
MyModel = <...>
<...>
Теперь обучите собственную модель c добавлением стобца свободных членов.
Помимо рассмотренных на семенаре метрик довольно часто рассматривают коэфициент детерминации $R^2$, который может быть более интуитывным.
Определяется он так $$R^2 = 1 - \frac{SS_{reg}}{SS_{tot}}$$
где, $SS_{res} = \sum\limits_{i=1}^n (y_i - f_i)^2$ отражает точность нашей модели,
a $SS_{tot} = \sum\limits_{i=1}^n (y_i - \overline{y})^2$ отражает дисперсию исходных данных.
Соответсвенно чем результат ближе к единице тем более точная у нас модель и тем лучше она предсказывает. Отрицательный же результат можем получить в случае, если наша модель предсказывает хуже чем предсказание средним.
В sklearn
есть готовая реализация под названием r2_score
Сравните качество моделей со свободным членом и без него на тестовой выборке.
Сделайте выводы
Выводы: <...>
Датасет дифференциальной экспресии дермального фибробласта человека¶
Если пингвины для вас слишком просты¶
В данной задаче мы будем предсказывать возраст пациента от эксперссии (т.е. - от активности) исследуемых генов
df = <...>
df.head()
В качестве таргета будем оценивать возраст пациента. Разбейте выборку на train
и test
.
Обучите модель линейной регресии (используйте готовый модуль sklearn) и выведите метрику качества (MAPE
), а также оцените коэфициент детерминации $R^2$
Как вы думаете, что могло привести к такому результату?
Вывод: <...>
Задача 2¶
Иногда вместо классической линейной регрессии удобнее использовать метод Ridge регрессии в котором помимо ошибки также минимизируется значение параметра.
$$
\sum\limits_{i=1}^n \left(Y_i - x_i^T \theta\right)^2 + \alpha\sum\limits_{j=1}^n \theta_j^2 \to \min\limits_\theta,
$$
где $\alpha \in \mathbb{R}_{+}$ произвольный параметр.
Найдите решение данной задачи в матричном виде. (Выражение для $\hat{\theta}$)
Решение: <...>
Задача 3¶
Во взвешенном методе наименьших квадратов каждому наблюдению задается некоторый известный вес $w_i$. Задача имеет вид: $$\sum\limits_{i=1}^n w_i\left(Y_i - x_i^T \theta\right)^2 \to \min\limits_\theta$$ Найдите решение задачи в матричном виде.
Решение:<...>