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