{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3ff20f11",
   "metadata": {},
   "source": [
    "# Регрессия, отбор признаков, эволюционный поиск архитектуры и прототипы\n",
    "\n",
    "В работе:\n",
    "- автоматически определяется ключевая зависимая переменная;\n",
    "- строится базовая нейросеть регрессии по всем признакам;\n",
    "- вычисляется важность признаков;\n",
    "- по отобранным признакам строится вторая нейросеть с эволюционным поиском архитектуры;\n",
    "- выбирается лучшая модель на тестовой выборке;\n",
    "- по лучшей сети выделяются основные прототипы и интерпретируются их признаки."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "f3fe5c3b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import warnings\n",
    "import copy\n",
    "import math\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn.compose import ColumnTransformer\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.impute import SimpleImputer\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error\n",
    "from sklearn.neural_network import MLPRegressor\n",
    "from sklearn.cluster import KMeans\n",
    "\n",
    "warnings.filterwarnings(\"ignore\")\n",
    "np.random.seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "d13b7962",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Используемый файл: ./anxiety_depression_data.csv\n",
      "Форма датасета: (1200, 21)\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>Age</th>\n",
       "      <th>Gender</th>\n",
       "      <th>Education_Level</th>\n",
       "      <th>Employment_Status</th>\n",
       "      <th>Sleep_Hours</th>\n",
       "      <th>Physical_Activity_Hrs</th>\n",
       "      <th>Social_Support_Score</th>\n",
       "      <th>Anxiety_Score</th>\n",
       "      <th>Depression_Score</th>\n",
       "      <th>Stress_Level</th>\n",
       "      <th>...</th>\n",
       "      <th>Chronic_Illnesses</th>\n",
       "      <th>Medication_Use</th>\n",
       "      <th>Therapy</th>\n",
       "      <th>Meditation</th>\n",
       "      <th>Substance_Use</th>\n",
       "      <th>Financial_Stress</th>\n",
       "      <th>Work_Stress</th>\n",
       "      <th>Self_Esteem_Score</th>\n",
       "      <th>Life_Satisfaction_Score</th>\n",
       "      <th>Loneliness_Score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>56</td>\n",
       "      <td>Male</td>\n",
       "      <td>Bachelor's</td>\n",
       "      <td>Unemployed</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.4</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>9</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>7</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>69</td>\n",
       "      <td>Female</td>\n",
       "      <td>Bachelor's</td>\n",
       "      <td>Retired</td>\n",
       "      <td>8.8</td>\n",
       "      <td>2.8</td>\n",
       "      <td>6</td>\n",
       "      <td>18</td>\n",
       "      <td>7</td>\n",
       "      <td>6</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>7</td>\n",
       "      <td>4</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>46</td>\n",
       "      <td>Female</td>\n",
       "      <td>Master's</td>\n",
       "      <td>Employed</td>\n",
       "      <td>5.3</td>\n",
       "      <td>1.6</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>13</td>\n",
       "      <td>8</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>8</td>\n",
       "      <td>7</td>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>32</td>\n",
       "      <td>Female</td>\n",
       "      <td>High School</td>\n",
       "      <td>Unemployed</td>\n",
       "      <td>8.8</td>\n",
       "      <td>0.5</td>\n",
       "      <td>4</td>\n",
       "      <td>6</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>7</td>\n",
       "      <td>4</td>\n",
       "      <td>8</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>60</td>\n",
       "      <td>Female</td>\n",
       "      <td>Bachelor's</td>\n",
       "      <td>Retired</td>\n",
       "      <td>7.2</td>\n",
       "      <td>0.7</td>\n",
       "      <td>2</td>\n",
       "      <td>7</td>\n",
       "      <td>15</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Frequent</td>\n",
       "      <td>8</td>\n",
       "      <td>9</td>\n",
       "      <td>5</td>\n",
       "      <td>7</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 21 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   Age  Gender Education_Level Employment_Status  Sleep_Hours  \\\n",
       "0   56    Male      Bachelor's        Unemployed          6.0   \n",
       "1   69  Female      Bachelor's           Retired          8.8   \n",
       "2   46  Female        Master's          Employed          5.3   \n",
       "3   32  Female     High School        Unemployed          8.8   \n",
       "4   60  Female      Bachelor's           Retired          7.2   \n",
       "\n",
       "   Physical_Activity_Hrs  Social_Support_Score  Anxiety_Score  \\\n",
       "0                    0.4                     3              4   \n",
       "1                    2.8                     6             18   \n",
       "2                    1.6                     5              5   \n",
       "3                    0.5                     4              6   \n",
       "4                    0.7                     2              7   \n",
       "\n",
       "   Depression_Score  Stress_Level  ...  Chronic_Illnesses  Medication_Use  \\\n",
       "0                 2             9  ...                  0             NaN   \n",
       "1                 7             6  ...                  0             NaN   \n",
       "2                13             8  ...                  0             NaN   \n",
       "3                 3             4  ...                  1             NaN   \n",
       "4                15             3  ...                  0             NaN   \n",
       "\n",
       "  Therapy  Meditation  Substance_Use Financial_Stress  Work_Stress  \\\n",
       "0       0           1            NaN                4            3   \n",
       "1       1           0            NaN                1            4   \n",
       "2       0           1            NaN                8            7   \n",
       "3       0           0            NaN                7            4   \n",
       "4       1           1       Frequent                8            9   \n",
       "\n",
       "   Self_Esteem_Score  Life_Satisfaction_Score  Loneliness_Score  \n",
       "0                  7                        5                 1  \n",
       "1                  7                        4                 6  \n",
       "2                  8                        1                 1  \n",
       "3                  8                        4                 4  \n",
       "4                  5                        7                 7  \n",
       "\n",
       "[5 rows x 21 columns]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "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>Age</td>\n",
       "      <td>age</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Gender</td>\n",
       "      <td>gender</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Education_Level</td>\n",
       "      <td>education_level</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Employment_Status</td>\n",
       "      <td>employment_status</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Sleep_Hours</td>\n",
       "      <td>sleep_hours</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Physical_Activity_Hrs</td>\n",
       "      <td>physical_activity_hrs</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Social_Support_Score</td>\n",
       "      <td>social_support_score</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Anxiety_Score</td>\n",
       "      <td>anxiety_score</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>Depression_Score</td>\n",
       "      <td>depression_score</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Stress_Level</td>\n",
       "      <td>stress_level</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>Family_History_Mental_Illness</td>\n",
       "      <td>family_history_mental_illness</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Chronic_Illnesses</td>\n",
       "      <td>chronic_illnesses</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>Medication_Use</td>\n",
       "      <td>medication_use</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>Therapy</td>\n",
       "      <td>therapy</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>Meditation</td>\n",
       "      <td>meditation</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>Substance_Use</td>\n",
       "      <td>substance_use</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>Financial_Stress</td>\n",
       "      <td>financial_stress</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>Work_Stress</td>\n",
       "      <td>work_stress</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>Self_Esteem_Score</td>\n",
       "      <td>self_esteem_score</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>Life_Satisfaction_Score</td>\n",
       "      <td>life_satisfaction_score</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>Loneliness_Score</td>\n",
       "      <td>loneliness_score</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                    original_name                normalized_name\n",
       "0                             Age                            age\n",
       "1                          Gender                         gender\n",
       "2                 Education_Level                education_level\n",
       "3               Employment_Status              employment_status\n",
       "4                     Sleep_Hours                    sleep_hours\n",
       "5           Physical_Activity_Hrs          physical_activity_hrs\n",
       "6            Social_Support_Score           social_support_score\n",
       "7                   Anxiety_Score                  anxiety_score\n",
       "8                Depression_Score               depression_score\n",
       "9                    Stress_Level                   stress_level\n",
       "10  Family_History_Mental_Illness  family_history_mental_illness\n",
       "11              Chronic_Illnesses              chronic_illnesses\n",
       "12                 Medication_Use                 medication_use\n",
       "13                        Therapy                        therapy\n",
       "14                     Meditation                     meditation\n",
       "15                  Substance_Use                  substance_use\n",
       "16               Financial_Stress               financial_stress\n",
       "17                    Work_Stress                    work_stress\n",
       "18              Self_Esteem_Score              self_esteem_score\n",
       "19        Life_Satisfaction_Score        life_satisfaction_score\n",
       "20               Loneliness_Score               loneliness_score"
      ]
     },
     "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>age</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>gender</th>\n",
       "      <td>object</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>education_level</th>\n",
       "      <td>object</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>employment_status</th>\n",
       "      <td>object</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sleep_hours</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>physical_activity_hrs</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>social_support_score</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>anxiety_score</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>depression_score</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>stress_level</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>family_history_mental_illness</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>chronic_illnesses</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>medication_use</th>\n",
       "      <td>object</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>therapy</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>meditation</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>substance_use</th>\n",
       "      <td>object</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>financial_stress</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>work_stress</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>self_esteem_score</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>life_satisfaction_score</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>loneliness_score</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                 dtype\n",
       "age                              int64\n",
       "gender                          object\n",
       "education_level                 object\n",
       "employment_status               object\n",
       "sleep_hours                    float64\n",
       "physical_activity_hrs          float64\n",
       "social_support_score             int64\n",
       "anxiety_score                    int64\n",
       "depression_score                 int64\n",
       "stress_level                     int64\n",
       "family_history_mental_illness    int64\n",
       "chronic_illnesses                int64\n",
       "medication_use                  object\n",
       "therapy                          int64\n",
       "meditation                       int64\n",
       "substance_use                   object\n",
       "financial_stress                 int64\n",
       "work_stress                      int64\n",
       "self_esteem_score                int64\n",
       "life_satisfaction_score          int64\n",
       "loneliness_score                 int64"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def make_ohe():\n",
    "    from sklearn.preprocessing import OneHotEncoder\n",
    "    try:\n",
    "        return OneHotEncoder(handle_unknown=\"ignore\", sparse_output=False)\n",
    "    except TypeError:\n",
    "        return OneHotEncoder(handle_unknown=\"ignore\", sparse=False)\n",
    "\n",
    "def normalize_name(col):\n",
    "    col = str(col).strip().lower()\n",
    "    repl = {\n",
    "        \" \": \"_\", \"-\": \"_\", \"/\": \"_\", \"(\": \"\", \")\": \"\", \"%\": \"pct\",\n",
    "        \"'\": \"\", '\"': \"\", \",\": \"\", \".\": \"\", \"__\": \"_\"\n",
    "    }\n",
    "    for k, v in repl.items():\n",
    "        col = col.replace(k, v)\n",
    "    while \"__\" in col:\n",
    "        col = col.replace(\"__\", \"_\")\n",
    "    return col.strip(\"_\")\n",
    "\n",
    "def find_csv_file():\n",
    "    candidates = [\n",
    "        \"anxiety_depression_data.csv\",\n",
    "        \"Anxiety_Depression_Data.csv\",\n",
    "        \"mental_health.csv\",\n",
    "    ]\n",
    "    search_dirs = [\".\", \"/mnt/data\"]\n",
    "    for d in search_dirs:\n",
    "        for c in candidates:\n",
    "            p = os.path.join(d, c)\n",
    "            if os.path.exists(p):\n",
    "                return p\n",
    "    for d in search_dirs:\n",
    "        for fn in os.listdir(d):\n",
    "            if fn.lower().endswith(\".csv\") and \"anxiety\" in fn.lower():\n",
    "                return os.path.join(d, fn)\n",
    "    raise FileNotFoundError(\"CSV-файл не найден.\")\n",
    "\n",
    "csv_path = find_csv_file()\n",
    "df_raw = pd.read_csv(csv_path)\n",
    "print(\"Используемый файл:\", csv_path)\n",
    "print(\"Форма датасета:\", df_raw.shape)\n",
    "display(df_raw.head())\n",
    "\n",
    "orig_cols = list(df_raw.columns)\n",
    "df = df_raw.copy()\n",
    "df.columns = [normalize_name(c) for c in df.columns]\n",
    "\n",
    "display(pd.DataFrame({\"original_name\": orig_cols, \"normalized_name\": df.columns}))\n",
    "print(\"Типы данных:\")\n",
    "display(df.dtypes.astype(str).rename(\"dtype\").to_frame())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "f037b542",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Выбранная зависимая переменная: depression_score\n",
      "Найденные идентификаторы / несодержательные поля: []\n",
      "Число объектов после удаления пропусков по целевой переменной: 1200\n",
      "Число исходных признаков: 20\n",
      "Число числовых признаков: 15\n",
      "Число категориальных признаков: 5\n",
      "Категориальные признаки: ['gender', 'education_level', 'employment_status', 'medication_use', 'substance_use']\n"
     ]
    }
   ],
   "source": [
    "priority_targets = [\n",
    "    \"depression_score\", \"price\", \"amount\", \"survival_months\", \"happiness_score\",\n",
    "    \"risk_score\", \"score\", \"target\", \"label\"\n",
    "]\n",
    "\n",
    "target_col = None\n",
    "for c in priority_targets:\n",
    "    if c in df.columns:\n",
    "        target_col = c\n",
    "        break\n",
    "\n",
    "if target_col is None:\n",
    "    numeric_candidates = [c for c in df.columns if pd.api.types.is_numeric_dtype(df[c])]\n",
    "    numeric_candidates = [c for c in numeric_candidates if df[c].nunique(dropna=True) > 10]\n",
    "    if not numeric_candidates:\n",
    "        raise ValueError(\"Не удалось автоматически определить зависимую переменную.\")\n",
    "    target_col = numeric_candidates[-1]\n",
    "\n",
    "identifier_like = []\n",
    "for c in df.columns:\n",
    "    lc = c.lower()\n",
    "    if c == target_col:\n",
    "        continue\n",
    "    if \"id\" in lc and df[c].nunique(dropna=False) >= 0.95 * len(df):\n",
    "        identifier_like.append(c)\n",
    "\n",
    "print(\"Выбранная зависимая переменная:\", target_col)\n",
    "print(\"Найденные идентификаторы / несодержательные поля:\", identifier_like)\n",
    "\n",
    "X = df.drop(columns=[target_col] + identifier_like, errors=\"ignore\").copy()\n",
    "y = pd.to_numeric(df[target_col], errors=\"coerce\")\n",
    "\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(\"Число объектов после удаления пропусков по целевой переменной:\", len(X))\n",
    "print(\"Число исходных признаков:\", X.shape[1])\n",
    "\n",
    "numeric_features = [c for c in X.columns if pd.api.types.is_numeric_dtype(X[c])]\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",
    "print(\"Категориальные признаки:\", categorical_features)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "cd8e735d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Размеры выборок:\n",
      "train: (720, 20) val: (240, 20) test: (240, 20)\n",
      "Число признаков после кодирования: 32\n",
      "Первые признаки после преобразования:\n",
      "['num__age', 'num__sleep_hours', 'num__physical_activity_hrs', 'num__social_support_score', 'num__anxiety_score', 'num__stress_level', 'num__family_history_mental_illness', 'num__chronic_illnesses', 'num__therapy', 'num__meditation', 'num__financial_stress', 'num__work_stress', 'num__self_esteem_score', 'num__life_satisfaction_score', 'num__loneliness_score']\n"
     ]
    }
   ],
   "source": [
    "X_train_full, X_test, y_train_full, y_test = train_test_split(\n",
    "    X, y, test_size=0.2, random_state=42\n",
    ")\n",
    "X_train, X_val, y_train, y_val = train_test_split(\n",
    "    X_train_full, y_train_full, test_size=0.25, random_state=42\n",
    ")\n",
    "\n",
    "print(\"Размеры выборок:\")\n",
    "print(\"train:\", X_train.shape, \"val:\", X_val.shape, \"test:\", X_test.shape)\n",
    "\n",
    "def make_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\", make_ohe())\n",
    "    ])\n",
    "    return ColumnTransformer([\n",
    "        (\"num\", num_pipe, num_cols),\n",
    "        (\"cat\", cat_pipe, cat_cols)\n",
    "    ])\n",
    "\n",
    "preprocessor_all = make_preprocessor(numeric_features, categorical_features)\n",
    "X_train_proc = preprocessor_all.fit_transform(X_train)\n",
    "X_val_proc = preprocessor_all.transform(X_val)\n",
    "X_test_proc = preprocessor_all.transform(X_test)\n",
    "X_trainval_proc = preprocessor_all.transform(X_train_full)\n",
    "\n",
    "try:\n",
    "    feature_names_all = preprocessor_all.get_feature_names_out()\n",
    "except Exception:\n",
    "    feature_names_all = np.array([f\"f_{i}\" for i in range(X_train_proc.shape[1])])\n",
    "\n",
    "print(\"Число признаков после кодирования:\", X_train_proc.shape[1])\n",
    "print(\"Первые признаки после преобразования:\")\n",
    "print(feature_names_all[:15].tolist())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "52770335",
   "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):\n",
    "    return {\n",
    "        \"r2\": float(r2_score(y_true, y_pred)),\n",
    "        \"rmse\": rmse(y_true, y_pred),\n",
    "        \"mae\": float(mean_absolute_error(y_true, y_pred))\n",
    "    }\n",
    "\n",
    "def activation_forward(Z, activation):\n",
    "    if activation == \"relu\":\n",
    "        return np.maximum(0, Z)\n",
    "    if activation == \"tanh\":\n",
    "        return np.tanh(Z)\n",
    "    if activation == \"logistic\":\n",
    "        return 1.0 / (1.0 + np.exp(-np.clip(Z, -30, 30)))\n",
    "    return Z\n",
    "\n",
    "def get_hidden_representation(model, X_mat):\n",
    "    A = np.asarray(X_mat)\n",
    "    hidden_layers = len(model.coefs_) - 1\n",
    "    for i in range(hidden_layers):\n",
    "        A = activation_forward(A @ model.coefs_[i] + model.intercepts_[i], model.activation)\n",
    "    return A\n",
    "\n",
    "def restore_mlp_state(model, best_state):\n",
    "    model.coefs_ = [w.copy() for w in best_state[\"coefs\"]]\n",
    "    model.intercepts_ = [b.copy() for b in best_state[\"intercepts\"]]\n",
    "    model.n_layers_ = best_state[\"n_layers\"]\n",
    "    model.n_outputs_ = best_state[\"n_outputs\"]\n",
    "    model.out_activation_ = best_state[\"out_activation\"]\n",
    "    return model\n",
    "\n",
    "def train_mlp_epochs(X_tr, y_tr, X_va, y_va, hidden_layers=(64, 32), alpha=1e-4, learning_rate_init=1e-3,\n",
    "                     max_epochs=80, patience=12, random_state=42):\n",
    "    model = MLPRegressor(\n",
    "        hidden_layer_sizes=hidden_layers,\n",
    "        activation=\"relu\",\n",
    "        solver=\"adam\",\n",
    "        alpha=float(alpha),\n",
    "        learning_rate_init=float(learning_rate_init),\n",
    "        max_iter=1,\n",
    "        warm_start=True,\n",
    "        random_state=random_state,\n",
    "        shuffle=True\n",
    "    )\n",
    "    history = []\n",
    "    best_rmse = np.inf\n",
    "    best_state = None\n",
    "    bad_epochs = 0\n",
    "\n",
    "    for epoch in range(max_epochs):\n",
    "        model.fit(X_tr, y_tr)\n",
    "        pred_val = model.predict(X_va)\n",
    "        row = {\"epoch\": epoch + 1, \"train_loss\": float(model.loss_)}\n",
    "        row.update({f\"val_{k}\": v for k, v in regression_metrics(y_va, pred_val).items()})\n",
    "        history.append(row)\n",
    "\n",
    "        if row[\"val_rmse\"] < best_rmse - 1e-6:\n",
    "            best_rmse = row[\"val_rmse\"]\n",
    "            best_state = {\n",
    "                \"coefs\": [w.copy() for w in model.coefs_],\n",
    "                \"intercepts\": [b.copy() for b in model.intercepts_],\n",
    "                \"n_layers\": model.n_layers_,\n",
    "                \"n_outputs\": model.n_outputs_,\n",
    "                \"out_activation\": model.out_activation_,\n",
    "            }\n",
    "            bad_epochs = 0\n",
    "        else:\n",
    "            bad_epochs += 1\n",
    "            if bad_epochs >= patience:\n",
    "                break\n",
    "\n",
    "    if best_state is not None:\n",
    "        model = restore_mlp_state(model, best_state)\n",
    "\n",
    "    history_df = pd.DataFrame(history)\n",
    "    return model, history_df"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d78a635d",
   "metadata": {},
   "source": [
    "## Базовая нейросеть по всем признакам"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "ae3e2355",
   "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>split</th>\n",
       "      <th>r2</th>\n",
       "      <th>rmse</th>\n",
       "      <th>mae</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>train</td>\n",
       "      <td>-0.013093</td>\n",
       "      <td>5.776314</td>\n",
       "      <td>4.958591</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>validation</td>\n",
       "      <td>-0.058219</td>\n",
       "      <td>5.723308</td>\n",
       "      <td>4.865476</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>test</td>\n",
       "      <td>-0.021922</td>\n",
       "      <td>5.409027</td>\n",
       "      <td>4.586194</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        split        r2      rmse       mae\n",
       "0       train -0.013093  5.776314  4.958591\n",
       "1  validation -0.058219  5.723308  4.865476\n",
       "2        test -0.021922  5.409027  4.586194"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "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>epoch</th>\n",
       "      <th>train_loss</th>\n",
       "      <th>val_r2</th>\n",
       "      <th>val_rmse</th>\n",
       "      <th>val_mae</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>27</td>\n",
       "      <td>16.275144</td>\n",
       "      <td>-0.067589</td>\n",
       "      <td>5.748591</td>\n",
       "      <td>4.893690</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>28</td>\n",
       "      <td>16.191911</td>\n",
       "      <td>-0.070177</td>\n",
       "      <td>5.755554</td>\n",
       "      <td>4.900386</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>29</td>\n",
       "      <td>16.117483</td>\n",
       "      <td>-0.072643</td>\n",
       "      <td>5.762183</td>\n",
       "      <td>4.905966</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>30</td>\n",
       "      <td>16.047943</td>\n",
       "      <td>-0.074973</td>\n",
       "      <td>5.768437</td>\n",
       "      <td>4.910826</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>31</td>\n",
       "      <td>15.983154</td>\n",
       "      <td>-0.077235</td>\n",
       "      <td>5.774504</td>\n",
       "      <td>4.914959</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>32</td>\n",
       "      <td>15.920655</td>\n",
       "      <td>-0.079452</td>\n",
       "      <td>5.780442</td>\n",
       "      <td>4.919181</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>33</td>\n",
       "      <td>15.860420</td>\n",
       "      <td>-0.081620</td>\n",
       "      <td>5.786244</td>\n",
       "      <td>4.923123</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>34</td>\n",
       "      <td>15.802045</td>\n",
       "      <td>-0.083424</td>\n",
       "      <td>5.791067</td>\n",
       "      <td>4.926369</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>35</td>\n",
       "      <td>15.746198</td>\n",
       "      <td>-0.085228</td>\n",
       "      <td>5.795888</td>\n",
       "      <td>4.929124</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>36</td>\n",
       "      <td>15.691416</td>\n",
       "      <td>-0.086973</td>\n",
       "      <td>5.800545</td>\n",
       "      <td>4.931926</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    epoch  train_loss    val_r2  val_rmse   val_mae\n",
       "26     27   16.275144 -0.067589  5.748591  4.893690\n",
       "27     28   16.191911 -0.070177  5.755554  4.900386\n",
       "28     29   16.117483 -0.072643  5.762183  4.905966\n",
       "29     30   16.047943 -0.074973  5.768437  4.910826\n",
       "30     31   15.983154 -0.077235  5.774504  4.914959\n",
       "31     32   15.920655 -0.079452  5.780442  4.919181\n",
       "32     33   15.860420 -0.081620  5.786244  4.923123\n",
       "33     34   15.802045 -0.083424  5.791067  4.926369\n",
       "34     35   15.746198 -0.085228  5.795888  4.929124\n",
       "35     36   15.691416 -0.086973  5.800545  4.931926"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "baseline_hidden = (64, 32)\n",
    "\n",
    "baseline_model, baseline_history = train_mlp_epochs(\n",
    "    X_train_proc, y_train.values,\n",
    "    X_val_proc, y_val.values,\n",
    "    hidden_layers=baseline_hidden,\n",
    "    alpha=1e-4,\n",
    "    learning_rate_init=1e-3,\n",
    "    max_epochs=90,\n",
    "    patience=14,\n",
    "    random_state=42\n",
    ")\n",
    "\n",
    "baseline_pred_train = baseline_model.predict(X_train_proc)\n",
    "baseline_pred_val = baseline_model.predict(X_val_proc)\n",
    "baseline_pred_test = baseline_model.predict(X_test_proc)\n",
    "\n",
    "baseline_metrics = pd.DataFrame([\n",
    "    {\"split\": \"train\", **regression_metrics(y_train, baseline_pred_train)},\n",
    "    {\"split\": \"validation\", **regression_metrics(y_val, baseline_pred_val)},\n",
    "    {\"split\": \"test\", **regression_metrics(y_test, baseline_pred_test)},\n",
    "])\n",
    "\n",
    "display(baseline_metrics)\n",
    "display(baseline_history.tail(10))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6c58628b",
   "metadata": {},
   "source": [
    "## Важность признаков\n",
    "\n",
    "Важность считается методом перестановки по исходным признакам на валидационной выборке."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "047c697d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Отобранные признаки:\n",
      "['chronic_illnesses', 'family_history_mental_illness', 'age', 'therapy', 'sleep_hours', 'life_satisfaction_score', 'substance_use', 'social_support_score', 'anxiety_score', 'medication_use']\n",
      "Число отобранных исходных признаков: 10\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>feature</th>\n",
       "      <th>permutation_importance_mean</th>\n",
       "      <th>permutation_importance_std</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>chronic_illnesses</td>\n",
       "      <td>0.057684</td>\n",
       "      <td>0.026378</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>family_history_mental_illness</td>\n",
       "      <td>0.046450</td>\n",
       "      <td>0.019821</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>age</td>\n",
       "      <td>0.026258</td>\n",
       "      <td>0.017295</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>therapy</td>\n",
       "      <td>0.016052</td>\n",
       "      <td>0.015622</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>sleep_hours</td>\n",
       "      <td>0.013375</td>\n",
       "      <td>0.009451</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>life_satisfaction_score</td>\n",
       "      <td>0.012293</td>\n",
       "      <td>0.018486</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>substance_use</td>\n",
       "      <td>0.005546</td>\n",
       "      <td>0.005859</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>social_support_score</td>\n",
       "      <td>0.004895</td>\n",
       "      <td>0.017125</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>anxiety_score</td>\n",
       "      <td>0.003460</td>\n",
       "      <td>0.015902</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>medication_use</td>\n",
       "      <td>0.000856</td>\n",
       "      <td>0.003359</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                         feature  permutation_importance_mean  \\\n",
       "0              chronic_illnesses                     0.057684   \n",
       "1  family_history_mental_illness                     0.046450   \n",
       "2                            age                     0.026258   \n",
       "3                        therapy                     0.016052   \n",
       "4                    sleep_hours                     0.013375   \n",
       "5        life_satisfaction_score                     0.012293   \n",
       "6                  substance_use                     0.005546   \n",
       "7           social_support_score                     0.004895   \n",
       "8                  anxiety_score                     0.003460   \n",
       "9                 medication_use                     0.000856   \n",
       "\n",
       "   permutation_importance_std  \n",
       "0                    0.026378  \n",
       "1                    0.019821  \n",
       "2                    0.017295  \n",
       "3                    0.015622  \n",
       "4                    0.009451  \n",
       "5                    0.018486  \n",
       "6                    0.005859  \n",
       "7                    0.017125  \n",
       "8                    0.015902  \n",
       "9                    0.003359  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "baseline_val_rmse = rmse(y_val, baseline_pred_val)\n",
    "\n",
    "importance_rows = []\n",
    "for col in X_train.columns:\n",
    "    scores = []\n",
    "    for rep in range(5):\n",
    "        X_val_perm = X_val.copy()\n",
    "        shuffled = X_val_perm[col].sample(frac=1.0, replace=False, random_state=42 + rep).reset_index(drop=True)\n",
    "        X_val_perm[col] = shuffled.values\n",
    "        X_val_perm_proc = preprocessor_all.transform(X_val_perm)\n",
    "        pred_perm = baseline_model.predict(X_val_perm_proc)\n",
    "        score = rmse(y_val, pred_perm) - baseline_val_rmse\n",
    "        scores.append(score)\n",
    "    importance_rows.append({\n",
    "        \"feature\": col,\n",
    "        \"permutation_importance_mean\": float(np.mean(scores)),\n",
    "        \"permutation_importance_std\": float(np.std(scores))\n",
    "    })\n",
    "\n",
    "importance_df = pd.DataFrame(importance_rows).sort_values(\n",
    "    \"permutation_importance_mean\", ascending=False\n",
    ").reset_index(drop=True)\n",
    "\n",
    "positive_features = importance_df.loc[importance_df[\"permutation_importance_mean\"] > 0, \"feature\"].tolist()\n",
    "if len(positive_features) >= 6:\n",
    "    selected_features = positive_features[:min(10, len(positive_features))]\n",
    "else:\n",
    "    selected_features = importance_df[\"feature\"].head(min(8, len(importance_df))).tolist()\n",
    "\n",
    "print(\"Отобранные признаки:\")\n",
    "print(selected_features)\n",
    "print(\"Число отобранных исходных признаков:\", len(selected_features))\n",
    "\n",
    "display(importance_df.head(10))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b3da2be2",
   "metadata": {},
   "source": [
    "## Эволюционный поиск архитектуры для нейросети по отобранным признакам\n",
    "\n",
    "Используется упрощённая схема дифференциальной эволюции."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "7b3d954f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Число признаков после кодирования (отобранные): 12\n"
     ]
    }
   ],
   "source": [
    "selected_numeric = [c for c in selected_features if pd.api.types.is_numeric_dtype(X_train[c])]\n",
    "selected_categorical = [c for c in selected_features if c not in selected_numeric]\n",
    "\n",
    "preprocessor_sel = make_preprocessor(selected_numeric, selected_categorical)\n",
    "X_train_sel = preprocessor_sel.fit_transform(X_train[selected_features])\n",
    "X_val_sel = preprocessor_sel.transform(X_val[selected_features])\n",
    "X_test_sel = preprocessor_sel.transform(X_test[selected_features])\n",
    "X_trainval_sel = preprocessor_sel.transform(X_train_full[selected_features])\n",
    "\n",
    "try:\n",
    "    feature_names_sel = preprocessor_sel.get_feature_names_out()\n",
    "except Exception:\n",
    "    feature_names_sel = np.array([f\"f_{i}\" for i in range(X_train_sel.shape[1])])\n",
    "\n",
    "print(\"Число признаков после кодирования (отобранные):\", X_train_sel.shape[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "f08fca2e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Лучшая архитектура, найденная эволюционным поиском: (16,)\n",
      "alpha: 1.0842262717330157e-05\n",
      "learning_rate_init: 0.0015638885600349187\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>hidden_layers</th>\n",
       "      <th>alpha</th>\n",
       "      <th>learning_rate_init</th>\n",
       "      <th>rmse_val</th>\n",
       "      <th>mae_val</th>\n",
       "      <th>r2_val</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>(16,)</td>\n",
       "      <td>0.000011</td>\n",
       "      <td>0.001564</td>\n",
       "      <td>5.551231</td>\n",
       "      <td>4.675388</td>\n",
       "      <td>0.004458</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>(44,)</td>\n",
       "      <td>0.000544</td>\n",
       "      <td>0.000444</td>\n",
       "      <td>5.552015</td>\n",
       "      <td>4.697068</td>\n",
       "      <td>0.004177</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>(16,)</td>\n",
       "      <td>0.000005</td>\n",
       "      <td>0.001827</td>\n",
       "      <td>5.559879</td>\n",
       "      <td>4.713313</td>\n",
       "      <td>0.001353</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>(16,)</td>\n",
       "      <td>0.010000</td>\n",
       "      <td>0.001066</td>\n",
       "      <td>5.568650</td>\n",
       "      <td>4.699978</td>\n",
       "      <td>-0.001800</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>(53,)</td>\n",
       "      <td>0.000169</td>\n",
       "      <td>0.000391</td>\n",
       "      <td>5.582765</td>\n",
       "      <td>4.782222</td>\n",
       "      <td>-0.006885</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>(16,)</td>\n",
       "      <td>0.003430</td>\n",
       "      <td>0.002304</td>\n",
       "      <td>5.584976</td>\n",
       "      <td>4.734466</td>\n",
       "      <td>-0.007683</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>(16,)</td>\n",
       "      <td>0.000120</td>\n",
       "      <td>0.001827</td>\n",
       "      <td>5.589929</td>\n",
       "      <td>4.753042</td>\n",
       "      <td>-0.009471</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>(37,)</td>\n",
       "      <td>0.000447</td>\n",
       "      <td>0.000391</td>\n",
       "      <td>5.590092</td>\n",
       "      <td>4.731936</td>\n",
       "      <td>-0.009530</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>(30,)</td>\n",
       "      <td>0.000001</td>\n",
       "      <td>0.000943</td>\n",
       "      <td>5.594210</td>\n",
       "      <td>4.750652</td>\n",
       "      <td>-0.011017</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>(16,)</td>\n",
       "      <td>0.000806</td>\n",
       "      <td>0.001372</td>\n",
       "      <td>5.599830</td>\n",
       "      <td>4.742863</td>\n",
       "      <td>-0.013050</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  hidden_layers     alpha  learning_rate_init  rmse_val   mae_val    r2_val\n",
       "0         (16,)  0.000011            0.001564  5.551231  4.675388  0.004458\n",
       "1         (44,)  0.000544            0.000444  5.552015  4.697068  0.004177\n",
       "2         (16,)  0.000005            0.001827  5.559879  4.713313  0.001353\n",
       "3         (16,)  0.010000            0.001066  5.568650  4.699978 -0.001800\n",
       "4         (53,)  0.000169            0.000391  5.582765  4.782222 -0.006885\n",
       "5         (16,)  0.003430            0.002304  5.584976  4.734466 -0.007683\n",
       "6         (16,)  0.000120            0.001827  5.589929  4.753042 -0.009471\n",
       "7         (37,)  0.000447            0.000391  5.590092  4.731936 -0.009530\n",
       "8         (30,)  0.000001            0.000943  5.594210  4.750652 -0.011017\n",
       "9         (16,)  0.000806            0.001372  5.599830  4.742863 -0.013050"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "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>generation</th>\n",
       "      <th>best_hidden_layers</th>\n",
       "      <th>best_alpha</th>\n",
       "      <th>best_learning_rate_init</th>\n",
       "      <th>best_val_rmse</th>\n",
       "      <th>mean_val_rmse</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>(36,)</td>\n",
       "      <td>0.000011</td>\n",
       "      <td>0.001192</td>\n",
       "      <td>5.633396</td>\n",
       "      <td>6.030242</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>(16,)</td>\n",
       "      <td>0.000120</td>\n",
       "      <td>0.001827</td>\n",
       "      <td>5.589929</td>\n",
       "      <td>5.734029</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>(44,)</td>\n",
       "      <td>0.000544</td>\n",
       "      <td>0.000444</td>\n",
       "      <td>5.552015</td>\n",
       "      <td>5.633762</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>(16,)</td>\n",
       "      <td>0.000011</td>\n",
       "      <td>0.001564</td>\n",
       "      <td>5.551231</td>\n",
       "      <td>5.609500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>(16,)</td>\n",
       "      <td>0.000011</td>\n",
       "      <td>0.001564</td>\n",
       "      <td>5.551231</td>\n",
       "      <td>5.601236</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>(16,)</td>\n",
       "      <td>0.000011</td>\n",
       "      <td>0.001564</td>\n",
       "      <td>5.551231</td>\n",
       "      <td>5.595035</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>(16,)</td>\n",
       "      <td>0.000011</td>\n",
       "      <td>0.001564</td>\n",
       "      <td>5.551231</td>\n",
       "      <td>5.591482</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>(16,)</td>\n",
       "      <td>0.000011</td>\n",
       "      <td>0.001564</td>\n",
       "      <td>5.551231</td>\n",
       "      <td>5.587744</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   generation best_hidden_layers  best_alpha  best_learning_rate_init  \\\n",
       "0           1              (36,)    0.000011                 0.001192   \n",
       "1           2              (16,)    0.000120                 0.001827   \n",
       "2           3              (44,)    0.000544                 0.000444   \n",
       "3           4              (16,)    0.000011                 0.001564   \n",
       "4           5              (16,)    0.000011                 0.001564   \n",
       "5           6              (16,)    0.000011                 0.001564   \n",
       "6           7              (16,)    0.000011                 0.001564   \n",
       "7           8              (16,)    0.000011                 0.001564   \n",
       "\n",
       "   best_val_rmse  mean_val_rmse  \n",
       "0       5.633396       6.030242  \n",
       "1       5.589929       5.734029  \n",
       "2       5.552015       5.633762  \n",
       "3       5.551231       5.609500  \n",
       "4       5.551231       5.601236  \n",
       "5       5.551231       5.595035  \n",
       "6       5.551231       5.591482  \n",
       "7       5.551231       5.587744  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def decode_candidate(vec):\n",
    "    layers_n = int(np.clip(round(vec[0]), 1, 3))\n",
    "    h1 = int(np.clip(round(vec[1]), 16, 128))\n",
    "    h2 = int(np.clip(round(vec[2]), 8, 96))\n",
    "    h3 = int(np.clip(round(vec[3]), 4, 64))\n",
    "    hidden = [h1]\n",
    "    if layers_n >= 2:\n",
    "        hidden.append(h2)\n",
    "    if layers_n >= 3:\n",
    "        hidden.append(h3)\n",
    "    alpha = 10 ** float(np.clip(vec[4], -6, -2))\n",
    "    lr = 10 ** float(np.clip(vec[5], -4, -2.2))\n",
    "    return tuple(hidden), alpha, lr\n",
    "\n",
    "def evaluate_candidate(vec, X_tr, y_tr, X_va, y_va, random_state=42):\n",
    "    hidden, alpha, lr = decode_candidate(vec)\n",
    "    model = MLPRegressor(\n",
    "        hidden_layer_sizes=hidden,\n",
    "        activation=\"relu\",\n",
    "        solver=\"adam\",\n",
    "        alpha=alpha,\n",
    "        learning_rate_init=lr,\n",
    "        max_iter=220,\n",
    "        random_state=random_state\n",
    "    )\n",
    "    model.fit(X_tr, y_tr)\n",
    "    pred = model.predict(X_va)\n",
    "    m = regression_metrics(y_va, pred)\n",
    "    return {\n",
    "        \"hidden_layers\": hidden,\n",
    "        \"alpha\": alpha,\n",
    "        \"learning_rate_init\": lr,\n",
    "        \"rmse_val\": m[\"rmse\"],\n",
    "        \"mae_val\": m[\"mae\"],\n",
    "        \"r2_val\": m[\"r2\"]\n",
    "    }\n",
    "\n",
    "bounds = np.array([\n",
    "    [1, 3],\n",
    "    [16, 128],\n",
    "    [8, 96],\n",
    "    [4, 64],\n",
    "    [-6, -2],\n",
    "    [-4, -2.2],\n",
    "], dtype=float)\n",
    "\n",
    "rng = np.random.RandomState(42)\n",
    "pop_size = 10\n",
    "generations = 8\n",
    "F = 0.7\n",
    "CR = 0.8\n",
    "\n",
    "population = np.column_stack([\n",
    "    rng.uniform(bounds[i, 0], bounds[i, 1], size=pop_size) for i in range(bounds.shape[0])\n",
    "])\n",
    "\n",
    "scores = []\n",
    "config_rows = []\n",
    "\n",
    "for idx in range(pop_size):\n",
    "    res = evaluate_candidate(population[idx], X_train_sel, y_train.values, X_val_sel, y_val.values, random_state=42 + idx)\n",
    "    scores.append(res[\"rmse_val\"])\n",
    "    config_rows.append(res)\n",
    "\n",
    "evolution_rows = []\n",
    "\n",
    "for gen in range(generations):\n",
    "    for i in range(pop_size):\n",
    "        candidates = [idx for idx in range(pop_size) if idx != i]\n",
    "        a, b, c = rng.choice(candidates, 3, replace=False)\n",
    "        mutant = population[a] + F * (population[b] - population[c])\n",
    "        mutant = np.clip(mutant, bounds[:, 0], bounds[:, 1])\n",
    "\n",
    "        cross_points = rng.rand(bounds.shape[0]) < CR\n",
    "        if not np.any(cross_points):\n",
    "            cross_points[rng.randint(0, bounds.shape[0])] = True\n",
    "\n",
    "        trial = np.where(cross_points, mutant, population[i])\n",
    "        trial_res = evaluate_candidate(trial, X_train_sel, y_train.values, X_val_sel, y_val.values, random_state=1000 + gen * pop_size + i)\n",
    "        config_rows.append(trial_res)\n",
    "\n",
    "        if trial_res[\"rmse_val\"] <= scores[i]:\n",
    "            population[i] = trial\n",
    "            scores[i] = trial_res[\"rmse_val\"]\n",
    "\n",
    "    gen_best_idx = int(np.argmin(scores))\n",
    "    best_hidden, best_alpha, best_lr = decode_candidate(population[gen_best_idx])\n",
    "    evolution_rows.append({\n",
    "        \"generation\": gen + 1,\n",
    "        \"best_hidden_layers\": best_hidden,\n",
    "        \"best_alpha\": best_alpha,\n",
    "        \"best_learning_rate_init\": best_lr,\n",
    "        \"best_val_rmse\": float(scores[gen_best_idx]),\n",
    "        \"mean_val_rmse\": float(np.mean(scores))\n",
    "    })\n",
    "\n",
    "search_results_df = pd.DataFrame(config_rows).sort_values(\"rmse_val\").reset_index(drop=True)\n",
    "evolution_history_df = pd.DataFrame(evolution_rows)\n",
    "\n",
    "best_hidden = tuple(search_results_df.loc[0, \"hidden_layers\"])\n",
    "best_alpha = float(search_results_df.loc[0, \"alpha\"])\n",
    "best_lr = float(search_results_df.loc[0, \"learning_rate_init\"])\n",
    "\n",
    "print(\"Лучшая архитектура, найденная эволюционным поиском:\", best_hidden)\n",
    "print(\"alpha:\", best_alpha)\n",
    "print(\"learning_rate_init:\", best_lr)\n",
    "\n",
    "display(search_results_df.head(10))\n",
    "display(evolution_history_df)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70fe99bf",
   "metadata": {},
   "source": [
    "## Нейросеть по отобранным признакам с найденной архитектурой"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "f09534b3",
   "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>split</th>\n",
       "      <th>r2</th>\n",
       "      <th>rmse</th>\n",
       "      <th>mae</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>train</td>\n",
       "      <td>0.018793</td>\n",
       "      <td>5.684687</td>\n",
       "      <td>4.912494</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>validation</td>\n",
       "      <td>-0.009053</td>\n",
       "      <td>5.588771</td>\n",
       "      <td>4.734382</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>test</td>\n",
       "      <td>-0.055398</td>\n",
       "      <td>5.496904</td>\n",
       "      <td>4.637355</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        split        r2      rmse       mae\n",
       "0       train  0.018793  5.684687  4.912494\n",
       "1  validation -0.009053  5.588771  4.734382\n",
       "2        test -0.055398  5.496904  4.637355"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "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>epoch</th>\n",
       "      <th>train_loss</th>\n",
       "      <th>val_r2</th>\n",
       "      <th>val_rmse</th>\n",
       "      <th>val_mae</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>100</th>\n",
       "      <td>101</td>\n",
       "      <td>16.276995</td>\n",
       "      <td>-0.016674</td>\n",
       "      <td>5.609839</td>\n",
       "      <td>4.757262</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>101</th>\n",
       "      <td>102</td>\n",
       "      <td>16.266724</td>\n",
       "      <td>-0.015425</td>\n",
       "      <td>5.606391</td>\n",
       "      <td>4.753565</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>102</th>\n",
       "      <td>103</td>\n",
       "      <td>16.256315</td>\n",
       "      <td>-0.014249</td>\n",
       "      <td>5.603143</td>\n",
       "      <td>4.750321</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>103</th>\n",
       "      <td>104</td>\n",
       "      <td>16.245534</td>\n",
       "      <td>-0.013227</td>\n",
       "      <td>5.600320</td>\n",
       "      <td>4.747243</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>104</th>\n",
       "      <td>105</td>\n",
       "      <td>16.235812</td>\n",
       "      <td>-0.012402</td>\n",
       "      <td>5.598039</td>\n",
       "      <td>4.744767</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>105</th>\n",
       "      <td>106</td>\n",
       "      <td>16.226371</td>\n",
       "      <td>-0.011559</td>\n",
       "      <td>5.595708</td>\n",
       "      <td>4.742183</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>106</th>\n",
       "      <td>107</td>\n",
       "      <td>16.217521</td>\n",
       "      <td>-0.010879</td>\n",
       "      <td>5.593826</td>\n",
       "      <td>4.740074</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>107</th>\n",
       "      <td>108</td>\n",
       "      <td>16.209118</td>\n",
       "      <td>-0.010182</td>\n",
       "      <td>5.591898</td>\n",
       "      <td>4.737854</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>108</th>\n",
       "      <td>109</td>\n",
       "      <td>16.200081</td>\n",
       "      <td>-0.009614</td>\n",
       "      <td>5.590326</td>\n",
       "      <td>4.735994</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>109</th>\n",
       "      <td>110</td>\n",
       "      <td>16.190758</td>\n",
       "      <td>-0.009053</td>\n",
       "      <td>5.588771</td>\n",
       "      <td>4.734382</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     epoch  train_loss    val_r2  val_rmse   val_mae\n",
       "100    101   16.276995 -0.016674  5.609839  4.757262\n",
       "101    102   16.266724 -0.015425  5.606391  4.753565\n",
       "102    103   16.256315 -0.014249  5.603143  4.750321\n",
       "103    104   16.245534 -0.013227  5.600320  4.747243\n",
       "104    105   16.235812 -0.012402  5.598039  4.744767\n",
       "105    106   16.226371 -0.011559  5.595708  4.742183\n",
       "106    107   16.217521 -0.010879  5.593826  4.740074\n",
       "107    108   16.209118 -0.010182  5.591898  4.737854\n",
       "108    109   16.200081 -0.009614  5.590326  4.735994\n",
       "109    110   16.190758 -0.009053  5.588771  4.734382"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "selected_model, selected_history = train_mlp_epochs(\n",
    "    X_train_sel, y_train.values,\n",
    "    X_val_sel, y_val.values,\n",
    "    hidden_layers=best_hidden,\n",
    "    alpha=best_alpha,\n",
    "    learning_rate_init=best_lr,\n",
    "    max_epochs=110,\n",
    "    patience=18,\n",
    "    random_state=42\n",
    ")\n",
    "\n",
    "selected_pred_train = selected_model.predict(X_train_sel)\n",
    "selected_pred_val = selected_model.predict(X_val_sel)\n",
    "selected_pred_test = selected_model.predict(X_test_sel)\n",
    "\n",
    "selected_metrics = pd.DataFrame([\n",
    "    {\"split\": \"train\", **regression_metrics(y_train, selected_pred_train)},\n",
    "    {\"split\": \"validation\", **regression_metrics(y_val, selected_pred_val)},\n",
    "    {\"split\": \"test\", **regression_metrics(y_test, selected_pred_test)},\n",
    "])\n",
    "\n",
    "display(selected_metrics)\n",
    "display(selected_history.tail(10))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "48321dfd",
   "metadata": {},
   "source": [
    "## Сравнение моделей и выбор лучшей сети"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "7aa05b63",
   "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_test</th>\n",
       "      <th>rmse_test</th>\n",
       "      <th>mae_test</th>\n",
       "      <th>r2_val</th>\n",
       "      <th>rmse_val</th>\n",
       "      <th>mae_val</th>\n",
       "      <th>n_original_features</th>\n",
       "      <th>n_processed_features</th>\n",
       "      <th>hidden_layers</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Базовая нейросеть по всем признакам</td>\n",
       "      <td>-0.021922</td>\n",
       "      <td>5.409027</td>\n",
       "      <td>4.586194</td>\n",
       "      <td>-0.058219</td>\n",
       "      <td>5.723308</td>\n",
       "      <td>4.865476</td>\n",
       "      <td>20</td>\n",
       "      <td>32</td>\n",
       "      <td>(64, 32)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Нейросеть по отобранным признакам + эволюционн...</td>\n",
       "      <td>-0.055398</td>\n",
       "      <td>5.496904</td>\n",
       "      <td>4.637355</td>\n",
       "      <td>-0.009053</td>\n",
       "      <td>5.588771</td>\n",
       "      <td>4.734382</td>\n",
       "      <td>10</td>\n",
       "      <td>12</td>\n",
       "      <td>(16,)</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                               model   r2_test  rmse_test  \\\n",
       "0                Базовая нейросеть по всем признакам -0.021922   5.409027   \n",
       "1  Нейросеть по отобранным признакам + эволюционн... -0.055398   5.496904   \n",
       "\n",
       "   mae_test    r2_val  rmse_val   mae_val  n_original_features  \\\n",
       "0  4.586194 -0.058219  5.723308  4.865476                   20   \n",
       "1  4.637355 -0.009053  5.588771  4.734382                   10   \n",
       "\n",
       "   n_processed_features hidden_layers  \n",
       "0                    32      (64, 32)  \n",
       "1                    12         (16,)  "
      ]
     },
     "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_test</th>\n",
       "      <th>rmse_test</th>\n",
       "      <th>mae_test</th>\n",
       "      <th>r2_val</th>\n",
       "      <th>rmse_val</th>\n",
       "      <th>mae_val</th>\n",
       "      <th>n_original_features</th>\n",
       "      <th>n_processed_features</th>\n",
       "      <th>hidden_layers</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Базовая нейросеть по всем признакам</td>\n",
       "      <td>-0.021922</td>\n",
       "      <td>5.409027</td>\n",
       "      <td>4.586194</td>\n",
       "      <td>-0.058219</td>\n",
       "      <td>5.723308</td>\n",
       "      <td>4.865476</td>\n",
       "      <td>20</td>\n",
       "      <td>32</td>\n",
       "      <td>(64, 32)</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                 model   r2_test  rmse_test  mae_test  \\\n",
       "0  Базовая нейросеть по всем признакам -0.021922   5.409027  4.586194   \n",
       "\n",
       "     r2_val  rmse_val   mae_val  n_original_features  n_processed_features  \\\n",
       "0 -0.058219  5.723308  4.865476                   20                    32   \n",
       "\n",
       "  hidden_layers  \n",
       "0      (64, 32)  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "baseline_test = regression_metrics(y_test, baseline_pred_test)\n",
    "selected_test = regression_metrics(y_test, selected_pred_test)\n",
    "\n",
    "models_comparison = pd.DataFrame([\n",
    "    {\n",
    "        \"model\": \"Базовая нейросеть по всем признакам\",\n",
    "        \"r2_test\": baseline_test[\"r2\"],\n",
    "        \"rmse_test\": baseline_test[\"rmse\"],\n",
    "        \"mae_test\": baseline_test[\"mae\"],\n",
    "        \"r2_val\": float(regression_metrics(y_val, baseline_pred_val)[\"r2\"]),\n",
    "        \"rmse_val\": float(regression_metrics(y_val, baseline_pred_val)[\"rmse\"]),\n",
    "        \"mae_val\": float(regression_metrics(y_val, baseline_pred_val)[\"mae\"]),\n",
    "        \"n_original_features\": X.shape[1],\n",
    "        \"n_processed_features\": X_train_proc.shape[1],\n",
    "        \"hidden_layers\": str(baseline_hidden)\n",
    "    },\n",
    "    {\n",
    "        \"model\": \"Нейросеть по отобранным признакам + эволюционный поиск\",\n",
    "        \"r2_test\": selected_test[\"r2\"],\n",
    "        \"rmse_test\": selected_test[\"rmse\"],\n",
    "        \"mae_test\": selected_test[\"mae\"],\n",
    "        \"r2_val\": float(regression_metrics(y_val, selected_pred_val)[\"r2\"]),\n",
    "        \"rmse_val\": float(regression_metrics(y_val, selected_pred_val)[\"rmse\"]),\n",
    "        \"mae_val\": float(regression_metrics(y_val, selected_pred_val)[\"mae\"]),\n",
    "        \"n_original_features\": len(selected_features),\n",
    "        \"n_processed_features\": X_train_sel.shape[1],\n",
    "        \"hidden_layers\": str(best_hidden)\n",
    "    },\n",
    "]).sort_values([\"r2_test\", \"rmse_test\"], ascending=[False, True]).reset_index(drop=True)\n",
    "\n",
    "display(models_comparison)\n",
    "best_model_name = models_comparison.loc[0, \"model\"]\n",
    "print(\"Лучшая модель:\")\n",
    "display(models_comparison.head(1))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70060d8f",
   "metadata": {},
   "source": [
    "## Прототипы по лучшей сети\n",
    "\n",
    "Прототипы строятся в пространстве последнего скрытого слоя лучшей сети."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "2977212f",
   "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>prototype_id</th>\n",
       "      <th>support_n</th>\n",
       "      <th>support_share_train</th>\n",
       "      <th>representative_target</th>\n",
       "      <th>assigned_mean_target_train</th>\n",
       "      <th>chronic_illnesses</th>\n",
       "      <th>family_history_mental_illness</th>\n",
       "      <th>age</th>\n",
       "      <th>therapy</th>\n",
       "      <th>sleep_hours</th>\n",
       "      <th>life_satisfaction_score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>96</td>\n",
       "      <td>0.133333</td>\n",
       "      <td>16.0</td>\n",
       "      <td>11.791667</td>\n",
       "      <td>0.843750</td>\n",
       "      <td>0.479167</td>\n",
       "      <td>46.406250</td>\n",
       "      <td>0.229167</td>\n",
       "      <td>6.315625</td>\n",
       "      <td>5.083333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4</td>\n",
       "      <td>144</td>\n",
       "      <td>0.200000</td>\n",
       "      <td>12.0</td>\n",
       "      <td>11.243056</td>\n",
       "      <td>0.194444</td>\n",
       "      <td>0.430556</td>\n",
       "      <td>40.701389</td>\n",
       "      <td>0.201389</td>\n",
       "      <td>5.526389</td>\n",
       "      <td>4.833333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>138</td>\n",
       "      <td>0.191667</td>\n",
       "      <td>10.0</td>\n",
       "      <td>10.971014</td>\n",
       "      <td>0.463768</td>\n",
       "      <td>0.079710</td>\n",
       "      <td>44.811594</td>\n",
       "      <td>0.369565</td>\n",
       "      <td>6.938406</td>\n",
       "      <td>4.246377</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>207</td>\n",
       "      <td>0.287500</td>\n",
       "      <td>13.0</td>\n",
       "      <td>10.246377</td>\n",
       "      <td>0.028986</td>\n",
       "      <td>0.173913</td>\n",
       "      <td>51.381643</td>\n",
       "      <td>0.154589</td>\n",
       "      <td>6.431401</td>\n",
       "      <td>5.618357</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3</td>\n",
       "      <td>135</td>\n",
       "      <td>0.187500</td>\n",
       "      <td>15.0</td>\n",
       "      <td>9.970370</td>\n",
       "      <td>0.081481</td>\n",
       "      <td>0.577778</td>\n",
       "      <td>46.592593</td>\n",
       "      <td>0.192593</td>\n",
       "      <td>7.028889</td>\n",
       "      <td>6.014815</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   prototype_id  support_n  support_share_train  representative_target  \\\n",
       "0             2         96             0.133333                   16.0   \n",
       "1             4        144             0.200000                   12.0   \n",
       "2             0        138             0.191667                   10.0   \n",
       "3             1        207             0.287500                   13.0   \n",
       "4             3        135             0.187500                   15.0   \n",
       "\n",
       "   assigned_mean_target_train  chronic_illnesses  \\\n",
       "0                   11.791667           0.843750   \n",
       "1                   11.243056           0.194444   \n",
       "2                   10.971014           0.463768   \n",
       "3                   10.246377           0.028986   \n",
       "4                    9.970370           0.081481   \n",
       "\n",
       "   family_history_mental_illness        age   therapy  sleep_hours  \\\n",
       "0                       0.479167  46.406250  0.229167     6.315625   \n",
       "1                       0.430556  40.701389  0.201389     5.526389   \n",
       "2                       0.079710  44.811594  0.369565     6.938406   \n",
       "3                       0.173913  51.381643  0.154589     6.431401   \n",
       "4                       0.577778  46.592593  0.192593     7.028889   \n",
       "\n",
       "   life_satisfaction_score  \n",
       "0                 5.083333  \n",
       "1                 4.833333  \n",
       "2                 4.246377  \n",
       "3                 5.618357  \n",
       "4                 6.014815  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "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>prototype_id</th>\n",
       "      <th>feature</th>\n",
       "      <th>contribution_score</th>\n",
       "      <th>interpreted_value</th>\n",
       "      <th>rank</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>chronic_illnesses</td>\n",
       "      <td>0.026142</td>\n",
       "      <td>0.463768</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>family_history_mental_illness</td>\n",
       "      <td>0.024198</td>\n",
       "      <td>0.07971</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>therapy</td>\n",
       "      <td>0.005685</td>\n",
       "      <td>0.369565</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>life_satisfaction_score</td>\n",
       "      <td>0.004625</td>\n",
       "      <td>4.246377</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>sleep_hours</td>\n",
       "      <td>0.004250</td>\n",
       "      <td>6.938406</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1</td>\n",
       "      <td>chronic_illnesses</td>\n",
       "      <td>0.030723</td>\n",
       "      <td>0.028986</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1</td>\n",
       "      <td>family_history_mental_illness</td>\n",
       "      <td>0.014852</td>\n",
       "      <td>0.173913</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>1</td>\n",
       "      <td>age</td>\n",
       "      <td>0.007943</td>\n",
       "      <td>51.381643</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>1</td>\n",
       "      <td>therapy</td>\n",
       "      <td>0.002610</td>\n",
       "      <td>0.154589</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>1</td>\n",
       "      <td>life_satisfaction_score</td>\n",
       "      <td>0.002019</td>\n",
       "      <td>5.618357</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>2</td>\n",
       "      <td>chronic_illnesses</td>\n",
       "      <td>0.075839</td>\n",
       "      <td>0.84375</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>2</td>\n",
       "      <td>family_history_mental_illness</td>\n",
       "      <td>0.015433</td>\n",
       "      <td>0.479167</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>2</td>\n",
       "      <td>substance_use</td>\n",
       "      <td>0.001386</td>\n",
       "      <td>nan</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>2</td>\n",
       "      <td>social_support_score</td>\n",
       "      <td>0.001219</td>\n",
       "      <td>5.666667</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>2</td>\n",
       "      <td>sleep_hours</td>\n",
       "      <td>0.001105</td>\n",
       "      <td>6.315625</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>3</td>\n",
       "      <td>family_history_mental_illness</td>\n",
       "      <td>0.025217</td>\n",
       "      <td>0.577778</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>3</td>\n",
       "      <td>chronic_illnesses</td>\n",
       "      <td>0.023857</td>\n",
       "      <td>0.081481</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>3</td>\n",
       "      <td>sleep_hours</td>\n",
       "      <td>0.005028</td>\n",
       "      <td>7.028889</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>3</td>\n",
       "      <td>life_satisfaction_score</td>\n",
       "      <td>0.003939</td>\n",
       "      <td>6.014815</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>3</td>\n",
       "      <td>substance_use</td>\n",
       "      <td>0.001386</td>\n",
       "      <td>nan</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>4</td>\n",
       "      <td>family_history_mental_illness</td>\n",
       "      <td>0.010610</td>\n",
       "      <td>0.430556</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>4</td>\n",
       "      <td>age</td>\n",
       "      <td>0.009172</td>\n",
       "      <td>40.701389</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>4</td>\n",
       "      <td>chronic_illnesses</td>\n",
       "      <td>0.009083</td>\n",
       "      <td>0.194444</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>4</td>\n",
       "      <td>sleep_hours</td>\n",
       "      <td>0.007891</td>\n",
       "      <td>5.526389</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>4</td>\n",
       "      <td>social_support_score</td>\n",
       "      <td>0.002761</td>\n",
       "      <td>3.534722</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    prototype_id                        feature  contribution_score  \\\n",
       "0              0              chronic_illnesses            0.026142   \n",
       "1              0  family_history_mental_illness            0.024198   \n",
       "2              0                        therapy            0.005685   \n",
       "3              0        life_satisfaction_score            0.004625   \n",
       "4              0                    sleep_hours            0.004250   \n",
       "5              1              chronic_illnesses            0.030723   \n",
       "6              1  family_history_mental_illness            0.014852   \n",
       "7              1                            age            0.007943   \n",
       "8              1                        therapy            0.002610   \n",
       "9              1        life_satisfaction_score            0.002019   \n",
       "10             2              chronic_illnesses            0.075839   \n",
       "11             2  family_history_mental_illness            0.015433   \n",
       "12             2                  substance_use            0.001386   \n",
       "13             2           social_support_score            0.001219   \n",
       "14             2                    sleep_hours            0.001105   \n",
       "15             3  family_history_mental_illness            0.025217   \n",
       "16             3              chronic_illnesses            0.023857   \n",
       "17             3                    sleep_hours            0.005028   \n",
       "18             3        life_satisfaction_score            0.003939   \n",
       "19             3                  substance_use            0.001386   \n",
       "20             4  family_history_mental_illness            0.010610   \n",
       "21             4                            age            0.009172   \n",
       "22             4              chronic_illnesses            0.009083   \n",
       "23             4                    sleep_hours            0.007891   \n",
       "24             4           social_support_score            0.002761   \n",
       "\n",
       "   interpreted_value  rank  \n",
       "0           0.463768   1.0  \n",
       "1            0.07971   2.0  \n",
       "2           0.369565   3.0  \n",
       "3           4.246377   4.0  \n",
       "4           6.938406   5.0  \n",
       "5           0.028986   1.0  \n",
       "6           0.173913   2.0  \n",
       "7          51.381643   3.0  \n",
       "8           0.154589   4.0  \n",
       "9           5.618357   5.0  \n",
       "10           0.84375   1.0  \n",
       "11          0.479167   2.0  \n",
       "12               nan   3.0  \n",
       "13          5.666667   4.0  \n",
       "14          6.315625   5.0  \n",
       "15          0.577778   1.0  \n",
       "16          0.081481   2.0  \n",
       "17          7.028889   3.0  \n",
       "18          6.014815   4.0  \n",
       "19               nan   5.0  \n",
       "20          0.430556   1.0  \n",
       "21         40.701389   2.0  \n",
       "22          0.194444   3.0  \n",
       "23          5.526389   4.0  \n",
       "24          3.534722   5.0  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "if best_model_name == \"Базовая нейросеть по всем признакам\":\n",
    "    best_model = baseline_model\n",
    "    X_best_train_proc = X_train_proc\n",
    "    X_best_test_proc = X_test_proc\n",
    "    X_best_full_train_orig = X_train.reset_index(drop=True)\n",
    "    best_feature_pool = list(X_train.columns)\n",
    "    best_importance_df = importance_df.copy()\n",
    "else:\n",
    "    best_model = selected_model\n",
    "    X_best_train_proc = X_train_sel\n",
    "    X_best_test_proc = X_test_sel\n",
    "    X_best_full_train_orig = X_train[selected_features].reset_index(drop=True)\n",
    "    best_feature_pool = list(selected_features)\n",
    "    best_importance_df = importance_df[importance_df[\"feature\"].isin(selected_features)].reset_index(drop=True)\n",
    "\n",
    "hidden_train = get_hidden_representation(best_model, X_best_train_proc)\n",
    "\n",
    "n_prototypes = 5 if len(X_train) >= 200 else 4\n",
    "kmeans = KMeans(n_clusters=n_prototypes, random_state=42, n_init=10)\n",
    "cluster_labels = kmeans.fit_predict(hidden_train)\n",
    "centroids = kmeans.cluster_centers_\n",
    "\n",
    "global_profile = {}\n",
    "for col in X_best_full_train_orig.columns:\n",
    "    if pd.api.types.is_numeric_dtype(X_best_full_train_orig[col]):\n",
    "        global_profile[col] = float(pd.to_numeric(X_best_full_train_orig[col], errors=\"coerce\").mean())\n",
    "    else:\n",
    "        mode_series = X_best_full_train_orig[col].astype(str).mode()\n",
    "        global_profile[col] = mode_series.iloc[0] if len(mode_series) else \"\"\n",
    "\n",
    "prototype_rows = []\n",
    "contrib_rows = []\n",
    "importance_map = best_importance_df.set_index(\"feature\")[\"permutation_importance_mean\"].to_dict()\n",
    "if len(importance_map) == 0:\n",
    "    importance_map = {c: 1.0 for c in X_best_full_train_orig.columns}\n",
    "\n",
    "for pid in range(n_prototypes):\n",
    "    idx = np.where(cluster_labels == pid)[0]\n",
    "    cluster_hidden = hidden_train[idx]\n",
    "    centroid = centroids[pid]\n",
    "    dists = ((cluster_hidden - centroid) ** 2).sum(axis=1)\n",
    "    rep_local = idx[int(np.argmin(dists))]\n",
    "\n",
    "    support_n = int(len(idx))\n",
    "    support_share = float(support_n / len(X_best_full_train_orig))\n",
    "    mean_target = float(np.mean(y_train.iloc[idx]))\n",
    "    rep_target = float(y_train.iloc[rep_local])\n",
    "\n",
    "    row = {\n",
    "        \"prototype_id\": pid,\n",
    "        \"support_n\": support_n,\n",
    "        \"support_share_train\": support_share,\n",
    "        \"representative_target\": rep_target,\n",
    "        \"assigned_mean_target_train\": mean_target,\n",
    "    }\n",
    "\n",
    "    cluster_df = X_best_full_train_orig.iloc[idx].copy()\n",
    "    top_features_for_display = best_importance_df[\"feature\"].head(min(6, len(best_importance_df))).tolist()\n",
    "    for f in top_features_for_display:\n",
    "        if f in cluster_df.columns:\n",
    "            if pd.api.types.is_numeric_dtype(cluster_df[f]):\n",
    "                row[f] = float(pd.to_numeric(cluster_df[f], errors=\"coerce\").mean())\n",
    "            else:\n",
    "                mode_series = cluster_df[f].astype(str).mode()\n",
    "                row[f] = mode_series.iloc[0] if len(mode_series) else \"\"\n",
    "    prototype_rows.append(row)\n",
    "\n",
    "    for f in best_feature_pool:\n",
    "        weight = float(max(importance_map.get(f, 0.0), 0.0) + 1e-8)\n",
    "        if pd.api.types.is_numeric_dtype(cluster_df[f]):\n",
    "            proto_val = float(pd.to_numeric(cluster_df[f], errors=\"coerce\").mean())\n",
    "            glob_val = float(global_profile[f])\n",
    "            std_val = float(pd.to_numeric(X_best_full_train_orig[f], errors=\"coerce\").std() or 1.0)\n",
    "            contribution = abs(proto_val - glob_val) / std_val * weight\n",
    "            interpreted_value = proto_val\n",
    "        else:\n",
    "            proto_mode = cluster_df[f].astype(str).mode()\n",
    "            proto_val = proto_mode.iloc[0] if len(proto_mode) else \"\"\n",
    "            glob_val = str(global_profile[f])\n",
    "            contribution = weight * (1.0 if proto_val != glob_val else 0.25)\n",
    "            interpreted_value = proto_val\n",
    "        contrib_rows.append({\n",
    "            \"prototype_id\": pid,\n",
    "            \"feature\": f,\n",
    "            \"contribution_score\": float(contribution),\n",
    "            \"interpreted_value\": interpreted_value\n",
    "        })\n",
    "\n",
    "prototypes_df = pd.DataFrame(prototype_rows).sort_values(\"assigned_mean_target_train\", ascending=False).reset_index(drop=True)\n",
    "contrib_df = pd.DataFrame(contrib_rows)\n",
    "contrib_df[\"rank\"] = contrib_df.groupby(\"prototype_id\")[\"contribution_score\"].rank(ascending=False, method=\"first\")\n",
    "top_contrib_df = contrib_df[contrib_df[\"rank\"] <= 5].sort_values([\"prototype_id\", \"rank\"]).reset_index(drop=True)\n",
    "\n",
    "display(prototypes_df)\n",
    "display(top_contrib_df)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f2d31a26",
   "metadata": {},
   "source": [
    "## Проверка предсказаний"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "cf0d9625",
   "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>y_true</th>\n",
       "      <th>y_pred_baseline</th>\n",
       "      <th>y_pred_selected_evolution</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>16</td>\n",
       "      <td>9.519252</td>\n",
       "      <td>11.989278</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>17</td>\n",
       "      <td>11.572372</td>\n",
       "      <td>9.908807</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>10.735875</td>\n",
       "      <td>10.813565</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>20</td>\n",
       "      <td>11.004069</td>\n",
       "      <td>10.186070</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>9</td>\n",
       "      <td>11.022912</td>\n",
       "      <td>9.746795</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>8</td>\n",
       "      <td>9.401737</td>\n",
       "      <td>12.544338</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>4</td>\n",
       "      <td>13.862891</td>\n",
       "      <td>11.260416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>6</td>\n",
       "      <td>11.590289</td>\n",
       "      <td>12.187669</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>10</td>\n",
       "      <td>13.242773</td>\n",
       "      <td>13.777769</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>12</td>\n",
       "      <td>8.792552</td>\n",
       "      <td>11.169349</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   y_true  y_pred_baseline  y_pred_selected_evolution\n",
       "0      16         9.519252                  11.989278\n",
       "1      17        11.572372                   9.908807\n",
       "2       1        10.735875                  10.813565\n",
       "3      20        11.004069                  10.186070\n",
       "4       9        11.022912                   9.746795\n",
       "5       8         9.401737                  12.544338\n",
       "6       4        13.862891                  11.260416\n",
       "7       6        11.590289                  12.187669\n",
       "8      10        13.242773                  13.777769\n",
       "9      12         8.792552                  11.169349"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pred_table = pd.DataFrame({\n",
    "    \"y_true\": y_test.reset_index(drop=True),\n",
    "    \"y_pred_baseline\": baseline_pred_test,\n",
    "    \"y_pred_selected_evolution\": selected_pred_test,\n",
    "}).head(10)\n",
    "\n",
    "display(pred_table)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4f244401",
   "metadata": {},
   "source": [
    "## Итоговый блок для вывода\n",
    "\n",
    "Ниже печатаются все значения, необходимые для краткого итогового вывода по реальным результатам."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "058ee15d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "=== КЛЮЧЕВАЯ ИНФОРМАЦИЯ ДЛЯ ВЫВОДА ===\n",
      "Зависимая переменная: depression_score\n",
      "\n",
      "Число исходных признаков: 20\n",
      "Число признаков после кодирования (все признаки): 32\n",
      "Число отобранных исходных признаков: 10\n",
      "Число признаков после кодирования (отобранные признаки): 12\n",
      "Фиксированная архитектура первой модели: (64, 32)\n",
      "Архитектура, найденная эволюционным поиском: (16,)\n",
      "alpha найденной модели: 1.0842262717330157e-05\n",
      "learning_rate_init найденной модели: 0.0015638885600349187\n",
      "\n",
      "Отобранные признаки:\n",
      "['chronic_illnesses', 'family_history_mental_illness', 'age', 'therapy', 'sleep_hours', 'life_satisfaction_score', 'substance_use', 'social_support_score', 'anxiety_score', 'medication_use']\n",
      "\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_test</th>\n",
       "      <th>rmse_test</th>\n",
       "      <th>mae_test</th>\n",
       "      <th>r2_val</th>\n",
       "      <th>rmse_val</th>\n",
       "      <th>mae_val</th>\n",
       "      <th>n_original_features</th>\n",
       "      <th>n_processed_features</th>\n",
       "      <th>hidden_layers</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Базовая нейросеть по всем признакам</td>\n",
       "      <td>-0.021922</td>\n",
       "      <td>5.409027</td>\n",
       "      <td>4.586194</td>\n",
       "      <td>-0.058219</td>\n",
       "      <td>5.723308</td>\n",
       "      <td>4.865476</td>\n",
       "      <td>20</td>\n",
       "      <td>32</td>\n",
       "      <td>(64, 32)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Нейросеть по отобранным признакам + эволюционн...</td>\n",
       "      <td>-0.055398</td>\n",
       "      <td>5.496904</td>\n",
       "      <td>4.637355</td>\n",
       "      <td>-0.009053</td>\n",
       "      <td>5.588771</td>\n",
       "      <td>4.734382</td>\n",
       "      <td>10</td>\n",
       "      <td>12</td>\n",
       "      <td>(16,)</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                               model   r2_test  rmse_test  \\\n",
       "0                Базовая нейросеть по всем признакам -0.021922   5.409027   \n",
       "1  Нейросеть по отобранным признакам + эволюционн... -0.055398   5.496904   \n",
       "\n",
       "   mae_test    r2_val  rmse_val   mae_val  n_original_features  \\\n",
       "0  4.586194 -0.058219  5.723308  4.865476                   20   \n",
       "1  4.637355 -0.009053  5.588771  4.734382                   10   \n",
       "\n",
       "   n_processed_features hidden_layers  \n",
       "0                    32      (64, 32)  \n",
       "1                    12         (16,)  "
      ]
     },
     "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_test</th>\n",
       "      <th>rmse_test</th>\n",
       "      <th>mae_test</th>\n",
       "      <th>r2_val</th>\n",
       "      <th>rmse_val</th>\n",
       "      <th>mae_val</th>\n",
       "      <th>n_original_features</th>\n",
       "      <th>n_processed_features</th>\n",
       "      <th>hidden_layers</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Базовая нейросеть по всем признакам</td>\n",
       "      <td>-0.021922</td>\n",
       "      <td>5.409027</td>\n",
       "      <td>4.586194</td>\n",
       "      <td>-0.058219</td>\n",
       "      <td>5.723308</td>\n",
       "      <td>4.865476</td>\n",
       "      <td>20</td>\n",
       "      <td>32</td>\n",
       "      <td>(64, 32)</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                 model   r2_test  rmse_test  mae_test  \\\n",
       "0  Базовая нейросеть по всем признакам -0.021922   5.409027  4.586194   \n",
       "\n",
       "     r2_val  rmse_val   mae_val  n_original_features  n_processed_features  \\\n",
       "0 -0.058219  5.723308  4.865476                   20                    32   \n",
       "\n",
       "  hidden_layers  \n",
       "0      (64, 32)  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Топ-10 признаков по важности:\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>feature</th>\n",
       "      <th>permutation_importance_mean</th>\n",
       "      <th>permutation_importance_std</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>chronic_illnesses</td>\n",
       "      <td>0.057684</td>\n",
       "      <td>0.026378</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>family_history_mental_illness</td>\n",
       "      <td>0.046450</td>\n",
       "      <td>0.019821</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>age</td>\n",
       "      <td>0.026258</td>\n",
       "      <td>0.017295</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>therapy</td>\n",
       "      <td>0.016052</td>\n",
       "      <td>0.015622</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>sleep_hours</td>\n",
       "      <td>0.013375</td>\n",
       "      <td>0.009451</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>life_satisfaction_score</td>\n",
       "      <td>0.012293</td>\n",
       "      <td>0.018486</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>substance_use</td>\n",
       "      <td>0.005546</td>\n",
       "      <td>0.005859</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>social_support_score</td>\n",
       "      <td>0.004895</td>\n",
       "      <td>0.017125</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>anxiety_score</td>\n",
       "      <td>0.003460</td>\n",
       "      <td>0.015902</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>medication_use</td>\n",
       "      <td>0.000856</td>\n",
       "      <td>0.003359</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                         feature  permutation_importance_mean  \\\n",
       "0              chronic_illnesses                     0.057684   \n",
       "1  family_history_mental_illness                     0.046450   \n",
       "2                            age                     0.026258   \n",
       "3                        therapy                     0.016052   \n",
       "4                    sleep_hours                     0.013375   \n",
       "5        life_satisfaction_score                     0.012293   \n",
       "6                  substance_use                     0.005546   \n",
       "7           social_support_score                     0.004895   \n",
       "8                  anxiety_score                     0.003460   \n",
       "9                 medication_use                     0.000856   \n",
       "\n",
       "   permutation_importance_std  \n",
       "0                    0.026378  \n",
       "1                    0.019821  \n",
       "2                    0.017295  \n",
       "3                    0.015622  \n",
       "4                    0.009451  \n",
       "5                    0.018486  \n",
       "6                    0.005859  \n",
       "7                    0.017125  \n",
       "8                    0.015902  \n",
       "9                    0.003359  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Топ-10 конфигураций эволюционного поиска:\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>hidden_layers</th>\n",
       "      <th>alpha</th>\n",
       "      <th>learning_rate_init</th>\n",
       "      <th>rmse_val</th>\n",
       "      <th>mae_val</th>\n",
       "      <th>r2_val</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>(16,)</td>\n",
       "      <td>0.000011</td>\n",
       "      <td>0.001564</td>\n",
       "      <td>5.551231</td>\n",
       "      <td>4.675388</td>\n",
       "      <td>0.004458</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>(44,)</td>\n",
       "      <td>0.000544</td>\n",
       "      <td>0.000444</td>\n",
       "      <td>5.552015</td>\n",
       "      <td>4.697068</td>\n",
       "      <td>0.004177</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>(16,)</td>\n",
       "      <td>0.000005</td>\n",
       "      <td>0.001827</td>\n",
       "      <td>5.559879</td>\n",
       "      <td>4.713313</td>\n",
       "      <td>0.001353</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>(16,)</td>\n",
       "      <td>0.010000</td>\n",
       "      <td>0.001066</td>\n",
       "      <td>5.568650</td>\n",
       "      <td>4.699978</td>\n",
       "      <td>-0.001800</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>(53,)</td>\n",
       "      <td>0.000169</td>\n",
       "      <td>0.000391</td>\n",
       "      <td>5.582765</td>\n",
       "      <td>4.782222</td>\n",
       "      <td>-0.006885</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>(16,)</td>\n",
       "      <td>0.003430</td>\n",
       "      <td>0.002304</td>\n",
       "      <td>5.584976</td>\n",
       "      <td>4.734466</td>\n",
       "      <td>-0.007683</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>(16,)</td>\n",
       "      <td>0.000120</td>\n",
       "      <td>0.001827</td>\n",
       "      <td>5.589929</td>\n",
       "      <td>4.753042</td>\n",
       "      <td>-0.009471</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>(37,)</td>\n",
       "      <td>0.000447</td>\n",
       "      <td>0.000391</td>\n",
       "      <td>5.590092</td>\n",
       "      <td>4.731936</td>\n",
       "      <td>-0.009530</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>(30,)</td>\n",
       "      <td>0.000001</td>\n",
       "      <td>0.000943</td>\n",
       "      <td>5.594210</td>\n",
       "      <td>4.750652</td>\n",
       "      <td>-0.011017</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>(16,)</td>\n",
       "      <td>0.000806</td>\n",
       "      <td>0.001372</td>\n",
       "      <td>5.599830</td>\n",
       "      <td>4.742863</td>\n",
       "      <td>-0.013050</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  hidden_layers     alpha  learning_rate_init  rmse_val   mae_val    r2_val\n",
       "0         (16,)  0.000011            0.001564  5.551231  4.675388  0.004458\n",
       "1         (44,)  0.000544            0.000444  5.552015  4.697068  0.004177\n",
       "2         (16,)  0.000005            0.001827  5.559879  4.713313  0.001353\n",
       "3         (16,)  0.010000            0.001066  5.568650  4.699978 -0.001800\n",
       "4         (53,)  0.000169            0.000391  5.582765  4.782222 -0.006885\n",
       "5         (16,)  0.003430            0.002304  5.584976  4.734466 -0.007683\n",
       "6         (16,)  0.000120            0.001827  5.589929  4.753042 -0.009471\n",
       "7         (37,)  0.000447            0.000391  5.590092  4.731936 -0.009530\n",
       "8         (30,)  0.000001            0.000943  5.594210  4.750652 -0.011017\n",
       "9         (16,)  0.000806            0.001372  5.599830  4.742863 -0.013050"
      ]
     },
     "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>epoch</th>\n",
       "      <th>train_loss</th>\n",
       "      <th>val_r2</th>\n",
       "      <th>val_rmse</th>\n",
       "      <th>val_mae</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>27</td>\n",
       "      <td>16.275144</td>\n",
       "      <td>-0.067589</td>\n",
       "      <td>5.748591</td>\n",
       "      <td>4.893690</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>28</td>\n",
       "      <td>16.191911</td>\n",
       "      <td>-0.070177</td>\n",
       "      <td>5.755554</td>\n",
       "      <td>4.900386</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>29</td>\n",
       "      <td>16.117483</td>\n",
       "      <td>-0.072643</td>\n",
       "      <td>5.762183</td>\n",
       "      <td>4.905966</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>30</td>\n",
       "      <td>16.047943</td>\n",
       "      <td>-0.074973</td>\n",
       "      <td>5.768437</td>\n",
       "      <td>4.910826</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>31</td>\n",
       "      <td>15.983154</td>\n",
       "      <td>-0.077235</td>\n",
       "      <td>5.774504</td>\n",
       "      <td>4.914959</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>32</td>\n",
       "      <td>15.920655</td>\n",
       "      <td>-0.079452</td>\n",
       "      <td>5.780442</td>\n",
       "      <td>4.919181</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>33</td>\n",
       "      <td>15.860420</td>\n",
       "      <td>-0.081620</td>\n",
       "      <td>5.786244</td>\n",
       "      <td>4.923123</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>34</td>\n",
       "      <td>15.802045</td>\n",
       "      <td>-0.083424</td>\n",
       "      <td>5.791067</td>\n",
       "      <td>4.926369</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>35</td>\n",
       "      <td>15.746198</td>\n",
       "      <td>-0.085228</td>\n",
       "      <td>5.795888</td>\n",
       "      <td>4.929124</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>36</td>\n",
       "      <td>15.691416</td>\n",
       "      <td>-0.086973</td>\n",
       "      <td>5.800545</td>\n",
       "      <td>4.931926</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    epoch  train_loss    val_r2  val_rmse   val_mae\n",
       "26     27   16.275144 -0.067589  5.748591  4.893690\n",
       "27     28   16.191911 -0.070177  5.755554  4.900386\n",
       "28     29   16.117483 -0.072643  5.762183  4.905966\n",
       "29     30   16.047943 -0.074973  5.768437  4.910826\n",
       "30     31   15.983154 -0.077235  5.774504  4.914959\n",
       "31     32   15.920655 -0.079452  5.780442  4.919181\n",
       "32     33   15.860420 -0.081620  5.786244  4.923123\n",
       "33     34   15.802045 -0.083424  5.791067  4.926369\n",
       "34     35   15.746198 -0.085228  5.795888  4.929124\n",
       "35     36   15.691416 -0.086973  5.800545  4.931926"
      ]
     },
     "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>epoch</th>\n",
       "      <th>train_loss</th>\n",
       "      <th>val_r2</th>\n",
       "      <th>val_rmse</th>\n",
       "      <th>val_mae</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>100</th>\n",
       "      <td>101</td>\n",
       "      <td>16.276995</td>\n",
       "      <td>-0.016674</td>\n",
       "      <td>5.609839</td>\n",
       "      <td>4.757262</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>101</th>\n",
       "      <td>102</td>\n",
       "      <td>16.266724</td>\n",
       "      <td>-0.015425</td>\n",
       "      <td>5.606391</td>\n",
       "      <td>4.753565</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>102</th>\n",
       "      <td>103</td>\n",
       "      <td>16.256315</td>\n",
       "      <td>-0.014249</td>\n",
       "      <td>5.603143</td>\n",
       "      <td>4.750321</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>103</th>\n",
       "      <td>104</td>\n",
       "      <td>16.245534</td>\n",
       "      <td>-0.013227</td>\n",
       "      <td>5.600320</td>\n",
       "      <td>4.747243</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>104</th>\n",
       "      <td>105</td>\n",
       "      <td>16.235812</td>\n",
       "      <td>-0.012402</td>\n",
       "      <td>5.598039</td>\n",
       "      <td>4.744767</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>105</th>\n",
       "      <td>106</td>\n",
       "      <td>16.226371</td>\n",
       "      <td>-0.011559</td>\n",
       "      <td>5.595708</td>\n",
       "      <td>4.742183</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>106</th>\n",
       "      <td>107</td>\n",
       "      <td>16.217521</td>\n",
       "      <td>-0.010879</td>\n",
       "      <td>5.593826</td>\n",
       "      <td>4.740074</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>107</th>\n",
       "      <td>108</td>\n",
       "      <td>16.209118</td>\n",
       "      <td>-0.010182</td>\n",
       "      <td>5.591898</td>\n",
       "      <td>4.737854</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>108</th>\n",
       "      <td>109</td>\n",
       "      <td>16.200081</td>\n",
       "      <td>-0.009614</td>\n",
       "      <td>5.590326</td>\n",
       "      <td>4.735994</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>109</th>\n",
       "      <td>110</td>\n",
       "      <td>16.190758</td>\n",
       "      <td>-0.009053</td>\n",
       "      <td>5.588771</td>\n",
       "      <td>4.734382</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     epoch  train_loss    val_r2  val_rmse   val_mae\n",
       "100    101   16.276995 -0.016674  5.609839  4.757262\n",
       "101    102   16.266724 -0.015425  5.606391  4.753565\n",
       "102    103   16.256315 -0.014249  5.603143  4.750321\n",
       "103    104   16.245534 -0.013227  5.600320  4.747243\n",
       "104    105   16.235812 -0.012402  5.598039  4.744767\n",
       "105    106   16.226371 -0.011559  5.595708  4.742183\n",
       "106    107   16.217521 -0.010879  5.593826  4.740074\n",
       "107    108   16.209118 -0.010182  5.591898  4.737854\n",
       "108    109   16.200081 -0.009614  5.590326  4.735994\n",
       "109    110   16.190758 -0.009053  5.588771  4.734382"
      ]
     },
     "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>prototype_id</th>\n",
       "      <th>support_n</th>\n",
       "      <th>support_share_train</th>\n",
       "      <th>representative_target</th>\n",
       "      <th>assigned_mean_target_train</th>\n",
       "      <th>chronic_illnesses</th>\n",
       "      <th>family_history_mental_illness</th>\n",
       "      <th>age</th>\n",
       "      <th>therapy</th>\n",
       "      <th>sleep_hours</th>\n",
       "      <th>life_satisfaction_score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>96</td>\n",
       "      <td>0.133333</td>\n",
       "      <td>16.0</td>\n",
       "      <td>11.791667</td>\n",
       "      <td>0.843750</td>\n",
       "      <td>0.479167</td>\n",
       "      <td>46.406250</td>\n",
       "      <td>0.229167</td>\n",
       "      <td>6.315625</td>\n",
       "      <td>5.083333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4</td>\n",
       "      <td>144</td>\n",
       "      <td>0.200000</td>\n",
       "      <td>12.0</td>\n",
       "      <td>11.243056</td>\n",
       "      <td>0.194444</td>\n",
       "      <td>0.430556</td>\n",
       "      <td>40.701389</td>\n",
       "      <td>0.201389</td>\n",
       "      <td>5.526389</td>\n",
       "      <td>4.833333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>138</td>\n",
       "      <td>0.191667</td>\n",
       "      <td>10.0</td>\n",
       "      <td>10.971014</td>\n",
       "      <td>0.463768</td>\n",
       "      <td>0.079710</td>\n",
       "      <td>44.811594</td>\n",
       "      <td>0.369565</td>\n",
       "      <td>6.938406</td>\n",
       "      <td>4.246377</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>207</td>\n",
       "      <td>0.287500</td>\n",
       "      <td>13.0</td>\n",
       "      <td>10.246377</td>\n",
       "      <td>0.028986</td>\n",
       "      <td>0.173913</td>\n",
       "      <td>51.381643</td>\n",
       "      <td>0.154589</td>\n",
       "      <td>6.431401</td>\n",
       "      <td>5.618357</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3</td>\n",
       "      <td>135</td>\n",
       "      <td>0.187500</td>\n",
       "      <td>15.0</td>\n",
       "      <td>9.970370</td>\n",
       "      <td>0.081481</td>\n",
       "      <td>0.577778</td>\n",
       "      <td>46.592593</td>\n",
       "      <td>0.192593</td>\n",
       "      <td>7.028889</td>\n",
       "      <td>6.014815</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   prototype_id  support_n  support_share_train  representative_target  \\\n",
       "0             2         96             0.133333                   16.0   \n",
       "1             4        144             0.200000                   12.0   \n",
       "2             0        138             0.191667                   10.0   \n",
       "3             1        207             0.287500                   13.0   \n",
       "4             3        135             0.187500                   15.0   \n",
       "\n",
       "   assigned_mean_target_train  chronic_illnesses  \\\n",
       "0                   11.791667           0.843750   \n",
       "1                   11.243056           0.194444   \n",
       "2                   10.971014           0.463768   \n",
       "3                   10.246377           0.028986   \n",
       "4                    9.970370           0.081481   \n",
       "\n",
       "   family_history_mental_illness        age   therapy  sleep_hours  \\\n",
       "0                       0.479167  46.406250  0.229167     6.315625   \n",
       "1                       0.430556  40.701389  0.201389     5.526389   \n",
       "2                       0.079710  44.811594  0.369565     6.938406   \n",
       "3                       0.173913  51.381643  0.154589     6.431401   \n",
       "4                       0.577778  46.592593  0.192593     7.028889   \n",
       "\n",
       "   life_satisfaction_score  \n",
       "0                 5.083333  \n",
       "1                 4.833333  \n",
       "2                 4.246377  \n",
       "3                 5.618357  \n",
       "4                 6.014815  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Топ-5 вкладов признаков для прототипов:\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>prototype_id</th>\n",
       "      <th>feature</th>\n",
       "      <th>contribution_score</th>\n",
       "      <th>interpreted_value</th>\n",
       "      <th>rank</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>chronic_illnesses</td>\n",
       "      <td>0.026142</td>\n",
       "      <td>0.463768</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>family_history_mental_illness</td>\n",
       "      <td>0.024198</td>\n",
       "      <td>0.07971</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>therapy</td>\n",
       "      <td>0.005685</td>\n",
       "      <td>0.369565</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>life_satisfaction_score</td>\n",
       "      <td>0.004625</td>\n",
       "      <td>4.246377</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>sleep_hours</td>\n",
       "      <td>0.004250</td>\n",
       "      <td>6.938406</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1</td>\n",
       "      <td>chronic_illnesses</td>\n",
       "      <td>0.030723</td>\n",
       "      <td>0.028986</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1</td>\n",
       "      <td>family_history_mental_illness</td>\n",
       "      <td>0.014852</td>\n",
       "      <td>0.173913</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>1</td>\n",
       "      <td>age</td>\n",
       "      <td>0.007943</td>\n",
       "      <td>51.381643</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>1</td>\n",
       "      <td>therapy</td>\n",
       "      <td>0.002610</td>\n",
       "      <td>0.154589</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>1</td>\n",
       "      <td>life_satisfaction_score</td>\n",
       "      <td>0.002019</td>\n",
       "      <td>5.618357</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>2</td>\n",
       "      <td>chronic_illnesses</td>\n",
       "      <td>0.075839</td>\n",
       "      <td>0.84375</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>2</td>\n",
       "      <td>family_history_mental_illness</td>\n",
       "      <td>0.015433</td>\n",
       "      <td>0.479167</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>2</td>\n",
       "      <td>substance_use</td>\n",
       "      <td>0.001386</td>\n",
       "      <td>nan</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>2</td>\n",
       "      <td>social_support_score</td>\n",
       "      <td>0.001219</td>\n",
       "      <td>5.666667</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>2</td>\n",
       "      <td>sleep_hours</td>\n",
       "      <td>0.001105</td>\n",
       "      <td>6.315625</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>3</td>\n",
       "      <td>family_history_mental_illness</td>\n",
       "      <td>0.025217</td>\n",
       "      <td>0.577778</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>3</td>\n",
       "      <td>chronic_illnesses</td>\n",
       "      <td>0.023857</td>\n",
       "      <td>0.081481</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>3</td>\n",
       "      <td>sleep_hours</td>\n",
       "      <td>0.005028</td>\n",
       "      <td>7.028889</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>3</td>\n",
       "      <td>life_satisfaction_score</td>\n",
       "      <td>0.003939</td>\n",
       "      <td>6.014815</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>3</td>\n",
       "      <td>substance_use</td>\n",
       "      <td>0.001386</td>\n",
       "      <td>nan</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>4</td>\n",
       "      <td>family_history_mental_illness</td>\n",
       "      <td>0.010610</td>\n",
       "      <td>0.430556</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>4</td>\n",
       "      <td>age</td>\n",
       "      <td>0.009172</td>\n",
       "      <td>40.701389</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>4</td>\n",
       "      <td>chronic_illnesses</td>\n",
       "      <td>0.009083</td>\n",
       "      <td>0.194444</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>4</td>\n",
       "      <td>sleep_hours</td>\n",
       "      <td>0.007891</td>\n",
       "      <td>5.526389</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>4</td>\n",
       "      <td>social_support_score</td>\n",
       "      <td>0.002761</td>\n",
       "      <td>3.534722</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    prototype_id                        feature  contribution_score  \\\n",
       "0              0              chronic_illnesses            0.026142   \n",
       "1              0  family_history_mental_illness            0.024198   \n",
       "2              0                        therapy            0.005685   \n",
       "3              0        life_satisfaction_score            0.004625   \n",
       "4              0                    sleep_hours            0.004250   \n",
       "5              1              chronic_illnesses            0.030723   \n",
       "6              1  family_history_mental_illness            0.014852   \n",
       "7              1                            age            0.007943   \n",
       "8              1                        therapy            0.002610   \n",
       "9              1        life_satisfaction_score            0.002019   \n",
       "10             2              chronic_illnesses            0.075839   \n",
       "11             2  family_history_mental_illness            0.015433   \n",
       "12             2                  substance_use            0.001386   \n",
       "13             2           social_support_score            0.001219   \n",
       "14             2                    sleep_hours            0.001105   \n",
       "15             3  family_history_mental_illness            0.025217   \n",
       "16             3              chronic_illnesses            0.023857   \n",
       "17             3                    sleep_hours            0.005028   \n",
       "18             3        life_satisfaction_score            0.003939   \n",
       "19             3                  substance_use            0.001386   \n",
       "20             4  family_history_mental_illness            0.010610   \n",
       "21             4                            age            0.009172   \n",
       "22             4              chronic_illnesses            0.009083   \n",
       "23             4                    sleep_hours            0.007891   \n",
       "24             4           social_support_score            0.002761   \n",
       "\n",
       "   interpreted_value  rank  \n",
       "0           0.463768   1.0  \n",
       "1            0.07971   2.0  \n",
       "2           0.369565   3.0  \n",
       "3           4.246377   4.0  \n",
       "4           6.938406   5.0  \n",
       "5           0.028986   1.0  \n",
       "6           0.173913   2.0  \n",
       "7          51.381643   3.0  \n",
       "8           0.154589   4.0  \n",
       "9           5.618357   5.0  \n",
       "10           0.84375   1.0  \n",
       "11          0.479167   2.0  \n",
       "12               nan   3.0  \n",
       "13          5.666667   4.0  \n",
       "14          6.315625   5.0  \n",
       "15          0.577778   1.0  \n",
       "16          0.081481   2.0  \n",
       "17          7.028889   3.0  \n",
       "18          6.014815   4.0  \n",
       "19               nan   5.0  \n",
       "20          0.430556   1.0  \n",
       "21         40.701389   2.0  \n",
       "22          0.194444   3.0  \n",
       "23          5.526389   4.0  \n",
       "24          3.534722   5.0  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Первые 10 фактических и предсказанных значений на тесте:\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>y_true</th>\n",
       "      <th>y_pred_baseline</th>\n",
       "      <th>y_pred_selected_evolution</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>16</td>\n",
       "      <td>9.519252</td>\n",
       "      <td>11.989278</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>17</td>\n",
       "      <td>11.572372</td>\n",
       "      <td>9.908807</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>10.735875</td>\n",
       "      <td>10.813565</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>20</td>\n",
       "      <td>11.004069</td>\n",
       "      <td>10.186070</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>9</td>\n",
       "      <td>11.022912</td>\n",
       "      <td>9.746795</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>8</td>\n",
       "      <td>9.401737</td>\n",
       "      <td>12.544338</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>4</td>\n",
       "      <td>13.862891</td>\n",
       "      <td>11.260416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>6</td>\n",
       "      <td>11.590289</td>\n",
       "      <td>12.187669</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>10</td>\n",
       "      <td>13.242773</td>\n",
       "      <td>13.777769</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>12</td>\n",
       "      <td>8.792552</td>\n",
       "      <td>11.169349</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   y_true  y_pred_baseline  y_pred_selected_evolution\n",
       "0      16         9.519252                  11.989278\n",
       "1      17        11.572372                   9.908807\n",
       "2       1        10.735875                  10.813565\n",
       "3      20        11.004069                  10.186070\n",
       "4       9        11.022912                   9.746795\n",
       "5       8         9.401737                  12.544338\n",
       "6       4        13.862891                  11.260416\n",
       "7       6        11.590289                  12.187669\n",
       "8      10        13.242773                  13.777769\n",
       "9      12         8.792552                  11.169349"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(\"=== КЛЮЧЕВАЯ ИНФОРМАЦИЯ ДЛЯ ВЫВОДА ===\")\n",
    "print(\"Зависимая переменная:\", target_col)\n",
    "print()\n",
    "print(\"Число исходных признаков:\", X.shape[1])\n",
    "print(\"Число признаков после кодирования (все признаки):\", X_train_proc.shape[1])\n",
    "print(\"Число отобранных исходных признаков:\", len(selected_features))\n",
    "print(\"Число признаков после кодирования (отобранные признаки):\", X_train_sel.shape[1])\n",
    "print(\"Фиксированная архитектура первой модели:\", baseline_hidden)\n",
    "print(\"Архитектура, найденная эволюционным поиском:\", best_hidden)\n",
    "print(\"alpha найденной модели:\", best_alpha)\n",
    "print(\"learning_rate_init найденной модели:\", best_lr)\n",
    "print()\n",
    "print(\"Отобранные признаки:\")\n",
    "print(selected_features)\n",
    "print()\n",
    "print(\"Метрики моделей на тестовой выборке:\")\n",
    "display(models_comparison)\n",
    "print(\"Лучшая модель:\")\n",
    "display(models_comparison.head(1))\n",
    "print(\"Топ-10 признаков по важности:\")\n",
    "display(importance_df.head(10))\n",
    "print(\"Топ-10 конфигураций эволюционного поиска:\")\n",
    "display(search_results_df.head(10))\n",
    "print(\"Последние эпохи обучения базовой нейросети:\")\n",
    "display(baseline_history.tail(10))\n",
    "print(\"Последние эпохи обучения модели с найденной архитектурой:\")\n",
    "display(selected_history.tail(10))\n",
    "print(\"Основные прототипы по лучшей сети:\")\n",
    "display(prototypes_df)\n",
    "print(\"Топ-5 вкладов признаков для прототипов:\")\n",
    "display(top_contrib_df)\n",
    "print(\"Первые 10 фактических и предсказанных значений на тесте:\")\n",
    "display(pred_table)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "77b13b2e",
   "metadata": {},
   "source": [
    "Итог\n",
    "\n",
    "Зависимой переменной выбрана depression_score. Построены две модели: базовая нейросеть по всем признакам и нейросеть по 10 отобранным признакам с архитектурой, найденной эволюционным поиском.\n",
    "\n",
    "Обе модели показали неприемлемое качество: на тестовой выборке у обеих R² < 0 (-0.022 и -0.055), а предсказания слабо отражают реальную вариацию целевой переменной. Следовательно, обе модели статистически несостоятельны и не пригодны для практического использования.\n",
    "\n",
    "Наиболее важными признаками оказались chronic_illnesses, family_history_mental_illness, age, therapy, sleep_hours, life_satisfaction_score. Прототипы лучшей из двух моделей формируют группы, различающиеся прежде всего по хроническим заболеваниям, семейной истории психических расстройств, возрасту, терапии, сну и удовлетворённости жизнью.\n",
    "\n",
    "Однако из-за низкого качества регрессии интерпретацию прототипов и важностей признаков следует считать только ориентировочной, без практической ценности."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "831ec982",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
