{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Лабораторная работа 2. Основные понятия ML\n",
    "\n",
    "## Задание 1. Подготовка датасета\n",
    "\n",
    "Прочтите данные из датасета вашего варианта. Проверьте, правильно ли pandas распознала даты (если они есть). Если в ваших данных есть пропущенные значения, замените их на средние значения (по этому же столбцу).\n",
    "\n",
    "Если в вашем датасете есть не числовые признаки, закодируйте их: для порядковых - с помощью `sklearn.preprocessing.LabelEncoder`, для номинальных - с помощью `pandas.get_dummies`. Проверьте, все ли было сделано правильно.\n",
    "\n",
    "## Задание 2. Регрессия\n",
    "\n",
    "\n",
    "Отделите целевой признак Y от остального датасета X. Натренируйте (метод `fit`) линейную регрессию `sklearn.linear_model.LinearRegression` на всем датасете (X,Y) и выполните предсказание (метод `predict`) для X. Вычислите вектор ошибок `errors = abs(prediction - Y)`.\n",
    "\n",
    "Сравните среднюю арифметическую и среднюю медианную ошибки. Если они существенно отличаются, объясните причины этого в комментариях.\n",
    "\n",
    "Постройте гистограмму распределения ошибок `errors`, отметьте на ней среднюю арифметическую и среднюю медианную ошибки. Если у вас есть чересчур большие значения на фоне маленьких, примените логарифмический масштаб.\n",
    "\n",
    "Вычислите, как изменится средняя ошибка, если из обучающей выборки удалить не более 5-10% объектов с самыми большими значениями ошибки. Напишите в комментариях подкрепленные примерами рассуждения о том, когда правильно так делать, а когда неправильно.\n",
    "\n",
    "## Задание 3. Классификация\n",
    "\n",
    "Создайте требуемый новый целевой признак Yc для бинарной классификации (см. инструкции к вашему варианту на втором листе Google-таблицы). Исключите из X столбец, по которому вы строили целевой класс Yc. Натренируйте логистическую регрессию `sklearn.linear_model.LogisticRegression` и выполните предсказание. С помощью функции `sklearn.metrics.confusion_matrix` рассчитайте и выведете на экран матрицу ошибок. Объясните в комментариях, что означает каждое число этой матрицы. Где расположено количество ошибок первого и второго рода. Какие из этих ошибок в вашей задаче более нежелательны?\n",
    "\n",
    "## Задание 4. Decision function\n",
    "\n",
    "Натренированной логистической регрессией выполните предсказание вероятностей (метод `predict_proba`). Посмотрите на результат (должна получится матрица с двумя столбцами и большим числом строк) и объясните в комментариях, вероятностью чего является каждое из 4-х чисел вверху матрицы.\n",
    "\n",
    "Придумайте более или менее обоснованные цены за ошибки первого и второго рода (убытки вашей компании). Простейшей решающей функцией является предсказание класса 1, когда его вероятность больше 0.5, и класса 0, когда вероятность класса 1 меньше 0.5. Запрограммируйте этот алгоритм и рассчитайте суммарные убытки.\n",
    "\n",
    "Выясните, как нужно изменить решающую функцию, чтобы убытки были минимальны? Найдите оптимальную решающую функцию и соответствующее ей минимальное значение убытков методом подбора, а также пользуясь формулой из лекции 2 (слайд Decision function). Сравните полученные пороговые значения.\n",
    "\n",
    "## Задание 5. Переобучение и кросс-валидация\n",
    "\n",
    "С помощью функции `sklearn.model_selection.train_test_split` разделите вашу выборку для классификации на тренировочную (train) и проверочную (test). Натренируйте решающее дерево `sklearn.tree.DecisionTreeClassifier` на train и выполните предсказание для train и для test. Сравните accuracy и сделайте выводы в комментариях.\n",
    "\n",
    "Проведите ту же процедуру для логистической регрессии. Как accuracy логистической регрессии на train и test отличается от аналогичных значений решающего дерева. Напишите в комментариях выводы из этого сравнения об обобщающей способности решающего дерева и логистической регрессии.\n",
    "\n",
    "Нарисуйте на одном графике разными цветами зависимости accuracy решающего дерева на train и test от размера листа min_samples_leaf. Сравните этот график с кривой переобучения из презентации ко второй лекции. Укажите в комментариях области недообученности и переобученности алгоритма. Какое значение min_samples_leaf является наилучшим?\n",
    "\n",
    "Добавьте на предыдущий график переобучения еще две аналогичные кривые для логистической регрессии."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "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.13.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
