Скачать ipynb
task2_2022

Phystech@DataScience

Задание 2

Правила:

  • Выполненную работу нужно отправить телеграм-боту.
  • Дедлайн 23 февраля в 15:00 (отбор). После дедлайна работы не принимаются кроме случаев наличия уважительной причины с подтверждающими документами.
  • Прислать нужно ноутбук в формате ipynb
  • Решения, размещенные на каких-либо интернет-ресурсах, не принимаются. Публикация решения может быть приравнена к предоставлении возможности списать.
  • Для выполнения задания используйте этот ноутбук в качествие основы, ничего не удаляя из него.

In [ ]:
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 можно прочитать подробнее о данных.

Загрузка данных

In [ ]:
data = load_diabetes()

Посмотрим на описание датасета.

In [ ]:
print(data['DESCR'])
.. _diabetes_dataset:

Diabetes dataset
----------------

Ten baseline variables, age, sex, body mass index, average blood
pressure, and six blood serum measurements were obtained for each of n =
442 diabetes patients, as well as the response of interest, a
quantitative measure of disease progression one year after baseline.

**Data Set Characteristics:**

  :Number of Instances: 442

  :Number of Attributes: First 10 columns are numeric predictive values

  :Target: Column 11 is a quantitative measure of disease progression one year after baseline

  :Attribute Information:
      - Age
      - Sex
      - Body mass index
      - Average blood pressure
      - S1
      - S2
      - S3
      - S4
      - S5
      - S6

Note: Each of these 10 feature variables have been mean centered and scaled by the standard deviation times `n_samples` (i.e. the sum of squares of each column totals 1).

Source URL:
https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html

For more information see:
Bradley Efron, Trevor Hastie, Iain Johnstone and Robert Tibshirani (2004) "Least Angle Regression," Annals of Statistics (with discussion), 407-499.
(https://web.stanford.edu/~hastie/Papers/LARS/LeastAngle_2002.pdf)

Поле data содержит матрицу размера 442 $\times$ 10, где 442 — количество пациентов, а 10 — количество признаков (возраст, пол, и т.д.). Строки матрицы соответствуют пациентам, столбцы — признакам.

In [ ]:
data['data'].shape
Out[ ]:
(442, 10)

Целевая переменная $-$ мера прогрессирования заболевания в течении года.

In [ ]:
data['target'].shape
Out[ ]:
(442,)

Создайте матрицу регрессоров $X$ и столбец наблюдений $y$.

In [ ]:
X, y = <...>

Обучение моделей

Разбейте данные случайно на две части — обучающую и тестовую в соотношении 80:20.

Если что-то забыли или что-то не понятно, можно почитать справку:

In [ ]:
train_test_split?
In [ ]:
X_train, X_test, y_train, y_test = <...>

print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)

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

In [ ]:
model = <...>
<...>

Выведите кооэффициенты модели, включая свободный член.

In [ ]:
<...>

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

In [ ]:
y_pred = <...>

Реализуйте метрики MSE, MAE, MAPE без использования sklearn и других готовых реализаций.

In [ ]:
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 на тестовой выборке и выведите с точностью до трех знаков после запятой.

In [ ]:
<...>

Своя реализация модели

Теперь реализуем линейную регрессию самостоятельно, используя формулы с лекции. Вам нужно только заполнить прочерки в методах fit и predict.

In [ ]:
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.

In [ ]:
my = <...>

<...>

Теперь обучите модель без свободного члена.

In [ ]:
<...>

Сравните качество моделей со свободным членом и без него на тестовой выборке.

In [ ]:
<...>

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

In [ ]: