{
"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
}