{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Введение в анализ данных\n", "## Домашнее задание 1. Простой анализ данных.\n" ] }, { "attachments": { "ai_eval_small.png": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABkAAAAaCAYAAABCfffNAAAA7HpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjajVHbDcMgDPxnio7gV3iMQ5pE6gYdvxcwpalUqZYwfuE77LA/H0e4nSJZgi0pxxIjQaxYkQojU5e1aSZrujvFc3yNB66eEIQUt3a3iMd3xGGz+8VBeNSPRm+kCmuZieoAvF7jqzeU/N3IGSh3ZNr8gTdScUbW/bsziiWny9e2O10lz2OaJC6Rk0GbUEqxwM5CljDP7SSqqcFjRo40AsMfpQJOsisrQavmzlLPs2htd0U2BhTiag41bW3whFWCwtzSMZZybudjNnNGP+Sfb4UXkvF1sXkYuKkAAAGEaUNDUElDQyBwcm9maWxlAAB4nH2RPUjDQBzFX1OlRVoU7CDikKF1siAq4qhVKEKFUCu06mBy6Rc0aUhaXBwF14KDH4tVBxdnXR1cBUHwA8RdcFJ0kRL/lxRaxHhw3I939x537wChWWGa1TMOaHrNTCcTYja3KgZeIWAAYQQRk5llzElSCp7j6x4+vt7FeZb3uT9HWM1bDPCJxLPMMGvEG8TTmzWD8z5xhJVklficeMykCxI/cl1x+Y1z0WGBZ0bMTHqeOEIsFrtY6WJWMjXiKeKoqumUL2RdVjlvcdYqdda+J39hKK+vLHOd5giSWMQSJIhQUEcZFdQQp1UnxUKa9hMe/mHHL5FLIVcZjBwLqEKD7PjB/+B3t1ZhcsJNCiWA3hfb/ogBgV2g1bDt72Pbbp0A/mfgSu/4q01g5pP0RkeLHgH928DFdUdT9oDLHWDoyZBN2ZH8NIVCAXg/o2/KAYO3QN+a21t7H6cPQIa6St0AB4fAaJGy1z3eHezu7d8z7f5+ADSSco7tItw/AAANeGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNC40LjAtRXhpdjIiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6R0lNUD0iaHR0cDovL3d3dy5naW1wLm9yZy94bXAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgIHhtcE1NOkRvY3VtZW50SUQ9ImdpbXA6ZG9jaWQ6Z2ltcDpjMGNkNDM2OS03ZmRjLTQwZWYtYTI5ZC0xN2U5ZWQwNDMyM2IiCiAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ZTgzZmFjYTUtYmNhYS00MTI5LWE3NWMtOGYwNmJiMmQ4ZjM4IgogICB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6OTUzOTUxN2UtNjg5ZS00YjYyLThiNGMtZTA5M2JkYjUzMGJhIgogICBkYzpGb3JtYXQ9ImltYWdlL3BuZyIKICAgR0lNUDpBUEk9IjIuMCIKICAgR0lNUDpQbGF0Zm9ybT0iTGludXgiCiAgIEdJTVA6VGltZVN0YW1wPSIxNzM5NzExNDE1NDc1MjY0IgogICBHSU1QOlZlcnNpb249IjIuMTAuMzgiCiAgIHRpZmY6T3JpZW50YXRpb249IjEiCiAgIHhtcDpDcmVhdG9yVG9vbD0iR0lNUCAyLjEwIgogICB4bXA6TWV0YWRhdGFEYXRlPSIyMDI1OjAyOjE2VDE2OjEwOjE0KzAzOjAwIgogICB4bXA6TW9kaWZ5RGF0ZT0iMjAyNTowMjoxNlQxNjoxMDoxNCswMzowMCI+CiAgIDx4bXBNTTpIaXN0b3J5PgogICAgPHJkZjpTZXE+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmQ2YWNlMzhmLTM5YzQtNDQwYi1iNThiLWY0Mzg4OGQ2ODdhNyIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iR2ltcCAyLjEwIChMaW51eCkiCiAgICAgIHN0RXZ0OndoZW49IjIwMjUtMDItMTZUMTY6MTA6MTUrMDM6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+hPczYgAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB+kCEA0KD7XOgl0AAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAGhElEQVRIx42WbYxdVRWGn7X3Puee+zUz907HMqXOUGqLtqYUFIpBQgAVglUk0QgExQ8gIpqQEEhEDSQCJvwwMTGEGEJpiYgRA0ShNRiwKiDSCLUiaUIk0w/aaTszd+bee+6955y9lz9m2tjIh/vn2nuvd62137XfJbzHOvTUPZG+/PjmCNkseetMNdWN4uetugTr3BvBxK+F4B+fHT9nx4dvfih9Nz/yTsb2Mz+Szs4nvuvyhR+a0Fsm8l/HBXCCWLNoUgjYo7kp/7jYcOX9K6+6e/C+IP++/azJWtH/jckXPqYEREDEIAKIoICIoFYQK5wIQIVga7v7Gl1x6r2vTr0ryKFbzzzN5a2d6vOJxSADGmDQs+Q9g88MvlCsE1wJorIQV8GVwTqQACqlg9nQ2kuW3/Hbvf8Dsveuz00MHd3zJ6PZpAiEoHTnLd2WRb1gDMRljnuiGAghCBgoN6DWVErlxUwVt2+2vvaCNT94eh+AOw4yNPvWNhPySYCiEOaOlBh0DXE5MDzuqdQWS4eCooQAvVRYOBbROQr9tjCyQijXBfATI90DW4BLAAzA1C1nf8Nm8xeKgs+FY4diem1LpamMryqoDQUMivpA8IEQFAEq1cDyiYzKaCBPDbP7A/2OAoLk3Yv3337u105kUioG3xcBVWH2mCPtWkbGAmOnZFgBgsL6r1LacDFFZRjba5P9/Q/onq0YC82xAgTaR2Ja04FlEZhIibR/F/CwTN163mXVdHo7EuimwttTMVEFVp2eYoyi5QmS635Gae3Gk1ioqqSvv0L28LegOAYiHN4fk3cdIysCtYYiCN1k+eWmlKWXLt4ytFoJuToayzyiSvAQf/OBkwE0LDJGhOpHzyW5/kG0ECRAY8yjaui0LCE3GBzlfHCpEbXnqzfkmWGuFaMuop54QgF69k0kp68HIO/OM//Q3bx54xnMPXAHRXsegOSMs5CzbyAUQmwDOKXbNhR5BMTgzSdNCPFq1JH2SvR8QpxYjBq0sMQbLkSWWN7/83aefGwbG7catj36K9I/PnUio2jjRYTcEDLBRkJWRKRpRAgJGeUzjPemWZgKaajR0zJqI0QtobYWu3L18RpRHD7AP6eVEDy7jkA+fRBd2rUrT0fLq9EMCm/o+og0S8g1IQRXM4UZJjdNBmaYrtbo+Sq+EOQzN6FRcqJnS+dcxFfWKvd9wnLbBihv+tRSjgpRBS67GZ8L/SJhIVToaYVBqJFRw/WiZhqFQcU76BvHdGpZ66tEE+vpzncoDdUxxpCsO4s19z7FaW++QbzmIyQfWrfEMkgXUmRyHbmWmSsatLVCitCXGoWJjrmc+h41lU2mlDEQQ6vnaI+fzxARvj2gNT1H45QmRgzlNespr1l/EpU7MwsMOhkiEWHiAvYdmCeYCHXCwDTJ4E03cEPPeQ2bTNJDXE5RxOyer3FeP+A9zOybw+fQPHUEa+0J58EHWtMt2ocXEFn8jfemI6SqlGLBVBK6DOPhBdezQ09GPnwvEDE83GEmDbz0tznWXdkjqZehEOam5lg42KY8UsbGgi+Ufisl+KX/zAhZ2uf5XR0atkKzZiiiBkqFvtNn7JYXnz94zabNXyy09AFfBA61AlkwBBsxOjqKKvhCyQee3nyPdLZPv9WnyDzBB3wRGLRzdr/wOof3HiJyjuVjVZKh5RQm/tflP7nlNgeQhvge690vTRKxrDFH92iPXc++RjUaZvkHx6gMJ4g1iAhLqoUAqp7+woCjB2b5645XqEpEvVYiqo2RaUJuwp0n6ckT397yO9R8trvQ5q23ZzjS6tINnvMu+DgrVpxKqepwkVtqQPC5J+/lTB85yovPvURJLaP1MivHG9RHhhEnT3/p/us2n6Qng3J0tXTNP0wyctqyhpAXhmK+zQvPvkxjRZNVqyYZqY+gS3oy32mxf/9+ZvfNUIlLDNWrjDabREmDvpcpV/fXvqP8brvxsUnN2RnyMNlpdzg2N8dMe4FBVizWPwQK7xERnDHEzlGKYxq1KmOjTaq1YdTqVIiLC69/8Nqpdx0ktnzn0XHt2K1hoJ8eDAa0Ox06aZeiKPA+EFRRhdg6ykmJeq1GpVIhimLUhR2VZuXqa376+db7jkQAP7/uF1/X3Nzj+3586ZkhLAIAWOewNkZVIQpv4cKdN2y76pH/e+46vn5939PmyKszV8Q2+oL10Xpr5cxQiBNLhpg9QfUv3mS/v+GRL29/Lz//ASycGpPJ/QPNAAAAAElFTkSuQmCC" } }, "cell_type": "markdown", "metadata": {}, "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", "* Отвечайте на вопросы, а также добавляйте новые ячейки в предложенных местах, которые обозначены `<...>`.\n", "* В markdown-ячейка, содержащих описание задачи, находятся специальные отметки, которые запрещается модифицировать.\n", "* При нарушении данных правил работа может получить 0 баллов.\n", "\n", "\n", "**Перед выполнением задания посмотрите презентацию по выполнению и оформлению домашних заданий с занятия 2.**\n", "\n", "\n", "**Баллы за задание:**\n", "\n", "Легкая часть (достаточно на \"хор\"):\n", "* Задача 1 — 30 баллов\n", "* Задача 2 — 90 баллов\n", "\n", "Баллы учитываются в обязательной части курса и не влияют на оценку по факультативной части." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Bot check\n", "\n", "# HW_ID: fpmi_ad1\n", "# Бот проверит этот ID и предупредит, если случайно сдать что-то не то\n", "\n", "# Status: not final\n", "# Перед отправкой в финальном решении удали \"not\" в строчке выше\n", "# Так бот проверит, что ты отправляешь финальную версию, а не промежуточную" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Тренировочные задачи на библиотеки\n", "\n", "Если вы неуверенно себя чувствуете в библиотеках numpy, pandas, matplotlib, seaborn, рекомендуем сначала\n", "* посмотреть материалы по библиотекам на нашем сайте\n", "* прорешать упражнения на библиотеки на странице курса\n", "* прорешать два упражнения на numpy в системе Яндекс.Контест." ] }, { "cell_type": "markdown", "metadata": { "ai_eval_tool": { "snippet_hash": "9ede240862d9bf1602556040405c317e", "snippet_label": "start" }, "id": "6VKl_PIkw3io" }, "source": [ "\n", "\n", "---\n", "### Легкая часть\n", "\n", "### Задача 1\n", "\n", "На семинаре мы разбирали классификацию изображений на основе kNN. В этом задании мы вернемся к датасету [MNIST](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_digits.html) и попробуем улучшить результат, полученный на семинаре.\n", "\n", "Для начала, загрузите данные и разделите их на обучающую и тестовую части." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Lb6MyU-uleIo" }, "outputs": [], "source": [ "..." ] }, { "cell_type": "markdown", "metadata": { "id": "mT-r62MNttSF" }, "source": [ "Число соседей в модели kNN является необучаемым параметром т.е. гиперпараметром который выставляется вручную. Как мы видели на лекции, выбор оптимального значения $k$ важен, так как слишком маленькое значение может привести к переобучению, а слишком большое — к недообучению.\n", "\n", "Постройте график зависимости точности (`accuracy_score`) предсказания kNN от значения $k$ (от 1 до 20) для обучающей и тестовой выборок." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ai_eval_tool": { "snippet_hash": "9ede240862d9bf1602556040405c317e", "snippet_label": "end" }, "id": "j4UhszICw8Bo" }, "outputs": [], "source": [ "..." ] }, { "cell_type": "markdown", "metadata": { "ai_eval_tool": { "snippet_hash": "fe9171a6e245a953987df27f018c61c2", "snippet_label": "end" }, "id": "pJiPScaLwmXi" }, "source": [ "\n", "\n", "❓ **Вопрос** ❓\n", "\n", "> Почему при $k = 1$ на тренировочной выборке метрика качества составляет 100%.\n", "\n", "**Ваш ответ:** ..." ] }, { "cell_type": "markdown", "metadata": { "ai_eval_tool": { "snippet_hash": "cdb15caec1719ca7ba80d25b716879ca", "snippet_label": "start" }, "id": "REdGLgdPqEwO" }, "source": [ "\n", "\n", "Помимо числа соседей гиперпараметром модели также является *метрика расстояния* между объектами.\n", "\n", "> По умолчанию используется *Евклидова метрика* ($L_2$), согласно которой расстояние между двумя точками $x_1 =(x_{11}, …, x_{1d})$ и $x_2=(x_{21},…,x_{2n})$ в $d$-мерном пространстве определяется как:\n", "$$\\rho(x_1, x_2) = \\sqrt{\\sum^d_{j=1}\\left(x_{1j} - x_{2j}\\right)^2}.$$\n", ">\n", "> Иногда в kNN имеет смысл использовать другие метрики, например *метрику Манхэттена* ($L_1$).\n", "$$\\rho(x_1, x_2) = \\sum^d_{j=1} \\left|x_{1j} - x_{2j}\\right|.$$\n", ">\n", "> Выбор одной из них зависит от особенностей задачи и данных. В частности,\n", ">\n", "> * метрика Манхэттена менее чувствительна к выбросам, чем евклидово расстояние, что делает её полезной для данных с сильным шумом или при наличии аномалий;\n", ">\n", "> * в задачах с разреженными данными (например, текстовые данные, представленные в виде векторов) метрика Манхэттена может работать лучше, чем евклидово расстояние." ] }, { "cell_type": "markdown", "metadata": { "id": "4g9hVn2KmKeE" }, "source": [ "Проведите аналогичный эксперимент используя в качестве гиперпараметра $L_1$-метрику (выясните сами, как ее задать). Выведите на одном графике зависимости точности (accuracy) от значения $k$ для обучающей и тестовой выборок для обоих метрик." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "z8uEdlnKyTsC" }, "outputs": [], "source": [ "..." ] }, { "cell_type": "markdown", "metadata": { "id": "pdv72RC0ggo-" }, "source": [ "❔ **Вопрос** ❔\n", "\n", "> Как вы думаете почему смена метрики так сильно повлияла на характер кривых?\n", "\n", "**Ваш ответ:** ..." ] }, { "cell_type": "markdown", "metadata": { "ai_eval_tool": { "snippet_hash": "cdb15caec1719ca7ba80d25b716879ca", "snippet_label": "end" }, "id": "ADwgvQaE1EOe" }, "source": [ "**Выводы:** ..." ] }, { "cell_type": "markdown", "metadata": { "id": "Ov2nWFnVoReB" }, "source": [ "\n", "\n", "\n", "\n", "---\n", "\n", "### Задача 2\n", "\n", "Перед выполнением задачи рекомендуется посмотреть материал с семинара.\n", "\n", "#### 0. Подготовка данных\n", "\n", "Титаник был крупнейшим пассажирским судном в 1912—1913 годах. Во время первого рейса затонул в северной Атлантике, столкнувшись с айсбергом в ночь с 14 на 15 апреля 1912 года, при этом погибло 1502 из 2224 пассажиров и членов экипажа. Данные о пассажирах были собраны в таблицы, которые можно скачать с Kaggle. Эти данные часто используются в качестве обучающих в анализе данных.\n", "\n", "\n", "Загрузите данные с помощью `pandas`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "u3XTF4HQoRsu" }, "outputs": [], "source": [ "titanic = pd.read_csv(\"train.csv\").dropna()\n", "titanic.head()" ] }, { "cell_type": "markdown", "metadata": { "id": "AQTWh2U-eJth" }, "source": [ "Для лучшего понимания процесса работы с данными, уточним ключевые термины.\n", "\n", "> **Объект** — это единица данных, представленная набором признаков и используемая для обучения или предсказаний модели. В данной задаче являются пассажиры, им соответствуют *строки* таблицы данных.\n", ">\n", "> **Признаки (features)** — это характеристики, которые описывают объекты в данных. В таблицах данных они обычно соответствуют *колонкам*. В данной задаче мы будем работать со следующими признаками\n", ">\n", "> * `Pclass` — класс билета (1 = первый класс, 2 = второй класс, 3 = третий класс);\n", ">\n", "> * `Age` — возраст пассажира;\n", ">\n", "> * `SibSp` — количество братьев, сестер или супругов на борту;\n", ">\n", "> * `Parch` — количество родителей или детей на борту;\n", ">\n", "> * `Fare` — стоимость билета.\n", ">\n", "> **Таргет (target)** — это целевая переменная, которую мы хотим предсказать. В данной задаче мы будем предсказывать `Survived` — бинарная переменная, указывающая, выжил ли пассажир (1) или нет (0). Значения этой переменной имеются для обучающего набора данных, а для тестого — нет.\n", "\n", "Из каждой части оставим несколько признаков, с которыми мы будем работать, а также отдельно — целевой признак, который мы хотим предсказать." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "1pA6iDn8oRwi" }, "outputs": [], "source": [ "features_columns = [\"Pclass\", \"Age\", \"Sex\", \"SibSp\", \"Parch\", \"Fare\"]\n", "target_column = \"Survived\" # Целевой признак\n", "\n", "X, y = titanic[features_columns], titanic[target_column]" ] }, { "cell_type": "markdown", "metadata": { "id": "bvfsk5Xx5tMx" }, "source": [ "В данных могут присутствовать пропуски. Пока что мы не умеем с ними работать, так что исключим из данных.\n", "\n", "Посмотрите, сколько объектов имеют хотя бы один пропуск. Удалите их из данных." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "rz5NYRh55rlj" }, "outputs": [], "source": [ "..." ] }, { "cell_type": "markdown", "metadata": { "id": "osxYYeFXeSKl" }, "source": [ "Разделите данные по строкам на две части случайным образом в соотношении 7:3. Первую часть мы будем называть *обучающей*, а вторую — *тестовой*." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "-AcX9JcseSnJ" }, "outputs": [], "source": [ "..." ] }, { "cell_type": "markdown", "metadata": { "ai_eval_tool": { "snippet_hash": "371b31e8ca86989a98cce342afcbbf2a", "snippet_label": "start" }, "id": "ofn7oGpgCcAI" }, "source": [ "\n", "\n", "#### 1. Исследование\n", "\n", "> ❗ **Внимание.** Эта часть задачи должна выполняться *исключительно на обучающих данных*. За использование тестовых данных решение не будет оценено.\n", "\n", "Проведите визуальный анализ данных чтобы понять, как различные признаки влияют на целевой. Исследовать можно не целиком обучающие данные, а разделить их на две части по одному из признаков, а далее рассматривать каждую часть отдельно.\n", "\n", "*Не забывайте про информативность и эстетичность графиков, посмотрите презентацию про оформление домашних заданий.*" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ai_eval_tool": { "snippet_hash": "371b31e8ca86989a98cce342afcbbf2a", "snippet_label": "end" }, "id": "LkIm5g5yChw7" }, "outputs": [], "source": [ "..." ] }, { "cell_type": "markdown", "metadata": { "ai_eval_tool": { "snippet_hash": "476dce11b8cac8705a10bff695e4cdee", "snippet_label": "start" }, "id": "Phh0aDWIBOKO" }, "source": [ "\n", "\n", "#### 2. Классификация логическими правилами\n", "\n", "На основе выше проведенного исследования предложите два разных правила в виде решающего дерева, пример которого можете посмотреть в презентации с первой лекции (классификация котиков). Никакие статистические методы использовать не требуется, только логику и графики. Любые решения \"из коробки\" использовать запрещено. Например, достаточно пояснения \"*по графику (описание графика) визуально я увидел, что при X > 100 большинство пассажиров выжило, поэтому использую правило (описание правила)*\".\n", "\n", "В данной задаче достаточно, если первое дерево будет иметь максимальную глубину 2, а второе — глубину 1, и при этом не является поддеревом первого. Дерево из одного листа имеет глубину 0.\n", "\n", "*Указание*. Попросите ИИ красиво оформить описание дерева и его пояснение.\n", "\n", "**Дерево 1:**\n", "\n", " ...\n", "\n", "**Дерево 2:**\n", "\n", " ..." ] }, { "cell_type": "markdown", "metadata": { "id": "Yg3O6JYz4EON" }, "source": [ "Реализуйте полученные деревья по шаблону" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ai_eval_tool": { "snippet_hash": "476dce11b8cac8705a10bff695e4cdee", "snippet_label": "end" }, "id": "ovqn-0u0BSsA" }, "outputs": [], "source": [ "def tree(features: pd.DataFrame) -> pd.Series:\n", " \"\"\"\n", " Предсказание целевого признака для данных features -- pandas-таблица данных.\n", " Возвращает pandas.Series с теми же индексами, что и у features.\n", " \"\"\"\n", "\n", " ...\n", " return predicted" ] }, { "cell_type": "markdown", "metadata": { "ai_eval_tool": { "snippet_hash": "509cca15393d5b0fb3cf40b463d12077", "snippet_label": "start" }, "id": "1AqlNknxF4vL" }, "source": [ "\n", "\n", "Проверьте работоспособность данных моделей на тестовой выборке и оцените качество модели по метрике `accuracy`.\n", "\n", "> ❕ *Примечание.* Полученные значения не влияют на оценку по заданию. Оценивается только корректность и обоснованность решения, а также графики и выводы." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "_f6OznrD9foG" }, "outputs": [], "source": [ "def accuracy(target: pd.Series, predicted: pd.Series) -> float:\n", " \"\"\"\n", " Вычисление критерия качества для предсказания predicted,\n", " если истинные значения -- target.\n", " Возвращает одно вещественное число.\n", " \"\"\"\n", "\n", " ..." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ai_eval_tool": { "snippet_hash": "509cca15393d5b0fb3cf40b463d12077", "snippet_label": "end" }, "id": "yhpCxMFgFrMx" }, "outputs": [], "source": [ "..." ] }, { "cell_type": "markdown", "metadata": { "ai_eval_tool": { "snippet_hash": "2bf781f25f8969f7e712ea5d28d608a3", "snippet_label": "end" }, "id": "puAaPMQX7P3q" }, "source": [ "\n", "\n", "#### 3. Классификация методом ближайшего соседа\n", "\n", "В данной части задачи оставим только признаки `'Pclass'`, `'Age'`, `'Sex'`,`'Fare'`.\n", "\n", "\n", "❓ **Вопрос** ❓\n", "> Какие могли бы возникнуть проблемы при использовании признаков `'SibSp'`, `'Parch'`? Имеется ли подобная проблема для признака `'Pclass'`?\n", "\n", "**Ваш ответ:** ..." ] }, { "cell_type": "markdown", "metadata": { "ai_eval_tool": { "snippet_hash": "3bfbe10cf933e1302c2f524a99acfa54", "snippet_label": "start" }, "id": "SvhX9x7MfneJ" }, "source": [ "\n", "\n", "Постройте классификатор методом ближайшего соседа. Обучите его и оцените качество модели. Сравните с предыдущим методом.\n", "\n", "Пока никаких преобразований данных делать не нужно.\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ai_eval_tool": { "snippet_hash": "3bfbe10cf933e1302c2f524a99acfa54", "snippet_label": "end" }, "id": "VWWVQ2_4fn1q" }, "outputs": [], "source": [ "..." ] }, { "cell_type": "markdown", "metadata": { "ai_eval_tool": { "snippet_hash": "21227e76b996f62c6c83ee38ce486bdf", "snippet_label": "start" }, "id": "QpLg-Q6lHcwU" }, "source": [ "\n", "\n", "Попробуем улучшить результаты предсказаний, для этого надо сначала посмотреть на сами данные. Выведите значение минимального и максимального объекта для каждого признака." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "cm-r7Lcafo1a" }, "outputs": [], "source": [ "..." ] }, { "cell_type": "markdown", "metadata": { "id": "1i8dxxH3uk9v" }, "source": [ "Как мы видим данные в каждом столбце распределены очень по-разному.\n", "\n", "❓ **Вопрос** ❓\n", "> Как это может повлиять на работу kNN, почему?\n", "\n", "**Ваш ответ:** ...\n" ] }, { "cell_type": "markdown", "metadata": { "id": "GLr8AdnSIG7S" }, "source": [ "Для решения этой проблемы нужно привести признаки к единому масштабу. Существует много методов масштабирования рассмотрим работу одного из них — **минимаксная нормализация**\n", "\n", " \n", "> **Минимакс** — линейное преобразование данных в диапазоне $[0, 1]$, где минимальное и максимальное масштабируемые значения соответствуют 0 и 1 соответственно.\n", "> Реализуется оно по следующей формуле:\n", ">\n", "> $$\\widetilde{x}_{ij} = \\frac{x_{ij} - m_j}{M_j - m_j}$$\n", ">\n", "> где $x_{ij}$ — значение признака $j$ для объекта $i$, а $m_j$ и $M_j$ — минимальное и максимальное значения признака $j$ в обучающем наборе данных. \n", "> В модуле `sklearn.preprocessing` есть [класс](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html) `MinMaxScaler`, который реализует эту операцию. Давайте рассмотрим методы этого класса подробнее:\n", ">\n", "> * `fit(X)`: вычисляет минимальные и максимальные значения для каждого признака.\n", ">\n", "> * `transform(X)`: применяет масштабирование к данным.\n", ">\n", "> * `fit_transform(X)`: объединяет оба метода, сначала подгоняя модель, а затем трансформируя данные.\n", ">\n", "> * `inverse_transform(X)`: восстанавливает исходные данные из масштабированных.\n", "\n", "\n", "Стоит отметить что существуют и другие методы масштабирования данных." ] }, { "cell_type": "markdown", "metadata": { "ai_eval_tool": { "snippet_hash": "21227e76b996f62c6c83ee38ce486bdf", "snippet_label": "end" }, "id": "qGN85R3LusZv" }, "source": [ "❓ **Вопрос** ❓\n", "> В чем может быть недостаток такого метода масштабирования?\n", "\n", "**Ваш ответ:** ...\n" ] }, { "cell_type": "markdown", "metadata": { "ai_eval_tool": { "snippet_hash": "3cf8b0b6b0402c9ceb439c2de6ee4276", "snippet_label": "start" }, "id": "3E--mcozuxRD" }, "source": [ "\n", "\n", "\n", "\n", "Отмасштабируйте данные" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "iOqCmb18oRz_" }, "outputs": [], "source": [ "..." ] }, { "cell_type": "markdown", "metadata": { "id": "2D01wnURo5Ys" }, "source": [ "Теперь выведите значения максимума и минимума нормализованных признаков. Обратите внимание `MinMaxScaler` возвращается объект в виде `np.ndarray`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "8qlsb9SjNE_a" }, "outputs": [], "source": [ "..." ] }, { "cell_type": "markdown", "metadata": { "id": "OV7-PW0pIdq6" }, "source": [ "Обучите модель и сравните результат предсказаний со стандартизацией и без." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "BLq3asddIdHr" }, "outputs": [], "source": [ "..." ] }, { "cell_type": "markdown", "metadata": { "ai_eval_tool": { "snippet_hash": "3cf8b0b6b0402c9ceb439c2de6ee4276", "snippet_label": "end" }, "id": "KGCAy2x1plhJ" }, "source": [ "**Вывод:** ..." ] }, { "cell_type": "markdown", "metadata": { "ai_eval_tool": { "snippet_hash": "02a5bc7d6f2e8382a04db099c58ba6d1", "snippet_label": "start" }, "id": "m8foCV7dkzD9" }, "source": [ "\n", "\n", "**А можем ли мы как-то еще повысить точность модели?**\n", "\n", "Как мы видели, параметр $k$ числа соседей является необучаемым т.е. гиперпараметром, который выставляется вручную. Выбор оптимального значения $k$ важен, так как слишком маленькое значение может привести к переобучению, а слишком большое — к недообучению.\n", "\n", "\n", "\n", "Постройте график зависимости точности (`accuracy_score`) от значения $k$ (от 1 до 20) для обучающей и тестовой выборок." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "lWbvYKh1vW9m" }, "outputs": [], "source": [ "..." ] }, { "cell_type": "markdown", "metadata": { "ai_eval_tool": { "snippet_hash": "02a5bc7d6f2e8382a04db099c58ba6d1", "snippet_label": "end" }, "id": "jWssEgoXvYQy" }, "source": [ "**Вывод:** ..." ] } ], "metadata": { "colab": { "provenance": [] }, "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 }