{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "6b613b05-deb3-4406-9b23-65fc548e1bf6",
   "metadata": {},
   "source": [
    "# Обработка и анализ признаков\n",
    "\n",
    "Возьмите датасет вашего варианта из лабораторной работы № 1. Если вы раньше применяли бинаризацию целевого признака, то сейчас этого делать не нужно. Добавьте для тестирования искусственно сгенерированный признак random с рандомными вещественными значениями.\n",
    "\n",
    "## Корреляции\n",
    "\n",
    "Нарисуйте матрицу корреляций признаков. Вам поможет код:\n",
    "```\n",
    "corr = data.corr()\n",
    "sns.heatmap(corr)\n",
    "```\n",
    "Нарисуйте 4 графика рассеяния: два на осях самых коррелированных пар признаков и два - для некоррелированных пар. Скопируйте их в отчет, разместив рядом друг с другом. Чем коррелированные графики отличаются от некореллированных?\n",
    "\n",
    "С какими признаками сильнее всего коррелирует целевой?\n",
    "\n",
    "\n",
    "## Важность признаков\n",
    "\n",
    "Сравните разные подходы к определению \"важных\" признаков. Для этого постройте столбцовую диаграмму, в которой по оси х будут отмечены названия признаков. Каждому признаку соответсвует набор столбцов разного цвета, высота которых отражает важность в смысле разных определений. Нормируйте все важности одного типа на максимальную важность этого типа. Если признаков больше 7, разбейте диаграмму на несколько рисунков по 7 признаков в каждом. \n",
    "\n",
    "Подходы к определению важности признака f:\n",
    "\n",
    "* качество предсказания целевого признака моделью ExtraTrees по одному признаку f \n",
    "\n",
    "* Свойство feature_importances_ модели ExtraTrees, обученной **на всех признаках** одновременно\n",
    "\n",
    "* Модуль коэффициента линейной модели (признаки должны быть нормированными!)\n",
    "\n",
    "* Модуль коэффициента корреляции с целевым признаком\n",
    "\n",
    "* Количество взаимной информации в f и целевом признаке (используйте mutual_info_regression для задачи регрессии и mutual_info_classif для задачи классификации)\n",
    "\n",
    "Код для построения столбцовой диаграммы по датафрейму из важностей (см. лаб. работу №1):\n",
    "```\n",
    "importance = importance.melt(id_vars=['name'], value_vars=['quality', 'ExtraTrees', 'linear', 'corr', 'MI'])\n",
    "sns.barplot(x='value', y='name', hue='variable', data=importance)\n",
    "```\n",
    "\n",
    "Какой самый важный признак? Какая важность оказалась у признака random?\n",
    "\n",
    "## Главные компоненты\n",
    "\n",
    "1) Примените метод главных компонент к нормированной матрице объектов-признаков (sklearn.decomposition.PCA). Спроектируйте датасет на две главные компоненты (fit_transform) и постройте в плоскости этих компонент график рассеяния датасета, используя в качестве цвета значения целевого признака.  \n",
    "\n",
    "2) Выведите координаты главной компоненты и соответсвующие им названия признаков (свойство components_). Анализируя вывод, выясните какие признаки меняются \"в унисон\" и соответствует ли это матрице корреляций. \n",
    "\n",
    "3) Примените PCA в качестве генеративной модели. Эффектнее всего такая генерация выглядит для датасета с изображениями, но мы попробуем применить аналогичную операцию и для наших данных. Для этого на графике рассеяния выберите какие-нибудь два набора значений главных компонент в областях разных классов (разных значений целевого признака - для регрессии). Причем выберите так, чтобы этим значениям не соответствовала никакая точка из обучающей выборки. После этого примените обратную трансформацию и найдите признаки, соответсвующие этим двум наборам. Запишите в отчете эти два набора в таблицу вместе с 10 другими случайными объектами. Насколько эти два искусственно построенных объекта реальны? Сможете ли вы отличить реальные объекты от искусственно сгенерированных?\n",
    "\n",
    "4) Найдите две главные компоненты методом PLS (sklearn.cross_decomposition.PLSRegression, StandardScaler использовать не нужно - он уже встроен в PLSRegression). Нарисуйте аналогичный п.1 график рассеяния и поместите оба графика в отчете рядом друг с другом\n",
    "\n",
    "Полезный код:\n",
    "\n",
    "```\n",
    "pca_transformer = make_pipeline(StandardScaler(), PCA(n_components=2))\n",
    "pca_features = pca_transformer.fit_transform(data.loc[:, data.columns != label])\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5deb0216-d249-42af-9f3e-e49050fe5460",
   "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.10.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
