{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "LVdUca_-lz0z" }, "source": [ "# Введение в анализ данных\n", "## Домашнее задание 9. Статистика и байесовские классификаторы.\n" ] }, { "cell_type": "markdown", "metadata": { "id": "j0nuOgDOlz0z" }, "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", "* Задача 3 — 30 баллов\n", "* Задача 4 — 30 баллов\n", "* Задача 3 — 50 баллов\n", "* Задача 4 — 40 баллов\n", "\n", "Баллы учитываются в факультативной части курса и не влияют на оценку по основной части." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ht9Xm0EucoAr" }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "from sklearn.datasets import fetch_20newsgroups\n", "\n", "sns.set(palette='Set2')" ] }, { "cell_type": "markdown", "metadata": { "id": "hYgTespbkXej" }, "source": [ "---\n", "### Задача 1. \n", "---\n", "\n", "**a).** Пусть $X_1,...,X_n$ выборка из некоторого распределения $\\mathsf{P}$, причем ${\\sf D} X_1=\\sigma^2<+\\infty$, и $\\sigma$ неизвестно.\n", "Рассмотрим оценку $S^2 = \\overline{X^2}-\\overline{X}^2$ дисперсии $\\sigma^2$.\n", "\n", "Докажите, что $S^2=\\frac1n\\sum\\limits_{i=1}^n\\left(X_i-\\overline{X}\\right)^2$.\n", "\n", "**b).** Оценка $\\widehat{\\theta}$ называется несмещенной оценкой параметра $\\theta$ если для любого $\\theta \\in \\Theta$ выполнено $\\mathsf{E}_\\theta \\widehat{\\theta} = \\theta$. Иначе говоря, какое бы ни оказалось истинное значение параметра $\\theta$, рассматривая оценку $\\widehat{\\theta}$ в среднем будем получать именно $\\theta$.\n", "\n", "Является ли статистика $S^2$ несмещенной оценкой $\\sigma^2$?\n", "\n", "*Подсказка.* Посчитайте математическое ожидание случайной величины $S^2$. Используйте для этого известные вам свойства математического ожидания." ] }, { "cell_type": "markdown", "metadata": { "id": "ZH_7vCIE4Md7" }, "source": [ " ---\n", "### Задача 2. \n", "---\n", "Пусть $X_1, ..., X_n$ — выборка из распределения $\\mathcal{N}(0, \\sigma^2)$. В качестве оценок $\\sigma^2$ обычно используют $S^2$ или $\\frac{n}{n-1}S^2$. Что можно сказать про их несмещенность?" ] }, { "cell_type": "markdown", "metadata": { "id": "jHlO95TVJGqx" }, "source": [ "**Ответ:** <...>" ] }, { "cell_type": "markdown", "metadata": { "id": "JP3jb2n64hgO" }, "source": [ "**1.** Теперь проверьте это на практике. Для каждой из приведенных выше оценок $\\widehat{\\theta}$ выполните следующие действия.\n", "\n", "* Вычислите $k = 500$ независимых оценок $\\widehat{\\theta}_1, ... , \\widehat{\\theta}_k$ по независимым выборкам $(X_1^1, ... , X_n^1), ... , (X_1^k, ... , X_n^k)$, сгенерированным из распределения $\\mathcal{N}(0, \\sigma^2)$. Для генерации выберите какое-то истинное значение $\\sigma$. Далее вычислите среднее этих оценок, которое обозначим $\\widetilde{\\theta}$.\n", "\n", "* Визуализируйте полученные значения, построив на **одном** графике точки $(\\widehat{\\theta}_1, $y$), ... , (\\widehat{\\theta}_k, y)$ и среднее оценок $(\\widetilde{\\theta}, y)$, где $y$ — произвольные различные (например, 0 и 1) координаты для двух различных типов оценок.\n", "\n", "* Повторите действие три раза для $n \\in \\{10, 100, 500\\}$. В итоге получится три графика для различных $n$, на каждом из которых изображено поведение двух типов оценок и их среднее.\n", "\n", "Используйте приведенный ниже **шаблон** для визуализации значений.\n", "\n", "**Внимание!** Следите за информативностью и наглядностью графиков. Например, пустых пространств должно быть как можно меньше, ничего не должно быть скомкано, вся нужная информация должна быть представлена. Посмотрите презентацию по оформлению домашних заданий. **Если график чему-то не удовлетворяет, оценка будет снижена.**\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "EkmPUrPwpoEZ" }, "outputs": [], "source": [ "# Вначале:\n", "plt.figure(figsize=<размер>)\n", "\n", "# Для каждой оценки:\n", "# y - номер оценки\n", "plt.scatter(<независимые оценки> , np.zeros(k) + y,\n", " alpha=0.1, s=100, color=<цвет>, label=<метка>)\n", "plt.scatter(<независимые оценки>.mean(), y, marker='*', s=200,\n", " color='w', edgecolors='black')\n", "\n", "# Для всего графика:\n", "plt.vlines(1, <наименьший y>, <наибольший y>, color='r')\n", "plt.title(f'Размер выборки = {n}')\n", "plt.yticks([])\n", "plt.legend()" ] }, { "cell_type": "markdown", "metadata": { "id": "FdCCsVL43jva" }, "source": [ "**Решение:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "8qcnAu0a3jva" }, "outputs": [], "source": [ "..." ] }, { "cell_type": "markdown", "metadata": { "id": "-ZfBwUhe3jvb" }, "source": [ "**2.** Изучим поведение среднего оценок из первого пункта при росте размера выборки. Постройте график зависимости $\\widetilde{\\theta}$ от $n$ для двух типов оценок. Для вычисления зависимости нужно один раз сгенерировать выборки из пункта 1 достаточно большого размера (не более 500) и посчитать оценки по подвыборкам, используя функции из `numpy`. Использовать циклы, а так же функции, разворачивающиеся в цикл (например, `np.vectorize`), запрещено." ] }, { "cell_type": "markdown", "metadata": { "id": "jIBkuOKb3jvb" }, "source": [ "**Решение:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ZP8sBmKL3jvb" }, "outputs": [], "source": [ "..." ] }, { "cell_type": "markdown", "metadata": { "id": "agviQcZi3jvd" }, "source": [ "Сделайте вывод о том, что такое свойство несмещенности. Подтверждают ли сделанные эксперименты полученное в теоретических задачах свойство несмещенности (или отсутствие этого свойства) данных оценок?\n", "\n", "*Для ПМФ:* поясните, почему в лабораторных по физике при оценке погрешности иногда используют $n-1$ в знаменателе, а не $n$.\n", "\n", "*Замечание.* Для ответа на вопрос достаточно понимания текущего материала, ничего из физики знать не требуется." ] }, { "cell_type": "markdown", "metadata": { "id": "md1nb2PX3jvd" }, "source": [ "**Вывод:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "teV7u_WHlz01" }, "outputs": [], "source": [ "..." ] }, { "cell_type": "markdown", "metadata": { "id": "tjP3oPDmlz01" }, "source": [ "*Замечание.* Проведенные эксперименты позволяют сделать вывод только о поведении среднего значения оценки, но ничего не говорят о том, насколько велик их разброс относительно среднего." ] }, { "cell_type": "markdown", "metadata": { "id": "Eyt1tswnlz01" }, "source": [ "---\n", "### Задача 3.\n", "---\n", "Рассмотрим задачу построения системы, автоматически классифицирующей поступающие новостные сюжеты на несколько заранее заданных категорий.\n", "\n", "\n", "\n", "Перед выполнением задачи обязательно посмотрите ноутбук с занятия по классификации.\n", "\n", "---\n", "\n", "С помощью кода ниже загрузите встроенные в `sklearn` данные, в которых представлены различные новостные сюжеты, разделенные на 20 тематических групп." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-04-29T13:15:28.590056Z", "start_time": "2021-04-29T13:15:26.553499Z" }, "id": "c-FzyeAolz01" }, "outputs": [], "source": [ "# удаляем заголовки и подписи\n", "remove = ('headers', 'footers')\n", "# зафиксируем зерно случайности\n", "random_state = 42\n", "\n", "# Извлекаем обучающую и тестовую части перемешивая случайным образом\n", "data_train = fetch_20newsgroups(\n", " subset='train', shuffle=True, random_state=random_state, remove=remove\n", ")\n", "data_test = fetch_20newsgroups(\n", " subset='test', shuffle=True, random_state=random_state, remove=remove\n", ")" ] }, { "cell_type": "markdown", "metadata": { "id": "qnUEzZX3lz01" }, "source": [ "Посмотрим на какое-нибудь сообщение" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-04-29T13:15:37.313958Z", "start_time": "2021-04-29T13:15:37.302380Z" }, "id": "FA6-phPzlz01" }, "outputs": [], "source": [ "print(data_train['data'][21])" ] }, { "cell_type": "markdown", "metadata": { "id": "qHLKHFsTlz01" }, "source": [ "Индекс тематической группы для каждого сообщения" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-04-29T13:15:55.742687Z", "start_time": "2021-04-29T13:15:55.727744Z" }, "id": "qc3-Fuqilz01" }, "outputs": [], "source": [ "data_train['target']" ] }, { "cell_type": "markdown", "metadata": { "id": "6jNDS4oGlz01" }, "source": [ "Названия тематических групп" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-04-29T13:15:55.368277Z", "start_time": "2021-04-29T13:15:55.355803Z" }, "id": "aLKH-LPdlz01" }, "outputs": [], "source": [ "data_train['target_names']" ] }, { "cell_type": "markdown", "metadata": { "id": "pFwLkRmHlz01" }, "source": [ "Разделите данные на обучающую, валидационную и тестовую части" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "WJDh_PHolz01" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "KvoDDuGHlz01" }, "source": [ "Прежде чем приступать к построению сложных систем всегда стоит выбрать простой бейзлайн — модель, которую вы можете получить относительно быстро, и она не занимает много ресурсов.\n", "\n", "В качестве бейзлайна рассмотрим простую модель, обученную на представлении текстов в виде мешка слов (bag of words). Мы можем обучить два известных нам классификатора:\n", "* метод ближайших соседей,\n", "* наивный байесовский классификатор.\n", "\n", "Подумайте, почему метод ближайших соседей не подходит для решения данной задачи." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "9vS5nqOElz01" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "ZWr1oZHhlz01" }, "source": [ "Обучите наивный байесовский классификатор, подобрав также для него оптимальные гиперпараметры. В качестве гиперпараметров можно рассмотреть, например, параметры мешка слов.\n", "\n", "Для выполнения этой процедуры зафиксируйте несколько комбинаций значений гиперпараметров, для каждой из них обучите модель по обучающей части выборки и посчитайте качество (точность классификации) на валидационной части. Выберите классификатор, дающий максимальную точность." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "UlKrhLGAlz01" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "LvOcO9aPlz01" }, "source": [ "Посчитайте качество на тестовой выборке." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ud-zn-6wlz01" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "5Yhoyre-lz01" }, "source": [ "Выберите некоторую нейросеть для классификации текстов. Вы можете выбрать готовую нейросеть и дообучить ее на рассматриваемых данных, как это сделано на семинаре, так и самостоятельно написать нейросеть." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "6rVgcU3Rlz01" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "jfIgIrEulz01" }, "source": [ "Сравните качество моделей на тестовой выборке. Можно ли с уверенностью утверждать, что одна из моделей лучше другой?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "tBBAER_ilz01" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "ChQAKj3olz02" }, "source": [ "Сделайте выводы." ] }, { "cell_type": "markdown", "metadata": { "id": "3OgvS13plz02" }, "source": [ "---\n", "### Задача 4.\n", "---\n", "\n", "Пусть $\\mathscr{X} = \\mathbb{R}^d$ — пространство признаков, $\\mathscr{Y} = \\{0, 1\\}$ — множество классов. Рассматривается квадратичный дискриминантный анализ (QDA), в котором условное распределение $X$ при условии $Y=k$ равно $\\mathcal{N}(a_k, \\Sigma_k)$. Разделяющей поверхностью между классами $k$ и $\\ell$ называется множество точек пространства признаков, для которых вероятность этих двух классов одинакова.\n", "\n", "**1.**\n", "Покажите, что в модели QDA разделяющие поверхности в общем случае квадратичны, а в LDA — линейны между любыми двумя классами.\n", "\n", "*Примечание.* В LDA предполагается $\\Sigma_1 = ... = \\Sigma_k$.\n", "\n", "**2.**\n", "Рассмотрим квадратичный дискриминантный анализ при $d=2$. Приведите примеры таких параметров $a_k, \\Sigma_k$ и вероятностей $\\mathsf{P}(Y = k)$, при которых разделяющая поверхность является\n", "* гиперболой;\n", "* параболой;\n", "* двумя параллельными прямыми;\n", "* двумя пересекающимися прямыми.\n", "\n", "*Примечание.* Можно подобрать выборку, посчитать оценки со страшными числами. Но еще лучше — немного подумать и привести пример с \"красивыми\" числами без какого-либо подбора выборки. В данном случае это довольно просто, а также позволяет лучше разобраться в параметрах многомерного нормального распределения.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "q5W_ROFKKAZK" }, "outputs": [], "source": [] } ], "metadata": { "colab": { "provenance": [] }, "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.11.6" } }, "nbformat": 4, "nbformat_minor": 0 }