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