{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "9e9ed0be",
   "metadata": {},
   "source": [
    "# Регрессия по датасету NASA Kepler Object of Interest\n",
    "\n",
    "В работе решается задача регрессии четырьмя способами:\n",
    "1. линейная регрессия по всем признакам;\n",
    "2. линейная регрессия после классического отбора признаков;\n",
    "3. нейросеть по всем признакам;\n",
    "4. ансамбль нейросетей по трём методам отбора признаков.\n",
    "\n",
    "Финальный текстовый вывод в ноутбуке не приводится. В конце печатаются все ключевые метрики для подготовки итогового вывода по фактическим результатам.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "2864671b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import re\n",
    "import json\n",
    "import random\n",
    "import warnings\n",
    "from pathlib import Path\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.compose import ColumnTransformer\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.impute import SimpleImputer\n",
    "from sklearn.preprocessing import OneHotEncoder, StandardScaler\n",
    "from sklearn.feature_selection import SelectKBest, f_regression, mutual_info_regression, RFE, SelectFromModel\n",
    "from sklearn.linear_model import LinearRegression, LassoCV\n",
    "from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error\n",
    "from sklearn.ensemble import RandomForestRegressor\n",
    "\n",
    "warnings.filterwarnings('ignore')\n",
    "SEED = 42\n",
    "np.random.seed(SEED)\n",
    "random.seed(SEED)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "0ce63254",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TensorFlow доступен: True\n"
     ]
    }
   ],
   "source": [
    "def set_global_seed(seed: int = 42):\n",
    "    import os\n",
    "    os.environ['PYTHONHASHSEED'] = str(seed)\n",
    "    np.random.seed(seed)\n",
    "    random.seed(seed)\n",
    "    try:\n",
    "        import tensorflow as tf\n",
    "        tf.keras.utils.set_random_seed(seed)\n",
    "        try:\n",
    "            tf.config.experimental.enable_op_determinism()\n",
    "        except Exception:\n",
    "            pass\n",
    "        return tf\n",
    "    except Exception:\n",
    "        return None\n",
    "\n",
    "TF = set_global_seed(SEED)\n",
    "USE_TF = TF is not None\n",
    "print('TensorFlow доступен:', USE_TF)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "bba9e04a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Используемый файл: NASA Exoplanet.csv\n",
      "Форма датасета: (9564, 49)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>kepid</th>\n",
       "      <th>kepoi_name</th>\n",
       "      <th>kepler_name</th>\n",
       "      <th>koi_disposition</th>\n",
       "      <th>koi_pdisposition</th>\n",
       "      <th>koi_score</th>\n",
       "      <th>koi_fpflag_nt</th>\n",
       "      <th>koi_fpflag_ss</th>\n",
       "      <th>koi_fpflag_co</th>\n",
       "      <th>koi_fpflag_ec</th>\n",
       "      <th>...</th>\n",
       "      <th>koi_steff_err2</th>\n",
       "      <th>koi_slogg</th>\n",
       "      <th>koi_slogg_err1</th>\n",
       "      <th>koi_slogg_err2</th>\n",
       "      <th>koi_srad</th>\n",
       "      <th>koi_srad_err1</th>\n",
       "      <th>koi_srad_err2</th>\n",
       "      <th>ra</th>\n",
       "      <th>dec</th>\n",
       "      <th>koi_kepmag</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10797460</td>\n",
       "      <td>K00752.01</td>\n",
       "      <td>Kepler-227 b</td>\n",
       "      <td>CONFIRMED</td>\n",
       "      <td>CANDIDATE</td>\n",
       "      <td>1.000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>-81.0</td>\n",
       "      <td>4.467</td>\n",
       "      <td>0.064</td>\n",
       "      <td>-0.096</td>\n",
       "      <td>0.927</td>\n",
       "      <td>0.105</td>\n",
       "      <td>-0.061</td>\n",
       "      <td>291.93423</td>\n",
       "      <td>48.141651</td>\n",
       "      <td>15.347</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10797460</td>\n",
       "      <td>K00752.02</td>\n",
       "      <td>Kepler-227 c</td>\n",
       "      <td>CONFIRMED</td>\n",
       "      <td>CANDIDATE</td>\n",
       "      <td>0.969</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>-81.0</td>\n",
       "      <td>4.467</td>\n",
       "      <td>0.064</td>\n",
       "      <td>-0.096</td>\n",
       "      <td>0.927</td>\n",
       "      <td>0.105</td>\n",
       "      <td>-0.061</td>\n",
       "      <td>291.93423</td>\n",
       "      <td>48.141651</td>\n",
       "      <td>15.347</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10811496</td>\n",
       "      <td>K00753.01</td>\n",
       "      <td>NaN</td>\n",
       "      <td>CANDIDATE</td>\n",
       "      <td>CANDIDATE</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>-176.0</td>\n",
       "      <td>4.544</td>\n",
       "      <td>0.044</td>\n",
       "      <td>-0.176</td>\n",
       "      <td>0.868</td>\n",
       "      <td>0.233</td>\n",
       "      <td>-0.078</td>\n",
       "      <td>297.00482</td>\n",
       "      <td>48.134129</td>\n",
       "      <td>15.436</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10848459</td>\n",
       "      <td>K00754.01</td>\n",
       "      <td>NaN</td>\n",
       "      <td>FALSE POSITIVE</td>\n",
       "      <td>FALSE POSITIVE</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>-174.0</td>\n",
       "      <td>4.564</td>\n",
       "      <td>0.053</td>\n",
       "      <td>-0.168</td>\n",
       "      <td>0.791</td>\n",
       "      <td>0.201</td>\n",
       "      <td>-0.067</td>\n",
       "      <td>285.53461</td>\n",
       "      <td>48.285210</td>\n",
       "      <td>15.597</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10854555</td>\n",
       "      <td>K00755.01</td>\n",
       "      <td>Kepler-664 b</td>\n",
       "      <td>CONFIRMED</td>\n",
       "      <td>CANDIDATE</td>\n",
       "      <td>1.000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>-211.0</td>\n",
       "      <td>4.438</td>\n",
       "      <td>0.070</td>\n",
       "      <td>-0.210</td>\n",
       "      <td>1.046</td>\n",
       "      <td>0.334</td>\n",
       "      <td>-0.133</td>\n",
       "      <td>288.75488</td>\n",
       "      <td>48.226200</td>\n",
       "      <td>15.509</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 49 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      kepid kepoi_name   kepler_name koi_disposition koi_pdisposition  \\\n",
       "0  10797460  K00752.01  Kepler-227 b       CONFIRMED        CANDIDATE   \n",
       "1  10797460  K00752.02  Kepler-227 c       CONFIRMED        CANDIDATE   \n",
       "2  10811496  K00753.01           NaN       CANDIDATE        CANDIDATE   \n",
       "3  10848459  K00754.01           NaN  FALSE POSITIVE   FALSE POSITIVE   \n",
       "4  10854555  K00755.01  Kepler-664 b       CONFIRMED        CANDIDATE   \n",
       "\n",
       "   koi_score  koi_fpflag_nt  koi_fpflag_ss  koi_fpflag_co  koi_fpflag_ec  ...  \\\n",
       "0      1.000              0              0              0              0  ...   \n",
       "1      0.969              0              0              0              0  ...   \n",
       "2      0.000              0              0              0              0  ...   \n",
       "3      0.000              0              1              0              0  ...   \n",
       "4      1.000              0              0              0              0  ...   \n",
       "\n",
       "   koi_steff_err2  koi_slogg  koi_slogg_err1  koi_slogg_err2  koi_srad  \\\n",
       "0           -81.0      4.467           0.064          -0.096     0.927   \n",
       "1           -81.0      4.467           0.064          -0.096     0.927   \n",
       "2          -176.0      4.544           0.044          -0.176     0.868   \n",
       "3          -174.0      4.564           0.053          -0.168     0.791   \n",
       "4          -211.0      4.438           0.070          -0.210     1.046   \n",
       "\n",
       "   koi_srad_err1  koi_srad_err2         ra        dec  koi_kepmag  \n",
       "0          0.105         -0.061  291.93423  48.141651      15.347  \n",
       "1          0.105         -0.061  291.93423  48.141651      15.347  \n",
       "2          0.233         -0.078  297.00482  48.134129      15.436  \n",
       "3          0.201         -0.067  285.53461  48.285210      15.597  \n",
       "4          0.334         -0.133  288.75488  48.226200      15.509  \n",
       "\n",
       "[5 rows x 49 columns]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Типы данных:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>dtype</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>kepid</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>kepoi_name</th>\n",
       "      <td>object</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>kepler_name</th>\n",
       "      <td>object</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_disposition</th>\n",
       "      <td>object</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_pdisposition</th>\n",
       "      <td>object</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_score</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_fpflag_nt</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_fpflag_ss</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_fpflag_co</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_fpflag_ec</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_period</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_period_err1</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_period_err2</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_time0bk</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_time0bk_err1</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_time0bk_err2</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_impact</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_impact_err1</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_impact_err2</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_duration</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_duration_err1</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_duration_err2</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_depth</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_depth_err1</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_depth_err2</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_prad</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_prad_err1</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_prad_err2</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_teq</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_teq_err1</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_teq_err2</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_insol</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_insol_err1</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_insol_err2</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_model_snr</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_tce_plnt_num</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_tce_delivname</th>\n",
       "      <td>object</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_steff</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_steff_err1</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_steff_err2</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_slogg</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_slogg_err1</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_slogg_err2</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_srad</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_srad_err1</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_srad_err2</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>ra</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>dec</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>koi_kepmag</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     dtype\n",
       "kepid                int64\n",
       "kepoi_name          object\n",
       "kepler_name         object\n",
       "koi_disposition     object\n",
       "koi_pdisposition    object\n",
       "koi_score          float64\n",
       "koi_fpflag_nt        int64\n",
       "koi_fpflag_ss        int64\n",
       "koi_fpflag_co        int64\n",
       "koi_fpflag_ec        int64\n",
       "koi_period         float64\n",
       "koi_period_err1    float64\n",
       "koi_period_err2    float64\n",
       "koi_time0bk        float64\n",
       "koi_time0bk_err1   float64\n",
       "koi_time0bk_err2   float64\n",
       "koi_impact         float64\n",
       "koi_impact_err1    float64\n",
       "koi_impact_err2    float64\n",
       "koi_duration       float64\n",
       "koi_duration_err1  float64\n",
       "koi_duration_err2  float64\n",
       "koi_depth          float64\n",
       "koi_depth_err1     float64\n",
       "koi_depth_err2     float64\n",
       "koi_prad           float64\n",
       "koi_prad_err1      float64\n",
       "koi_prad_err2      float64\n",
       "koi_teq            float64\n",
       "koi_teq_err1       float64\n",
       "koi_teq_err2       float64\n",
       "koi_insol          float64\n",
       "koi_insol_err1     float64\n",
       "koi_insol_err2     float64\n",
       "koi_model_snr      float64\n",
       "koi_tce_plnt_num   float64\n",
       "koi_tce_delivname   object\n",
       "koi_steff          float64\n",
       "koi_steff_err1     float64\n",
       "koi_steff_err2     float64\n",
       "koi_slogg          float64\n",
       "koi_slogg_err1     float64\n",
       "koi_slogg_err2     float64\n",
       "koi_srad           float64\n",
       "koi_srad_err1      float64\n",
       "koi_srad_err2      float64\n",
       "ra                 float64\n",
       "dec                float64\n",
       "koi_kepmag         float64"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Поиск CSV-файла\n",
    "candidate_paths = [\n",
    "    Path('NASA Exoplanet.csv'),\n",
    "    Path('/mnt/data/NASA Exoplanet.csv'),\n",
    "    Path('/home/konnilol/Documents/uni/mmo/pr13/NASA Exoplanet.csv')\n",
    "]\n",
    "\n",
    "csv_path = None\n",
    "for p in candidate_paths:\n",
    "    if p.exists():\n",
    "        csv_path = p\n",
    "        break\n",
    "\n",
    "if csv_path is None:\n",
    "    # поиск похожего файла в текущей директории и /mnt/data\n",
    "    search_roots = [Path('.'), Path('/mnt/data')]\n",
    "    for root in search_roots:\n",
    "        if root.exists():\n",
    "            for p in root.glob('*.csv'):\n",
    "                name = p.name.lower()\n",
    "                if ('nasa' in name or 'exoplanet' in name or 'koi' in name) and p.exists():\n",
    "                    csv_path = p\n",
    "                    break\n",
    "        if csv_path is not None:\n",
    "            break\n",
    "\n",
    "if csv_path is None:\n",
    "    raise FileNotFoundError('CSV-файл не найден. Поместите файл NASA Exoplanet.csv рядом с ноутбуком или укажите путь вручную.')\n",
    "\n",
    "print('Используемый файл:', csv_path)\n",
    "df = pd.read_csv(csv_path)\n",
    "print('Форма датасета:', df.shape)\n",
    "display(df.head())\n",
    "print('Типы данных:')\n",
    "display(df.dtypes.rename('dtype').to_frame())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a27f51cc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>original_name</th>\n",
       "      <th>normalized_name</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>kepid</td>\n",
       "      <td>kepid</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>kepoi_name</td>\n",
       "      <td>kepoi_name</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>kepler_name</td>\n",
       "      <td>kepler_name</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>koi_disposition</td>\n",
       "      <td>koi_disposition</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>koi_pdisposition</td>\n",
       "      <td>koi_pdisposition</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>koi_score</td>\n",
       "      <td>koi_score</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>koi_fpflag_nt</td>\n",
       "      <td>koi_fpflag_nt</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>koi_fpflag_ss</td>\n",
       "      <td>koi_fpflag_ss</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>koi_fpflag_co</td>\n",
       "      <td>koi_fpflag_co</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>koi_fpflag_ec</td>\n",
       "      <td>koi_fpflag_ec</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>koi_period</td>\n",
       "      <td>koi_period</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>koi_period_err1</td>\n",
       "      <td>koi_period_err1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>koi_period_err2</td>\n",
       "      <td>koi_period_err2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>koi_time0bk</td>\n",
       "      <td>koi_time0bk</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>koi_time0bk_err1</td>\n",
       "      <td>koi_time0bk_err1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>koi_time0bk_err2</td>\n",
       "      <td>koi_time0bk_err2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>koi_impact</td>\n",
       "      <td>koi_impact</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>koi_impact_err1</td>\n",
       "      <td>koi_impact_err1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>koi_impact_err2</td>\n",
       "      <td>koi_impact_err2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>koi_duration</td>\n",
       "      <td>koi_duration</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>koi_duration_err1</td>\n",
       "      <td>koi_duration_err1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>koi_duration_err2</td>\n",
       "      <td>koi_duration_err2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>koi_depth</td>\n",
       "      <td>koi_depth</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>koi_depth_err1</td>\n",
       "      <td>koi_depth_err1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>koi_depth_err2</td>\n",
       "      <td>koi_depth_err2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>koi_prad</td>\n",
       "      <td>koi_prad</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>koi_prad_err1</td>\n",
       "      <td>koi_prad_err1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>koi_prad_err2</td>\n",
       "      <td>koi_prad_err2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>koi_teq</td>\n",
       "      <td>koi_teq</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>koi_teq_err1</td>\n",
       "      <td>koi_teq_err1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>koi_teq_err2</td>\n",
       "      <td>koi_teq_err2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>koi_insol</td>\n",
       "      <td>koi_insol</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>koi_insol_err1</td>\n",
       "      <td>koi_insol_err1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>koi_insol_err2</td>\n",
       "      <td>koi_insol_err2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>koi_model_snr</td>\n",
       "      <td>koi_model_snr</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>koi_tce_plnt_num</td>\n",
       "      <td>koi_tce_plnt_num</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>koi_tce_delivname</td>\n",
       "      <td>koi_tce_delivname</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>koi_steff</td>\n",
       "      <td>koi_steff</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>koi_steff_err1</td>\n",
       "      <td>koi_steff_err1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39</th>\n",
       "      <td>koi_steff_err2</td>\n",
       "      <td>koi_steff_err2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>koi_slogg</td>\n",
       "      <td>koi_slogg</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>41</th>\n",
       "      <td>koi_slogg_err1</td>\n",
       "      <td>koi_slogg_err1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>koi_slogg_err2</td>\n",
       "      <td>koi_slogg_err2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43</th>\n",
       "      <td>koi_srad</td>\n",
       "      <td>koi_srad</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44</th>\n",
       "      <td>koi_srad_err1</td>\n",
       "      <td>koi_srad_err1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45</th>\n",
       "      <td>koi_srad_err2</td>\n",
       "      <td>koi_srad_err2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>46</th>\n",
       "      <td>ra</td>\n",
       "      <td>ra</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>47</th>\n",
       "      <td>dec</td>\n",
       "      <td>dec</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>48</th>\n",
       "      <td>koi_kepmag</td>\n",
       "      <td>koi_kepmag</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        original_name    normalized_name\n",
       "0               kepid              kepid\n",
       "1          kepoi_name         kepoi_name\n",
       "2         kepler_name        kepler_name\n",
       "3     koi_disposition    koi_disposition\n",
       "4    koi_pdisposition   koi_pdisposition\n",
       "5           koi_score          koi_score\n",
       "6       koi_fpflag_nt      koi_fpflag_nt\n",
       "7       koi_fpflag_ss      koi_fpflag_ss\n",
       "8       koi_fpflag_co      koi_fpflag_co\n",
       "9       koi_fpflag_ec      koi_fpflag_ec\n",
       "10         koi_period         koi_period\n",
       "11    koi_period_err1    koi_period_err1\n",
       "12    koi_period_err2    koi_period_err2\n",
       "13        koi_time0bk        koi_time0bk\n",
       "14   koi_time0bk_err1   koi_time0bk_err1\n",
       "15   koi_time0bk_err2   koi_time0bk_err2\n",
       "16         koi_impact         koi_impact\n",
       "17    koi_impact_err1    koi_impact_err1\n",
       "18    koi_impact_err2    koi_impact_err2\n",
       "19       koi_duration       koi_duration\n",
       "20  koi_duration_err1  koi_duration_err1\n",
       "21  koi_duration_err2  koi_duration_err2\n",
       "22          koi_depth          koi_depth\n",
       "23     koi_depth_err1     koi_depth_err1\n",
       "24     koi_depth_err2     koi_depth_err2\n",
       "25           koi_prad           koi_prad\n",
       "26      koi_prad_err1      koi_prad_err1\n",
       "27      koi_prad_err2      koi_prad_err2\n",
       "28            koi_teq            koi_teq\n",
       "29       koi_teq_err1       koi_teq_err1\n",
       "30       koi_teq_err2       koi_teq_err2\n",
       "31          koi_insol          koi_insol\n",
       "32     koi_insol_err1     koi_insol_err1\n",
       "33     koi_insol_err2     koi_insol_err2\n",
       "34      koi_model_snr      koi_model_snr\n",
       "35   koi_tce_plnt_num   koi_tce_plnt_num\n",
       "36  koi_tce_delivname  koi_tce_delivname\n",
       "37          koi_steff          koi_steff\n",
       "38     koi_steff_err1     koi_steff_err1\n",
       "39     koi_steff_err2     koi_steff_err2\n",
       "40          koi_slogg          koi_slogg\n",
       "41     koi_slogg_err1     koi_slogg_err1\n",
       "42     koi_slogg_err2     koi_slogg_err2\n",
       "43           koi_srad           koi_srad\n",
       "44      koi_srad_err1      koi_srad_err1\n",
       "45      koi_srad_err2      koi_srad_err2\n",
       "46                 ra                 ra\n",
       "47                dec                dec\n",
       "48         koi_kepmag         koi_kepmag"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def normalize_name(name: str) -> str:\n",
    "    name = str(name).strip().lower()\n",
    "    name = name.replace('°', 'deg')\n",
    "    name = re.sub(r'[^a-z0-9]+', '_', name)\n",
    "    name = re.sub(r'_+', '_', name).strip('_')\n",
    "    return name\n",
    "\n",
    "original_columns = df.columns.tolist()\n",
    "normalized_columns = [normalize_name(c) for c in original_columns]\n",
    "col_map = dict(zip(original_columns, normalized_columns))\n",
    "\n",
    "df = df.rename(columns=col_map)\n",
    "display(pd.DataFrame({'original_name': original_columns, 'normalized_name': normalized_columns}))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "12ce029a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Выбранная зависимая переменная: koi_period\n"
     ]
    }
   ],
   "source": [
    "# Автоматический выбор зависимой переменной для регрессии\n",
    "# Приоритет отдаётся содержательной непрерывной переменной радиуса планеты.\n",
    "priority_targets = [\n",
    "    'koi_prad',\n",
    "    'koi_period',\n",
    "    'koi_duration',\n",
    "    'koi_depth',\n",
    "    'koi_teq',\n",
    "    'koi_insol',\n",
    "    'koi_kepmag'\n",
    "]\n",
    "\n",
    "numeric_cols = df.select_dtypes(include=[np.number]).columns.tolist()\n",
    "missing_share = df.isna().mean()\n",
    "\n",
    "non_feature_patterns = [\n",
    "    'err1', 'err2', 'score', 'flag', 'kepid', 'ra', 'dec', 'tce_plnt_num'\n",
    "]\n",
    "\n",
    "candidate_numeric = [\n",
    "    c for c in numeric_cols\n",
    "    if missing_share[c] < 0.35 and not any(p in c for p in non_feature_patterns)\n",
    "]\n",
    "\n",
    "selected_target = None\n",
    "for c in priority_targets:\n",
    "    if c in candidate_numeric:\n",
    "        selected_target = c\n",
    "        break\n",
    "\n",
    "if selected_target is None:\n",
    "    # fallback: содержательная числовая переменная с умеренной вариативностью\n",
    "    candidate_stats = []\n",
    "    for c in candidate_numeric:\n",
    "        nunique = df[c].nunique(dropna=True)\n",
    "        if nunique >= 20:\n",
    "            candidate_stats.append((c, missing_share[c], nunique))\n",
    "    if not candidate_stats:\n",
    "        raise ValueError('Не удалось автоматически определить зависимую переменную.')\n",
    "    candidate_stats = sorted(candidate_stats, key=lambda x: (x[1], -x[2]))\n",
    "    selected_target = candidate_stats[0][0]\n",
    "\n",
    "print('Выбранная зависимая переменная:', selected_target)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "825f0181",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Исключённые столбцы: ['kepid', 'kepler_name', 'kepoi_name', 'koi_period', 'koi_period_err1', 'koi_period_err2', 'koi_teq_err1', 'koi_teq_err2']\n",
      "Форма X: (9564, 41)\n",
      "Доля пропусков в y: 0.0\n"
     ]
    }
   ],
   "source": [
    "# Удаление явных идентификаторов и утечек\n",
    "id_like = [c for c in df.columns if c in ['kepid', 'kepoi_name', 'kepler_name'] or c.endswith('_name')]\n",
    "\n",
    "# Исключаем переменные, напрямую характеризующие целевую переменную ошибками измерения или служебными версиями\n",
    "leak_like = [c for c in df.columns if c.startswith(selected_target + '_err')]\n",
    "\n",
    "# Отдельно исключаем полностью/почти полностью пропущенные признаки\n",
    "high_na_cols = df.columns[df.isna().mean() > 0.70].tolist()\n",
    "\n",
    "exclude_cols = sorted(set(id_like + leak_like + [selected_target] + high_na_cols))\n",
    "X = df.drop(columns=exclude_cols, errors='ignore').copy()\n",
    "y = df[selected_target].copy()\n",
    "\n",
    "# Оставляем только строки с известным target\n",
    "mask = y.notna()\n",
    "X = X.loc[mask].reset_index(drop=True)\n",
    "y = y.loc[mask].reset_index(drop=True)\n",
    "\n",
    "print('Исключённые столбцы:', exclude_cols)\n",
    "print('Форма X:', X.shape)\n",
    "print('Доля пропусков в y:', df[selected_target].isna().mean())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "bc01ce3e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Удалены константные признаки: []\n",
      "Итоговая форма X: (9564, 41)\n",
      "Числовые признаки: 38\n",
      "Категориальные признаки: 3\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numeric_features</th>\n",
       "      <th>categorical_features</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>koi_score</td>\n",
       "      <td>koi_disposition</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>koi_fpflag_nt</td>\n",
       "      <td>koi_pdisposition</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>koi_fpflag_ss</td>\n",
       "      <td>koi_tce_delivname</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>koi_fpflag_co</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>koi_fpflag_ec</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>koi_time0bk</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>koi_time0bk_err1</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>koi_time0bk_err2</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>koi_impact</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>koi_impact_err1</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>koi_impact_err2</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>koi_duration</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>koi_duration_err1</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>koi_duration_err2</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>koi_depth</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>koi_depth_err1</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>koi_depth_err2</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>koi_prad</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>koi_prad_err1</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>koi_prad_err2</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>koi_teq</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>koi_insol</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>koi_insol_err1</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>koi_insol_err2</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>koi_model_snr</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>koi_tce_plnt_num</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>koi_steff</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>koi_steff_err1</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>koi_steff_err2</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>koi_slogg</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>koi_slogg_err1</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>koi_slogg_err2</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>koi_srad</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>koi_srad_err1</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>koi_srad_err2</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>ra</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>dec</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>koi_kepmag</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     numeric_features categorical_features\n",
       "0           koi_score      koi_disposition\n",
       "1       koi_fpflag_nt     koi_pdisposition\n",
       "2       koi_fpflag_ss    koi_tce_delivname\n",
       "3       koi_fpflag_co                  NaN\n",
       "4       koi_fpflag_ec                  NaN\n",
       "5         koi_time0bk                  NaN\n",
       "6    koi_time0bk_err1                  NaN\n",
       "7    koi_time0bk_err2                  NaN\n",
       "8          koi_impact                  NaN\n",
       "9     koi_impact_err1                  NaN\n",
       "10    koi_impact_err2                  NaN\n",
       "11       koi_duration                  NaN\n",
       "12  koi_duration_err1                  NaN\n",
       "13  koi_duration_err2                  NaN\n",
       "14          koi_depth                  NaN\n",
       "15     koi_depth_err1                  NaN\n",
       "16     koi_depth_err2                  NaN\n",
       "17           koi_prad                  NaN\n",
       "18      koi_prad_err1                  NaN\n",
       "19      koi_prad_err2                  NaN\n",
       "20            koi_teq                  NaN\n",
       "21          koi_insol                  NaN\n",
       "22     koi_insol_err1                  NaN\n",
       "23     koi_insol_err2                  NaN\n",
       "24      koi_model_snr                  NaN\n",
       "25   koi_tce_plnt_num                  NaN\n",
       "26          koi_steff                  NaN\n",
       "27     koi_steff_err1                  NaN\n",
       "28     koi_steff_err2                  NaN\n",
       "29          koi_slogg                  NaN\n",
       "30     koi_slogg_err1                  NaN\n",
       "31     koi_slogg_err2                  NaN\n",
       "32           koi_srad                  NaN\n",
       "33      koi_srad_err1                  NaN\n",
       "34      koi_srad_err2                  NaN\n",
       "35                 ra                  NaN\n",
       "36                dec                  NaN\n",
       "37         koi_kepmag                  NaN"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Огрублённая очистка: убираем константные и почти константные признаки\n",
    "low_var_cols = []\n",
    "for c in X.columns:\n",
    "    nunique = X[c].nunique(dropna=True)\n",
    "    if nunique <= 1:\n",
    "        low_var_cols.append(c)\n",
    "\n",
    "X = X.drop(columns=low_var_cols, errors='ignore')\n",
    "print('Удалены константные признаки:', low_var_cols)\n",
    "print('Итоговая форма X:', X.shape)\n",
    "\n",
    "numeric_features = X.select_dtypes(include=[np.number]).columns.tolist()\n",
    "categorical_features = [c for c in X.columns if c not in numeric_features]\n",
    "\n",
    "print('Числовые признаки:', len(numeric_features))\n",
    "print('Категориальные признаки:', len(categorical_features))\n",
    "display(pd.DataFrame({'numeric_features': pd.Series(numeric_features), 'categorical_features': pd.Series(categorical_features)}))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "5717a571",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train: (7651, 41) Test: (1913, 41) Val для НС: (1531, 41)\n"
     ]
    }
   ],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(\n",
    "    X, y, test_size=0.2, random_state=SEED\n",
    ")\n",
    "\n",
    "# небольшой validation для нейросетей\n",
    "X_train_nn, X_val_nn, y_train_nn, y_val_nn = train_test_split(\n",
    "    X_train, y_train, test_size=0.2, random_state=SEED\n",
    ")\n",
    "\n",
    "print('Train:', X_train.shape, 'Test:', X_test.shape, 'Val для НС:', X_val_nn.shape)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "ee5c29f3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Размерность после кодирования: 46\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>num__koi_score</th>\n",
       "      <th>num__koi_fpflag_nt</th>\n",
       "      <th>num__koi_fpflag_ss</th>\n",
       "      <th>num__koi_fpflag_co</th>\n",
       "      <th>num__koi_fpflag_ec</th>\n",
       "      <th>num__koi_time0bk</th>\n",
       "      <th>num__koi_time0bk_err1</th>\n",
       "      <th>num__koi_time0bk_err2</th>\n",
       "      <th>num__koi_impact</th>\n",
       "      <th>num__koi_impact_err1</th>\n",
       "      <th>...</th>\n",
       "      <th>num__dec</th>\n",
       "      <th>num__koi_kepmag</th>\n",
       "      <th>cat__koi_disposition_CANDIDATE</th>\n",
       "      <th>cat__koi_disposition_CONFIRMED</th>\n",
       "      <th>cat__koi_disposition_FALSE POSITIVE</th>\n",
       "      <th>cat__koi_pdisposition_CANDIDATE</th>\n",
       "      <th>cat__koi_pdisposition_FALSE POSITIVE</th>\n",
       "      <th>cat__koi_tce_delivname_q1_q16_tce</th>\n",
       "      <th>cat__koi_tce_delivname_q1_q17_dr24_tce</th>\n",
       "      <th>cat__koi_tce_delivname_q1_q17_dr25_tce</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>8117</th>\n",
       "      <td>-1.018782</td>\n",
       "      <td>0.145800</td>\n",
       "      <td>-0.555660</td>\n",
       "      <td>2.02585</td>\n",
       "      <td>2.752699</td>\n",
       "      <td>-0.507685</td>\n",
       "      <td>-0.136287</td>\n",
       "      <td>0.136287</td>\n",
       "      <td>-0.127040</td>\n",
       "      <td>-0.177027</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.037889</td>\n",
       "      <td>0.215407</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5245</th>\n",
       "      <td>1.237579</td>\n",
       "      <td>-0.041934</td>\n",
       "      <td>-0.555660</td>\n",
       "      <td>-0.49362</td>\n",
       "      <td>-0.363280</td>\n",
       "      <td>-0.379101</td>\n",
       "      <td>-0.324170</td>\n",
       "      <td>0.324170</td>\n",
       "      <td>-0.177811</td>\n",
       "      <td>-0.160815</td>\n",
       "      <td>...</td>\n",
       "      <td>1.634841</td>\n",
       "      <td>-0.351469</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5865</th>\n",
       "      <td>1.244369</td>\n",
       "      <td>-0.041934</td>\n",
       "      <td>-0.555660</td>\n",
       "      <td>2.02585</td>\n",
       "      <td>-0.363280</td>\n",
       "      <td>-0.501236</td>\n",
       "      <td>-0.282615</td>\n",
       "      <td>0.282615</td>\n",
       "      <td>-0.039601</td>\n",
       "      <td>-0.196209</td>\n",
       "      <td>...</td>\n",
       "      <td>-1.055615</td>\n",
       "      <td>-2.759246</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4050</th>\n",
       "      <td>-1.018782</td>\n",
       "      <td>-0.041934</td>\n",
       "      <td>1.799661</td>\n",
       "      <td>2.02585</td>\n",
       "      <td>-0.363280</td>\n",
       "      <td>1.415000</td>\n",
       "      <td>-0.227797</td>\n",
       "      <td>0.227797</td>\n",
       "      <td>0.045300</td>\n",
       "      <td>-0.198492</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.591222</td>\n",
       "      <td>0.821329</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5130</th>\n",
       "      <td>1.235316</td>\n",
       "      <td>-0.041934</td>\n",
       "      <td>-0.555660</td>\n",
       "      <td>-0.49362</td>\n",
       "      <td>-0.363280</td>\n",
       "      <td>-0.485149</td>\n",
       "      <td>0.140895</td>\n",
       "      <td>-0.140895</td>\n",
       "      <td>-0.199248</td>\n",
       "      <td>-0.151567</td>\n",
       "      <td>...</td>\n",
       "      <td>0.776489</td>\n",
       "      <td>1.216840</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 46 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      num__koi_score  num__koi_fpflag_nt  num__koi_fpflag_ss  \\\n",
       "8117       -1.018782            0.145800           -0.555660   \n",
       "5245        1.237579           -0.041934           -0.555660   \n",
       "5865        1.244369           -0.041934           -0.555660   \n",
       "4050       -1.018782           -0.041934            1.799661   \n",
       "5130        1.235316           -0.041934           -0.555660   \n",
       "\n",
       "      num__koi_fpflag_co  num__koi_fpflag_ec  num__koi_time0bk  \\\n",
       "8117             2.02585            2.752699         -0.507685   \n",
       "5245            -0.49362           -0.363280         -0.379101   \n",
       "5865             2.02585           -0.363280         -0.501236   \n",
       "4050             2.02585           -0.363280          1.415000   \n",
       "5130            -0.49362           -0.363280         -0.485149   \n",
       "\n",
       "      num__koi_time0bk_err1  num__koi_time0bk_err2  num__koi_impact  \\\n",
       "8117              -0.136287               0.136287        -0.127040   \n",
       "5245              -0.324170               0.324170        -0.177811   \n",
       "5865              -0.282615               0.282615        -0.039601   \n",
       "4050              -0.227797               0.227797         0.045300   \n",
       "5130               0.140895              -0.140895        -0.199248   \n",
       "\n",
       "      num__koi_impact_err1  ...  num__dec  num__koi_kepmag  \\\n",
       "8117             -0.177027  ... -0.037889         0.215407   \n",
       "5245             -0.160815  ...  1.634841        -0.351469   \n",
       "5865             -0.196209  ... -1.055615        -2.759246   \n",
       "4050             -0.198492  ... -0.591222         0.821329   \n",
       "5130             -0.151567  ...  0.776489         1.216840   \n",
       "\n",
       "      cat__koi_disposition_CANDIDATE  cat__koi_disposition_CONFIRMED  \\\n",
       "8117                             0.0                             0.0   \n",
       "5245                             0.0                             1.0   \n",
       "5865                             0.0                             0.0   \n",
       "4050                             0.0                             0.0   \n",
       "5130                             1.0                             0.0   \n",
       "\n",
       "      cat__koi_disposition_FALSE POSITIVE  cat__koi_pdisposition_CANDIDATE  \\\n",
       "8117                                  1.0                              0.0   \n",
       "5245                                  0.0                              1.0   \n",
       "5865                                  1.0                              0.0   \n",
       "4050                                  1.0                              0.0   \n",
       "5130                                  0.0                              1.0   \n",
       "\n",
       "      cat__koi_pdisposition_FALSE POSITIVE  cat__koi_tce_delivname_q1_q16_tce  \\\n",
       "8117                                   1.0                                0.0   \n",
       "5245                                   0.0                                0.0   \n",
       "5865                                   1.0                                0.0   \n",
       "4050                                   1.0                                0.0   \n",
       "5130                                   0.0                                0.0   \n",
       "\n",
       "      cat__koi_tce_delivname_q1_q17_dr24_tce  \\\n",
       "8117                                     0.0   \n",
       "5245                                     0.0   \n",
       "5865                                     0.0   \n",
       "4050                                     0.0   \n",
       "5130                                     0.0   \n",
       "\n",
       "      cat__koi_tce_delivname_q1_q17_dr25_tce  \n",
       "8117                                     1.0  \n",
       "5245                                     1.0  \n",
       "5865                                     1.0  \n",
       "4050                                     1.0  \n",
       "5130                                     1.0  \n",
       "\n",
       "[5 rows x 46 columns]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def build_preprocessor(num_cols, cat_cols):\n",
    "    num_pipe = Pipeline([\n",
    "        ('imputer', SimpleImputer(strategy='median')),\n",
    "        ('scaler', StandardScaler())\n",
    "    ])\n",
    "    cat_pipe = Pipeline([\n",
    "        ('imputer', SimpleImputer(strategy='most_frequent')),\n",
    "        ('onehot', OneHotEncoder(handle_unknown='ignore', sparse_output=False))\n",
    "    ])\n",
    "    return ColumnTransformer([\n",
    "        ('num', num_pipe, num_cols),\n",
    "        ('cat', cat_pipe, cat_cols)\n",
    "    ], remainder='drop')\n",
    "\n",
    "base_preprocessor = build_preprocessor(numeric_features, categorical_features)\n",
    "X_train_proc = base_preprocessor.fit_transform(X_train)\n",
    "X_test_proc = base_preprocessor.transform(X_test)\n",
    "X_train_proc_df = pd.DataFrame(X_train_proc, columns=base_preprocessor.get_feature_names_out(), index=X_train.index)\n",
    "X_test_proc_df = pd.DataFrame(X_test_proc, columns=base_preprocessor.get_feature_names_out(), index=X_test.index)\n",
    "\n",
    "X_train_nn_proc = base_preprocessor.transform(X_train_nn)\n",
    "X_val_nn_proc = base_preprocessor.transform(X_val_nn)\n",
    "\n",
    "print('Размерность после кодирования:', X_train_proc_df.shape[1])\n",
    "display(X_train_proc_df.head())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "0ad93d0e",
   "metadata": {},
   "outputs": [],
   "source": [
    "def rmse(y_true, y_pred):\n",
    "    return float(np.sqrt(mean_squared_error(y_true, y_pred)))\n",
    "\n",
    "def regression_metrics(y_true, y_pred, prefix=''):\n",
    "    return {\n",
    "        f'{prefix}r2': float(r2_score(y_true, y_pred)),\n",
    "        f'{prefix}rmse': rmse(y_true, y_pred),\n",
    "        f'{prefix}mae': float(mean_absolute_error(y_true, y_pred))\n",
    "    }\n",
    "\n",
    "results = []\n",
    "selected_feature_sets = {}\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "25d13735",
   "metadata": {},
   "source": [
    "## 1. Линейная регрессия по всем признакам\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "9ce9ca75",
   "metadata": {},
   "outputs": [],
   "source": [
    "lin_all = LinearRegression()\n",
    "lin_all.fit(X_train_proc_df, y_train)\n",
    "pred_lin_all = lin_all.predict(X_test_proc_df)\n",
    "\n",
    "metrics_lin_all = regression_metrics(y_test, pred_lin_all)\n",
    "results.append({\n",
    "    'model': 'Линейная регрессия по всем признакам',\n",
    "    **metrics_lin_all,\n",
    "    'n_original_features': X.shape[1],\n",
    "    'n_processed_features': X_train_proc_df.shape[1]\n",
    "})\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "78bcb86b",
   "metadata": {},
   "source": [
    "## 2. Классический отбор признаков + линейная регрессия\n",
    "\n",
    "В качестве классического метода отбора используется **LassoCV**. Отбор выполняется по уже преобразованным признакам.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "35dfeb63",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Число отобранных преобразованных признаков: 46\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>selected_processed_features_lasso</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>num__koi_score</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>num__koi_fpflag_nt</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>num__koi_fpflag_ss</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>num__koi_fpflag_co</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>num__koi_fpflag_ec</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>num__koi_time0bk</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>num__koi_time0bk_err1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>num__koi_time0bk_err2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>num__koi_impact</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>num__koi_impact_err1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>num__koi_impact_err2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>num__koi_duration</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>num__koi_duration_err1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>num__koi_duration_err2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>num__koi_depth</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>num__koi_depth_err1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>num__koi_depth_err2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>num__koi_prad</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>num__koi_prad_err1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>num__koi_prad_err2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>num__koi_teq</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>num__koi_insol</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>num__koi_insol_err1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>num__koi_insol_err2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>num__koi_model_snr</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>num__koi_tce_plnt_num</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>num__koi_steff</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>num__koi_steff_err1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>num__koi_steff_err2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>num__koi_slogg</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   selected_processed_features_lasso\n",
       "0                     num__koi_score\n",
       "1                 num__koi_fpflag_nt\n",
       "2                 num__koi_fpflag_ss\n",
       "3                 num__koi_fpflag_co\n",
       "4                 num__koi_fpflag_ec\n",
       "5                   num__koi_time0bk\n",
       "6              num__koi_time0bk_err1\n",
       "7              num__koi_time0bk_err2\n",
       "8                    num__koi_impact\n",
       "9               num__koi_impact_err1\n",
       "10              num__koi_impact_err2\n",
       "11                 num__koi_duration\n",
       "12            num__koi_duration_err1\n",
       "13            num__koi_duration_err2\n",
       "14                    num__koi_depth\n",
       "15               num__koi_depth_err1\n",
       "16               num__koi_depth_err2\n",
       "17                     num__koi_prad\n",
       "18                num__koi_prad_err1\n",
       "19                num__koi_prad_err2\n",
       "20                      num__koi_teq\n",
       "21                    num__koi_insol\n",
       "22               num__koi_insol_err1\n",
       "23               num__koi_insol_err2\n",
       "24                num__koi_model_snr\n",
       "25             num__koi_tce_plnt_num\n",
       "26                    num__koi_steff\n",
       "27               num__koi_steff_err1\n",
       "28               num__koi_steff_err2\n",
       "29                    num__koi_slogg"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "lasso_selector = LassoCV(cv=5, random_state=SEED, max_iter=5000)\n",
    "lasso_selector.fit(X_train_proc_df, y_train)\n",
    "selector = SelectFromModel(lasso_selector, prefit=True, threshold='median')\n",
    "\n",
    "mask_sel = selector.get_support()\n",
    "selected_processed_lasso = X_train_proc_df.columns[mask_sel].tolist()\n",
    "if len(selected_processed_lasso) < 5:\n",
    "    # fallback: top-k по абсолютному коэффициенту\n",
    "    coef_abs = pd.Series(np.abs(lasso_selector.coef_), index=X_train_proc_df.columns).sort_values(ascending=False)\n",
    "    selected_processed_lasso = coef_abs.head(min(15, len(coef_abs))).index.tolist()\n",
    "\n",
    "selected_feature_sets['lasso'] = selected_processed_lasso\n",
    "\n",
    "lin_sel = LinearRegression()\n",
    "lin_sel.fit(X_train_proc_df[selected_processed_lasso], y_train)\n",
    "pred_lin_sel = lin_sel.predict(X_test_proc_df[selected_processed_lasso])\n",
    "\n",
    "metrics_lin_sel = regression_metrics(y_test, pred_lin_sel)\n",
    "results.append({\n",
    "    'model': 'Lasso-отбор + линейная регрессия',\n",
    "    **metrics_lin_sel,\n",
    "    'n_original_features': X.shape[1],\n",
    "    'n_processed_features': len(selected_processed_lasso)\n",
    "})\n",
    "\n",
    "print('Число отобранных преобразованных признаков:', len(selected_processed_lasso))\n",
    "display(pd.DataFrame({'selected_processed_features_lasso': pd.Series(selected_processed_lasso)}).head(30))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dcaeaa87",
   "metadata": {},
   "source": [
    "## 3. Нейросеть по всем признакам\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "26332c33",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n",
      "I0000 00:00:1773499680.203072  138433 gpu_device.cc:2020] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 7154 MB memory:  -> device: 0, name: NVIDIA GeForce RTX 3080, pci bus id: 0000:06:00.0, compute capability: 8.6\n",
      "2026-03-14 17:48:00.673146: E tensorflow/core/framework/node_def_util.cc:680] NodeDef mentions attribute use_unbounded_threadpool which is not in the op definition: Op<name=MapDataset; signature=input_dataset:variant, other_arguments: -> handle:variant; attr=f:func; attr=Targuments:list(type),min=0; attr=output_types:list(type),min=1; attr=output_shapes:list(shape),min=1; attr=use_inter_op_parallelism:bool,default=true; attr=preserve_cardinality:bool,default=false; attr=force_synchronous:bool,default=false; attr=metadata:string,default=\"\"> This may be expected if your graph generating binary is newer  than this binary. Unknown attributes will be ignored. NodeDef: {{node ParallelMapDatasetV2/_15}}\n",
      "2026-03-14 17:48:14.427126: E tensorflow/core/framework/node_def_util.cc:680] NodeDef mentions attribute use_unbounded_threadpool which is not in the op definition: Op<name=MapDataset; signature=input_dataset:variant, other_arguments: -> handle:variant; attr=f:func; attr=Targuments:list(type),min=0; attr=output_types:list(type),min=1; attr=output_shapes:list(shape),min=1; attr=use_inter_op_parallelism:bool,default=true; attr=preserve_cardinality:bool,default=false; attr=force_synchronous:bool,default=false; attr=metadata:string,default=\"\"> This may be expected if your graph generating binary is newer  than this binary. Unknown attributes will be ignored. NodeDef: {{node ParallelMapDatasetV2/_14}}\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>loss</th>\n",
       "      <th>mae</th>\n",
       "      <th>rmse</th>\n",
       "      <th>val_loss</th>\n",
       "      <th>val_mae</th>\n",
       "      <th>val_rmse</th>\n",
       "      <th>epoch</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>75</th>\n",
       "      <td>1948.212891</td>\n",
       "      <td>16.764240</td>\n",
       "      <td>44.138565</td>\n",
       "      <td>10933792.0</td>\n",
       "      <td>103.203087</td>\n",
       "      <td>3306.628418</td>\n",
       "      <td>76</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>76</th>\n",
       "      <td>1898.589844</td>\n",
       "      <td>16.914137</td>\n",
       "      <td>43.572811</td>\n",
       "      <td>10932898.0</td>\n",
       "      <td>103.615562</td>\n",
       "      <td>3306.493164</td>\n",
       "      <td>77</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>77</th>\n",
       "      <td>1894.841675</td>\n",
       "      <td>16.581873</td>\n",
       "      <td>43.529778</td>\n",
       "      <td>10934878.0</td>\n",
       "      <td>102.889183</td>\n",
       "      <td>3306.792725</td>\n",
       "      <td>78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>78</th>\n",
       "      <td>1789.618774</td>\n",
       "      <td>16.162876</td>\n",
       "      <td>42.303886</td>\n",
       "      <td>10931300.0</td>\n",
       "      <td>103.077255</td>\n",
       "      <td>3306.251465</td>\n",
       "      <td>79</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>79</th>\n",
       "      <td>1848.366943</td>\n",
       "      <td>16.265190</td>\n",
       "      <td>42.992638</td>\n",
       "      <td>10930978.0</td>\n",
       "      <td>102.888580</td>\n",
       "      <td>3306.202637</td>\n",
       "      <td>80</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           loss        mae       rmse    val_loss     val_mae     val_rmse  \\\n",
       "75  1948.212891  16.764240  44.138565  10933792.0  103.203087  3306.628418   \n",
       "76  1898.589844  16.914137  43.572811  10932898.0  103.615562  3306.493164   \n",
       "77  1894.841675  16.581873  43.529778  10934878.0  102.889183  3306.792725   \n",
       "78  1789.618774  16.162876  42.303886  10931300.0  103.077255  3306.251465   \n",
       "79  1848.366943  16.265190  42.992638  10930978.0  102.888580  3306.202637   \n",
       "\n",
       "    epoch  \n",
       "75     76  \n",
       "76     77  \n",
       "77     78  \n",
       "78     79  \n",
       "79     80  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def build_dense_regressor(input_dim: int, seed: int = 42):\n",
    "    if not USE_TF:\n",
    "        raise RuntimeError('TensorFlow недоступен, нейросетевые модели не могут быть обучены.')\n",
    "    tf = TF\n",
    "    model = tf.keras.Sequential([\n",
    "        tf.keras.layers.Input(shape=(input_dim,)),\n",
    "        tf.keras.layers.Dense(128, activation='relu'),\n",
    "        tf.keras.layers.Dropout(0.15),\n",
    "        tf.keras.layers.Dense(64, activation='relu'),\n",
    "        tf.keras.layers.Dense(1)\n",
    "    ])\n",
    "    model.compile(\n",
    "        optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3),\n",
    "        loss='mse',\n",
    "        metrics=[tf.keras.metrics.RootMeanSquaredError(name='rmse'), tf.keras.metrics.MeanAbsoluteError(name='mae')]\n",
    "    )\n",
    "    return model\n",
    "\n",
    "def train_nn_model(Xtr, ytr, Xval, yval, Xte, yte, label='model'):\n",
    "    model = build_dense_regressor(Xtr.shape[1], SEED)\n",
    "    tf = TF\n",
    "    callbacks = [\n",
    "        tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)\n",
    "    ]\n",
    "    history = model.fit(\n",
    "        Xtr, ytr,\n",
    "        validation_data=(Xval, yval),\n",
    "        epochs=80,\n",
    "        batch_size=128,\n",
    "        verbose=0,\n",
    "        callbacks=callbacks\n",
    "    )\n",
    "    pred_test = model.predict(Xte, verbose=0).ravel()\n",
    "    pred_val = model.predict(Xval, verbose=0).ravel()\n",
    "    metrics_test = regression_metrics(yte, pred_test)\n",
    "    metrics_val = regression_metrics(yval, pred_val, prefix='val_')\n",
    "    hist_df = pd.DataFrame(history.history)\n",
    "    hist_df['epoch'] = np.arange(1, len(hist_df) + 1)\n",
    "    return model, hist_df, pred_test, {**metrics_test, **metrics_val}\n",
    "\n",
    "nn_all_model, nn_all_history, pred_nn_all, metrics_nn_all = train_nn_model(\n",
    "    X_train_nn_proc, y_train_nn.to_numpy(),\n",
    "    X_val_nn_proc, y_val_nn.to_numpy(),\n",
    "    X_test_proc, y_test.to_numpy(),\n",
    "    label='nn_all'\n",
    ")\n",
    "\n",
    "results.append({\n",
    "    'model': 'Нейросеть по всем признакам',\n",
    "    'r2': metrics_nn_all['r2'],\n",
    "    'rmse': metrics_nn_all['rmse'],\n",
    "    'mae': metrics_nn_all['mae'],\n",
    "    'n_original_features': X.shape[1],\n",
    "    'n_processed_features': X_train_proc_df.shape[1]\n",
    "})\n",
    "\n",
    "display(nn_all_history.tail())\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "67e05285",
   "metadata": {},
   "source": [
    "## 4. Ансамбль нейросетей по трём методам отбора признаков\n",
    "\n",
    "Используются три метода отбора на преобразованных признаках:\n",
    "- **f_regression**;\n",
    "- **mutual information**;\n",
    "- **Random Forest importance**.\n",
    "\n",
    "Для каждого набора обучается нейросеть с той же архитектурой. Итоговый прогноз ансамбля — среднее по предсказаниям трёх сетей.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "31794ea7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Число признаков в каждом подмножестве: 11\n",
      "lasso -> 46\n",
      "f_regression -> 11\n",
      "mutual_info -> 11\n",
      "random_forest -> 11\n"
     ]
    }
   ],
   "source": [
    "# Подготовка преобразованных наборов для отбора\n",
    "X_train_base = X_train_proc_df.copy()\n",
    "X_test_base = X_test_proc_df.copy()\n",
    "X_train_nn_base = pd.DataFrame(X_train_nn_proc, columns=X_train_proc_df.columns, index=X_train_nn.index)\n",
    "X_val_nn_base = pd.DataFrame(X_val_nn_proc, columns=X_train_proc_df.columns, index=X_val_nn.index)\n",
    "\n",
    "k_top = max(10, min(30, X_train_base.shape[1] // 4))\n",
    "print('Число признаков в каждом подмножестве:', k_top)\n",
    "\n",
    "# Метод 1: f_regression\n",
    "sel_f = SelectKBest(score_func=f_regression, k=min(k_top, X_train_base.shape[1]))\n",
    "sel_f.fit(X_train_base, y_train)\n",
    "features_f = X_train_base.columns[sel_f.get_support()].tolist()\n",
    "selected_feature_sets['f_regression'] = features_f\n",
    "\n",
    "# Метод 2: mutual information\n",
    "sel_mi = SelectKBest(score_func=mutual_info_regression, k=min(k_top, X_train_base.shape[1]))\n",
    "sel_mi.fit(X_train_base, y_train)\n",
    "features_mi = X_train_base.columns[sel_mi.get_support()].tolist()\n",
    "selected_feature_sets['mutual_info'] = features_mi\n",
    "\n",
    "# Метод 3: Random Forest importance\n",
    "rf = RandomForestRegressor(n_estimators=200, random_state=SEED, n_jobs=-1)\n",
    "rf.fit(X_train_base, y_train)\n",
    "rf_imp = pd.Series(rf.feature_importances_, index=X_train_base.columns).sort_values(ascending=False)\n",
    "features_rf = rf_imp.head(min(k_top, len(rf_imp))).index.tolist()\n",
    "selected_feature_sets['random_forest'] = features_rf\n",
    "\n",
    "for method_name, features in selected_feature_sets.items():\n",
    "    print(method_name, '->', len(features))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "b3a8a39a",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2026-03-14 17:48:31.472575: E tensorflow/core/framework/node_def_util.cc:680] NodeDef mentions attribute use_unbounded_threadpool which is not in the op definition: Op<name=MapDataset; signature=input_dataset:variant, other_arguments: -> handle:variant; attr=f:func; attr=Targuments:list(type),min=0; attr=output_types:list(type),min=1; attr=output_shapes:list(shape),min=1; attr=use_inter_op_parallelism:bool,default=true; attr=preserve_cardinality:bool,default=false; attr=force_synchronous:bool,default=false; attr=metadata:string,default=\"\"> This may be expected if your graph generating binary is newer  than this binary. Unknown attributes will be ignored. NodeDef: {{node ParallelMapDatasetV2/_14}}\n",
      "2026-03-14 17:48:44.434714: E tensorflow/core/framework/node_def_util.cc:680] NodeDef mentions attribute use_unbounded_threadpool which is not in the op definition: Op<name=MapDataset; signature=input_dataset:variant, other_arguments: -> handle:variant; attr=f:func; attr=Targuments:list(type),min=0; attr=output_types:list(type),min=1; attr=output_shapes:list(shape),min=1; attr=use_inter_op_parallelism:bool,default=true; attr=preserve_cardinality:bool,default=false; attr=force_synchronous:bool,default=false; attr=metadata:string,default=\"\"> This may be expected if your graph generating binary is newer  than this binary. Unknown attributes will be ignored. NodeDef: {{node ParallelMapDatasetV2/_14}}\n",
      "2026-03-14 17:48:50.749088: E tensorflow/core/framework/node_def_util.cc:680] NodeDef mentions attribute use_unbounded_threadpool which is not in the op definition: Op<name=MapDataset; signature=input_dataset:variant, other_arguments: -> handle:variant; attr=f:func; attr=Targuments:list(type),min=0; attr=output_types:list(type),min=1; attr=output_shapes:list(shape),min=1; attr=use_inter_op_parallelism:bool,default=true; attr=preserve_cardinality:bool,default=false; attr=force_synchronous:bool,default=false; attr=metadata:string,default=\"\"> This may be expected if your graph generating binary is newer  than this binary. Unknown attributes will be ignored. NodeDef: {{node ParallelMapDatasetV2/_14}}\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>method</th>\n",
       "      <th>r2</th>\n",
       "      <th>rmse</th>\n",
       "      <th>mae</th>\n",
       "      <th>n_features</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>f_regression</td>\n",
       "      <td>0.724869</td>\n",
       "      <td>70.782229</td>\n",
       "      <td>24.185272</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>mutual_info</td>\n",
       "      <td>0.480697</td>\n",
       "      <td>97.244557</td>\n",
       "      <td>28.830851</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>random_forest</td>\n",
       "      <td>0.613482</td>\n",
       "      <td>83.895706</td>\n",
       "      <td>32.712783</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          method        r2       rmse        mae  n_features\n",
       "0   f_regression  0.724869  70.782229  24.185272          11\n",
       "1    mutual_info  0.480697  97.244557  28.830851          11\n",
       "2  random_forest  0.613482  83.895706  32.712783          11"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ensemble_predictions = []\n",
    "ensemble_histories = {}\n",
    "ensemble_member_metrics = []\n",
    "\n",
    "for method_name in ['f_regression', 'mutual_info', 'random_forest']:\n",
    "    feats = selected_feature_sets[method_name]\n",
    "    model_i, hist_i, pred_i, metrics_i = train_nn_model(\n",
    "        X_train_nn_base[feats].to_numpy(), y_train_nn.to_numpy(),\n",
    "        X_val_nn_base[feats].to_numpy(), y_val_nn.to_numpy(),\n",
    "        X_test_base[feats].to_numpy(), y_test.to_numpy(),\n",
    "        label=method_name\n",
    "    )\n",
    "    ensemble_predictions.append(pred_i)\n",
    "    ensemble_histories[method_name] = hist_i\n",
    "    ensemble_member_metrics.append({\n",
    "        'method': method_name,\n",
    "        'r2': metrics_i['r2'],\n",
    "        'rmse': metrics_i['rmse'],\n",
    "        'mae': metrics_i['mae'],\n",
    "        'n_features': len(feats)\n",
    "    })\n",
    "\n",
    "ensemble_pred = np.mean(np.column_stack(ensemble_predictions), axis=1)\n",
    "metrics_ensemble = regression_metrics(y_test, ensemble_pred)\n",
    "\n",
    "results.append({\n",
    "    'model': 'Ансамбль нейросетей по 3 методам отбора признаков',\n",
    "    **metrics_ensemble,\n",
    "    'n_original_features': X.shape[1],\n",
    "    'n_processed_features': np.mean([len(selected_feature_sets[m]) for m in ['f_regression', 'mutual_info', 'random_forest']])\n",
    "})\n",
    "\n",
    "display(pd.DataFrame(ensemble_member_metrics))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d28a4f29",
   "metadata": {},
   "source": [
    "## Сравнение подходов\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "d7894845",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>model</th>\n",
       "      <th>r2</th>\n",
       "      <th>rmse</th>\n",
       "      <th>mae</th>\n",
       "      <th>n_original_features</th>\n",
       "      <th>n_processed_features</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Ансамбль нейросетей по 3 методам отбора признаков</td>\n",
       "      <td>0.684944</td>\n",
       "      <td>75.744104</td>\n",
       "      <td>25.248001</td>\n",
       "      <td>41</td>\n",
       "      <td>11.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Нейросеть по всем признакам</td>\n",
       "      <td>0.554468</td>\n",
       "      <td>90.072964</td>\n",
       "      <td>20.087247</td>\n",
       "      <td>41</td>\n",
       "      <td>46.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Линейная регрессия по всем признакам</td>\n",
       "      <td>0.061597</td>\n",
       "      <td>130.722216</td>\n",
       "      <td>86.156605</td>\n",
       "      <td>41</td>\n",
       "      <td>46.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Lasso-отбор + линейная регрессия</td>\n",
       "      <td>0.061597</td>\n",
       "      <td>130.722216</td>\n",
       "      <td>86.156605</td>\n",
       "      <td>41</td>\n",
       "      <td>46.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                               model        r2        rmse  \\\n",
       "0  Ансамбль нейросетей по 3 методам отбора признаков  0.684944   75.744104   \n",
       "1                        Нейросеть по всем признакам  0.554468   90.072964   \n",
       "2               Линейная регрессия по всем признакам  0.061597  130.722216   \n",
       "3                   Lasso-отбор + линейная регрессия  0.061597  130.722216   \n",
       "\n",
       "         mae  n_original_features  n_processed_features  \n",
       "0  25.248001                   41                  11.0  \n",
       "1  20.087247                   41                  46.0  \n",
       "2  86.156605                   41                  46.0  \n",
       "3  86.156605                   41                  46.0  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Лучшая модель по максимальному R2 и минимальному RMSE:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>model</th>\n",
       "      <th>r2</th>\n",
       "      <th>rmse</th>\n",
       "      <th>mae</th>\n",
       "      <th>n_original_features</th>\n",
       "      <th>n_processed_features</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Ансамбль нейросетей по 3 методам отбора признаков</td>\n",
       "      <td>0.684944</td>\n",
       "      <td>75.744104</td>\n",
       "      <td>25.248001</td>\n",
       "      <td>41</td>\n",
       "      <td>11.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                               model        r2       rmse  \\\n",
       "0  Ансамбль нейросетей по 3 методам отбора признаков  0.684944  75.744104   \n",
       "\n",
       "         mae  n_original_features  n_processed_features  \n",
       "0  25.248001                   41                  11.0  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "results_df = pd.DataFrame(results)\n",
    "results_df = results_df.sort_values(['r2', 'rmse'], ascending=[False, True]).reset_index(drop=True)\n",
    "display(results_df)\n",
    "\n",
    "best_model_row = results_df.iloc[[0]].copy()\n",
    "print('Лучшая модель по максимальному R2 и минимальному RMSE:')\n",
    "display(best_model_row)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "a775dd2d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABCwAAAJMCAYAAAAxNjfwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA1jhJREFUeJzs3Xt8jvXjx/H3vbHNcQ5jc1jmfBrG5nyMMaeEEpLDlFREFJEiVIhEUg6hksohkUNOc2Y5y/mYczbnjWGz3Z/fH/vtym0jfcPu7PV8PO4Hu+7PdV2f695137uu9/052IwxRgAAAAAAAE7EJbUrAAAAAAAAcCcCCwAAAAAA4HQILAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsAAAAAAOB0CCwAAAAAAIDTIbAAAAAAAABOJ11qVwAAAAAAUktcXJwuXboku92uvHnzpnZ1ANyGFhYAAACPgYULF2rnzp3Wz/PmzdPevXtTr0JI87777jsdP37c+vnrr7/WmTNnUq9Ct9m6dauef/55eXl5yd3dXXny5NEzzzyT2tUCcAcCCwAA/gdHjx5V165dVahQIXl4eChr1qyqXr26xo4dqxs3bqR29ZAG7d69Wz179tThw4f122+/6ZVXXtHVq1dTu1oOOnXqJJvNZj3c3d1VrFgxDRw4UDdv3nQoe/HiRY0cOVK1atVSrly5lC1bNlWpUkUzZ85Mpdrjn1q3bp369u2r48ePa+nSperWrZtcXFL/9mP+/PmqUaOG9u3bpw8//FDLly/X8uXLNXHixNSuGoA70CUEAIB/aNGiRWrVqpXc3d3VoUMH+fv7Ky4uTuvXr1efPn20d+9eTZo0KbWriTTmpZde0tSpU1WsWDFJUsuWLVWlSpVUrlVy7u7u+uqrryRJUVFRmj9/voYOHaqjR49qxowZVrnw8HANGDBAjRs31rvvvqt06dLpp59+Ups2bbRv3z4NHjw4tQ4B96lXr16qU6eOChYsKEnq3bu38uTJk6p1unTpkl566SWFhIRo9uzZcnNzS9X6ALg3mzHGpHYlAAD4rzh27JjKli2r/Pnza+XKlckuvo8cOaJFixapZ8+eqVRDpGWxsbHas2ePMmbMqJIlS6Z2dZLp1KmT5syZo2vXrlnLjDGqVq2aNm3apLNnz8rb21tS4nvNxcVFBQoUcCgbHBysDRs26OLFi8qUKdMjPwb8MzExMdqzZ4+8vLxUuHDh1K6OPvnkE73//vs6efKksmfPntrVAfA3Ur9NFgAA/yEff/yxrl27pilTpqT4TWGRIkUcwgqbzabu3btrxowZKl68uDw8PBQYGKi1a9c6rHfixAm99tprKl68uDJkyKCcOXOqVatWDv2/pcQ+4Lc3qc+YMaPKlCljfWOdpFOnTsqcOXOy+s2ZM0c2m02rV692WL5p0yY1bNhQnp6eypgxo2rXrq0NGzY4lHn//fdls9l04cIFh+Vbt26VzWbT119/7bB/Pz8/h3KnTp1ShgwZZLPZkh3Xr7/+qpo1aypTpkzKkiWLmjRpcl/jLyS9Hm5ubjp//rzDc+Hh4dbrtHXrVofnZs+ercDAQGXIkEFeXl564YUX7tq33s/Pz+E1T3rcfrySZLfbNWbMGJUuXVoeHh7y9vZW165ddfny5WTbXL16dYrbvPM1i42N1aBBg1SkSBG5u7vL19dXffv2VWxsrEM5m82m999/X+7u7goMDFTJkiU1cuRI2Ww21alT529fx5Tqcrc6xcTE6M0335Svr6/c3d1VvHhxjRo1Sv/rd2A2m001atSQMUZ//PGHtbxgwYIOYUVS2ebNmys2NtahbEqSXuM5c+Ykey5z5szq1KmT9fOlS5f01ltvqUyZMsqcObOyZs2qRo0a6ffff7+v+t/rcfvrf7+/Tylx/IdKlSopY8aMyp49u2rVqqVly5ZJuvs5mdLv7H5/X7ev7+rqqnz58unll1/WlStXHMqdO3dOL774ory9veXh4aFy5crpm2++cShz/Phx6z2SKVMmVa5cWYULF1a3bt1ks9kcXvuUJK2f9EifPr38/PzUp08fxcXFWeWS3v93vr9vV6dOHYffwW+//aaAgAB99NFH1mtStGhRDR8+XHa73WHd+Ph4DR06VIULF5a7u7v8/Pz0zjvvJPt9+fn5qWnTplq2bJkCAgLk4eGhUqVKae7cuQ7lkup7++ff3r17lT17djVt2lTx8fHW8itXruiNN96w6likSBGNGDEiWR2Bxx1dQgAA+AcWLFigQoUKqVq1ave9zpo1azRz5kz16NFD7u7u+uKLL9SwYUNt3rxZ/v7+kqQtW7Zo48aNatOmjfLnz6/jx4/ryy+/VJ06dbRv3z5lzJjRYZuffvqpvLy8FB0dralTp6pLly7y8/NTcHDwPz6mlStXqlGjRgoMDNSgQYPk4uKiadOmqW7dulq3bp0qVar0j7eZkpTGKZCk6dOnq2PHjgoJCdGIESN0/fp1ffnll6pRo4Z27NiR7IY5Ja6urvruu+/Uq1cva9m0adPk4eGRbJ9ff/21QkNDVbFiRQ0bNkyRkZEaO3asNmzYoB07dihbtmzJth8QEKA333xTUuI3/wMHDkxWpmvXrta2e/TooWPHjunzzz/Xjh07tGHDBqVPnz7ZOu+8847VEmLSpEk6efKk9ZzdblezZs20fv16vfzyyypZsqR2796tTz/9VIcOHdK8efPu+npcuXJFw4YNu+drdqf69eurQ4cODss++eQTh8DFGKNmzZpp1apVevHFFxUQEKClS5eqT58+OnPmjD799NN/tM8kSTdw9/ONd0REhCTJy8vrf9pXSv744w/NmzdPrVq1UsGCBRUZGamJEyeqdu3a2rdv3z1njpg+fbr1/3Xr1mnSpEnW+1OS1WLkn/w+Bw8erPfff1/VqlXTkCFD5Obmpk2bNmnlypVq0KCBxowZY7VS2b9/vz766COHcykprPynv68WLVqoZcuWio+PV3h4uCZNmqQbN25Yx3jjxg3VqVNHR44cUffu3VWwYEHNnj1bnTp10pUrV+7ZsuzIkSOaPHny/f5KJEkvv/yyatasqdjYWC1dulSjRo2Sh4eHhg4d+o+2c7uLFy9q/fr1Wr9+vTp37qzAwECFhYWpf//+On78uCZMmGCVfemll/TNN9/o2Wef1ZtvvqlNmzZp2LBh2r9/v37++WeH7R4+fFitW7fWK6+8oo4dO2ratGlq1aqVlixZovr166dYl1OnTqlhw4YqUaKEZs2apXTpEm/Nrl+/rtq1a+vMmTPq2rWrnnjiCW3cuFH9+/fX2bNnNWbMmP/5+IH/HAMAAO5LVFSUkWSefvrp+15HkpFktm7dai07ceKE8fDwMC1atLCWXb9+Pdm64eHhRpL59ttvrWXTpk0zksyxY8esZYcOHTKSzMcff2wt69ixo8mUKVOybc6ePdtIMqtWrTLGGGO3203RokVNSEiIsdvtDvUpWLCgqV+/vrVs0KBBRpI5f/68wza3bNliJJlp06Y57L9AgQLWz3v27DEuLi6mUaNGDvW/evWqyZYtm+nSpYvDNiMiIoynp2ey5XdKej3atm1rypQpYy2PiYkxWbNmNc8//7yRZLZs2WKMMSYuLs7kzp3b+Pv7mxs3bljlFy5caCSZgQMHJttH3rx5TdOmTe95vOvWrTOSzIwZMxzWXbJkSYrLly9fbiSZNWvW3PU1mz59unFxcTHr1q1zWHfChAlGktmwYYO1TJIZNGiQ9XPfvn1N7ty5TWBgoKldu3YKr5wjSaZbt27Jljdp0sShTvPmzTOSzAcffOBQ7tlnnzU2m80cOXLknvtJOi/Pnz9vzp8/b44cOWJGjRplbDab8ff3dzgHU3Lx4kWTO3duU7Nmzb89plWrVhlJZvbs2cmey5Qpk+nYsaP1882bN01CQoJDmWPHjhl3d3czZMiQv91XkpTen0nu9/d5+PBh4+LiYlq0aJGsTim9PknHmfSevt0/+X3deQ4ZY0y1atVMqVKlrJ/HjBljJJnvvvvOWhYXF2eqVq1qMmfObKKjo40xia/dne+R5557zvj7+xtfX1+H1z4lKa1vTOJ7sXHjxtbPSa930vs7JbVr13Z4D9SuXdtIMu+//75DuU6dOhlJZvfu3cYYY3bu3GkkmZdeesmh3FtvvWUkmZUrV1rLChQoYCSZn376yVoWFRVl8uTJY8qXL5+svseOHTOXLl0ypUqVMsWLFzcXLlxw2MfQoUNNpkyZzKFDhxyW9+vXz7i6upqTJ0/e9XiBxw1dQgAAuE/R0dGSpCxZsvyj9apWrarAwEDr5yeeeEJPP/20li5dqoSEBElShgwZrOdv3bqlixcvqkiRIsqWLZu2b9+ebJuXL1/WhQsX9Mcff+jTTz+Vq6urateunazchQsXHB53zhqxc+dOHT58WM8//7wuXrxolYuJiVG9evW0du3aZE2QL1265LDNqKiov30N+vfvrwoVKqhVq1YOy5cvX64rV66obdu2Dtt0dXVV5cqVtWrVqr/dtiS1b99eBw4csJqG//TTT/L09FS9evUcym3dulXnzp3Ta6+9Jg8PD2t5kyZNVKJECS1atCjZtm/evOlQNiWzZ8+Wp6en6tev73AcgYGBypw5c7LjSGrW7u7ufs9tlixZUiVKlHDYZt26dSXprq/NmTNnNG7cOL333nspdgv6NxYvXixXV1f16NHDYfmbb74pY4x+/fXXv91GTEyMcuXKpVy5cqlIkSJ66623VL16dc2fP182m+2u69ntdrVr105XrlzRuHHj7rvOV69eTfY+uJO7u7s1e0VCQoIuXryozJkzq3jx4im+//4X9/v7nDdvnux2uwYOHJhsRo17vT4p+ae/r+vXr+vChQuKiIjQTz/9pN9//93hPbR48WL5+Piobdu21rL06dOrR48eunbtmtasWZNiPbZt26bZs2dr2LBh/2iWkGvXrunChQs6c+aMJk2apIiIiGTvaSlx8NaUPt/uxtXV1aE1liSrBVXSZ8DixYslJQ4Ueq9ySfLmzasWLVpYP2fNmlUdOnTQjh07rFZBSW7evKlmzZrp/PnzWrJkiXLmzOnw/OzZs1WzZk1lz57d4VwJDg5WQkJCsi6FwOOMLiEAANynrFmzStI/niqyaNGiyZYVK1ZM169f1/nz5+Xj46MbN25o2LBhmjZtms6cOePQvzylQKBChQrW/93d3fX5558n67qRdGN4L4cPH5YkdezY8a5loqKiHJrqFy9e/J7bvNP69eu1YMEChYWFOXR5uH3/STdtd0p6zf9Orly51KRJE02dOlVBQUGaOnWqOnbsmOzm6MSJE3c9hhIlSmj9+vUOyxISEnTlyhV5enrec/+HDx9WVFSUcufOneLz586dc/g5aVyAewUKhw8f1v79++/6O7xzm0kGDRqkvHnzqmvXrimO3/BvnDhxQnnz5k0W2iV1RUh6fe/Fw8NDCxYskCSdPn1aH3/8sc6dO+cQ2qXk9ddf15IlS/Ttt9+qXLly913nzp07/20Zu92usWPH6osvvtCxY8esIFFSspvJ/9X9/j6PHj0qFxcXlSpV6l/v85/+vkaOHKmRI0daPzds2FAjRoxw2F7RokWTva/+7vffr18/1axZU02bNlX37t3vu/6vv/66Xn/9devn0NDQZEGDJIeucNmyZVPbtm01cuTIFAdltdlsyps3b7LPluLFi8vFxcXqnnTixAm5uLioSJEiDuV8fHyULVu2ZMdapEiRZIFS0ow9x48fl4+Pj8Nx/Pbbb/Lw8HAYtyLJ4cOHtWvXrn/83gceRwQWAADcp6xZsypv3rzas2fPA9/266+/rmnTpumNN95Q1apV5enpKZvNpjZt2qQ4yNp3330nb29v3bx5UytXrlS3bt3k4eHhMJjd7TeGSdatW6chQ4ZYPydte+TIkQoICEixbnfeVP/0008OF/uHDh1St27d7npsb7/9tkJCQlS3bt0UB6qUEscBuP2CPklSn+770blzZ3Xo0EGvv/661q5dq6+++krr1q277/VTcvLkSdnt9r8dR8Nutyt37twO03Le7s4bj6RvXFM65tu3WaZMGY0ePTrF5319fZMt279/v77++mt99913KY6Z4QxcXV0dbjBDQkJUokQJde3aVb/88kuK6wwePFhffPGFhg8frvbt2/+j/Q0cOFA1a9Z0WPbUU085/PzRRx/pvffeU+fOnTV06FDlyJFDLi4ueuONNx7YIIf/y+/zUWvfvr06dOggu92uP/74Q0OHDlXTpk21YsWKf9y6I8myZcu0YsUKhYeH/+N1+/TpowYNGighIUF79+7VkCFDZIzRtGnTHMqNHz9exYoVU2xsrFavXq1Ro0ZJkr744otk2/y7YOxO/+tx38v27ds1f/58de/eXS+//LJWrlzp8Lzdblf9+vXVt2/fFNdPCkKAtIDAAgCAf6Bp06aaNGmSwsPDVbVq1ftaJ6kVwe0OHTqkjBkzWjeyc+bMUceOHfXJJ59YZW7evJlshP4k1atXt26imzZtqr1792rYsGEOgcWdN4aSkm0vaZrBrFmz3veAnbVq1XIY8DClQSqTzJs3T+Hh4XdtVp+0/9y5c/9PA4berlGjRvLw8FCbNm1Uo0YNFS5cOFlgkTTrxMGDB5O16jh48GCyWSmSupgEBQXdc9+FCxfWihUrVL169fu6Idq3b59y5cp1z2/vCxcubDXJv9+bpv79+ysgIECtW7e+r/L/VIECBbRixQpdvXrV4Vv7AwcOWM//U3ny5FGvXr00ePBg/fbbb6pSpYrD8+PHj9f777+vN954Q2+//fY/3n6ZMmWSnVuurq4OP8+ZM0dPPvmkpkyZ4rD8ypUrD2xwz/v9fRYuXFh2u1379u27a4h4v/7p76tQoUIOr5Wnp6eef/55/fbbb6pataoKFCigXbt2yW63O7SyuNv2jDHq16+fWrRokez3ej9KlSpl1SckJESxsbF655139OGHHzoMhFqpUiXrPdqkSRP9/vvvWrJkSYrbLFiwoJYtW5bsNTl06JBDOFmgQAHZ7XYdPnzYYYrgyMhIXblyJdmxHjlyRMYYh9/toUOHJClZ4PnVV1+pWbNmcnV1VdOmTTVlyhS9+OKL1vOFCxfWtWvX/vVnIvA4YAwLAAD+gb59+ypTpkx66aWXFBkZmez5o0ePauzYsQ7L7rxhP3XqlObPn68GDRpYN06urq7JphkcN26cQ9P0e7lx40aKUyP+ncDAQBUuXFijRo2yZh243Z1Thf4TCQkJeuedd/T888/f9cYrJCREWbNm1UcffaRbt279q/2nS5dOHTp00K5du+7aDSAoKEi5c+fWhAkTHF6vX3/9Vfv371eTJk0cys+ePVvZsmVLcXyQ2z333HNKSEhIcfaC+Ph4h6Do6tWrWrx48V27wdy+zTNnzqQ4s8KNGzcUExPjsCw8PFzz58/X8OHDH8q3wpLUuHFjJSQk6PPPP3dY/umnn8pms6lRo0b/03Zff/11ZcyYUcOHD3dYnjS7Trt27e7aMuFBSOn9N3v27LtOdfu/uN/fZ/PmzeXi4qIhQ4Yka91xZx3/zr/9fd24cUOSrPdK48aNFRERoZkzZ1pl4uPjNW7cOGXOnDnZ++THH3/Url27/vGMNX9Xn9unNk2J3W5PFkoludtrknR+JX0GNG7cWJKSzchxZ7kkf/75p8PMIdHR0fr2228VEBCQrCVVUoufJk2aqE2bNurTp4/D35PnnntO4eHhWrp0abL6X7lyJcVuJMDjihYWAAD8A4ULF9b333+v1q1bq2TJkurQoYP8/f0VFxenjRs3WlP83c7f318hISEO05pKic3ckzRt2lTTp0+Xp6enSpUqpfDwcK1YseKu38DPmzdPXl5eVpeQdevW6Y033vjHx+Pi4qKvvvpKjRo1UunSpRUaGqp8+fLpzJkzWrVqlbJmzZqsW8n9On36tNzc3KzB61KSNWtWffnll2rfvr0qVKigNm3aKFeuXDp58qQWLVqk6tWrJ7uxuJehQ4eqT58+d50eM3369BoxYoRCQ0NVu3ZttW3b1prW1M/Pz+ofHxkZqc8++0yzZ89WrVq19NNPP1nbOHbsmKTEgKBChQoqW7asateura5du2rYsGHauXOnGjRooPTp0+vw4cOaPXu2xo4dq2effVazZs3S4MGDdfnyZfXr1++ex9K+fXvNmjVLr7zyilatWqXq1asrISFBBw4c0KxZs7R06VKHlh/Lli1T/fr1H+q3sk899ZSefPJJDRgwQMePH1e5cuW0bNkyzZ8/X2+88YbVYuafypkzp0JDQ/XFF19o//79KlmypDZv3qwOHTooZ86cqlevXrLuNtWqVVOhQoUexGGpadOmGjJkiEJDQ1WtWjXt3r1bM2bMeGDbl+7/91mkSBENGDBAQ4cOVc2aNdWyZUu5u7try5Ytyps37z+6+f+nv69du3bpu+++kzFGR48e1Weffab8+fNb59nLL7+siRMnqlOnTtq2bZv8/Pw0Z84cbdiwQWPGjEk2VsayZcvUpUuXfzzuTZLw8HClS5fO6hIybtw4lS9fPlmLhfDwcF24cMHqEhIWFqa33norxW02btxYwcHBGjBggI4dO6aAgACtXLlSP/30k1555RVrquly5cqpY8eOmjRpkq5cuaLatWtr8+bN+uabb9S8eXM9+eSTDtstVqyYXnzxRW3ZskXe3t6aOnWqIiMjk3VfudPYsWNVsmRJvf7665o1a5akxK4wv/zyi5o2bapOnTopMDBQMTEx2r17t+bMmaPjx48/0Gl9AaeWWtOTAADwX3bo0CHTpUsX4+fnZ9zc3EyWLFlM9erVzbhx48zNmzetcvr/6SK/++47U7RoUePu7m7Kly+fbArCy5cvm9DQUOPl5WUyZ85sQkJCzIEDB0yBAgUcpgBMmhYv6eHm5maKFCliBg4c6LDf+53WNMmOHTtMy5YtTc6cOY27u7spUKCAee6550xYWJhV5p9OayrJ9OzZ06Hs3aZ9XLVqlQkJCTGenp7Gw8PDFC5c2HTq1MlhOtiU/N20hnd7fubMmaZ8+fLG3d3d5MiRw7Rr186cPn3aoT63v853e9w5DeSkSZNMYGCgyZAhg8mSJYspU6aM6du3r/nzzz+NMca0aNHCNGrUyGzatClZXe+c1tSYxCkjR4wYYUqXLm3c3d1N9uzZTWBgoBk8eLCJioqyykkyNpvNbNu2zWH9O6d0vJuk8/ROd05rakziVLS9evUyefPmNenTpzdFixY1I0eO/NspSZOOMaXz0hhjjh49alxdXa3z/c5z/c7HnVNe3umfTmv65ptvmjx58pgMGTKY6tWrm/Dw8Pt+/ZLca1pTY+7/92mMMVOnTrXO0ezZs5vatWub5cuX3/U4U5rW1Jj7/33d/trabDbj4+NjWrZsafbv3+9QLjIy0vqscnNzM2XKlEn2u0ialjRDhgzmzJkzDs/d+ZmWkqT1kx4uLi4mf/78pmPHjg7v03t9HsbGxhpjUn4PXLt2zeE1KVKkiBk+fHiyaWRv3bplBg8ebAoWLGjSp09vfH19Tf/+/R0+a5OOqUmTJmbp0qWmbNmyxt3d3ZQoUSLZuXe38+Obb74xkswvv/xiLbt69arp37+/KVKkiHFzczNeXl6mWrVqZtSoUSYuLu6erx/wOLEZ8w/blgEAgPtms9nUrVu3f9RKAKlv9erVevLJJ+/ZBL9Tp07y8/PT+++//+gqBsDp+Pn5yd/fXwsXLkztqgCPHcawAAAAAAAATocxLAAAAO7g7e2tdu3a3bNMtWrV6EcOAMBDRGABAABwh5IlS+q77767Z5mXX375EdUGAIC0iTEsAAAAAACA02EMCwAAAAAA4HQILAAAAAAAgNNhDAsAj4Tdbteff/6pLFmyyGazpXZ1AAAAAKQSY4yuXr2qvHnzysXl7u0oCCwAPBJ//vmnfH19U7saAAAAAJzEqVOnlD9//rs+T2AB4JHIkiWLpMQPpaxZs6ZybQAAAACklujoaPn6+lr3CHdDYAHgkUjqBpI1a1YCCwAAAAB/21WcQTcBAAAAAIDTIbAAAAAAAABOh8ACAAAAAAA4HQILII0aP368/Pz85OHhocqVK2vz5s13LVunTh3ZbLZkjyZNmjzCGgMAAABISwgsgDRo5syZ6t27twYNGqTt27erXLlyCgkJ0blz51IsP3fuXJ09e9Z67NmzR66urmrVqtUjrjkAAACAtILAAkiDRo8erS5duig0NFSlSpXShAkTlDFjRk2dOjXF8jly5JCPj4/1WL58uTJmzEhgAQAAAOChIbAA0pi4uDht27ZNwcHB1jIXFxcFBwcrPDz8vrYxZcoUtWnTRpkyZXpY1QQAAACQxqVL7QoAeLQuXLighIQEeXt7Oyz39vbWgQMH/nb9zZs3a8+ePZoyZco9y8XGxio2Ntb6OTo6+n+rMAAAAIA0iRYWAP6RKVOmqEyZMqpUqdI9yw0bNkyenp7Ww9fX9xHVEAAAAMDjgMACSGO8vLzk6uqqyMhIh+WRkZHy8fG557oxMTH68ccf9eKLL/7tfvr376+oqCjrcerUqX9VbwAAAABpC4EFkMa4ubkpMDBQYWFh1jK73a6wsDBVrVr1nuvOnj1bsbGxeuGFF/52P+7u7sqaNavDAwAAAADuF2NYAGlQ79691bFjRwUFBalSpUoaM2aMYmJiFBoaKknq0KGD8uXLp2HDhjmsN2XKFDVv3lw5c+ZMjWoDAAAASEMILIA0qHXr1jp//rwGDhyoiIgIBQQEaMmSJdZAnCdPnpSLi2MDrIMHD2r9+vVatmxZalQZAAAAQBpjM8aY1K4EgMdfdHS0PD09FRUVRfcQAAAAIA2733sDxrAAAAAAAABOh8ACAAAAAAA4HcawAJAm+fVblNpVwGPk+PAmqV0FAACAxw4tLAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsAAAAAAOB0CCwAAAAAAIDTIbAAAAAAAABOh8ACAAAAAAA4HQILAAAAAADgdAgsAAAAAACA0yGwAAAAAAAATofAAgAAAAAAOB0CCwAAAAAA4HQILAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsAAAAAAOB0CCwAAAAAAIDTIbAAAAAAAABOh8ACAAAAAAA4HQILAAAAAADgdAgsAAAAAACA0yGwAAAAAAAATofAAgAAAAAAOB0CCwAAAAAA4HQILAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsAAAAAAOB0CCwAAAAAAIDTIbAAAAAAAABOh8ACAAAAAAA4HQILAAAAAADgdAgsAAAAAACA0yGwAAAAAAAATofAAgAAAAAAOB0CCwAAAAAA4HQILAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsAAAAAAOB0CCyANGr8+PHy8/OTh4eHKleurM2bN9+z/JUrV9StWzflyZNH7u7uKlasmBYvXvyIagsAAAAgrUmX2hUA8OjNnDlTvXv31oQJE1S5cmWNGTNGISEhOnjwoHLnzp2sfFxcnOrXr6/cuXNrzpw5ypcvn06cOKFs2bI9+soDAAAASBMILIA0aPTo0erSpYtCQ0MlSRMmTNCiRYs0depU9evXL1n5qVOn6tKlS9q4caPSp08vSfLz83uUVQYAAACQxtAlBEhj4uLitG3bNgUHB1vLXFxcFBwcrPDw8BTX+eWXX1S1alV169ZN3t7e8vf310cffaSEhIS77ic2NlbR0dEODwAAAAC4XwQWQBpz4cIFJSQkyNvb22G5t7e3IiIiUlznjz/+0Jw5c5SQkKDFixfrvffe0yeffKIPPvjgrvsZNmyYPD09rYevr+8DPQ4AAAAAjzcCCwB/y263K3fu3Jo0aZICAwPVunVrDRgwQBMmTLjrOv3791dUVJT1OHXq1COsMQAAAID/OsawANIYLy8vubq6KjIy0mF5ZGSkfHx8UlwnT548Sp8+vVxdXa1lJUuWVEREhOLi4uTm5pZsHXd3d7m7uz/YygMAAABIM2hhAaQxbm5uCgwMVFhYmLXMbrcrLCxMVatWTXGd6tWr68iRI7Lb7dayQ4cOKU+ePCmGFQAAAADwbxFYAGlQ7969NXnyZH3zzTfav3+/Xn31VcXExFizhnTo0EH9+/e3yr/66qu6dOmSevbsqUOHDmnRokX66KOP1K1bt9Q6BAAAAACPObqEAGlQ69atdf78eQ0cOFAREREKCAjQkiVLrIE4T548KReXv/JMX19fLV26VL169VLZsmWVL18+9ezZU2+//XZqHQIAAACAx5zNGGNSuxIAHn/R0dHy9PRUVFSUsmbNmtrVkV+/RaldBTxGjg9vktpVAAAA+M+433sDuoQAAAAAAACnQ2ABAAAAAACcDoEFAAAAAABwOgQWAAAAAADA6RBYAAAAAAAAp0NgAQAAAAAAnA6BBQAAAAAAcDoEFgAAAAAAwOkQWAAAAAAAAKdDYAEAAAAAAJwOgQUAAAAAAHA6BBYAAAAAAMDpEFgAAAAAAACnQ2ABAAAAAACcDoEFAAAAAABwOgQWAAAAAADA6RBYAAAAAAAAp0NgAQAAAAAAnE661K4AAAB48Pz6LUrtKuAxcnx4k9SuAgAgDaKFBQAAAAAAcDoEFgAAAAAAwOkQWAAAAAAAAKdDYAEAAAAAAJwOgQUAAAAAAHA6BBYAAAAAAMDpEFgAAAAAAACnQ2ABAAAAAACcDoEFAAAAAABwOgQWAAAAAADA6RBYAAAAAAAAp0NgAQAAAAAAnA6BBQAAAAAAcDoEFgAAAAAAwOkQWAAAAAAAAKdDYAEAAAAAAJwOgQUAAAAAAHA6BBYAAAAAAMDpEFgAAAAAAACnQ2ABAAAAAACcDoEFAAAAAABwOgQWAAAAAADA6RBYAAAAAAAAp0NgAaRR48ePl5+fnzw8PFS5cmVt3rz5rmW//vpr2Ww2h4eHh8cjrC0AAACAtIbAAkiDZs6cqd69e2vQoEHavn27ypUrp5CQEJ07d+6u62TNmlVnz561HidOnHiENQYAAACQ1hBYAGnQ6NGj1aVLF4WGhqpUqVKaMGGCMmbMqKlTp951HZvNJh8fH+vh7e39CGsMAAAAIK0hsADSmLi4OG3btk3BwcHWMhcXFwUHBys8PPyu6127dk0FChSQr6+vnn76ae3du/dRVBcAAABAGkVgAaQxFy5cUEJCQrIWEt7e3oqIiEhxneLFi2vq1KmaP3++vvvuO9ntdlWrVk2nT5++635iY2MVHR3t8AAAAACA+0VgAeBvVa1aVR06dFBAQIBq166tuXPnKleuXJo4ceJd1xk2bJg8PT2th6+v7yOsMQAAAID/OgILII3x8vKSq6urIiMjHZZHRkbKx8fnvraRPn16lS9fXkeOHLlrmf79+ysqKsp6nDp16l/VGwAAAEDaQmABpDFubm4KDAxUWFiYtcxutyssLExVq1a9r20kJCRo9+7dypMnz13LuLu7K2vWrA4PAAAAALhf6VK7AgAevd69e6tjx44KCgpSpUqVNGbMGMXExCg0NFSS1KFDB+XLl0/Dhg2TJA0ZMkRVqlRRkSJFdOXKFY0cOVInTpzQSy+9lJqHAQAAAOAxRmABpEGtW7fW+fPnNXDgQEVERCggIEBLliyxBuI8efKkXFz+aoB1+fJldenSRREREcqePbsCAwO1ceNGlSpVKrUOAQAAAMBjzmaMMaldCQCPv+joaHl6eioqKsopuof49VuU2lXAY+T48CapXYVkOMfxIDnjOQ4A+O+633sDxrAAAAAAAABOh8ACAAAAAAA4HQILAAAAAADgdAgsAAAAAACA0yGwAAAAAAAATofAAgAAAAAAOB0CCwAAAAAA4HQILAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsAAAAAAOB0CCwAAAAAAIDTIbAAAAAAAABOh8ACAAAAAAA4HQILAAAAAADgdAgsAAAAAACA0yGwAAAAAAAATofAAgAAAAAAOB0CCwAAAAAA4HQILAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsAAAAAAOB0CCwAAAAAAIDTIbAAAAAAAABOh8ACAAAAAAA4HQILAAAAAADgdAgsAAAAAACA0yGwAAAAAAAATofAAgAAAAAAOB0CCwAAAAAA4HQILAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsAAAAAAOB0CCwAAAAAAIDTIbAAAAAAAABOh8ACAAAAAAA4HQILAAAAAADgdAgsAAAAAACA0yGwAAAAAAAATofAAgAAAAAAOB0CCwAAAAAA4HQILIA0avz48fLz85OHh4cqV66szZs339d6P/74o2w2m5o3b/5wKwgAAAAgTSOwANKgmTNnqnfv3ho0aJC2b9+ucuXKKSQkROfOnbvnesePH9dbb72lmjVrPqKaAgAAAEirCCyANGj06NHq0qWLQkNDVapUKU2YMEEZM2bU1KlT77pOQkKC2rVrp8GDB6tQoUKPsLYAAAAA0iICCyCNiYuL07Zt2xQcHGwtc3FxUXBwsMLDw++63pAhQ5Q7d269+OKL97Wf2NhYRUdHOzwAAAAA4H4RWABpzIULF5SQkCBvb2+H5d7e3oqIiEhxnfXr12vKlCmaPHnyfe9n2LBh8vT0tB6+vr7/qt4AAAAA0hYCCwD3dPXqVbVv316TJ0+Wl5fXfa/Xv39/RUVFWY9Tp049xFoCAAAAeNykS+0KAHi0vLy85OrqqsjISIflkZGR8vHxSVb+6NGjOn78uJ566ilrmd1ulySlS5dOBw8eVOHChZOt5+7uLnd39wdcewAAAABpBS0sgDTGzc1NgYGBCgsLs5bZ7XaFhYWpatWqycqXKFFCu3fv1s6dO61Hs2bN9OSTT2rnzp109QAAAADwUNDCAkiDevfurY4dOyooKEiVKlXSmDFjFBMTo9DQUElShw4dlC9fPg0bNkweHh7y9/d3WD9btmySlGw5AAAAADwoBBZAGtS6dWudP39eAwcOVEREhAICArRkyRJrIM6TJ0/KxYUGWAAAAABSD4EFkEZ1795d3bt3T/G51atX33Pdr7/++sFXCAAAAABuw1eoAAAAAADA6RBYAAAAAAAAp0NgAQAAAAAAnA6BBQAAAAAAcDoEFgAAAAAAwOkQWAAAAAAAAKdDYAEAAAAAAJwOgQUAAAAAAHA6BBYAAAAAAMDpEFgAAAAAAACnQ2AB/AfcunVLffv2VZEiRVSpUiVNnTrV4fnIyEi5urqmUu0AAAAA4MEjsAD+Az788EN9++23euWVV9SgQQP17t1bXbt2dShjjEml2gEAAADAg5cutSsA4O/NmDFDX331lZo2bSpJ6tSpkxo1aqTQ0FCrtYXNZkvNKgIAAADAA0ULC+A/4MyZM/L397d+LlKkiFavXq2NGzeqffv2SkhISMXaAQAAAMCDR2AB/Af4+Pjo6NGjDsvy5cunVatWacuWLerUqVPqVAwAAAAAHhICC+A/oG7duvr++++TLc+bN69WrlypY8eOpUKtAAAAAODhYQwL4D/gvffe04EDB1J8Ll++fFqzZo3mz5//iGsFAAAAAA8PLSyA/4ACBQooJCQkxediY2P1448/avDgwY+4VgAAAADw8BBYAP8BsbGx6t+/v4KCglStWjXNmzdPkjRt2jQVLFhQn376qXr16pW6lQQAAACAB4guIcB/wMCBAzVx4kQFBwdr48aNatWqlUJDQ/Xbb79p9OjRatWqlVxdXVO7mgAAAADwwBBYAP8Bs2fP1rfffqtmzZppz549Klu2rOLj4/X777/LZrOldvUAAAAA4IGjSwjwH3D69GkFBgZKkvz9/eXu7q5evXoRVgAAAAB4bBFYAP8BCQkJcnNzs35Oly6dMmfOnIo1AgAAAICHiy4hwH+AMUadOnWSu7u7JOnmzZt65ZVXlClTJodyc+fOTY3qAQAAAMADR2AB/Ad07NjR4ecXXnghlWoCAAAAAI8GgQXwHzBt2rTUrgIAAAAAPFKMYQEAAAAAAJwOgQUAAAAAAHA6BBYAAAAAAMDpEFgAAAAAAACnQ2ABAAAAAACcDoEFAAAAAABwOgQWAAAAAADA6RBYAAAAAAAAp0NgAQAAAAAAnA6BBQAAAAAAcDoEFgAAAAAAwOkQWAAAAAAAAKdDYAEAAAAAAJwOgQUAAAAAAHA6BBYAAAAAAMDpEFgAAAAAAACnQ2ABpFHjx4+Xn5+fPDw8VLlyZW3evPmuZefOnaugoCBly5ZNmTJlUkBAgKZPn/4IawsAAAAgrSGwANKgmTNnqnfv3ho0aJC2b9+ucuXKKSQkROfOnUuxfI4cOTRgwACFh4dr165dCg0NVWhoqJYuXfqIaw4AAAAgrSCwANKg0aNHq0uXLgoNDVWpUqU0YcIEZcyYUVOnTk2xfJ06ddSiRQuVLFlShQsXVs+ePVW2bFmtX7/+EdccAAAAQFpBYAGkMXFxcdq2bZuCg4OtZS4uLgoODlZ4ePjfrm+MUVhYmA4ePKhatWo9zKoCAAAASMPSpXYFADxaFy5cUEJCgry9vR2We3t768CBA3ddLyoqSvny5VNsbKxcXV31xRdfqH79+nctHxsbq9jYWOvn6Ojof195AAAAAGkGgQWA+5IlSxbt3LlT165dU1hYmHr37q1ChQqpTp06KZYfNmyYBg8e/GgrCQAAAOCxQWABpDFeXl5ydXVVZGSkw/LIyEj5+PjcdT0XFxcVKVJEkhQQEKD9+/dr2LBhdw0s+vfvr969e1s/R0dHy9fX998fAAAAAIA0gTEsgDTGzc1NgYGBCgsLs5bZ7XaFhYWpatWq970du93u0OXjTu7u7sqaNavDAwAAAADuFy0sgDSod+/e6tixo4KCglSpUiWNGTNGMTExCg0NlSR16NBB+fLl07BhwyQldu8ICgpS4cKFFRsbq8WLF2v69On68ssvU/MwAAAAADzGCCyANKh169Y6f/68Bg4cqIiICAUEBGjJkiXWQJwnT56Ui8tfDbBiYmL02muv6fTp08qQIYNKlCih7777Tq1bt06tQwAAAADwmLMZY0xqVwLA4y86Olqenp6Kiopyiu4hfv0WpXYV8Bg5PrxJalchGc5xPEjOeI4DAP677vfegDEsAAAAAACA0yGwAAAAAAAATofAAgAAAAAAOB0CCwAAAAAA4HQILAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsAAAAAAOB0CCwAAAAAAIDTIbAAAAAAAABOh8ACAAAAAAA4HQILAAAAAADgdAgsAAAAAACA0yGwAAAAAAAATofAAgAAAAAAOB0CCwAAAAAA4HQILAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsAAAAAAOB0CCwAAAAAAIDTIbAAAAAAAABOh8ACAAAAAAA4HQILAAAAAADgdAgsAAAAAACA0yGwAAAAAAAATofAAgAAAAAAOB0CCwAAAAAA4HQILAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsAAAAAAOB0CCwAAAAAAIDTIbAAAAAAAABOh8ACAAAAAAA4HQILAAAAAADgdAgsAAAAAACA0yGwAAAAAAAATofAAgAAAAAAOB0CCwAAAAAA4HQILAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsgjRo/frz8/Pzk4eGhypUra/PmzXctO3nyZNWsWVPZs2dX9uzZFRwcfM/yAAAAAPBvEVgAadDMmTPVu3dvDRo0SNu3b1e5cuUUEhKic+fOpVh+9erVatu2rVatWqXw8HD5+vqqQYMGOnPmzCOuOQAAAIC0gsACSINGjx6tLl26KDQ0VKVKldKECROUMWNGTZ06NcXyM2bM0GuvvaaAgACVKFFCX331lex2u8LCwh5xzQEAAACkFQQWQBoTFxenbdu2KTg42Frm4uKi4OBghYeH39c2rl+/rlu3bilHjhx3LRMbG6vo6GiHBwAAAADcLwILII25cOGCEhIS5O3t7bDc29tbERER97WNt99+W3nz5nUIPe40bNgweXp6Wg9fX99/VW8AAAAAaQuBBYB/ZPjw4frxxx/1888/y8PD467l+vfvr6ioKOtx6tSpR1hLAAAAAP916VK7AgAeLS8vL7m6uioyMtJheWRkpHx8fO657qhRozR8+HCtWLFCZcuWvWdZd3d3ubu7/+v6AgAAAEibaGEBpDFubm4KDAx0GDAzaQDNqlWr3nW9jz/+WEOHDtWSJUsUFBT0KKoKAAAAIA2jhQWQBvXu3VsdO3ZUUFCQKlWqpDFjxigmJkahoaGSpA4dOihfvnwaNmyYJGnEiBEaOHCgvv/+e/n5+VljXWTOnFmZM2dOteMAAAAA8PgisADSoNatW+v8+fMaOHCgIiIiFBAQoCVLllgDcZ48eVIuLn81wPryyy8VFxenZ5991mE7gwYN0vvvv/8oqw4AAAAgjSCwANKo7t27q3v37ik+t3r1aoefjx8//vArBAAAAAC3YQwLAAAAAADgdAgsAAAAAACA0yGwAAAAAAAATofAAgAAAAAAOB0CCwAAAAAA4HQILAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsAAAAAAOB0CCwAAAAAAIDTIbAAAAAAAABOh8ACAAAAAAA4HQILAAAAAADgdAgsAAAAAACA0yGwAAAAAAAATofAAgAAAAAAOB0CCwAAAAAA4HQILAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsAAAAAAOB0CCwAAAAAAIDTIbAAAAAAAABOh8ACAAAAAAA4HQILAAAAAADgdAgsAAAAAACA0yGwAAAAAAAATofAAgAAAAAAOB0CCwAAAAAA4HQILAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsAAAAAAOB0CCwAAAAAAIDTIbAAAAAAAABOh8ACAAAAAAA4HQILAAAAAADgdAgsAAAAAACA0yGwAAAAAAAATofAAgAAAAAAOB0CCwAAAAAA4HQILAAAAAAAgNMhsAAAAAAAAE6HwAJIo8aPHy8/Pz95eHiocuXK2rx5813L7t27V88884z8/Pxks9k0ZsyYR1dRAAAAAGkSgQWQBs2cOVO9e/fWoEGDtH37dpUrV04hISE6d+5ciuWvX7+uQoUKafjw4fLx8XnEtQUAAACQFhFYAGnQ6NGj1aVLF4WGhqpUqVKaMGGCMmbMqKlTp6ZYvmLFiho5cqTatGkjd3f3R1xbAAAAAGkRgQWQxsTFxWnbtm0KDg62lrm4uCg4OFjh4eEPbD+xsbGKjo52eAAAAADA/SKwANKYCxcuKCEhQd7e3g7Lvb29FRER8cD2M2zYMHl6eloPX1/fB7ZtAAAAAI8/AgsAD0X//v0VFRVlPU6dOpXaVQIAAADwH5IutSsA4NHy8vKSq6urIiMjHZZHRkY+0AE13d3dGe8CAAAAwP+MFhZAGuPm5qbAwECFhYVZy+x2u8LCwlS1atVUrBkAAAAA/IUWFkAa1Lt3b3Xs2FFBQUGqVKmSxowZo5iYGIWGhkqSOnTooHz58mnYsGGSEgfq3Ldvn/X/M2fOaOfOncqcObOKFCmSascBAAAA4PFFYAGkQa1bt9b58+c1cOBARUREKCAgQEuWLLEG4jx58qRcXP5qgPXnn3+qfPny1s+jRo3SqFGjVLt2ba1evfpRVx8AAABAGkBgAaRR3bt3V/fu3VN87s4Qws/PT8aYR1ArAAAAAEjEGBYAAAAAAMDpEFgAAAAAAACnQ2ABAAAAAACcDoEFAAAAAABwOgQWAAAAAADA6RBYAAAAAAAAp0NgAQAAAAAAnA6BBQAAAAAAcDoEFgAAAAAAwOkQWAAAAAAAAKdDYAEAAAAAAJwOgQUAAAAAAHA6BBYAAAAAAMDppEvtCgAAAAD/C79+i1K7CniMHB/eJLWrkAznOB4kZzzH/w4tLAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsAAAAAAOB0CCwAAAAAAIDTIbAAAAAAAABOh8ACAAAAAAA4HQILAAAAAADgdAgsAAAAAACA0yGwAAAAAAAATofAAgAAAAAAOB0CCwAAAAAA4HQILAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsAAAAAAOB0CCwAAAAAAIDTIbAAAAAAAABOh8ACAAAAAAA4HQILAAAAAADgdAgsAAAAAACA0yGwAAAAAAAATofAAgAAAAAAOB0CCwAAAAAA4HQILAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsAAAAAAOB0CCyANGr8+PHy8/OTh4eHKleurM2bN9+z/OzZs1WiRAl5eHioTJkyWrx48SOqKQAAAIC0iMACSINmzpyp3r17a9CgQdq+fbvKlSunkJAQnTt3LsXyGzduVNu2bfXiiy9qx44dat68uZo3b649e/Y84poDAAAASCsILIA0aPTo0erSpYtCQ0NVqlQpTZgwQRkzZtTUqVNTLD927Fg1bNhQffr0UcmSJTV06FBVqFBBn3/++SOuOQAAAIC0Il1qVwDAoxUXF6dt27apf//+1jIXFxcFBwcrPDw8xXXCw8PVu3dvh2UhISGaN2/eXfcTGxur2NhY6+eoqChJUnR09L+o/YNjj72e2lXAY8RZzuvbcY7jQXLGc1ziPMeD5YznOec4HiRnOseT6mKMuWc5Agsgjblw4YISEhLk7e3tsNzb21sHDhxIcZ2IiIgUy0dERNx1P8OGDdPgwYOTLff19f0fag04N88xqV0D4OHiHEdawHmOx50znuNXr16Vp6fnXZ8nsADwUPTv39+hVYbdbtelS5eUM2dO2Wy2VKwZ7ld0dLR8fX116tQpZc2aNbWrAzxwnONICzjP8bjjHP9vMsbo6tWryps37z3LEVgAaYyXl5dcXV0VGRnpsDwyMlI+Pj4pruPj4/OPykuSu7u73N3dHZZly5btf6s0UlXWrFm5AMBjjXMcaQHnOR53nOP/PfdqWZGEQTeBNMbNzU2BgYEKCwuzltntdoWFhalq1aoprlO1alWH8pK0fPnyu5YHAAAAgH+LFhZAGtS7d2917NhRQUFBqlSpksaMGaOYmBiFhoZKkjp06KB8+fJp2LBhkqSePXuqdu3a+uSTT9SkSRP9+OOP2rp1qyZNmpSahwEAAADgMUZgAaRBrVu31vnz5zVw4EBFREQoICBAS5YssQbWPHnypFxc/mqAVa1aNX3//fd699139c4776ho0aKaN2+e/P39U+sQ8Ai4u7tr0KBBybr2AI8LznGkBZzneNxxjj/ebObv5hEBAAAAAAB4xBjDAgAAAAAAOB0CCwAAAAAA4HQILAAAAAAAgNMhsAAAAAAAAE6HwAIAAAAAADgdAgsASKMSEhKUkJCQ2tUAHrr4+PjUrgLwUNnt9tSuAvBQGWO4ZkmjCCwAII1J+oPv6uoqV1dXGWN07dq1VK4V8PCkS5dOkhQTE5PKNQEeDheXxEv68PBw3bp1K5VrAzw4CQkJstvtstlscnV1Te3qIBUQWABAGpP0B//XX39VkyZNVKpUKb366qs6dOhQKtcM+HfsdrsVyBljrOWrV69W/vz51adPn9SqGvDApNSa4vLly6pUqZKqV6+uZcuWpUKtgIfD1dVVLi4uOnr0qN588029/vrrunnzZmpXC48QgQUAPKaSvpW409q1a1WwYEE988wzKly4sPr3768FCxZo+PDhqVBL4MFxcXGRq6ur4uPjZbPZJCUGF6tXr1ZkZKR27Nih8+fPp3ItgX/HxcVFJ0+e1MmTJ61lkZGRunHjhvz9/bVo0aJUrB3wv7k9cL7dr7/+qvLly6tUqVJavHixxo8fr2PHjqVCDZFaCCwA4DGV9K3EtWvXHPrwX7t2TRkzZtSoUaP02WefqUOHDmrevLmKFCmSirUF7t/d+jJfvHhRzz33nEqWLKkTJ05Ikmw2m06dOqWgoCDlyJFDv/zyy6OuLvCP3e3mzW6367PPPpOfn59eeuklRUVFSZJy5cqlyMhI1a1bV7t379bZs2cfdZWBfyUpcL5dVFSUBg4cqHr16uns2bPav3+/ChYsqDlz5qRSLZEaCCwA4D/Obrc7NH9PMmfOHAUFBalcuXIKDQ3V3LlzJUmBgYGqVKmSfvzxR40cOVJFixbVjBkztGvXLq1cuZLB2+C0jDH37MscExOjffv26ejRoxo/frw2bNggSSpcuLDy5MkjLy8vLV++/FFXG/jHbr95O336tMPyokWLKl26dLp48aJGjBihU6dOSZJCQkKUI0cO2e12/frrr6lSb+B+3XmtcevWLfXq1UuNGjWyWsKtXLlSFy9eVL169ZQjRw5J0osvvqgffviBMYnSEAILAPiPc3FxsZq/JwkLC1OfPn3UrFkzffrpp4qJiVH79u3122+/ydvbW1WqVNGePXv09ddf691339WOHTtks9k0YMAArV27NpWOBEju9jDOZrPJxcVFp06d0nvvvacWLVroyy+/1OHDhyUlfsvctm1bZcyYUQUKFNAbb7yhhIQEHTlyRB07dlSRIkV0+PBhxmuBU0mpJcX27dvVrl07FShQQM2bN9eAAQMUGRkpSSpXrpxKlSqlsmXLKiYmRsOHD9fvv/+umJgYPf/888qdOzfjWMDpJCQkOHyeu7i4KDo62hok9siRI5o4caK2bdumVatWSZJy5Mih7Nmza+XKlZKkDRs2aO3atTp48KB27dr16A8CqYLAAgD+Y5K+lUj6w3/9+nW9/fbbCgsLs8p89NFHqlixot555x01a9ZMc+fOVfny5fXJJ5/o2rVrqlq1qkqWLKmnn35aHTt2lL+/v9555x3t27dPN27cSJXjAlJyexh37do1jR49WlWrVlV4eLgKFiyoKVOmqFWrVpKkDBkyqG7durp+/brq1q2rHDly6KuvvtLKlStljFHjxo2VLl06LV68OLUOB0jmztZC69at09tvvy1J+uabb/Taa69pyZIleueddyRJuXPnVkhIiLZt26a+ffsqIiJCX3/9tbZt26ZChQqpatWqOnbsmA4cOPDIjwW40+0zk9lsNuvaZdy4capVq5Z27twpKbElkc1mU40aNbRkyRJJUq1atdSyZUvNnz9f+fPnV3BwsIoUKaL8+fPr+++/T5XjwaNHYAEA/zFJ41Ik3cht2rRJc+bMUaFChawyf/75pypVqqR06dIpNjZWktSrVy9t2LBBx48fV9GiRVWhQgWrNcX169f1008/qVixYgoICHjkxwRIjt80J13UrlixwiGMi42N1bfffqsVK1Zo9OjRmjNnjnbt2qUffvhBklS6dGmVLVtW33zzjaZNm6a9e/dagxMWL15cfn5+mjVr1iM8KuAvKXXfW7p0qUJDQ3XkyBFJkoeHh7p27aoZM2aoTp06atiwoQoUKKBffvlFx48fV7p06fTMM89oz549unjxokaNGqVTp06pevXqMsaofPnyunTpkn7++edHfXhAMkmB3E8//aQXXnhBo0ePliRVq1ZNFy5c0MGDByVJJ06cUNOmTVWgQAH98ccfOnjwoNXyc/bs2SpSpIg6dOigzz//XH369NGMGTN04cKFVDsuPDoEFgDghIwxDgNl3n6Ru3DhQpUrV07h4eGSEltTtGzZUgULFpSUOEhVhQoVtG7dOkl/XSw89dRTOnfunC5cuKAMGTKoSpUqOnHihMqUKaPcuXNr5syZGjBggHx8fFK8qAYettu/abbZbDp9+rSee+45K8jInDmzXnjhBdWtW1erV69W8+bNFRgYKFdXV3311VeKj49X1qxZ1a5dO02ZMkV58+bV0KFDNXHiRFWpUkWZM2dWnTp11KxZM12/fj21DhNpWFLQnDQorCRNmTJFbm5u1sDHgYGBevbZZ7V69WoFBwerZMmSio6O1rVr1zR//nxJUsmSJVWpUiV9/vnnKliwoKZOnaqBAwfK1dVVlStX1tixY/XKK688+gNEmnW3mcn27Nmj8uXLq1evXsqePbuuXr2q+Ph4BQYGqkCBAlYgvXr1avn7+6tly5a6fv26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MyYmRi+++KI++eQTff7557py5Yq+//57de3aVbGxsZo7d64kqVy5cipevLg15krSLEz58+e3BoYNCgpS9uzZZbfb1bhxY2sftWrVUr169SQ5fgOdLl06bt7wwNzZtelen58lS5ZU48aNFR8fr+rVq0tK/Ozu27evrl69qmXLlqlWrVoqUKCADhw4YIXK8fHxmj9/viZPnqxdu3ZJkr777jsNHz7coatH0nlduHBhvfDCC9a4FZzvcBZcXQD4T0sKIu42EFWSpOeqVKkiHx8frVmzRufPn7eeq1ixojJkyKCffvpJUuKgmrlz51aPHj3UpUsXtWrVShMnTlSbNm2sUeE9PT3VsGFDubi4MPMBHqp7jQeRtDxLliwqVKiQ+vTpo9dff11eXl5yd3dX3bp1tW7dOl2/fl1eXl6qWrWqjhw5omXLllnbmD9/vnLlyqWsWbNKSmwK/9FHH+mbb75Rjhw5HPZ3e9cmznM8aHc7p4wxypQpk2rWrKnq1aurePHiVqu1J554QlWqVLFm+ChVqpQCAgI0efJkHT58WK6urrp48aIWL16sFi1aWJ/X7733nk6fPu0wkGbSvoCH6fauTdu3b9err76qlStXSko+LkrOnDlVu3ZtXbp0SZkyZbI+84OCgpQxY0bt2rVLGTJk0PDhw7V7927VqlVLbdu2VdGiRdW7d2/VrVtXRYoUkZTYys7HxyfFOqVLl05dunTRs88++7AOG/ifEFgA+E9LCiLWrl2rF198US+//LKWLVuW4kVv0h/5evXq6ejRo9qxY4f1XJkyZeTv76+lS5dKSvyGrkqVKgoICFCZMmVUpkwZrVy50pra9E7cuOFhShoP4tKlS4qIiJD0103V7WFciRIltGbNGqu5b/r06VWlShVlyZJF3377raTELk9+fn5q37693n77bX355ZcaMWKE6tWrp8DAQEmSr6+v+vXr59CaIgldm/CgpBQM7Nq1S99//72ioqIcyiT9W6tWLdntdoeWbblz51ajRo20YcMGXb16VTlz5lSNGjVkt9vVoEEDde/eXf7+/kqXLp2aNWtmfV6XKFFCefPmTRYG8nmOh+3GjRv69NNPlS9fPtWsWVMTJ07UiBEjJCU//2w2mxo2bKjr169r2bJlcnFxsc5ZT09P68uXkJAQLVy4UB999JFy586tESNG6PTp03rzzTetMFoikMN/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0qWLJCUbkO32byb4Bg4Pg81ms/oX//rrr+rUqZM++ugja1yJkydPavHixapZs6aKFy8uY4wyZcokScqcObOKFy+u3Llz6+OPP9YzzzyjzJkzS5J++eUXTZo0SXa7Xf7+/nryySeVPn16a7/mtibwjAyPhylpWsTY2FiNGzdOFSpUUJUqVdSjRw+dP39ekrR06VL5+flZsxUYY6zz0tfXV6VLl9bVq1dVqFAhq1n9kSNHNGjQIP3+++9Knz69WrRooc8++0xubm4O5zef3XhYjDHWNcudhg8frg4dOlgDhG/ZskWZMmVSiRIlrNYTzZo10/Xr17VmzRq99dZb2r9/vxYuXKjWrVvrzJkz2rp1q1xdXdW/f39t3LhRFSpU0CuvvKJ69epp2bJlGjNmjNWSQqL7HvB3mN8JwP8sISHBCiiSQorp06dr8uTJatCggdq3b69XX31VM2bM0Jo1a1S+fHlJUr58+TR+/Hg1adJElSpV0owZM7RgwQK98cYbSpcunWJiYhQfH68MGTJIksqVK6fy5csrMjJSr732miZNmqQsWbKkWCdGy8ajEB0drY8//lifffaZMmbMqJo1a+qnn37S1KlTdeTIEeXMmVP79+9X7969Jf1182WMkc1mU+PGjTV79my1atVKXbt2VeXKlTV37lzNnz9fISEhio+PV9GiRTV16lSH/d5+E8e5jodtzJgxevvtt5UnTx716tVLLi4ueuutt5QzZ0598MEHcnd314ULFyT9dW4nnaM+Pj7q06ePGjZsqICAAD399NM6duyYwsLCVKFCBWswzJQGhwUeptsD51OnTsnT09MKEDJmzKiNGzfqxIkTKliwoGJiYvTkk0/Ky8tL27dvV2xsrIoUKaKAgADduHFDjRo1smYbq1ChgnLkyKFvv/1WQUFBeuutt9S2bVtdvnxZAQEB1v7NHTM70X0PuDeudgD8z5L+yK5du1adOnVSlixZNGDAANWqVUudO3fWE088oUqVKqls2bIOUyw2bNhQJUqU0KxZs1SpUiWVL19eH3/8sdatW6ebN29qw4YNyQaVqlatms6ePasLFy4oS5YsiouL41sJpJrLly9r2rRpCgkJUUREhGbPnq3nn39ePj4+unz5svWN3MqVK3Xr1i1JsqZnvHLligoVKqRvvvlGZcqU0bRp09S4cWMtXbpUAwYM0IgRIxwGeeM8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",
      "text/plain": [
       "<Figure size 1000x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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dOl09epVjR49WqGhoZKk+vXry9vbW3Fxcfr1119TpdzA43rwWuP+/fvq37+/GjZsaNWEW7duna5evao6derI29tbkvTyyy/rxx9/pE+iNITAAgD+xzk5OVnV3xOsXbtWAwYMUJMmTTRu3DhFRkaqY8eO2r59u3x9fVW5cmUdPHhQ3333nd59913t27dPNptNQ4YM0aZNm1JpT4CkEodxNptNTk5OCg0N1dChQ9W8eXN99dVXOnHihKT4p8zt2rVThgwZlCdPHvXr10+xsbE6efKkOnfurAIFCujEiRP01wKHklxNir1796pDhw7KkyePmjVrpiFDhig8PFySVLp0aRUrVkylSpVSZGSkPv74Yx04cECRkZFq3769smfPTj8WcDixsbF253MnJydFRERYncSePHlSU6ZM0Z49e7R+/XpJkre3t7JkyaJ169ZJkrZs2aJNmzbp2LFj+v3335/+TiBVEFgAwP+YhKcSCT/8UVFRevvtt7V27VprmY8++kgVKlTQO++8oyZNmmjhwoUqW7asPvvsM92+fVtVqlRR0aJF1bRpU3Xu3FklSpTQO++8o8OHD+vOnTupsl9AchKHcbdv39bYsWNVpUoVbdu2TXnz5tU333yj1q1bS5Lc3d1Vu3ZtRUVFqXbt2vL29tbXX3+tdevWyRijRo0aKV26dPrll19Sa3eAJB6sLbR582a9/fbbkqQZM2botdde04oVK/TOO+9IkrJnz6769etrz549GjhwoMLCwvTdd99pz549ypcvn6pUqaLTp0/r6NGjT31fgAclHpnMZrNZ1y4TJ05UjRo1tH//fknxNYlsNpuqVaumFStWSJJq1KihFi1aaPHixcqVK5dCQkJUoEAB5cqVS7Nnz06V/cHTR2ABAP9jEvqlSLiR27Fjh+bPn698+fJZy/z111+qWLGi0qVLp+joaElS//79tWXLFp05c0YFCxZUuXLlrNoUUVFRWrBggQoVKqQyZco89X0CJPsnzQkXtWvWrLEL46Kjo/X9999rzZo1Gjt2rObPn6/ff/9dP/74oySpePHiKlWqlGbMmKHp06fr0KFDVueEhQsXVmBgoObOnfsU9wr4P8k131u5cqW6du2qkydPSpLc3NzUs2dPzZo1S7Vq1VKDBg2UJ08eLVmyRGfOnFG6dOnUsmVLHTx4UFevXtWnn36q0NBQBQcHyxij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tW7dWj179lSlSpW0cOFCLV68WPXr11dMTIwKFiyob7/91m67iW/iONaR0saPH6+3335bOXLkUP/+/eXk5KS33npLPj4+GjlypFxdXXXlyhVJ/3dsJxyjfn5+GjBggBo0aKAyZcqoadOmOn36tNauXaty5cpZnWEm1zkskJISB86hoaHy8vKyAoQMGTJo69atOnv2rPLmzavIyEg999xzypo1q/bu3avo6GgVKFBAZcqU0Z07d9SwYUNrtLFy5crJ29tb33//vcqXL6+33npL7dq10/Xr11WmTBlr++aBkZ1ovgc8Glc7AP5rCT+ymzZtUpcuXeTh4aEhQ4aoRo0a6tatm3Lnzq2KFSuqVKlSdkMsNmjQQEWKFNHcuXNVsWJFlS1bVmPGjNHmzZt19+5dbdmyJUmnUlWrVtXFixd15coVeXh46N69ezyVQKq5fv26pk+frvr16yssLEzz5s1T+/bt5efnp+vXr1tP5NatW6f79+9LkjU8440bN5QvXz7NmDFDJUuW1PTp09WoUSOtXLlSQ4YM0ejRo+06eeM4R0p4VA2dhHlOTk4qVKiQZs+erb59+6ply5aqU6eOatasKUlq1qyZzp8/rx07dtiFaRcuXNDZs2dVsmRJLV26VJ07d9b+/ftljNGcOXO0dOlSlShRwlre0HkmUkhy58/o6Gh9+umnyps3r+rVq6e2bdvq66+/liR17txZsbGx2rlzpyTp559/VqdOnVShQgWdP39emzZtkiTVrVtX58+f19atW631FixYUGXLlrXO3+nSpVOePHmssCKhVkfiYA/A3yOwAPC3YmNjk/3RX7hwoXLkyKHnn39eu3btUoECBbRgwQKNHDlS/v7+stls1lO1qKgo66K0QIECypYtm8LCwnT//n2NHTtWxYsX1yuvvKKSJUuqadOmat26tcqXL29dONeoUUNeXl6aO3eupPjxyHkqgSfpUdWEH5QnTx7Vq1dPLi4u2rFjh8aPH68PP/xQJUqU0LFjxyRJvXv31rx587Ry5UpJ8Td/586d02effaaoqCgFBgbqu+++05w5c3T06FFt375drVu3tsqSgOMcT1LCufxRNXQSbqaaNWumjBkz6ttvv1X37t1VvHhxbdu2TbNnz9auXbuUN29eNWrUSKNHj9bcuXMVHR2t8PBwTZw4UT///LOk+KfO/fv31+LFizVz5kxV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",
      "text/plain": [
       "<Figure size 1000x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10, 5))\n",
    "plt.bar(results_df['model'], results_df['r2'])\n",
    "plt.xticks(rotation=20, ha='right')\n",
    "plt.title('Сравнение моделей по R2 на тестовой выборке')\n",
    "plt.ylabel('R2')\n",
    "plt.show()\n",
    "\n",
    "plt.figure(figsize=(10, 5))\n",
    "plt.bar(results_df['model'], results_df['rmse'])\n",
    "plt.xticks(rotation=20, ha='right')\n",
    "plt.title('Сравнение моделей по RMSE на тестовой выборке')\n",
    "plt.ylabel('RMSE')\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f4e8c3fc",
   "metadata": {},
   "source": [
    "## Финальная ячейка с ключевой информацией для вывода\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "9f16bc5f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "=== КЛЮЧЕВАЯ ИНФОРМАЦИЯ ДЛЯ ВЫВОДА ===\n",
      "Зависимая переменная: koi_period\n",
      "Число исходных признаков: 41\n",
      "Число признаков после кодирования: 46\n",
      "Метрики моделей на тестовой выборке:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>model</th>\n",
       "      <th>r2</th>\n",
       "      <th>rmse</th>\n",
       "      <th>mae</th>\n",
       "      <th>n_original_features</th>\n",
       "      <th>n_processed_features</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Ансамбль нейросетей по 3 методам отбора признаков</td>\n",
       "      <td>0.684944</td>\n",
       "      <td>75.744104</td>\n",
       "      <td>25.248001</td>\n",
       "      <td>41</td>\n",
       "      <td>11.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Нейросеть по всем признакам</td>\n",
       "      <td>0.554468</td>\n",
       "      <td>90.072964</td>\n",
       "      <td>20.087247</td>\n",
       "      <td>41</td>\n",
       "      <td>46.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Линейная регрессия по всем признакам</td>\n",
       "      <td>0.061597</td>\n",
       "      <td>130.722216</td>\n",
       "      <td>86.156605</td>\n",
       "      <td>41</td>\n",
       "      <td>46.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Lasso-отбор + линейная регрессия</td>\n",
       "      <td>0.061597</td>\n",
       "      <td>130.722216</td>\n",
       "      <td>86.156605</td>\n",
       "      <td>41</td>\n",
       "      <td>46.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                               model        r2        rmse  \\\n",
       "0  Ансамбль нейросетей по 3 методам отбора признаков  0.684944   75.744104   \n",
       "1                        Нейросеть по всем признакам  0.554468   90.072964   \n",
       "2               Линейная регрессия по всем признакам  0.061597  130.722216   \n",
       "3                   Lasso-отбор + линейная регрессия  0.061597  130.722216   \n",
       "\n",
       "         mae  n_original_features  n_processed_features  \n",
       "0  25.248001                   41                  11.0  \n",
       "1  20.087247                   41                  46.0  \n",
       "2  86.156605                   41                  46.0  \n",
       "3  86.156605                   41                  46.0  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Лучшая модель:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>model</th>\n",
       "      <th>r2</th>\n",
       "      <th>rmse</th>\n",
       "      <th>mae</th>\n",
       "      <th>n_original_features</th>\n",
       "      <th>n_processed_features</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Ансамбль нейросетей по 3 методам отбора признаков</td>\n",
       "      <td>0.684944</td>\n",
       "      <td>75.744104</td>\n",
       "      <td>25.248001</td>\n",
       "      <td>41</td>\n",
       "      <td>11.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                               model        r2       rmse  \\\n",
       "0  Ансамбль нейросетей по 3 методам отбора признаков  0.684944  75.744104   \n",
       "\n",
       "         mae  n_original_features  n_processed_features  \n",
       "0  25.248001                   41                  11.0  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Признаки, отобранные классическим методом Lasso:\n",
      "['num__koi_score', 'num__koi_fpflag_nt', 'num__koi_fpflag_ss', 'num__koi_fpflag_co', 'num__koi_fpflag_ec', 'num__koi_time0bk', 'num__koi_time0bk_err1', 'num__koi_time0bk_err2', 'num__koi_impact', 'num__koi_impact_err1', 'num__koi_impact_err2', 'num__koi_duration', 'num__koi_duration_err1', 'num__koi_duration_err2', 'num__koi_depth', 'num__koi_depth_err1', 'num__koi_depth_err2', 'num__koi_prad', 'num__koi_prad_err1', 'num__koi_prad_err2', 'num__koi_teq', 'num__koi_insol', 'num__koi_insol_err1', 'num__koi_insol_err2', 'num__koi_model_snr', 'num__koi_tce_plnt_num', 'num__koi_steff', 'num__koi_steff_err1', 'num__koi_steff_err2', 'num__koi_slogg', 'num__koi_slogg_err1', 'num__koi_slogg_err2', 'num__koi_srad', 'num__koi_srad_err1', 'num__koi_srad_err2', 'num__ra', 'num__dec', 'num__koi_kepmag', 'cat__koi_disposition_CANDIDATE', 'cat__koi_disposition_CONFIRMED', 'cat__koi_disposition_FALSE POSITIVE', 'cat__koi_pdisposition_CANDIDATE', 'cat__koi_pdisposition_FALSE POSITIVE', 'cat__koi_tce_delivname_q1_q16_tce', 'cat__koi_tce_delivname_q1_q17_dr24_tce', 'cat__koi_tce_delivname_q1_q17_dr25_tce']\n",
      "Количество: 46\n",
      "Размеры наборов признаков для ансамбля:\n",
      "f_regression: 11\n",
      "mutual_info: 11\n",
      "random_forest: 11\n",
      "Первые 20 признаков по методам отбора ансамбля:\n",
      "f_regression\n",
      "['num__koi_fpflag_ss', 'num__koi_fpflag_co', 'num__koi_time0bk', 'num__koi_duration', 'num__koi_duration_err1', 'num__koi_duration_err2', 'num__koi_teq', 'cat__koi_disposition_CANDIDATE', 'cat__koi_disposition_CONFIRMED', 'cat__koi_tce_delivname_q1_q16_tce', 'cat__koi_tce_delivname_q1_q17_dr25_tce']\n",
      "mutual_info\n",
      "['num__koi_score', 'num__koi_time0bk', 'num__koi_duration', 'num__koi_duration_err1', 'num__koi_duration_err2', 'num__koi_depth_err1', 'num__koi_depth_err2', 'num__koi_teq', 'num__koi_insol', 'num__koi_insol_err1', 'num__koi_insol_err2']\n",
      "random_forest\n",
      "['num__koi_insol', 'num__koi_teq', 'num__koi_time0bk', 'num__koi_srad', 'num__koi_srad_err1', 'num__koi_duration_err2', 'num__koi_duration_err1', 'num__koi_steff', 'num__koi_insol_err2', 'num__koi_insol_err1', 'num__koi_slogg']\n",
      "Последние эпохи обучения нейросети по всем признакам:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>loss</th>\n",
       "      <th>mae</th>\n",
       "      <th>rmse</th>\n",
       "      <th>val_loss</th>\n",
       "      <th>val_mae</th>\n",
       "      <th>val_rmse</th>\n",
       "      <th>epoch</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>75</th>\n",
       "      <td>1948.212891</td>\n",
       "      <td>16.764240</td>\n",
       "      <td>44.138565</td>\n",
       "      <td>10933792.0</td>\n",
       "      <td>103.203087</td>\n",
       "      <td>3306.628418</td>\n",
       "      <td>76</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>76</th>\n",
       "      <td>1898.589844</td>\n",
       "      <td>16.914137</td>\n",
       "      <td>43.572811</td>\n",
       "      <td>10932898.0</td>\n",
       "      <td>103.615562</td>\n",
       "      <td>3306.493164</td>\n",
       "      <td>77</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>77</th>\n",
       "      <td>1894.841675</td>\n",
       "      <td>16.581873</td>\n",
       "      <td>43.529778</td>\n",
       "      <td>10934878.0</td>\n",
       "      <td>102.889183</td>\n",
       "      <td>3306.792725</td>\n",
       "      <td>78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>78</th>\n",
       "      <td>1789.618774</td>\n",
       "      <td>16.162876</td>\n",
       "      <td>42.303886</td>\n",
       "      <td>10931300.0</td>\n",
       "      <td>103.077255</td>\n",
       "      <td>3306.251465</td>\n",
       "      <td>79</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>79</th>\n",
       "      <td>1848.366943</td>\n",
       "      <td>16.265190</td>\n",
       "      <td>42.992638</td>\n",
       "      <td>10930978.0</td>\n",
       "      <td>102.888580</td>\n",
       "      <td>3306.202637</td>\n",
       "      <td>80</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           loss        mae       rmse    val_loss     val_mae     val_rmse  \\\n",
       "75  1948.212891  16.764240  44.138565  10933792.0  103.203087  3306.628418   \n",
       "76  1898.589844  16.914137  43.572811  10932898.0  103.615562  3306.493164   \n",
       "77  1894.841675  16.581873  43.529778  10934878.0  102.889183  3306.792725   \n",
       "78  1789.618774  16.162876  42.303886  10931300.0  103.077255  3306.251465   \n",
       "79  1848.366943  16.265190  42.992638  10930978.0  102.888580  3306.202637   \n",
       "\n",
       "    epoch  \n",
       "75     76  \n",
       "76     77  \n",
       "77     78  \n",
       "78     79  \n",
       "79     80  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Метрики отдельных нейросетей ансамбля:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>method</th>\n",
       "      <th>r2</th>\n",
       "      <th>rmse</th>\n",
       "      <th>mae</th>\n",
       "      <th>n_features</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>f_regression</td>\n",
       "      <td>0.724869</td>\n",
       "      <td>70.782229</td>\n",
       "      <td>24.185272</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>mutual_info</td>\n",
       "      <td>0.480697</td>\n",
       "      <td>97.244557</td>\n",
       "      <td>28.830851</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>random_forest</td>\n",
       "      <td>0.613482</td>\n",
       "      <td>83.895706</td>\n",
       "      <td>32.712783</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          method        r2       rmse        mae  n_features\n",
       "0   f_regression  0.724869  70.782229  24.185272          11\n",
       "1    mutual_info  0.480697  97.244557  28.830851          11\n",
       "2  random_forest  0.613482  83.895706  32.712783          11"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print('=== КЛЮЧЕВАЯ ИНФОРМАЦИЯ ДЛЯ ВЫВОДА ===')\n",
    "print('Зависимая переменная:', selected_target)\n",
    "print('Число исходных признаков:', X.shape[1])\n",
    "print('Число признаков после кодирования:', X_train_proc_df.shape[1])\n",
    "\n",
    "print('Метрики моделей на тестовой выборке:')\n",
    "display(results_df)\n",
    "\n",
    "print('Лучшая модель:')\n",
    "display(best_model_row)\n",
    "\n",
    "print('Признаки, отобранные классическим методом Lasso:')\n",
    "print(selected_processed_lasso[:50])\n",
    "print('Количество:', len(selected_processed_lasso))\n",
    "\n",
    "print('Размеры наборов признаков для ансамбля:')\n",
    "for method_name in ['f_regression', 'mutual_info', 'random_forest']:\n",
    "    print(f'{method_name}:', len(selected_feature_sets[method_name]))\n",
    "\n",
    "print('Первые 20 признаков по методам отбора ансамбля:')\n",
    "for method_name in ['f_regression', 'mutual_info', 'random_forest']:\n",
    "    print('' + method_name)\n",
    "    print(selected_feature_sets[method_name][:20])\n",
    "\n",
    "print('Последние эпохи обучения нейросети по всем признакам:')\n",
    "display(nn_all_history.tail())\n",
    "\n",
    "print('Метрики отдельных нейросетей ансамбля:')\n",
    "display(pd.DataFrame(ensemble_member_metrics))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7c11b042",
   "metadata": {},
   "source": [
    "Итог\n",
    "\n",
    "Зависимой переменной выбрана koi_period. Сравнены четыре подхода: линейная регрессия по всем признакам, линейная регрессия после Lasso-отбора, нейросеть по всем признакам и ансамбль нейросетей по признакам, отобранным тремя методами (f_regression, mutual_info, random_forest).\n",
    "\n",
    "Лучший результат показал ансамбль нейросетей (R² = 0.685, RMSE ≈ 75.7), использующий 11 наиболее информативных признаков, что существенно лучше нейросети по всем признакам (R² = 0.554) и значительно превосходит линейные модели (R² ≈ 0.062).\n",
    "\n",
    "Следовательно, ансамбль нейросетей с предварительным отбором признаков является наиболее эффективным подходом для данной задачи регрессии."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
