{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "vRqD6ZuMEpkX" }, "source": [ "# [Phystech@DataScience](https://thetahat.ru/courses/ph-ds-2025-spr)\n", "## Домашнее задание 5\n", "\n", "**Правила, прочитайте внимательно:**\n", "\n", "* Выполненную работу нужно отправить телеграм-боту `@miptstats_st_bot`. Для начала работы с ботом каждый раз отправляйте `/start`. Дождитесь подтверждения от бота, что он принял файл. Если подтверждения нет, то что-то не так. **Работы, присланные иным способом, не принимаются.**\n", "* Дедлайн см. в боте. После дедлайна работы не принимаются кроме случаев наличия уважительной причины.\n", "* Прислать нужно **ноутбук в формате `ipynb`**. Если вы строите интерактивные графики, их стоит прислать в формате html.\n", "* Следите за размером файлов. **Бот не может принимать файлы весом более 20 Мб.** Если файл получается больше, заранее разделите его на несколько.\n", "* Выполнять задание необходимо полностью самостоятельно. **При обнаружении списывания всем участникам списывания дается штраф -2 балла к итоговой оценке за семестр.**\n", "* Решения, размещенные на каких-либо интернет-ресурсах, не принимаются. Кроме того, публикация решения в открытом доступе может быть приравнена к предоставлении возможности списать.\n", "* Обратите внимание на правила использования ИИ-инструментов при решении домашнего задания.\n", "* **Код из рассказанных на занятиях ноутбуков** можно использовать без ограничений.\n", "* Для выполнения задания используйте этот ноутбук в качестве основы, ничего не удаляя из него. Можно добавлять необходимое количество ячеек.\n", "* Комментарии к решению пишите в markdown-ячейках.\n", "* Выполнение задания (ход решения, выводы и пр.) должно быть осуществлено на русском языке.\n", "* Решение проверяется системой ИИ-проверки **ThetaGrader**. Результат проверки валидируется и исправляется человеком, после чего комментарии отправляются студентам.\n", "* Если код будет не понятен проверяющему, оценка может быть снижена.\n", "* Никакой код из данного задания при проверке запускаться не будет. *Если код студента не выполнен, недописан и т.д., то он не оценивается.*\n", "\n", "Важно!!! Правила заполнения ноутбука:\n", "* Запрещается удалять имеющиеся в ноутбуке ячейки, менять местами положения задач.\n", "* Сохраняйте естественный линейный порядок повествования в ноутбуке сверху-вниз.\n", "* Отвечайте на вопросы, а также добавляйте новые ячейки в предложенных местах, которые обозначены `<...>`.\n", "* В markdown-ячейка, содержащих описание задачи, находятся специальные отметки, которые запрещается модифицировать.\n", "* При нарушении данных правил работа может получить 0 баллов.\n", "\n", "**Баллы за задание:**\n", "\n", "Легкая часть (достаточно на \"хор\"):\n", "* Задача 1 — 80 баллов\n", "\n", "Cложная часть (необходимо на \"отл\"):\n", "* Задача 2 — 20 баллов\n", "-----" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Bot check\n", "\n", "# HW_ID: phds_hw5\n", "# Бот проверит этот ID и предупредит, если случайно сдать что-то не то.\n", "\n", "# Status: not final\n", "# Перед отправкой в финальном решении удали \"not\" в строчке выше.\n", "# Так бот проверит, что ты отправляешь финальную версию, а не промежуточную.\n", "# Никакие значения в этой ячейке не влияют на факт сдачи работы." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "from sklearn.linear_model import LogisticRegression, LinearRegression, Ridge, Lasso, ElasticNet\n", "from sklearn import tree\n", "from sklearn.neighbors import KNeighborsClassifier\n", "\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import accuracy_score, classification_report, f1_score, mean_absolute_percentage_error, roc_auc_score\n", "\n", "import torch\n", "import torch.nn as nn\n", "import torch.optim as optim\n", "from torch.utils.data import DataLoader, TensorDataset\n", "plt.style.use('classic')\n", "\n", "import warnings\n", "warnings.filterwarnings(\"ignore\")" ] }, { "cell_type": "markdown", "metadata": { "id": "779-UxHp3h8R" }, "source": [ "---\n", "### Задача 1\n", "\n", "#### Профиль физика\n", "Набор данных суперсимметрии поддерживает двоичную классификацию событий столкновений в физике элементарных частиц на основе собранных особенностей столкновений. Вам будет необходимо научиться предсказывать вид события в зависимости от физических параметров частиц после столкновения.\n", "\n", "Данные состоят из следующих функций:\n", "\n", "- `target class` : метки классов, где 0 - фоновое событие, 1 - суперсимметричное событие.\n", "- `L1pT` : импульс, поперечный лучу лептона 1\n", "- `L1eta` : псевдобыстрота лептона 1\n", "- `L1phi` : азимутальный угол лептона 1\n", "- `L2pT` : импульс, поперечный лучу лептона 2\n", "- `L2eta` : псевдобыстрота лептона 2\n", "- `L2phi` : азимутальный угол лептона 2\n", "- `missing energy magnitude` : количество недостающего поперечного импульса\n", "- `missing energy phi` : азимутальный угол недостающего поперечного импульса\n", "Остальные 10 признаков получены из первых 8 непосредственно измеренных признаков. Эти последние 10 функций — это функции, которые физики элементарных частиц разработали для улучшения своей задачи по обнаружению событий. Подробнее про оригинальное исследование можете посмотреть в прикрепленной статье.\n", "\n", "Суперсимметрия — это теоретическая основа физики элементарных частиц, которая предлагает принцип симметрии, связывающий фермионы (частицы с полуцелым спином) и бозоны (частицы с целым спином). Эта инновационная теория вводит концепцию суперсимметричного партнера для каждой известной элементарной частицы, которая отличается по спину на 1/2, но имеет другие фундаментальные свойства, такие как заряд и масса.\n", "\n", "#### Профиль биология\n", "Набор данных включает 171 молекулу, предназначенную для функциональных доменов белка CRY1, ответственного за формирование циркадного ритма. 56 молекул токсичны, а остальные нетоксичны.\n", "\n", "Полученные данные представляют собой полный набор из 1203 молекулярных дескрипторов." ] }, { "cell_type": "markdown", "metadata": { "id": "Zy-x7atXGekR" }, "source": [ "---\n", "\n", "Данное домашнее задание имеет свободную форму, то есть вашей задачей будет для каждого класса моделей получить лучший результат и после выбрать наилучшую модель. Метрика для задачи - `from sklearn.metrics import f1_score`. Работа будет оцениваться по следующим ключевым пунктам:\n", "\n", "\n", "1. Предвартельный анализ данных\n", "2. Предобработка данных\n", " - Обработка пропусков\n", " - Обработка выбросов\n", "\n", "3. Реализация моделей\n", " - Дерево\n", " - Логистическая регрессия\n", " - KNN\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "xHPwwPcdJ_5g" }, "source": [ "#### 1. Предварительный анализ данных" ] }, { "cell_type": "markdown", "metadata": { "id": "iioJPx-HKleJ" }, "source": [ "В этом разделе ожидается, что вы посмотрите на распределение признаков и классов, изучите их связь, проанализируете признаки на наличие в них пропусков или выбросов." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "rIbR09AdEXML" }, "outputs": [], "source": [ "df = pd.read_csv(<...>)\n" ] }, { "cell_type": "markdown", "metadata": { "id": "UDHS6jCRUk_4" }, "source": [ "**Выводы:**" ] }, { "cell_type": "markdown", "metadata": { "id": "vvcRb5NKMF_a" }, "source": [ "#### 2. Предобработка данных" ] }, { "cell_type": "markdown", "metadata": { "id": "D6o21LUtMPDI" }, "source": [ "В этом разделе ожидается, что вы обработаете пропуски (если они есть) с помощью линейной регрессии, а выбросы (если они есть) обработайте способом на ваше усмотрение. Для оценки качества обработки пропусков используйте метрику MAPE." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "1SHm3npKM-1w" }, "outputs": [], "source": [ "<...>" ] }, { "cell_type": "markdown", "metadata": { "id": "PIvTjeLIPLRS" }, "source": [ "#### 3. Обучение моделей" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "t7iCTDXDPOAV" }, "outputs": [], "source": [ "#для теста используйте 30% выборки, размер валидационной выборки выберите на ваше усмотрение\n", "<...>" ] }, { "cell_type": "markdown", "metadata": { "id": "Lm_2Vo95QqHt" }, "source": [ "##### DecisionTreeClassifier" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "x7FpQ17cRV6A" }, "outputs": [], "source": [ "<...>" ] }, { "cell_type": "markdown", "metadata": { "id": "BlXOd25cRwhB" }, "source": [ "**Выводы:**" ] }, { "cell_type": "markdown", "metadata": { "id": "Ucz276CrSV1L" }, "source": [ "##### LogisticRegression" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "fzmlg6liSb2z" }, "outputs": [], "source": [ "<...>" ] }, { "cell_type": "markdown", "metadata": { "id": "Dccrkag9UWWU" }, "source": [ "**Выводы:**" ] }, { "cell_type": "markdown", "metadata": { "id": "Mm--URZhTGQQ" }, "source": [ "##### KNeighborsClassifier" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "J0tm9o6RTHf-" }, "outputs": [], "source": [ "<...>" ] }, { "cell_type": "markdown", "metadata": { "id": "k3OQEDnIUhie" }, "source": [ "**Выводы:**" ] }, { "cell_type": "markdown", "metadata": { "id": "S94Q6wk8avIP" }, "source": [ "#### 4. Анализ полученных результатов и выводы по задаче" ] }, { "cell_type": "markdown", "metadata": { "id": "BiCgAxm8a0Ax" }, "source": [ "**Выводы:**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Задача 2\n", "\n", "В этой задаче вам нужно будет реализовать оптимальный подсчет метрики **ROC-AUC**. Вспомним, что **ROC** — кривая в координатах **True Positive Rate (TPR)** и **False Positive Rate (FPR)**, а **ROC-AUC** — площадь под этой кривой.\n", "\n", "**TPR (True Positive Rate, полнота)** показывает какую долю объектов положительного класса модель классифицировала правильно:\n", "\n", "$$TPR = \\dfrac{TP}{TP + FN}$$\n", "\n", "\n", "**FPR (False Positive Rate)** показывает, какую долю из объектов негативного класса модель предсказала неверно:\n", "\n", "$$FPR = \\dfrac{FP}{FP + TN}$$\n", "\n", "1. Предложите алгоритм расчета метрики за $\\mathcal{O} \\left(n \\log n\\right)$, где $n$ — размер выборки. \n", " *Подсказка.* Подумайте сколько всего различных пар $\\left(FPR, TPR\\right)$ существует.\n", "\n", " <...>\n", "\n", "2. Реализуйте предложенный алгоритм." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def roc_auc(y_true, y_score):\n", " '''\n", " Вычисляет ROC-AUC за O(n log(n))\n", " :param y_true: истинные бинарные метки\n", " :param y_score: предсказанная вероятность положительного класса\n", " '''\n", " <...>\n", " \n", " return auc\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для самопроверки:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "assert roc_auc([1, 0, 1, 1, 1], [0, 0.3, 0.2, 0, 0.5]) == 0.25" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "lab", "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.11.5" } }, "nbformat": 4, "nbformat_minor": 0 }