Физтех.Статистика
Информация не актуальна. Сайт переехал на miptstats.github.io
Скачать ipynb
Phystech@DataScience¶
Задание 2¶
Правила:
- Выполненную работу нужно отправить телеграм-боту.
- Дедлайн 23 февраля в 15:00 (отбор). После дедлайна работы не принимаются кроме случаев наличия уважительной причины с подтверждающими документами.
- Прислать нужно ноутбук в формате
ipynb
- Решения, размещенные на каких-либо интернет-ресурсах, не принимаются. Публикация решения может быть приравнена к предоставлении возможности списать.
- Для выполнения задания используйте этот ноутбук в качествие основы, ничего не удаляя из него.
import numpy as np
import pandas as pd
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(font_scale=1.3)
Рассмотрим данные исследования 2004 года о зависимости риска развития диабета от пола, возраста, индекса массы тела, среднего кровяного давления и других показателей.
Функция sklearn.datasets.load_diabetes()
возвращает словарь. В поле data
записана матрица регрессоров, в которой данные предварительно центрированы и нормированы. В поле target
записана мера прогрессирования заболевания в течении года. В поле DESCR
можно прочитать подробнее о данных.
Загрузка данных¶
data = load_diabetes()
Посмотрим на описание датасета.
print(data['DESCR'])
Поле data
содержит матрицу размера 442 $\times$ 10, где 442 — количество пациентов, а 10 — количество признаков (возраст, пол, и т.д.).
Строки матрицы соответствуют пациентам, столбцы — признакам.
data['data'].shape
Целевая переменная $-$ мера прогрессирования заболевания в течении года.
data['target'].shape
Создайте матрицу регрессоров $X$ и столбец наблюдений $y$.
X, y = <...>
Обучение моделей¶
Разбейте данные случайно на две части — обучающую и тестовую в соотношении 80:20.
Если что-то забыли или что-то не понятно, можно почитать справку:
train_test_split?
X_train, X_test, y_train, y_test = <...>
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)
Заведите модель линейной регрессии из sklearn
и обучите ее по обучающей части данных.
model = <...>
<...>
Выведите кооэффициенты модели, включая свободный член.
<...>
Посчитайте предсказания построенной модели на тестовой выборке
y_pred = <...>
Реализуйте метрики MSE, MAE, MAPE без использования sklearn
и других готовых реализаций.
def mean_squared_error(y_true, y_pred):
<...>
def mean_absolute_error(y_true, y_pred):
<...>
def mean_absolute_percentage_error(y_true, y_pred):
<...>
Посчитайте MSE, MAE, MAPE на тестовой выборке и выведите с точностью до трех знаков после запятой.
<...>
Своя реализация модели¶
Теперь реализуем линейную регрессию самостоятельно, используя формулы с лекции.
Вам нужно только заполнить прочерки в методах 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 = <...>
self.theta = <МНК-оценка>
return self
def predict(self, X):
"""
Возвращает предсказание отклика на новых объектах X
и опционально доверительный/предсказательный интервал.
X --- матрица объектов размера n x d
"""
y_pred = <...>
return <...>
Обучите вашу модель на данных о диабете с добавлением свободного члена.
Распечатайте коэффициенты и сравните их с коэффициентами модели из sklearn
.
my = <...>
<...>
Теперь обучите модель без свободного члена.
<...>
Сравните качество моделей со свободным членом и без него на тестовой выборке.
<...>
Сделайте выводы.