{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "2PQW7OXEoWEZ"
},
"source": [
"# Введение в анализ данных\n",
"## Домашнее задание 3, легкая часть. Линейная и логистическая регрессии.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "aRt8VO2EoWEa"
},
"source": [
"**Правила, прочитайте внимательно:**\n",
"\n",
"* Выполненную работу нужно отправить телеграм-боту `@thetahat_ds25_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",
"* Решения необходимо оформить в виде $\\LaTeX$ в markdown-ячейках. Иные способы (в т.ч. фотографии) не принимаются.\n",
"* Если вы не знаете $\\LaTeX$, используйте ИИ-инструменты для оформления черновика решения. Примеры были показаны на лекции 2 по ИИ-инструментам.\n",
"* **В решениях поясняйте, чем вы пользуетесь**, хотя бы кратко. \n",
"* Решение, в котором есть только ответ, и отсутствуют вычисления, оценивается в 0 баллов.\n",
"\n",
"\n",
"Важно!!! Правила заполнения ноутбука:\n",
"* Запрещается удалять имеющиеся в ноутбуке ячейки, менять местами положения задач.\n",
"* Сохраняйте естественный линейный порядок повествования в ноутбуке сверху-вниз.\n",
"* Отвечайте на вопросы, а также добавляйте новые ячейки в предложенных местах, которые обозначены `<...>`.\n",
"* В markdown-ячейка, содержащих описание задачи, находятся специальные отметки, которые запрещается модифицировать.\n",
"* При нарушении данных правил работа может получить 0 баллов.\n",
"\n",
"\n",
"**Баллы за задание:**\n",
"\n",
"Легкая часть (достаточно на \"хор\"):\n",
"\n",
"* Задача 1 — 20 баллов\n",
"* Задача 2 — 80 баллов\n",
"* Задача 3 — 30 баллов;\n",
"* Задача 4 — 20 баллов;\n",
"\n",
"Сложная часть (необходимо на \"отл\"):\n",
"\n",
"* Задачи 5-7: скачайте второй ноутбук с условием задания со страницы курса.\n",
"\n",
"Баллы учитываются в обязательной части курса и не влияют на оценку по факультативной части."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "TLUn-L0HoWEb"
},
"outputs": [],
"source": [
"# Bot check\n",
"\n",
"# HW_ID: fpmi_ad3_part1\n",
"# Бот проверит этот ID и предупредит, если случайно сдать что-то не то.\n",
"\n",
"# Status: not final\n",
"# Перед отправкой в финальном решении удали \"not\" в строчке выше.\n",
"# Так бот проверит, что ты отправляешь финальную версию, а не промежуточную.\n",
"# Никакие значения в этой ячейке не влияют на факт сдачи работы."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "LjG63iFWoWEb"
},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"sns.set(style=\"whitegrid\", palette=\"Set2\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4TDjFMbboWEc"
},
"source": [
"При решении задания используйте `sklearn`. Пропишите сюда необходимые импорты"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "j19vAJp2oWEc"
},
"outputs": [],
"source": [
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "N5pKs47noWEc"
},
"source": [
"---\n",
"### Легкая часть"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"### Задача 1."
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "146d04157c07b08ee58d3eafdcf82c32",
"snippet_label": "start"
},
"id": "5s4mqy-HoWEc"
},
"source": [
"\n",
"\n",
"Рассмотрим модель одномерной линейной регрессии *без свободного параметра* $y(x) = \\theta x$, где $x\\in \\mathbb{R}$ и $\\theta \\in \\mathbb{R}$. Предполагаем, что данные получены по правилу\n",
"$$Y_i = \\theta x_i + \\varepsilon_i,$$\n",
"где $i \\in \\{1, ..., n\\}$, числа $x_i \\in \\mathbb{R}$ неслучайны, а $\\varepsilon_i$ — случайные ошибки.\n",
"\n",
"**1.** Посчитайте оценку $\\widehat{\\theta}$ методом наименьших квадратов по явной формуле.\n",
"\n",
"**2.** Выпишите формулы итераций градиентного спуска (GD) и стохастического градиентного спуска (SGD) для поиска $\\widehat{\\theta}$. Не забудьте указать, как в SGD математически определяется батч (набор объектов на каждой итерации).\n",
"\n",
"**3.** Опишите, что произойдет, если для некоторого $i$ ошибка $\\varepsilon_i$ будет очень большой.\n",
"\n",
"\n",
"*Замечания.*\n",
"1. Это теоретическая задача, не перепутайте 😄\n",
"2. В ответе во всех пунктах могут оставаться суммы $n$ слагаемых, но не должно быть операций с векторами или матрицами.\n",
"3. **Прочитайте требования к формату решения в правилах сдачи задания.**"
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "146d04157c07b08ee58d3eafdcf82c32",
"snippet_label": "end"
}
},
"source": [
"**Решение:**\n",
"\n",
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "zaNoiiavoWEd"
},
"source": [
"\n",
"\n",
"---\n",
"### Задача 2.\n",
"\n",
"*Перед выполнением задачи ознакомтесь с ноутбуком по линейной регрессии с занятия.*\n",
"\n",
"Скоро весна и лето — идеальное время года для путешествий и прогулок на велосипедах. В крупных городах обычно развиты сети проката велосипедов или самокатов, предоставляющие удобный сервис. Одной из важных задач таких компаний является прогнозирование количества арендованных велосипедов в зависимости от времени года и погодных условий.\n",
"\n",
"Рассмотрим датасет Bike Sharing Dataset от компании Capital Bikeshare, располагающей автоматизированными пунктами проката велосипедов. В датасете по дням записаны календарная информация и погодные условия, а также число прокатов в этот день. Цель — предсказать количество арендованных велосипедов по остальным характеристикам.\n",
"\n",
"
\n",
"\n",
"Будем работать только со следующими признаками:\n",
"* `season`: время года: 1 — зима, 2 — весна, 3 — лето, 4 — осень;\n",
"* `mnth`: месяц от 1 до 12;\n",
"* `holiday`: является ли текущий день праздничным;\n",
"* `weekday`: день недели от 0 до 6;\n",
"* `workingday`: является ли текущий день рабочим или выходным;\n",
"* `weathersit`: оценка благоприятности погоды от 1 (чистый, ясный день) до 4 (ливень, туман);\n",
"* `temp`: температура в Цельсиях;\n",
"* `atemp`: температура по ощущениям в Цельсиях;\n",
"* `hum`: влажность воздуха;\n",
"* `windspeed`: скорость ветра;\n",
"* `cnt`: количество арендованных велосипедов в текущий день.\n",
"\n",
"---\n",
"\n",
"Скачайте данные, загрузите их с помощью `pandas` и разделите на обучающую и тестовую части в соотношении 4:1. Далее всю аналитику необходимо проводить только на обучающей части данных."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "MVqDzpcRoWEd"
},
"outputs": [],
"source": [
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "7e2346d718d374e3f957928b573e2a30",
"snippet_label": "start"
},
"id": "Rlbq9wRloWEd"
},
"source": [
"\n",
"\n",
"#### 1. Визуальный анализ\n",
"\n",
"Посмотрите по графикам, как *целевой признак зависит от остальных* и поймите характер этой зависимости. Старайтесь строить информативные графики, а из финального решения убирать те, которые не пригодились.\n",
"\n",
"Какие признаки категориальные, а какие — вещественные? Учтите это при построении информативных графиков.\n",
"\n",
"*Указание*. Среди признаков есть такие, значения которых как-то упорядочены, и их относительно небольшое количество. Чтобы понять, являются ли они категориальными, попробуйте понять, как с их значениями будут работать линейные модели. Иначе говоря, допустимо ли с точки зрения природы данных выполнять арифметические операции между *любыми* значениями этого признака, согласуется ли это со смыслом, который несет в себе данный признак?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ai_eval_tool": {
"snippet_hash": "7e2346d718d374e3f957928b573e2a30",
"snippet_label": "end"
},
"id": "6ElRHZvBoWEd"
},
"outputs": [],
"source": [
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "4c1edb365b02e434e38deeb52b2096fa",
"snippet_label": "start"
},
"id": "W0utO6FLoWEe"
},
"source": [
"\n",
"\n",
"Сделайте выводы по графикам. В частности, ответьте на следующие вопросы.\n",
"* Есть ли в данных явные выбросы, то есть точки, далеко находящиеся от основной массы точек?\n",
"* Стоит ли рассматривать какие-либо нелинейные функции от признаков? Не стоит придумывать сложные функции, достаточно рассмотреть $x^2$, $\\log x$ и $I\\{x > c\\}$.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "4c1edb365b02e434e38deeb52b2096fa",
"snippet_label": "end"
},
"id": "rmf5JAaZoWEe"
},
"source": [
"**Выводы по графикам:** ..."
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "e5fcb54a72af33e2c09b66124e63e5fc",
"snippet_label": "start"
},
"id": "3yFmlFFroWEe"
},
"source": [
"\n",
"\n",
"#### 2. Подготовка данных\n",
"\n",
"Опишите по шагам процедуру предобработки данных, которая будет включать работу с выбросами, преобразования вещественных и категориальных признаков, возможно, создание каких-либо новых признаков (посмотрите пример с занятия). То, как именно выполнять подготовку данных, является целым исскуством. Здесь нет \"правильного\" подхода, здесь есть метрика качества на тестовом множестве, которая в последствии оценит качество вашей модели.\n",
"\n",
"*Обратите внимание, от того, насколько качественно вы проведете визуальный анализ и подготовку данных, будет зависеть качество ваших моделей на следующих шагах.*\n",
"\n",
"**Процедура предобработки данных:**"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tMYAiMjWoWEe"
},
"source": [
"**a).** ..."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "sdpU3rZHoWEf"
},
"source": [
"Реализуйте данную процедуру."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ai_eval_tool": {
"snippet_hash": "e5fcb54a72af33e2c09b66124e63e5fc",
"snippet_label": "end"
},
"id": "zwkRgNImoWEf"
},
"outputs": [],
"source": [
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "c5124704b109dacbd9cf5647f50eb72c",
"snippet_label": "start"
},
"id": "lTS2CoiIoWEf"
},
"source": [
"\n",
"\n",
"#### 3. Обучение модели и ее анализ\n",
"\n",
"Обучите линейную регрессию из `sklearn` на полученных данных и посмотрите на полученные оценки коэффициентов (в т.ч. свободный коэффициент)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ai_eval_tool": {
"snippet_hash": "c5124704b109dacbd9cf5647f50eb72c",
"snippet_label": "end"
},
"id": "MrPj9XfeoWEf"
},
"outputs": [],
"source": [
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "0e8e860f57fc7df75f236442f7206c78",
"snippet_label": "start"
},
"id": "Ovm4yjiGoWEf"
},
"source": [
"\n",
"\n",
"Посчитайте ошибку предсказания на тестовой выборке по метрикам RMSE, MAE, MAPE. Подробнее можно почитать в ноутбуке с занятия.\n",
"\n",
"*Замечание.* Если в тестовой части тоже есть \"большие\" выбросы, их стоит убрать. Наша модель не должна пытаться их предсказать (например, сбои в работе сервиса) но в то же время выбросы вносят существенный вклад в значение метрики. Особенно стоит обратить на это внимание в случае высоких значений метрик."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ai_eval_tool": {
"snippet_hash": "0e8e860f57fc7df75f236442f7206c78",
"snippet_label": "end"
},
"id": "_qsXMDU7oWEf"
},
"outputs": [],
"source": [
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "82920a034ed2865f8a7e2f03eaabceb6",
"snippet_label": "start"
},
"id": "_Bz_2sX5oWEf"
},
"source": [
"\n",
"\n",
"Попробуйте посчитать оценку коэффициентов с помощью формулы, полученной на занятии. Не забудьте про константный признак. В чем заключается проблема?\n",
"\n",
"*Подсказка.* Подумайте о зависимостях между признаками. Причем, возможно, вы уже могли решить эту проблему на предыдущих этапах. В таком случае посмотрите, что будет, если \"вернуть\" проблему."
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "82920a034ed2865f8a7e2f03eaabceb6",
"snippet_label": "end"
},
"id": "fooG35mpoWEf"
},
"source": [
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "56aff27d604dbe90dda7b28a8da4e2e9",
"snippet_label": "start"
},
"id": "8zXL8x-JoWEg"
},
"source": [
"\n",
"\n",
"Исправьте эту проблему, посчитайте оценки коэффициентов, а также ошибку предсказания."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ai_eval_tool": {
"snippet_hash": "56aff27d604dbe90dda7b28a8da4e2e9",
"snippet_label": "end"
},
"id": "muQCyj8XoWEg"
},
"outputs": [],
"source": [
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "52266029600cdfda3b1cfce9e68f5c99",
"snippet_label": "start"
},
"id": "P9N3n2GAoWEg"
},
"source": [
"\n",
"\n",
"Сделайте выводы."
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "52266029600cdfda3b1cfce9e68f5c99",
"snippet_label": "end"
},
"id": "Sx5n7fdNoWEg"
},
"source": [
"**Выводы:**\n",
"\n",
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "eDX7nVIuoWEg"
},
"source": [
"\n",
"\n",
"*Замечание.* Не расстраивайтесь, если у вас получится не очень хорошее качество, это нормально. Вы провели только небольшую предобработку данных и обучили *простую* модель. Более сложные методы обработки данных и обучения ждут вас впереди. Главное — с чего-то начать!\n",
"\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "2c0205cf5ab3ec02c6ea667faa01e48b",
"snippet_label": "start"
},
"id": "-jym5lqSqxha"
},
"source": [
"\n",
"\n",
"---\n",
"### Задача 3."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "iI8OJHhiqRhk"
},
"source": [
"*Перед выполнением задачи ознакомтесь с ноутбуком по логистической регрессии с занятия.*\n",
"\n",
"> Одно из интересных свойств модели логистической регрессии — *при соблюдении её предположений* она дает возможность получать **несмещенные оценки вероятностей** принадлежности объекта к определенному классу. \n",
"> Для пояснения рассмотрим объект $x$ и соответствующее предсказание вероятности $\\widehat{p}(x)$ для класса 1. Если взять небольшую окрестность объекта $x$, то доля объектов класса 1 в этой окрестности будет приблизительно равна $\\widehat{p}(x)$. \n",
"\n",
"Далее проверим это свойство на конкретных примерах.\n",
"\n",
"С помощью кода ниже сгенерируйте данные, состоящие из одного вещественного признака и бинарного таргета."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "JwYNbh68qKFx"
},
"outputs": [],
"source": [
"sample_size = 3000 # Размер выборки\n",
"\n",
"# Признаки\n",
"X = np.random.uniform(low=-4, high=4, size=(sample_size, 1))\n",
"\n",
"# Таргет\n",
"y_mean_true = 1 / (1 + np.exp(1 - 2 * X.ravel()))\n",
"y = np.random.binomial(n=1, p=y_mean_true)\n",
"\n",
"plt.figure(figsize=(10, 3))\n",
"plt.scatter(X, y_mean_true, marker=\".\", s=1, label=\"Реальные вероятности\\n(мы их не знаем)\")\n",
"plt.scatter(X, y, marker=\"|\", alpha=0.1, label=\"Данные\")\n",
"plt.xlabel(\"Признак\")\n",
"plt.ylabel(\"Класс объекта\")\n",
"plt.legend();"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "SuGffKQWqTgP"
},
"source": [
"Обучите логистическую регрессию, используя реализацию из `sklearn`, при этом свободный коэффициент должен присутствовать в модели. Укажите также `penalty='none'`."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "bYEdWOT2qW2J"
},
"outputs": [],
"source": [
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "H80yPQ1cqY7P"
},
"source": [
"Напечатайте оценку коэффициентов"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "VZ4itf7UqapC"
},
"outputs": [],
"source": [
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "7lZwMvaNqbvL"
},
"source": [
"Ниже объявлена сетка значений признака. По этой сетке постройте\n",
"* предсказания классов,\n",
"* предсказания вероятностей класса 1.\n",
"\n",
"Визуализируйте эти предсказания. На график стоит нанести также обучающую выборку."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "-689880DqdON"
},
"outputs": [],
"source": [
"X_grid = np.linspace(-4, 4, 10000).reshape((-1, 1))\n",
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "iMJx4bblqevG"
},
"source": [
"Разбейте отрезок $[-4, 4]$ на одинаковые бины длины длины 0.2 и посчитайте в каждом бине долю объектов класса 1. Полученные значения добавьте на график предсказаний вероятностей и сравните эти графики. Проинтерпретируйте полученные результаты.\n",
"\n",
"*Подсказка:* может помочь `np.digitize` и метод `groupby` для таблиц `pandas`. Рекомендуем посмотреть обучающие ноутбуки по библиотекам."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "hSKK8i7cqnpR"
},
"outputs": [],
"source": [
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uo-f83HMqn4y"
},
"source": [
"Повторите проведенное исследование для следующих данных и сравните результаты."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "5ajXblBRqgpJ"
},
"outputs": [],
"source": [
"# Признаки\n",
"X = np.random.uniform(low=-4, high=4, size=(sample_size, 1))\n",
"\n",
"# Таргет\n",
"y_mean_true = 1 / (1 + np.exp(-100 * X.ravel()))\n",
"y = np.random.binomial(n=1, p=y_mean_true)\n",
"\n",
"plt.figure(figsize=(10, 3))\n",
"plt.scatter(X, y_mean_true, marker=\".\", s=1, label=\"Реальные вероятности\")\n",
"plt.scatter(X, y, marker=\"|\", alpha=0.1, label=\"Данные\")\n",
"plt.xlabel(\"Признак\")\n",
"plt.ylabel(\"Класс объекта\")\n",
"plt.legend();"
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "2c0205cf5ab3ec02c6ea667faa01e48b",
"snippet_label": "end"
},
"id": "BN1dDhhtqq-j"
},
"source": [
"**Выводы:**\n",
"\n",
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lnh_fbggq0db"
},
"source": [
"---\n",
"### Задача 4."
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "f92a2876d3f2b0d01fc396776be023a9",
"snippet_label": "start"
},
"id": "ZojQJLc8q9D9"
},
"source": [
"\n",
"\n",
"Продолжим исследовать модель логистической регрессии. Сгенерируем данные, состоящие из двух бинарных признаков и бинарного таргета"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "5-NC9xytq2kR"
},
"outputs": [],
"source": [
"probs = np.random.uniform(size=8)\n",
"probs /= probs.sum()\n",
"probs\n",
"\n",
"x = np.random.choice(np.arange(8), p=probs, size=10000)\n",
"data = pd.DataFrame(\n",
" np.unpackbits(np.array(x.reshape(-1, 1), dtype=\">i8\").view(np.uint8), axis=1)[:, -3:],\n",
" columns=[\"feature_1\", \"feature_2\", \"target\"],\n",
")\n",
"data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "cZe7L0Quq_Aa"
},
"source": [
"Особенность таких данных — конечное число *возможных различных* объектов. В данном случае их всего 4, по количеству всех возможных комбинаций значений признака. Соответственно, любой моделью мы можем сделать только 4 *различных* предсказания. Исследуем, как с этим справляется логистическая регрессия.\n",
"\n",
"Сначала для сравнения посчитайте долю класса 1 для каждой категории объектов.\n",
"\n",
"*Подсказка:* используйте `pd.pivot_table`. Рекомендуем посмотреть обучающие ноутбуки по библиотекам."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ai_eval_tool": {
"snippet_hash": "f92a2876d3f2b0d01fc396776be023a9",
"snippet_label": "end"
},
"id": "cG1DiCRkrAUR"
},
"outputs": [],
"source": [
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "14e68d57d58f901b3350e63f76b9f8db",
"snippet_label": "start"
},
"id": "7zN9tKwxrB9E"
},
"source": [
"\n",
"\n",
"Обучите логистическую регрессию с `penalty='none'` и получите предсказания вероятностей для этих четырех типов объектов. Представьте результаты в таком виде, чтобы их удобно было сравнивать с частотами, посчитанными ранее."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ai_eval_tool": {
"snippet_hash": "14e68d57d58f901b3350e63f76b9f8db",
"snippet_label": "end"
},
"id": "jeOIdQZtrCLA"
},
"outputs": [],
"source": [
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "1b868a951c9dec0be47540d5316f7e9f",
"snippet_label": "start"
},
"id": "8D8fNLDprDrK"
},
"source": [
"\n",
"\n",
"Почему результаты не совпадают?\n",
"\n",
"Для ответа на этот вопрос распишите формулу, которая задает модель логистической регрессии, указав все параметры. Какое предположение о данных при этом делает логистическая регрессия?"
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "1b868a951c9dec0be47540d5316f7e9f",
"snippet_label": "end"
}
},
"source": [
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "1180c36f8ac39574c944b19ddee07271",
"snippet_label": "start"
},
"id": "SEzIE7sprFlH"
},
"source": [
"\n",
"\n",
"Предложите и реализуйте способ построения модели логистической регрессии так, чтобы она точнее предсказывала частоты, посчитанные ранее."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Опишите ваше предложение:\n",
"\n",
"..."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Реализация:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ai_eval_tool": {
"snippet_hash": "1180c36f8ac39574c944b19ddee07271",
"snippet_label": "end"
},
"id": "nDyfSHDirD-w"
},
"outputs": [],
"source": [
"..."
]
},
{
"cell_type": "markdown",
"metadata": {
"ai_eval_tool": {
"snippet_hash": "3f951c224a4ac471c658ed7755ff9521",
"snippet_label": "end"
},
"id": "0Tth43N9rGHF"
},
"source": [
"\n",
"\n",
"**Выводы:**\n",
"\n",
"..."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"---\n",
"### Сложная часть"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Задачи 5-7: скачайте второй ноутбук с условием задания со страницы курса."
]
}
],
"metadata": {
"colab": {
"provenance": [],
"toc_visible": true
},
"hide_input": false,
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 1
}