{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.7" }, "colab": { "name": "task2_2022", "provenance": [], "collapsed_sections": [] } }, "cells": [ { "cell_type": "markdown", "source": [ "# Phystech@DataScience\n", "## Задание 2\n", "\n", "**Правила:**\n", "\n", "* Выполненную работу нужно отправить телеграм-боту.\n", "* Дедлайн **23 февраля в 15:00 (отбор)**. После дедлайна работы не принимаются кроме случаев наличия уважительной причины с подтверждающими документами.\n", "* Прислать нужно ноутбук в формате `ipynb` \n", "* Решения, размещенные на каких-либо интернет-ресурсах, не принимаются. Публикация решения может быть приравнена к предоставлении возможности списать.\n", "* Для выполнения задания используйте этот ноутбук в качествие основы, ничего не удаляя из него.\n", "\n", "-----" ], "metadata": { "id": "WsVUrFkls3iw" } }, { "cell_type": "code", "metadata": { "id": "y9F9cOSRkh3_" }, "source": [ "import numpy as np\n", "import pandas as pd\n", "from sklearn.datasets import load_diabetes\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.linear_model import LinearRegression\n", "\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "sns.set(font_scale=1.3)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "9tUvzn2cj31C" }, "source": [ "Рассмотрим данные исследования 2004 года о зависимости риска развития диабета от пола, возраста, индекса массы тела, среднего кровяного давления и других показателей. \n", "\n", "Функция `sklearn.datasets.load_diabetes()` возвращает словарь. В поле `data` записана матрица регрессоров, в которой данные предварительно центрированы и нормированы. В поле `target` записана мера прогрессирования заболевания в течении года. В поле `DESCR` можно прочитать подробнее о данных." ] }, { "cell_type": "markdown", "metadata": { "id": "w5gc2rJNj31I" }, "source": [ "### Загрузка данных" ] }, { "cell_type": "code", "metadata": { "id": "b6QhMHdJk0ro" }, "source": [ "data = load_diabetes()" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "FuPQNa2qkyxi" }, "source": [ "Посмотрим на описание датасета." ] }, { "cell_type": "code", "metadata": { "id": "tqFH1K8Jj31J", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "699a32c1-613a-4e1c-f0b6-0fdb9b79caf6" }, "source": [ "print(data['DESCR'])" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ ".. _diabetes_dataset:\n", "\n", "Diabetes dataset\n", "----------------\n", "\n", "Ten baseline variables, age, sex, body mass index, average blood\n", "pressure, and six blood serum measurements were obtained for each of n =\n", "442 diabetes patients, as well as the response of interest, a\n", "quantitative measure of disease progression one year after baseline.\n", "\n", "**Data Set Characteristics:**\n", "\n", " :Number of Instances: 442\n", "\n", " :Number of Attributes: First 10 columns are numeric predictive values\n", "\n", " :Target: Column 11 is a quantitative measure of disease progression one year after baseline\n", "\n", " :Attribute Information:\n", " - Age\n", " - Sex\n", " - Body mass index\n", " - Average blood pressure\n", " - S1\n", " - S2\n", " - S3\n", " - S4\n", " - S5\n", " - S6\n", "\n", "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).\n", "\n", "Source URL:\n", "https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html\n", "\n", "For more information see:\n", "Bradley Efron, Trevor Hastie, Iain Johnstone and Robert Tibshirani (2004) \"Least Angle Regression,\" Annals of Statistics (with discussion), 407-499.\n", "(https://web.stanford.edu/~hastie/Papers/LARS/LeastAngle_2002.pdf)\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "vkYw4mddj31K" }, "source": [ "Поле `data` содержит матрицу размера 442 $\\times$ 10, где 442 — количество пациентов, а 10 — количество признаков (возраст, пол, и т.д.). \n", "Строки матрицы соответствуют пациентам, столбцы — признакам." ] }, { "cell_type": "code", "metadata": { "scrolled": true, "id": "_y9bUW6Pj31K", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "2dd98a64-5bfa-498e-8b22-29d35234cb85" }, "source": [ "data['data'].shape" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(442, 10)" ] }, "metadata": { "tags": [] }, "execution_count": 11 } ] }, { "cell_type": "markdown", "metadata": { "id": "gs9ZtWmhj31K" }, "source": [ "Целевая переменная $-$ мера прогрессирования заболевания в течении года.\n" ] }, { "cell_type": "code", "metadata": { "id": "UkcxB5GAj31L", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "594f34f4-c4aa-4756-866b-95a25144b022" }, "source": [ "data['target'].shape" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(442,)" ] }, "metadata": { "tags": [] }, "execution_count": 12 } ] }, { "cell_type": "markdown", "metadata": { "id": "XaklAuUDj31L" }, "source": [ "Создайте матрицу регрессоров $X$ и столбец наблюдений $y$." ] }, { "cell_type": "code", "metadata": { "id": "klYxszn-j31L" }, "source": [ "X, y = <...>" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "CZRXHc0-j31L" }, "source": [ "### Обучение моделей\n", "\n", "Разбейте данные случайно на две части — обучающую и тестовую в соотношении 80:20.\n", "\n", "Если что-то забыли или что-то не понятно, можно почитать справку:" ] }, { "cell_type": "code", "metadata": { "id": "W480aZfXj31M" }, "source": [ "train_test_split?" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "BUf0Wl9uj31M" }, "source": [ "X_train, X_test, y_train, y_test = <...>\n", "\n", "print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "L8f5Sw7Aj31M" }, "source": [ "Заведите модель линейной регрессии из `sklearn` и обучите ее по обучающей части данных." ] }, { "cell_type": "code", "metadata": { "id": "vn0JJh6Tj31M" }, "source": [ "model = <...>\n", "<...>" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "unlbAxTYj31N" }, "source": [ "Выведите кооэффициенты модели, включая свободный член." ] }, { "cell_type": "code", "metadata": { "id": "_JP9ZiDpj31N" }, "source": [ "<...>" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "ZMj2MTgdj31N" }, "source": [ "Посчитайте предсказания построенной модели на тестовой выборке" ] }, { "cell_type": "code", "metadata": { "id": "4WB74enfj31O" }, "source": [ "y_pred = <...>" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "wDTfApjPWPrr" }, "source": [ "Реализуйте метрики MSE, MAE, MAPE без использования `sklearn` и других готовых реализаций." ] }, { "cell_type": "code", "metadata": { "id": "yAY5KO-jWU6S" }, "source": [ "def mean_squared_error(y_true, y_pred):\n", " <...>\n", "\n", "def mean_absolute_error(y_true, y_pred):\n", " <...>\n", "\n", "def mean_absolute_percentage_error(y_true, y_pred):\n", " <...>" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "VJfAkTn4j31O" }, "source": [ "Посчитайте MSE, MAE, MAPE на тестовой выборке и выведите с точностью до трех знаков после запятой." ] }, { "cell_type": "code", "metadata": { "id": "JkatiS-2j31O" }, "source": [ "<...>" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "-EeYuy9q6iFu" }, "source": [ "###Своя реализация модели" ] }, { "cell_type": "markdown", "metadata": { "id": "MadkefHAolFy" }, "source": [ "Теперь реализуем линейную регрессию самостоятельно, используя формулы с лекции.\n", "Вам нужно только заполнить прочерки в методах `fit` и `predict`." ] }, { "cell_type": "code", "metadata": { "id": "pYxZ7sIKokot" }, "source": [ "class MyLinearRegression:\n", " \"\"\"\n", " Класс, реализующий линейную регрессию c помощью МНК.\n", " \"\"\"\n", " \n", " def __init__(self):\n", " pass\n", " \n", " def fit(self, X, Y):\n", " \"\"\"\n", " Функция обучения модели. \n", " \n", " Предполагается модель Y = X * theta + epsilon. \n", " где X --- регрессор (матрица размера n x d), \n", " Y --- отклик (матрица размера n x 1),\n", " epsilon-ы имеют нормальное распределение\n", "\n", " Обратите внимание, здесь нет intercept_\n", " \"\"\"\n", " \n", " self.n, self.d = <...>\n", " \n", " self.theta = <МНК-оценка>\n", " \n", " return self\n", " \n", " \n", " def predict(self, X):\n", " \"\"\"\n", " Возвращает предсказание отклика на новых объектах X \n", " и опционально доверительный/предсказательный интервал.\n", " \n", " X --- матрица объектов размера n x d\n", " \n", " \"\"\"\n", " \n", " y_pred = <...>\n", " return <...>" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "wpnJWn-gpzM7" }, "source": [ "Обучите вашу модель на данных о диабете с добавлением свободного члена.\n", "Распечатайте коэффициенты и сравните их с коэффициентами модели из `sklearn`." ] }, { "cell_type": "code", "metadata": { "id": "atvrQ4N1pSdB" }, "source": [ "my = <...>\n", "\n", "<...>" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "BfNuu7Wcq0AP" }, "source": [ "Теперь обучите модель без свободного члена." ] }, { "cell_type": "code", "metadata": { "id": "cERxmrdyYIoa" }, "source": [ "<...>" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "qN-iGWbzrLC3" }, "source": [ "Сравните качество моделей со свободным членом и без него на тестовой выборке." ] }, { "cell_type": "code", "metadata": { "id": "fW8UvbANqm3X" }, "source": [ "<...>" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "TpllTM-HYN2F" }, "source": [ "Сделайте выводы." ] }, { "cell_type": "code", "metadata": { "id": "VN5vFgAxYOyI" }, "source": [ "" ], "execution_count": null, "outputs": [] } ] }