{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "906d48eb",
   "metadata": {},
   "source": [
    "# Анализ важности признаков с помощью нейросети с механизмом внимания\n",
    "\n",
    "В работе автоматически выбирается ключевая зависимая переменная, формируется задача бинарной классификации, затем обучается attention-нейросеть по всем признакам.  \n",
    "По attention-весам отбираются наиболее важные признаки, после чего обучается нейросеть с синонимичной архитектурой только на выбранных признаках.\n",
    "\n",
    "**Важно:** финальный текстовый вывод в ноутбуке не приводится. В последней ячейке печатаются все метрики и данные, необходимые для корректного вывода по фактическим результатам.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "b9dc04cd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "DEVICE = cuda\n"
     ]
    }
   ],
   "source": [
    "\n",
    "# Базовые настройки\n",
    "import os\n",
    "import re\n",
    "import gc\n",
    "import math\n",
    "import copy\n",
    "import random\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import (\n",
    "    accuracy_score, balanced_accuracy_score, precision_score, recall_score,\n",
    "    f1_score, roc_auc_score, confusion_matrix, classification_report\n",
    ")\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "SEED = 42\n",
    "random.seed(SEED)\n",
    "np.random.seed(SEED)\n",
    "\n",
    "try:\n",
    "    import torch\n",
    "    import torch.nn as nn\n",
    "    from torch.utils.data import Dataset, DataLoader\n",
    "except Exception as e:\n",
    "    raise ImportError(\n",
    "        \"Для выполнения ноутбука требуется PyTorch. \"\n",
    "        \"Установите его в окружении Jupyter/Kaggle и перезапустите ноутбук.\"\n",
    "    ) from e\n",
    "\n",
    "torch.manual_seed(SEED)\n",
    "if torch.cuda.is_available():\n",
    "    torch.cuda.manual_seed_all(SEED)\n",
    "\n",
    "DEVICE = 'cuda' if torch.cuda.is_available() else 'cpu'\n",
    "print('DEVICE =', DEVICE)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "29d3ca9a",
   "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"
    }
   ],
   "source": [
    "\n",
    "# Загрузка данных\n",
    "POSSIBLE_PATHS = [\n",
    "    'anxiety_depression_data.csv',\n",
    "    '/mnt/data/anxiety_depression_data.csv'\n",
    "]\n",
    "\n",
    "data_path = None\n",
    "for p in POSSIBLE_PATHS:\n",
    "    if os.path.exists(p):\n",
    "        data_path = p\n",
    "        break\n",
    "\n",
    "if data_path is None:\n",
    "    raise FileNotFoundError('CSV-файл не найден.')\n",
    "\n",
    "df = pd.read_csv(data_path)\n",
    "print('Путь к файлу:', data_path)\n",
    "print('Размер датасета:', df.shape)\n",
    "display(df.head())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "2a299421",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>original</th>\n",
       "      <th>normalized</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                     normalized\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",
      "['Age', 'Gender', 'Education_Level', 'Employment_Status', 'Sleep_Hours', 'Physical_Activity_Hrs', 'Social_Support_Score', 'Anxiety_Score', 'Depression_Score', 'Stress_Level', 'Family_History_Mental_Illness', 'Chronic_Illnesses', 'Medication_Use', 'Therapy', 'Meditation', 'Substance_Use', 'Financial_Stress', 'Work_Stress', 'Self_Esteem_Score', 'Life_Satisfaction_Score', 'Loneliness_Score']\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>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"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\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>missing_share</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Substance_Use</th>\n",
       "      <td>0.6950</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Medication_Use</th>\n",
       "      <td>0.6225</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Education_Level</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Gender</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Age</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Sleep_Hours</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Employment_Status</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Anxiety_Score</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Physical_Activity_Hrs</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Depression_Score</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Stress_Level</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Family_History_Mental_Illness</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Social_Support_Score</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Chronic_Illnesses</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Therapy</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Meditation</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Financial_Stress</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Work_Stress</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Self_Esteem_Score</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Life_Satisfaction_Score</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Loneliness_Score</th>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                               missing_share\n",
       "Substance_Use                         0.6950\n",
       "Medication_Use                        0.6225\n",
       "Education_Level                       0.0000\n",
       "Gender                                0.0000\n",
       "Age                                   0.0000\n",
       "Sleep_Hours                           0.0000\n",
       "Employment_Status                     0.0000\n",
       "Anxiety_Score                         0.0000\n",
       "Physical_Activity_Hrs                 0.0000\n",
       "Depression_Score                      0.0000\n",
       "Stress_Level                          0.0000\n",
       "Family_History_Mental_Illness         0.0000\n",
       "Social_Support_Score                  0.0000\n",
       "Chronic_Illnesses                     0.0000\n",
       "Therapy                               0.0000\n",
       "Meditation                            0.0000\n",
       "Financial_Stress                      0.0000\n",
       "Work_Stress                           0.0000\n",
       "Self_Esteem_Score                     0.0000\n",
       "Life_Satisfaction_Score               0.0000\n",
       "Loneliness_Score                      0.0000"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "# Нормализация названий столбцов и первичная диагностика\n",
    "def normalize_col(col: str) -> str:\n",
    "    col = str(col).strip()\n",
    "    col = re.sub(r'\\s+', '_', col)\n",
    "    col = re.sub(r'[^0-9a-zA-Zа-яА-Я_]', '', col)\n",
    "    return col\n",
    "\n",
    "original_columns = df.columns.tolist()\n",
    "normalized_columns = [normalize_col(c) for c in original_columns]\n",
    "df.columns = normalized_columns\n",
    "\n",
    "display(pd.DataFrame({'original': original_columns, 'normalized': normalized_columns}))\n",
    "print('Колонки:')\n",
    "print(df.columns.tolist())\n",
    "\n",
    "print('\\nТипы данных:')\n",
    "display(df.dtypes.astype(str).rename('dtype').to_frame())\n",
    "\n",
    "print('\\nДоли пропусков:')\n",
    "display(df.isna().mean().sort_values(ascending=False).rename('missing_share').to_frame())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "10a94b0c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Выбранная зависимая переменная: Depression_Score\n",
      "Порог высокого риска (75-й перцентиль): 15.000\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>share</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Depression_Score</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  share\n",
       "Depression_Score       \n",
       "0                   0.7\n",
       "1                   0.3"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "# Автоматический выбор ключевой зависимой переменной\n",
    "candidate_priority = [\n",
    "    'Depression_Score',\n",
    "    'Anxiety_Score',\n",
    "    'Churn',\n",
    "    'Target',\n",
    "    'Label',\n",
    "    'Outcome',\n",
    "    'Class'\n",
    "]\n",
    "\n",
    "target_col = None\n",
    "for c in candidate_priority:\n",
    "    if c in df.columns:\n",
    "        target_col = c\n",
    "        break\n",
    "\n",
    "if target_col is None:\n",
    "    # Резервный вариант: ищем числовую колонку с наибольшей вариативностью\n",
    "    num_candidates = df.select_dtypes(include=[np.number]).columns.tolist()\n",
    "    if not num_candidates:\n",
    "        raise ValueError('Не удалось определить зависимую переменную.')\n",
    "    target_col = max(num_candidates, key=lambda c: df[c].nunique())\n",
    "\n",
    "print('Выбранная зависимая переменная:', target_col)\n",
    "\n",
    "# Для score-переменной строим бинарную задачу \"высокий риск\"\n",
    "if pd.api.types.is_numeric_dtype(df[target_col]) and df[target_col].nunique() > 10:\n",
    "    threshold = float(df[target_col].quantile(0.75))\n",
    "    y_raw = (df[target_col] >= threshold).astype(int)\n",
    "    print(f'Порог высокого риска (75-й перцентиль): {threshold:.3f}')\n",
    "else:\n",
    "    # если переменная уже категориальная / бинарная\n",
    "    vals = df[target_col].dropna().astype(str)\n",
    "    top2 = vals.value_counts().index.tolist()[:2]\n",
    "    mapping = {top2[0]: 0, top2[1]: 1} if len(top2) >= 2 else {top2[0]: 0}\n",
    "    y_raw = df[target_col].astype(str).map(mapping)\n",
    "    if y_raw.isna().any():\n",
    "        # переводим остальные классы в 1 при многоклассовом сценарии\n",
    "        y_raw = (~df[target_col].astype(str).eq(top2[0])).astype(int)\n",
    "\n",
    "class_distribution = (\n",
    "    y_raw.value_counts(normalize=True)\n",
    "    .sort_index()\n",
    "    .rename_axis(target_col)\n",
    "    .rename('share')\n",
    "    .to_frame()\n",
    ")\n",
    "print('Распределение классов:')\n",
    "display(class_distribution)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "22bba03d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Число числовых признаков: 15\n",
      "Число категориальных признаков: 5\n",
      "Категориальные признаки: ['Gender', 'Education_Level', 'Employment_Status', 'Medication_Use', 'Substance_Use']\n",
      "Итоговое число признаков: 20\n"
     ]
    }
   ],
   "source": [
    "\n",
    "# Отбор признаков и обработка пропусков\n",
    "X_df = df.drop(columns=[target_col]).copy()\n",
    "\n",
    "# Удаляем полностью пустые и константные столбцы\n",
    "empty_cols = [c for c in X_df.columns if X_df[c].isna().all()]\n",
    "const_cols = [c for c in X_df.columns if X_df[c].nunique(dropna=True) <= 1]\n",
    "drop_cols = sorted(set(empty_cols + const_cols))\n",
    "if drop_cols:\n",
    "    X_df = X_df.drop(columns=drop_cols)\n",
    "\n",
    "# Выделяем типы признаков\n",
    "num_cols = X_df.select_dtypes(include=[np.number]).columns.tolist()\n",
    "cat_cols = [c for c in X_df.columns if c not in num_cols]\n",
    "\n",
    "for c in num_cols:\n",
    "    X_df[c] = pd.to_numeric(X_df[c], errors='coerce')\n",
    "    X_df[c] = X_df[c].fillna(X_df[c].median())\n",
    "\n",
    "for c in cat_cols:\n",
    "    X_df[c] = X_df[c].astype(str).replace({'nan': np.nan, 'None': np.nan})\n",
    "    mode_val = X_df[c].mode(dropna=True)\n",
    "    fill_val = mode_val.iloc[0] if len(mode_val) > 0 else 'Unknown'\n",
    "    X_df[c] = X_df[c].fillna(fill_val).astype(str)\n",
    "\n",
    "print('Число числовых признаков:', len(num_cols))\n",
    "print('Число категориальных признаков:', len(cat_cols))\n",
    "print('Категориальные признаки:', cat_cols)\n",
    "print('Итоговое число признаков:', X_df.shape[1])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "21b811bd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Размер train: (720, 20)\n",
      "Размер valid: (240, 20)\n",
      "Размер test: (240, 20)\n"
     ]
    }
   ],
   "source": [
    "\n",
    "# Разделение на train / valid / test\n",
    "X_train_df, X_test_df, y_train, y_test = train_test_split(\n",
    "    X_df, y_raw, test_size=0.20, random_state=SEED, stratify=y_raw\n",
    ")\n",
    "\n",
    "X_train_df, X_valid_df, y_train, y_valid = train_test_split(\n",
    "    X_train_df, y_train, test_size=0.25, random_state=SEED, stratify=y_train\n",
    ")\n",
    "\n",
    "print('Размер train:', X_train_df.shape)\n",
    "print('Размер valid:', X_valid_df.shape)\n",
    "print('Размер test:', X_test_df.shape)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "0b2d3e72",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Порядок исходных признаков:\n",
      "['Age', 'Sleep_Hours', 'Physical_Activity_Hrs', 'Social_Support_Score', 'Anxiety_Score', 'Stress_Level', 'Family_History_Mental_Illness', 'Chronic_Illnesses', 'Therapy', 'Meditation', 'Financial_Stress', 'Work_Stress', 'Self_Esteem_Score', 'Life_Satisfaction_Score', 'Loneliness_Score', 'Gender', 'Education_Level', 'Employment_Status', 'Medication_Use', 'Substance_Use']\n",
      "Матрица числовых признаков train: (720, 15)\n",
      "Матрица категориальных признаков train: (720, 5)\n"
     ]
    }
   ],
   "source": [
    "\n",
    "# Подготовка признаков для attention-модели:\n",
    "# числовые признаки стандартизируются;\n",
    "# категориальные кодируются индексами для embedding-слоев.\n",
    "\n",
    "from collections import OrderedDict\n",
    "\n",
    "num_scaler = StandardScaler()\n",
    "if num_cols:\n",
    "    X_train_num = num_scaler.fit_transform(X_train_df[num_cols])\n",
    "    X_valid_num = num_scaler.transform(X_valid_df[num_cols])\n",
    "    X_test_num = num_scaler.transform(X_test_df[num_cols])\n",
    "else:\n",
    "    X_train_num = np.zeros((len(X_train_df), 0), dtype=np.float32)\n",
    "    X_valid_num = np.zeros((len(X_valid_df), 0), dtype=np.float32)\n",
    "    X_test_num = np.zeros((len(X_test_df), 0), dtype=np.float32)\n",
    "\n",
    "cat_maps = OrderedDict()\n",
    "def fit_cat_mapping(series: pd.Series):\n",
    "    uniq = pd.Series(series.astype(str).unique()).tolist()\n",
    "    mapping = {v: i+1 for i, v in enumerate(sorted(uniq))}\n",
    "    return mapping\n",
    "\n",
    "def transform_cat(series: pd.Series, mapping: dict):\n",
    "    return series.astype(str).map(mapping).fillna(0).astype(int).values\n",
    "\n",
    "X_train_cat_list = []\n",
    "X_valid_cat_list = []\n",
    "X_test_cat_list = []\n",
    "\n",
    "for c in cat_cols:\n",
    "    mp = fit_cat_mapping(X_train_df[c])\n",
    "    cat_maps[c] = mp\n",
    "    X_train_cat_list.append(transform_cat(X_train_df[c], mp))\n",
    "    X_valid_cat_list.append(transform_cat(X_valid_df[c], mp))\n",
    "    X_test_cat_list.append(transform_cat(X_test_df[c], mp))\n",
    "\n",
    "if cat_cols:\n",
    "    X_train_cat = np.column_stack(X_train_cat_list).astype(np.int64)\n",
    "    X_valid_cat = np.column_stack(X_valid_cat_list).astype(np.int64)\n",
    "    X_test_cat = np.column_stack(X_test_cat_list).astype(np.int64)\n",
    "else:\n",
    "    X_train_cat = np.zeros((len(X_train_df), 0), dtype=np.int64)\n",
    "    X_valid_cat = np.zeros((len(X_valid_df), 0), dtype=np.int64)\n",
    "    X_test_cat = np.zeros((len(X_test_df), 0), dtype=np.int64)\n",
    "\n",
    "feature_order = num_cols + cat_cols\n",
    "print('Порядок исходных признаков:')\n",
    "print(feature_order)\n",
    "print('Матрица числовых признаков train:', X_train_num.shape)\n",
    "print('Матрица категориальных признаков train:', X_train_cat.shape)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "30f819ce",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "# Dataset / DataLoader\n",
    "class TabAttentionDataset(Dataset):\n",
    "    def __init__(self, X_num, X_cat, y):\n",
    "        self.X_num = torch.tensor(X_num, dtype=torch.float32)\n",
    "        self.X_cat = torch.tensor(X_cat, dtype=torch.long)\n",
    "        self.y = torch.tensor(np.asarray(y), dtype=torch.float32)\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self.y)\n",
    "\n",
    "    def __getitem__(self, idx):\n",
    "        return self.X_num[idx], self.X_cat[idx], self.y[idx]\n",
    "\n",
    "train_ds = TabAttentionDataset(X_train_num, X_train_cat, y_train)\n",
    "valid_ds = TabAttentionDataset(X_valid_num, X_valid_cat, y_valid)\n",
    "test_ds = TabAttentionDataset(X_test_num, X_test_cat, y_test)\n",
    "\n",
    "train_loader = DataLoader(train_ds, batch_size=64, shuffle=True)\n",
    "valid_loader = DataLoader(valid_ds, batch_size=256, shuffle=False)\n",
    "test_loader = DataLoader(test_ds, batch_size=256, shuffle=False)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "1ebe9b8a",
   "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>epoch</th>\n",
       "      <th>train_loss</th>\n",
       "      <th>valid_accuracy</th>\n",
       "      <th>valid_balanced_accuracy</th>\n",
       "      <th>valid_precision</th>\n",
       "      <th>valid_recall</th>\n",
       "      <th>valid_f1</th>\n",
       "      <th>valid_roc_auc</th>\n",
       "      <th>best_threshold</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>9</td>\n",
       "      <td>0.972112</td>\n",
       "      <td>0.3</td>\n",
       "      <td>0.5</td>\n",
       "      <td>0.3</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.461538</td>\n",
       "      <td>0.437748</td>\n",
       "      <td>0.05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>0.974741</td>\n",
       "      <td>0.3</td>\n",
       "      <td>0.5</td>\n",
       "      <td>0.3</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.461538</td>\n",
       "      <td>0.440724</td>\n",
       "      <td>0.05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>11</td>\n",
       "      <td>0.979549</td>\n",
       "      <td>0.3</td>\n",
       "      <td>0.5</td>\n",
       "      <td>0.3</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.461538</td>\n",
       "      <td>0.438161</td>\n",
       "      <td>0.05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>12</td>\n",
       "      <td>0.970228</td>\n",
       "      <td>0.3</td>\n",
       "      <td>0.5</td>\n",
       "      <td>0.3</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.461538</td>\n",
       "      <td>0.429398</td>\n",
       "      <td>0.05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>13</td>\n",
       "      <td>0.977674</td>\n",
       "      <td>0.3</td>\n",
       "      <td>0.5</td>\n",
       "      <td>0.3</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.461538</td>\n",
       "      <td>0.437996</td>\n",
       "      <td>0.05</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    epoch  train_loss  valid_accuracy  valid_balanced_accuracy  \\\n",
       "8       9    0.972112             0.3                      0.5   \n",
       "9      10    0.974741             0.3                      0.5   \n",
       "10     11    0.979549             0.3                      0.5   \n",
       "11     12    0.970228             0.3                      0.5   \n",
       "12     13    0.977674             0.3                      0.5   \n",
       "\n",
       "    valid_precision  valid_recall  valid_f1  valid_roc_auc  best_threshold  \n",
       "8               0.3           1.0  0.461538       0.437748            0.05  \n",
       "9               0.3           1.0  0.461538       0.440724            0.05  \n",
       "10              0.3           1.0  0.461538       0.438161            0.05  \n",
       "11              0.3           1.0  0.461538       0.429398            0.05  \n",
       "12              0.3           1.0  0.461538       0.437996            0.05  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Лучший порог по validation F1: 0.05\n"
     ]
    }
   ],
   "source": [
    "\n",
    "# Attention-нейросеть по исходным признакам\n",
    "class FeatureAttentionNet(nn.Module):\n",
    "    def __init__(self, num_features, cat_cardinalities, emb_dim=16, hidden_dim=64, dropout=0.15):\n",
    "        super().__init__()\n",
    "        self.num_features = num_features\n",
    "        self.cat_cardinalities = cat_cardinalities\n",
    "        self.emb_dim = emb_dim\n",
    "\n",
    "        self.num_linears = nn.ModuleList([\n",
    "            nn.Sequential(\n",
    "                nn.Linear(1, emb_dim),\n",
    "                nn.ReLU()\n",
    "            ) for _ in range(num_features)\n",
    "        ])\n",
    "\n",
    "        self.cat_embeddings = nn.ModuleList([\n",
    "            nn.Embedding(cardinality + 1, emb_dim, padding_idx=0) for cardinality in cat_cardinalities\n",
    "        ])\n",
    "\n",
    "        self.attn_mlp = nn.Sequential(\n",
    "            nn.Linear(emb_dim, emb_dim),\n",
    "            nn.Tanh(),\n",
    "            nn.Linear(emb_dim, 1)\n",
    "        )\n",
    "\n",
    "        self.head = nn.Sequential(\n",
    "            nn.Linear(emb_dim, hidden_dim),\n",
    "            nn.ReLU(),\n",
    "            nn.Dropout(dropout),\n",
    "            nn.Linear(hidden_dim, hidden_dim // 2),\n",
    "            nn.ReLU(),\n",
    "            nn.Dropout(dropout),\n",
    "            nn.Linear(hidden_dim // 2, 1)\n",
    "        )\n",
    "\n",
    "    def forward(self, x_num, x_cat):\n",
    "        tokens = []\n",
    "\n",
    "        # Числовые признаки -> токены\n",
    "        if self.num_features > 0:\n",
    "            for i in range(self.num_features):\n",
    "                xi = x_num[:, i:i+1]\n",
    "                tokens.append(self.num_linears[i](xi))\n",
    "\n",
    "        # Категориальные признаки -> embedding-токены\n",
    "        if len(self.cat_cardinalities) > 0:\n",
    "            for j, emb in enumerate(self.cat_embeddings):\n",
    "                tokens.append(emb(x_cat[:, j]))\n",
    "\n",
    "        tokens = torch.stack(tokens, dim=1)  # [B, F, D]\n",
    "        attn_scores = self.attn_mlp(tokens).squeeze(-1)  # [B, F]\n",
    "        attn_weights = torch.softmax(attn_scores, dim=1)  # [B, F]\n",
    "\n",
    "        context = torch.sum(tokens * attn_weights.unsqueeze(-1), dim=1)  # [B, D]\n",
    "        logits = self.head(context).squeeze(-1)\n",
    "        return logits, attn_weights\n",
    "\n",
    "def predict_proba(model, loader):\n",
    "    model.eval()\n",
    "    probs, ys, attns = [], [], []\n",
    "    with torch.no_grad():\n",
    "        for xb_num, xb_cat, yb in loader:\n",
    "            xb_num = xb_num.to(DEVICE)\n",
    "            xb_cat = xb_cat.to(DEVICE)\n",
    "            logits, attn = model(xb_num, xb_cat)\n",
    "            prob = torch.sigmoid(logits).cpu().numpy()\n",
    "            probs.append(prob)\n",
    "            ys.append(yb.numpy())\n",
    "            attns.append(attn.cpu().numpy())\n",
    "    probs = np.concatenate(probs)\n",
    "    ys = np.concatenate(ys)\n",
    "    attns = np.concatenate(attns)\n",
    "    return ys, probs, attns\n",
    "\n",
    "def evaluate_binary(y_true, prob, threshold=0.5):\n",
    "    pred = (prob >= threshold).astype(int)\n",
    "    out = {\n",
    "        'accuracy': accuracy_score(y_true, pred),\n",
    "        'balanced_accuracy': balanced_accuracy_score(y_true, pred),\n",
    "        'precision': precision_score(y_true, pred, zero_division=0),\n",
    "        'recall': recall_score(y_true, pred, zero_division=0),\n",
    "        'f1': f1_score(y_true, pred, zero_division=0),\n",
    "    }\n",
    "    try:\n",
    "        out['roc_auc'] = roc_auc_score(y_true, prob)\n",
    "    except Exception:\n",
    "        out['roc_auc'] = np.nan\n",
    "    return out, pred\n",
    "\n",
    "def find_best_threshold(y_true, prob):\n",
    "    thresholds = np.linspace(0.05, 0.95, 181)\n",
    "    best_thr, best_f1 = 0.5, -1\n",
    "    for thr in thresholds:\n",
    "        pred = (prob >= thr).astype(int)\n",
    "        f1 = f1_score(y_true, pred, zero_division=0)\n",
    "        if f1 > best_f1:\n",
    "            best_f1 = f1\n",
    "            best_thr = float(thr)\n",
    "    return best_thr, best_f1\n",
    "\n",
    "def train_attention_model(train_loader, valid_loader, num_features, cat_cardinalities,\n",
    "                          max_epochs=80, lr=1e-3, patience=12):\n",
    "    model = FeatureAttentionNet(\n",
    "        num_features=num_features,\n",
    "        cat_cardinalities=cat_cardinalities,\n",
    "        emb_dim=16,\n",
    "        hidden_dim=64,\n",
    "        dropout=0.15\n",
    "    ).to(DEVICE)\n",
    "\n",
    "    pos_count = float(np.sum(y_train == 1))\n",
    "    neg_count = float(np.sum(y_train == 0))\n",
    "    pos_weight = torch.tensor([neg_count / max(pos_count, 1.0)], dtype=torch.float32, device=DEVICE)\n",
    "\n",
    "    criterion = nn.BCEWithLogitsLoss(pos_weight=pos_weight)\n",
    "    optimizer = torch.optim.Adam(model.parameters(), lr=lr, weight_decay=1e-4)\n",
    "\n",
    "    history = []\n",
    "    best_state = None\n",
    "    best_score = -np.inf\n",
    "    best_thr = 0.5\n",
    "    wait = 0\n",
    "\n",
    "    for epoch in range(1, max_epochs + 1):\n",
    "        model.train()\n",
    "        train_losses = []\n",
    "\n",
    "        for xb_num, xb_cat, yb in train_loader:\n",
    "            xb_num = xb_num.to(DEVICE)\n",
    "            xb_cat = xb_cat.to(DEVICE)\n",
    "            yb = yb.to(DEVICE)\n",
    "\n",
    "            optimizer.zero_grad()\n",
    "            logits, _ = model(xb_num, xb_cat)\n",
    "            loss = criterion(logits, yb)\n",
    "            loss.backward()\n",
    "            nn.utils.clip_grad_norm_(model.parameters(), 1.0)\n",
    "            optimizer.step()\n",
    "            train_losses.append(loss.item())\n",
    "\n",
    "        yv, pv, _ = predict_proba(model, valid_loader)\n",
    "        thr, _ = find_best_threshold(yv, pv)\n",
    "        valid_metrics, _ = evaluate_binary(yv, pv, threshold=thr)\n",
    "\n",
    "        score = 0.7 * valid_metrics['f1'] + 0.3 * valid_metrics['roc_auc']\n",
    "\n",
    "        record = {\n",
    "            'epoch': epoch,\n",
    "            'train_loss': float(np.mean(train_losses)),\n",
    "            'valid_accuracy': valid_metrics['accuracy'],\n",
    "            'valid_balanced_accuracy': valid_metrics['balanced_accuracy'],\n",
    "            'valid_precision': valid_metrics['precision'],\n",
    "            'valid_recall': valid_metrics['recall'],\n",
    "            'valid_f1': valid_metrics['f1'],\n",
    "            'valid_roc_auc': valid_metrics['roc_auc'],\n",
    "            'best_threshold': thr,\n",
    "        }\n",
    "        history.append(record)\n",
    "\n",
    "        if score > best_score:\n",
    "            best_score = score\n",
    "            best_thr = thr\n",
    "            best_state = copy.deepcopy(model.state_dict())\n",
    "            wait = 0\n",
    "        else:\n",
    "            wait += 1\n",
    "            if wait >= patience:\n",
    "                break\n",
    "\n",
    "    if best_state is not None:\n",
    "        model.load_state_dict(best_state)\n",
    "\n",
    "    history_df = pd.DataFrame(history)\n",
    "    return model, history_df, best_thr\n",
    "\n",
    "cat_cardinalities = [len(cat_maps[c]) for c in cat_cols]\n",
    "att_model, hist_all, best_thr_all = train_attention_model(\n",
    "    train_loader, valid_loader, len(num_cols), cat_cardinalities\n",
    ")\n",
    "\n",
    "display(hist_all.tail())\n",
    "print('Лучший порог по validation F1:', round(best_thr_all, 4))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "d1015eaa",
   "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>value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>accuracy</th>\n",
       "      <td>0.300000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>balanced_accuracy</th>\n",
       "      <td>0.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>precision</th>\n",
       "      <td>0.300000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>recall</th>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f1</th>\n",
       "      <td>0.461538</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>roc_auc</th>\n",
       "      <td>0.526951</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                      value\n",
       "accuracy           0.300000\n",
       "balanced_accuracy  0.500000\n",
       "precision          0.300000\n",
       "recall             1.000000\n",
       "f1                 0.461538\n",
       "roc_auc            0.526951"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Матрица ошибок:\n",
      "[[  0 168]\n",
      " [  0  72]]\n",
      "\n",
      "Классификационный отчёт:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "         0.0     0.0000    0.0000    0.0000       168\n",
      "         1.0     0.3000    1.0000    0.4615        72\n",
      "\n",
      "    accuracy                         0.3000       240\n",
      "   macro avg     0.1500    0.5000    0.2308       240\n",
      "weighted avg     0.0900    0.3000    0.1385       240\n",
      "\n"
     ]
    }
   ],
   "source": [
    "\n",
    "# Оценка attention-модели на тестовой выборке\n",
    "y_test_true, test_prob_all, test_attn_all = predict_proba(att_model, test_loader)\n",
    "metrics_all, pred_all = evaluate_binary(y_test_true, test_prob_all, threshold=best_thr_all)\n",
    "\n",
    "metrics_all_df = pd.Series(metrics_all, name='value').to_frame()\n",
    "display(metrics_all_df)\n",
    "\n",
    "print('Матрица ошибок:')\n",
    "print(confusion_matrix(y_test_true, pred_all))\n",
    "\n",
    "print('\\nКлассификационный отчёт:')\n",
    "print(classification_report(y_test_true, pred_all, digits=4, zero_division=0))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "a236ca58",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>original_feature</th>\n",
       "      <th>attention_importance</th>\n",
       "      <th>share</th>\n",
       "      <th>cumulative_share</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Meditation</td>\n",
       "      <td>0.063162</td>\n",
       "      <td>0.063162</td>\n",
       "      <td>0.063162</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Life_Satisfaction_Score</td>\n",
       "      <td>0.060833</td>\n",
       "      <td>0.060833</td>\n",
       "      <td>0.123995</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Age</td>\n",
       "      <td>0.059858</td>\n",
       "      <td>0.059858</td>\n",
       "      <td>0.183853</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Work_Stress</td>\n",
       "      <td>0.057591</td>\n",
       "      <td>0.057591</td>\n",
       "      <td>0.241444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Family_History_Mental_Illness</td>\n",
       "      <td>0.057522</td>\n",
       "      <td>0.057522</td>\n",
       "      <td>0.298966</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Therapy</td>\n",
       "      <td>0.056520</td>\n",
       "      <td>0.056520</td>\n",
       "      <td>0.355486</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Self_Esteem_Score</td>\n",
       "      <td>0.056422</td>\n",
       "      <td>0.056422</td>\n",
       "      <td>0.411908</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Anxiety_Score</td>\n",
       "      <td>0.053219</td>\n",
       "      <td>0.053219</td>\n",
       "      <td>0.465127</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>Employment_Status</td>\n",
       "      <td>0.052664</td>\n",
       "      <td>0.052664</td>\n",
       "      <td>0.517791</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Chronic_Illnesses</td>\n",
       "      <td>0.049831</td>\n",
       "      <td>0.049831</td>\n",
       "      <td>0.567622</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>Loneliness_Score</td>\n",
       "      <td>0.049665</td>\n",
       "      <td>0.049665</td>\n",
       "      <td>0.617287</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Physical_Activity_Hrs</td>\n",
       "      <td>0.049448</td>\n",
       "      <td>0.049448</td>\n",
       "      <td>0.666735</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>Financial_Stress</td>\n",
       "      <td>0.049309</td>\n",
       "      <td>0.049309</td>\n",
       "      <td>0.716044</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>Stress_Level</td>\n",
       "      <td>0.048632</td>\n",
       "      <td>0.048632</td>\n",
       "      <td>0.764675</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>Education_Level</td>\n",
       "      <td>0.048494</td>\n",
       "      <td>0.048494</td>\n",
       "      <td>0.813169</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>Gender</td>\n",
       "      <td>0.047189</td>\n",
       "      <td>0.047189</td>\n",
       "      <td>0.860359</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>Sleep_Hours</td>\n",
       "      <td>0.046557</td>\n",
       "      <td>0.046557</td>\n",
       "      <td>0.906916</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>Social_Support_Score</td>\n",
       "      <td>0.044927</td>\n",
       "      <td>0.044927</td>\n",
       "      <td>0.951843</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>Substance_Use</td>\n",
       "      <td>0.026673</td>\n",
       "      <td>0.026673</td>\n",
       "      <td>0.978516</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>Medication_Use</td>\n",
       "      <td>0.021484</td>\n",
       "      <td>0.021484</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 original_feature  attention_importance     share  \\\n",
       "0                      Meditation              0.063162  0.063162   \n",
       "1         Life_Satisfaction_Score              0.060833  0.060833   \n",
       "2                             Age              0.059858  0.059858   \n",
       "3                     Work_Stress              0.057591  0.057591   \n",
       "4   Family_History_Mental_Illness              0.057522  0.057522   \n",
       "5                         Therapy              0.056520  0.056520   \n",
       "6               Self_Esteem_Score              0.056422  0.056422   \n",
       "7                   Anxiety_Score              0.053219  0.053219   \n",
       "8               Employment_Status              0.052664  0.052664   \n",
       "9               Chronic_Illnesses              0.049831  0.049831   \n",
       "10               Loneliness_Score              0.049665  0.049665   \n",
       "11          Physical_Activity_Hrs              0.049448  0.049448   \n",
       "12               Financial_Stress              0.049309  0.049309   \n",
       "13                   Stress_Level              0.048632  0.048632   \n",
       "14                Education_Level              0.048494  0.048494   \n",
       "15                         Gender              0.047189  0.047189   \n",
       "16                    Sleep_Hours              0.046557  0.046557   \n",
       "17           Social_Support_Score              0.044927  0.044927   \n",
       "18                  Substance_Use              0.026673  0.026673   \n",
       "19                 Medication_Use              0.021484  0.021484   \n",
       "\n",
       "    cumulative_share  \n",
       "0           0.063162  \n",
       "1           0.123995  \n",
       "2           0.183853  \n",
       "3           0.241444  \n",
       "4           0.298966  \n",
       "5           0.355486  \n",
       "6           0.411908  \n",
       "7           0.465127  \n",
       "8           0.517791  \n",
       "9           0.567622  \n",
       "10          0.617287  \n",
       "11          0.666735  \n",
       "12          0.716044  \n",
       "13          0.764675  \n",
       "14          0.813169  \n",
       "15          0.860359  \n",
       "16          0.906916  \n",
       "17          0.951843  \n",
       "18          0.978516  \n",
       "19          1.000000  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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qFixonj79q3UvmDBAlGsWDFhbGwsHBwcxM8//6x2zAjxbsmw9393dnZ2onr16mLPnj0auYmIskMlxFea9YaISAYRERFwcXHBoUOHPjq5Tlb3IyL9l/H3fu/ePbWJvt43adIkREREZHmiQ32hUqnQv39/rUMQiIhINzimm4iIiIiIiEhHOKabiP7TrKys0KlTp0+uLZzV/YhI/2X8vX9sHH7p0qU1Zr0nIiL6HOxeTkRERPSNYPdyIqKvj1e6iYiIiL4RvNZCRPT1cUw3ERERERERkY78J650p6en49GjR7C2toZKpZI7DhEREREREf3HCSHw6tUr5MuXDwYGmV/P/k8U3Y8ePYKTk5PcMYiIiIiIiOgbExUVhQIFCmR6/3+i6La2tgbw7sXa2NjInIaIiIiIiIj+616+fAknJyepHs3Mf6LozuhSbmNjw6KbiIiIiIiIvppPDXHmRGpEREREREREOsKim4iIiIiIiEhHWHQTERERERER6QiLbiIiIiIiIiIdYdFNREREREREpCMsuomIiIiIiIh0hEU3ERERERERkY6w6CYiIiIiIiLSESO5A3yLnEftljsCACBielO5IxAREREREf2n8Uo3ERERERERkY6w6CYiIiIiIiLSERbdRERERERERDrCopuIiIiIiIhIR1h0ExEREREREekIi24iIiIiIiIiHWHRTURERERERKQjn1V0L1y4EM7OzjAzM0PlypVx5syZj+6/adMmFCtWDGZmZihVqhT27Nmjsc/169fRokUL2NrawtLSEhUrVkRkZOTnxCMiIiIiIiJSBKPsPmDjxo3w8fFBYGAgKleujICAAHh5eeHmzZvIkyePxv4nT55Ex44d4e/vj2bNmmHdunVo1aoVQkNDUbJkSQBAeHg4atSoAW9vb/j5+cHGxgZXr16FmZnZ//4K6bM5j9otdwRJxPSmckcgIiIiIiLKNpUQQmTnAZUrV0bFihWxYMECAEB6ejqcnJwwcOBAjBo1SmP/9u3bIzExEbt27ZLaqlSpAg8PDwQGBgIAOnToAGNjY6xZsyZLGZKTk5GcnCzdfvnyJZycnPDixQvY2Nhk5+XIQinF7KcKWaXkBFh0ExERERGRsrx8+RK2trafrEOz1b08JSUF58+fh6en579PYGAAT09PhISEaH1MSEiI2v4A4OXlJe2fnp6O3bt3o0iRIvDy8kKePHlQuXJlBAUFZZrD398ftra20ubk5JSdl0FERERERET0VWSre3lcXBzS0tLg4OCg1u7g4IAbN25ofUx0dLTW/aOjowEAT548QUJCAqZPn46pU6dixowZ2Lt3L9q0aYNDhw6hdu3aGs85evRo+Pj4SLczrnTTt0spV+V5RZ6IiIiIiN6X7THdX1p6ejoAoGXLlhg6dCgAwMPDAydPnkRgYKDWotvU1BSmpqZfNScRERERERFRdmWre7m9vT0MDQ0RExOj1h4TEwNHR0etj3F0dPzo/vb29jAyMoK7u7vaPsWLF+fs5URERERERKTXslV0m5iYoHz58ggODpba0tPTERwcjKpVq2p9TNWqVdX2B4ADBw5I+5uYmKBixYq4efOm2j63bt1CoUKFshOPiIiIiIiISFGy3b3cx8cH3bp1Q4UKFVCpUiUEBAQgMTERPXr0AAB07doV+fPnh7+/PwBg8ODBqF27NmbNmoWmTZtiw4YNOHfuHJYuXSo9p6+vL9q3b49atWqhbt262Lt3L3bu3InDhw9/mVdJREREREREJINsF93t27dHbGwsJkyYgOjoaHh4eGDv3r3SZGmRkZEwMPj3Anq1atWwbt06jBs3DmPGjIGbmxuCgoKkNboBoHXr1ggMDIS/vz8GDRqEokWLYsuWLahRo8YXeIlERERERERE8sj2Ot1KlNX10ZRCX2baVkpOQH+ycvZyIiIiIqJvg07W6SYiIiIiIiKirJN9yTCib42+XJVXSk6APQiIiIiISH/xSjcRERERERGRjrDoJiIiIiIiItIRFt1EREREREREOsIx3USk95Qy/jwrY8/1KSsRERER/e94pZuIiIiIiIhIR1h0ExEREREREekIi24iIiIiIiIiHWHRTURERERERKQjLLqJiIiIiIiIdIRFNxEREREREZGOsOgmIiIiIiIi0hEW3UREREREREQ6wqKbiIiIiIiISEdYdBMRERERERHpiJHcAYiISHmcR+2WO4IkYnpTuSMQERERfTZe6SYiIiIiIiLSEV7pJiIivaaUq/K8Ik9ERETa8Eo3ERERERERkY6w6CYiIiIiIiLSERbdRERERERERDrCopuIiIiIiIhIR1h0ExEREREREenIZxXdCxcuhLOzM8zMzFC5cmWcOXPmo/tv2rQJxYoVg5mZGUqVKoU9e/ao3d+9e3eoVCq1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QsmSJb/cqyAiIiIiIiJSoM+aSG3AgAEYMGCA1vsOHz6s0da2bVu0bds2y88fERHxObGIiIiIiIiIFCVbY7qJiIiIiIiIKOtYdBMRERERERHpCItuIiIiIiIiIh1h0U1ERERERESkIyy6iYiIiIiIiHSERTcRERERERGRjrDoJiIiIiIiItIRFt1EREREREREOsKim4iIiIiIiEhHWHQTERERERER6QiLbiIiIiIiIiIdYdFNREREREREpCMsuomIiIiIiIh0hEU3ERERERERkY6w6CYiIiIiIiLSERbdRERERERERDrCopuIiIiIiIhIR1h0ExEREREREekIi24iIiIiIiIiHWHRTURERERERKQjLLqJiIiIiIiIdIRFNxEREREREZGOsOgmIiIiIiIi0hEW3UREREREREQ68llF98KFC+Hs7AwzMzNUrlwZZ86c+ej+mzZtQrFixWBmZoZSpUphz549avdPmjQJxYoVg6WlJXLkyAFPT0+cPn36c6IRERERERERKUa2i+6NGzfCx8cHEydORGhoKMqUKQMvLy88efJE6/4nT55Ex44d4e3tjQsXLqBVq1Zo1aoVrly5Iu1TpEgRLFiwAJcvX8bx48fh7OyMhg0bIjY29vNfGREREREREZHMsl10z549G71790aPHj3g7u6OwMBAWFhYYMWKFVr3nzt3Lho1agRfX18UL14cU6ZMQbly5bBgwQJpnx9//BGenp5wdXVFiRIlMHv2bLx8+RKXLl3S+pzJycl4+fKl2kZERERERESkNNkqulNSUnD+/Hl4enr++wQGBvD09ERISIjWx4SEhKjtDwBeXl6Z7p+SkoKlS5fC1tYWZcqU0bqPv78/bG1tpc3JySk7L4OIiIiIiIjoq8hW0R0XF4e0tDQ4ODiotTs4OCA6OlrrY6Kjo7O0/65du2BlZQUzMzPMmTMHBw4cgL29vdbnHD16NF68eCFtUVFR2XkZRERERERERF+FkdwBMtStWxcXL15EXFwcfv/9d7Rr1w6nT59Gnjx5NPY1NTWFqampDCmJiIiIiIiIsi5bV7rt7e1haGiImJgYtfaYmBg4OjpqfYyjo2OW9re0tEThwoVRpUoVLF++HEZGRli+fHl24hEREREREREpSraKbhMTE5QvXx7BwcFSW3p6OoKDg1G1alWtj6latara/gBw4MCBTPd//3mTk5OzE4+IiIiIiIhIUbLdvdzHxwfdunVDhQoVUKlSJQQEBCAxMRE9evQAAHTt2hX58+eHv78/AGDw4MGoXbs2Zs2ahaZNm2LDhg04d+4cli5dCgBITEzEL7/8ghYtWiBv3ryIi4vDwoUL8fDhQ7Rt2/YLvlQiIiIiIiKiryvbRXf79u0RGxuLCRMmIDo6Gh4eHti7d680WVpkZCQMDP69gF6tWjWsW7cO48aNw5gxY+Dm5oagoCCULFkSAGBoaIgbN25g1apViIuLQ65cuVCxYkUcO3YMJUqU+EIvk4iIiIiIiOjr+6yJ1AYMGIABAwZove/w4cMabW3bts30qrWZmRm2bt36OTGIiIiIiIiIFC1bY7qJiIiIiIiIKOtYdBMRERERERHpCItuIiIiIiIiIh1h0U1ERERERESkI581kRoRERERERFljfOo3XJHAABETG8qd4RvEq90ExEREREREekIi24iIiIiIiIiHWHRTURERERERKQjLLqJiIiIiIiIdIRFNxEREREREZGOsOgmIiIiIiIi0hEW3UREREREREQ6wqKbiIiIiIiISEdYdBMRERERERHpCItuIiIiIiIiIh1h0U1ERERERESkIyy6iYiIiIiIiHSERTcRERERERGRjrDoJiIiIiIiItIRFt1EREREREREOsKim4iIiIiIiEhHWHQTERERERER6YiR3AGIiIiIiIhIGZxH7ZY7AgAgYnpTuSN8MbzSTURERERERKQjn1V0L1y4EM7OzjAzM0PlypVx5syZj+6/adMmFCtWDGZmZihVqhT27Nkj3ZeamoqRI0eiVKlSsLS0RL58+dC1a1c8evToc6IRERERERERKUa2i+6NGzfCx8cHEydORGhoKMqUKQMvLy88efJE6/4nT55Ex44d4e3tjQsXLqBVq1Zo1aoVrly5AgBISkpCaGgoxo8fj9DQUGzduhU3b95EixYt/rdXRkRERERERCSzbBfds2fPRu/evdGjRw+4u7sjMDAQFhYWWLFihdb9586di0aNGsHX1xfFixfHlClTUK5cOSxYsAAAYGtriwMHDqBdu3YoWrQoqlSpggULFuD8+fOIjIz8314dERERERERkYyyVXSnpKTg/Pnz8PT0/PcJDAzg6emJkJAQrY8JCQlR2x8AvLy8Mt0fAF68eAGVSgU7Ozut9ycnJ+Ply5dqGxEREREREZHSZKvojouLQ1paGhwcHNTaHRwcEB0drfUx0dHR2dr/zZs3GDlyJDp27AgbGxut+/j7+8PW1lbanJycsvMyiIiIiIiIiL4KRc1enpqainbt2kEIgcWLF2e63+jRo/HixQtpi4qK+oopiYiIiIiIiLImW+t029vbw9DQEDExMWrtMTExcHR01PoYR0fHLO2fUXDfv38f//zzT6ZXuQHA1NQUpqam2YlORERERERE9NVl60q3iYkJypcvj+DgYKktPT0dwcHBqFq1qtbHVK1aVW1/ADhw4IDa/hkF9+3bt3Hw4EHkypUrO7GIiIiIiIiIFClbV7oBwMfHB926dUOFChVQqVIlBAQEIDExET169AAAdO3aFfnz54e/vz8AYPDgwahduzZmzZqFpk2bYsOGDTh37hyWLl0K4F3B/cMPPyA0NBS7du1CWlqaNN47Z86cMDEx+VKvlYiIiIiIiOirynbR3b59e8TGxmLChAmIjo6Gh4cH9u7dK02WFhkZCQODfy+gV6tWDevWrcO4ceMwZswYuLm5ISgoCCVLlgQAPHz4EDt27AAAeHh4qP2sQ4cOoU6dOp/50oiIiIiIiIjkle2iGwAGDBiAAQMGaL3v8OHDGm1t27ZF27Ztte7v7OwMIcTnxCAiIiIiIiJSNEXNXk5ERERERET0X8Kim4iIiIiIiEhHWHQTERERERER6QiLbiIiIiIiIiIdYdFNREREREREpCMsuomIiIiIiIh0hEU3ERERERERkY6w6CYiIiIiIiLSERbdRERERERERDrCopuIiIiIiIhIR1h0ExEREREREekIi24iIiIiIiIiHWHRTURERERERKQjLLqJiIiIiIiIdIRFNxEREREREZGOsOgmIiIiIiIi0hEW3UREREREREQ6wqKbiIiIiIiISEdYdBMRERERERHpCItuIiIiIiIiIh1h0U1ERERERESkIyy6iYiIiIiIiHSERTcRERERERGRjrDoJiIiIiIiItKRzyq6Fy5cCGdnZ5iZmaFy5co4c+bMR/fftGkTihUrBjMzM5QqVQp79uxRu3/r1q1o2LAhcuXKBZVKhYsXL35OLCIiIiIiIiJFyXbRvXHjRvj4+GDixIkIDQ1FmTJl4OXlhSdPnmjd/+TJk+jYsSO8vb1x4cIFtGrVCq1atcKVK1ekfRITE1GjRg3MmDHj818JERERERERkcJku+iePXs2evfujR49esDd3R2BgYGwsLDAihUrtO4/d+5cNGrUCL6+vihevDimTJmCcuXKYcGCBdI+Xbp0wYQJE+Dp6fn5r4SIiIiIiIhIYbJVdKekpOD8+fNqxbGBgQE8PT0REhKi9TEhISEaxbSXl1em+2dFcnIyXr58qbYRERERERERKU22iu64uDikpaXBwcFBrd3BwQHR0dFaHxMdHZ2t/bPC398ftra20ubk5PTZz0VERERERESkK3o5e/no0aPx4sULaYuKipI7EhEREREREZEGo+zsbG9vD0NDQ8TExKi1x8TEwNHRUetjHB0ds7V/VpiamsLU1PSzH09ERERERET0NWTrSreJiQnKly+P4OBgqS09PR3BwcGoWrWq1sdUrVpVbX8AOHDgQKb7ExEREREREf1XZOtKNwD4+PigW7duqFChAipVqoSAgAAkJiaiR48eAICuXbsif/788Pf3BwAMHjwYtWvXxqxZs9C0aVNs2LAB586dw9KlS6XnfPbsGSIjI/Ho0SMAwM2bNwG8u0r+v1wRJyIiIiIiIpJTtovu9u3bIzY2FhMmTEB0dDQ8PDywd+9eabK0yMhIGBj8ewG9WrVqWLduHcaNG4cxY8bAzc0NQUFBKFmypLTPjh07pKIdADp06AAAmDhxIiZNmvS5r42IiIiIiIhIVtkuugFgwIABGDBggNb7Dh8+rNHWtm1btG3bNtPn6969O7p37/45UYiIiIiIiIgUSy9nLyciIiIiIiLSByy6iYiIiIiIiHSERTcRERERERGRjrDoJiIiIiIiItIRFt1EREREREREOsKim4iIiIiIiEhHWHQTERERERER6QiLbiIiIiIiIiIdYdFNREREREREpCMsuomIiIiIiIh0hEU3ERERERERkY6w6CYiIiIiIiLSERbdRERERERERDrCopuIiIiIiIhIR1h0ExEREREREekIi24iIiIiIiIiHWHRTURERERERKQjLLqJiIiIiIiIdIRFNxEREREREZGOsOgmIiIiIiIi0hEW3UREREREREQ6wqKbiIiIiIiISEdYdBMRERERERHpCItuIiIiIiIiIh35rKJ74cKFcHZ2hpmZGSpXrowzZ858dP9NmzahWLFiMDMzQ6lSpbBnzx61+4UQmDBhAvLmzQtzc3N4enri9u3bnxONiIiIiIiISDGyXXRv3LgR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",
      "text/plain": [
       "<Figure size 1000x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "# Оценка важности исходных признаков по attention-весам\n",
    "feature_importance = test_attn_all.mean(axis=0)\n",
    "fi_df = pd.DataFrame({\n",
    "    'original_feature': feature_order,\n",
    "    'attention_importance': feature_importance\n",
    "}).sort_values('attention_importance', ascending=False).reset_index(drop=True)\n",
    "\n",
    "fi_df['share'] = fi_df['attention_importance'] / fi_df['attention_importance'].sum()\n",
    "fi_df['cumulative_share'] = fi_df['share'].cumsum()\n",
    "\n",
    "display(fi_df)\n",
    "\n",
    "plt.figure(figsize=(10, 5))\n",
    "plt.bar(fi_df['original_feature'], fi_df['share'])\n",
    "plt.xticks(rotation=90)\n",
    "plt.title('Доли attention-важности исходных признаков')\n",
    "plt.tight_layout()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "51faf244",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Отобранные признаки:\n",
      "['Meditation', 'Life_Satisfaction_Score', 'Age', 'Work_Stress', 'Family_History_Mental_Illness', 'Therapy', 'Self_Esteem_Score', 'Anxiety_Score', 'Employment_Status', 'Chronic_Illnesses', 'Loneliness_Score', 'Physical_Activity_Hrs']\n",
      "Число отобранных признаков: 12 из 20\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>original_feature</th>\n",
       "      <th>importance_pct</th>\n",
       "      <th>cumulative_pct</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Meditation</td>\n",
       "      <td>6.32</td>\n",
       "      <td>6.320000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Life_Satisfaction_Score</td>\n",
       "      <td>6.08</td>\n",
       "      <td>12.400000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Age</td>\n",
       "      <td>5.99</td>\n",
       "      <td>18.389999</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Work_Stress</td>\n",
       "      <td>5.76</td>\n",
       "      <td>24.139999</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Family_History_Mental_Illness</td>\n",
       "      <td>5.75</td>\n",
       "      <td>29.900000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Therapy</td>\n",
       "      <td>5.65</td>\n",
       "      <td>35.549999</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Self_Esteem_Score</td>\n",
       "      <td>5.64</td>\n",
       "      <td>41.189999</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Anxiety_Score</td>\n",
       "      <td>5.32</td>\n",
       "      <td>46.509998</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>Employment_Status</td>\n",
       "      <td>5.27</td>\n",
       "      <td>51.779999</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Chronic_Illnesses</td>\n",
       "      <td>4.98</td>\n",
       "      <td>56.759998</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>Loneliness_Score</td>\n",
       "      <td>4.97</td>\n",
       "      <td>61.730000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Physical_Activity_Hrs</td>\n",
       "      <td>4.94</td>\n",
       "      <td>66.669998</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 original_feature  importance_pct  cumulative_pct\n",
       "0                      Meditation            6.32        6.320000\n",
       "1         Life_Satisfaction_Score            6.08       12.400000\n",
       "2                             Age            5.99       18.389999\n",
       "3                     Work_Stress            5.76       24.139999\n",
       "4   Family_History_Mental_Illness            5.75       29.900000\n",
       "5                         Therapy            5.65       35.549999\n",
       "6               Self_Esteem_Score            5.64       41.189999\n",
       "7                   Anxiety_Score            5.32       46.509998\n",
       "8               Employment_Status            5.27       51.779999\n",
       "9               Chronic_Illnesses            4.98       56.759998\n",
       "10               Loneliness_Score            4.97       61.730000\n",
       "11          Physical_Activity_Hrs            4.94       66.669998"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "# Отбор важных признаков:\n",
    "# берем признаки до достижения 80% накопленной важности,\n",
    "# но не менее 8 и не более 12 признаков.\n",
    "selected_mask = fi_df['cumulative_share'] <= 0.80\n",
    "selected_features = fi_df.loc[selected_mask, 'original_feature'].tolist()\n",
    "\n",
    "if len(selected_features) < 8:\n",
    "    selected_features = fi_df.head(min(8, len(fi_df)))['original_feature'].tolist()\n",
    "if len(selected_features) > 12:\n",
    "    selected_features = selected_features[:12]\n",
    "if len(selected_features) == 0:\n",
    "    selected_features = fi_df.head(min(10, len(fi_df)))['original_feature'].tolist()\n",
    "\n",
    "selected_fi_df = fi_df[fi_df['original_feature'].isin(selected_features)].copy()\n",
    "selected_fi_df = selected_fi_df.sort_values('attention_importance', ascending=False).reset_index(drop=True)\n",
    "\n",
    "print('Отобранные признаки:')\n",
    "print(selected_features)\n",
    "print('Число отобранных признаков:', len(selected_features), 'из', len(feature_order))\n",
    "\n",
    "display(\n",
    "    selected_fi_df.assign(\n",
    "        importance_pct=(selected_fi_df['share'] * 100).round(2),\n",
    "        cumulative_pct=(selected_fi_df['cumulative_share'] * 100).round(2)\n",
    "    )[['original_feature', 'importance_pct', 'cumulative_pct']]\n",
    ")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "89d2c801",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "# Подготовка данных только по выбранным признакам\n",
    "selected_num_cols = [c for c in selected_features if c in num_cols]\n",
    "selected_cat_cols = [c for c in selected_features if c in cat_cols]\n",
    "\n",
    "sel_num_scaler = StandardScaler()\n",
    "if selected_num_cols:\n",
    "    X_train_num_sel = sel_num_scaler.fit_transform(X_train_df[selected_num_cols])\n",
    "    X_valid_num_sel = sel_num_scaler.transform(X_valid_df[selected_num_cols])\n",
    "    X_test_num_sel = sel_num_scaler.transform(X_test_df[selected_num_cols])\n",
    "else:\n",
    "    X_train_num_sel = np.zeros((len(X_train_df), 0), dtype=np.float32)\n",
    "    X_valid_num_sel = np.zeros((len(X_valid_df), 0), dtype=np.float32)\n",
    "    X_test_num_sel = np.zeros((len(X_test_df), 0), dtype=np.float32)\n",
    "\n",
    "sel_cat_maps = {}\n",
    "train_cat_sel_list, valid_cat_sel_list, test_cat_sel_list = [], [], []\n",
    "\n",
    "for c in selected_cat_cols:\n",
    "    mp = fit_cat_mapping(X_train_df[c])\n",
    "    sel_cat_maps[c] = mp\n",
    "    train_cat_sel_list.append(transform_cat(X_train_df[c], mp))\n",
    "    valid_cat_sel_list.append(transform_cat(X_valid_df[c], mp))\n",
    "    test_cat_sel_list.append(transform_cat(X_test_df[c], mp))\n",
    "\n",
    "if selected_cat_cols:\n",
    "    X_train_cat_sel = np.column_stack(train_cat_sel_list).astype(np.int64)\n",
    "    X_valid_cat_sel = np.column_stack(valid_cat_sel_list).astype(np.int64)\n",
    "    X_test_cat_sel = np.column_stack(test_cat_sel_list).astype(np.int64)\n",
    "else:\n",
    "    X_train_cat_sel = np.zeros((len(X_train_df), 0), dtype=np.int64)\n",
    "    X_valid_cat_sel = np.zeros((len(X_valid_df), 0), dtype=np.int64)\n",
    "    X_test_cat_sel = np.zeros((len(X_test_df), 0), dtype=np.int64)\n",
    "\n",
    "train_ds_sel = TabAttentionDataset(X_train_num_sel, X_train_cat_sel, y_train)\n",
    "valid_ds_sel = TabAttentionDataset(X_valid_num_sel, X_valid_cat_sel, y_valid)\n",
    "test_ds_sel = TabAttentionDataset(X_test_num_sel, X_test_cat_sel, y_test)\n",
    "\n",
    "train_loader_sel = DataLoader(train_ds_sel, batch_size=64, shuffle=True)\n",
    "valid_loader_sel = DataLoader(valid_ds_sel, batch_size=256, shuffle=False)\n",
    "test_loader_sel = DataLoader(test_ds_sel, batch_size=256, shuffle=False)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "64ec9384",
   "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>epoch</th>\n",
       "      <th>train_loss</th>\n",
       "      <th>valid_accuracy</th>\n",
       "      <th>valid_balanced_accuracy</th>\n",
       "      <th>valid_precision</th>\n",
       "      <th>valid_recall</th>\n",
       "      <th>valid_f1</th>\n",
       "      <th>valid_roc_auc</th>\n",
       "      <th>best_threshold</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>0.973155</td>\n",
       "      <td>0.304167</td>\n",
       "      <td>0.502976</td>\n",
       "      <td>0.301255</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.463023</td>\n",
       "      <td>0.456515</td>\n",
       "      <td>0.480</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>11</td>\n",
       "      <td>0.963508</td>\n",
       "      <td>0.300000</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>0.300000</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.461538</td>\n",
       "      <td>0.461888</td>\n",
       "      <td>0.050</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>12</td>\n",
       "      <td>0.970443</td>\n",
       "      <td>0.304167</td>\n",
       "      <td>0.502976</td>\n",
       "      <td>0.301255</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.463023</td>\n",
       "      <td>0.452712</td>\n",
       "      <td>0.475</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>13</td>\n",
       "      <td>0.982785</td>\n",
       "      <td>0.300000</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>0.300000</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.461538</td>\n",
       "      <td>0.455150</td>\n",
       "      <td>0.050</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>14</td>\n",
       "      <td>0.969336</td>\n",
       "      <td>0.300000</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>0.300000</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.461538</td>\n",
       "      <td>0.468998</td>\n",
       "      <td>0.050</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    epoch  train_loss  valid_accuracy  valid_balanced_accuracy  \\\n",
       "9      10    0.973155        0.304167                 0.502976   \n",
       "10     11    0.963508        0.300000                 0.500000   \n",
       "11     12    0.970443        0.304167                 0.502976   \n",
       "12     13    0.982785        0.300000                 0.500000   \n",
       "13     14    0.969336        0.300000                 0.500000   \n",
       "\n",
       "    valid_precision  valid_recall  valid_f1  valid_roc_auc  best_threshold  \n",
       "9          0.301255           1.0  0.463023       0.456515           0.480  \n",
       "10         0.300000           1.0  0.461538       0.461888           0.050  \n",
       "11         0.301255           1.0  0.463023       0.452712           0.475  \n",
       "12         0.300000           1.0  0.461538       0.455150           0.050  \n",
       "13         0.300000           1.0  0.461538       0.468998           0.050  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Лучший порог по validation F1: 0.51\n"
     ]
    }
   ],
   "source": [
    "\n",
    "# Нейросеть с той же архитектурой на отобранных признаках\n",
    "sel_cat_cardinalities = [len(sel_cat_maps[c]) for c in selected_cat_cols]\n",
    "\n",
    "att_model_sel, hist_sel, best_thr_sel = train_attention_model(\n",
    "    train_loader_sel, valid_loader_sel,\n",
    "    num_features=len(selected_num_cols),\n",
    "    cat_cardinalities=sel_cat_cardinalities\n",
    ")\n",
    "\n",
    "display(hist_sel.tail())\n",
    "print('Лучший порог по validation F1:', round(best_thr_sel, 4))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "f12e0a34",
   "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>value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>accuracy</th>\n",
       "      <td>0.316667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>balanced_accuracy</th>\n",
       "      <td>0.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>precision</th>\n",
       "      <td>0.300000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>recall</th>\n",
       "      <td>0.958333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f1</th>\n",
       "      <td>0.456954</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>roc_auc</th>\n",
       "      <td>0.455357</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                      value\n",
       "accuracy           0.316667\n",
       "balanced_accuracy  0.500000\n",
       "precision          0.300000\n",
       "recall             0.958333\n",
       "f1                 0.456954\n",
       "roc_auc            0.455357"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Матрица ошибок:\n",
      "[[  7 161]\n",
      " [  3  69]]\n",
      "\n",
      "Классификационный отчёт:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "         0.0     0.7000    0.0417    0.0787       168\n",
      "         1.0     0.3000    0.9583    0.4570        72\n",
      "\n",
      "    accuracy                         0.3167       240\n",
      "   macro avg     0.5000    0.5000    0.2678       240\n",
      "weighted avg     0.5800    0.3167    0.1921       240\n",
      "\n"
     ]
    }
   ],
   "source": [
    "\n",
    "# Оценка модели по отобранным признакам\n",
    "y_test_true_sel, test_prob_sel, test_attn_sel = predict_proba(att_model_sel, test_loader_sel)\n",
    "metrics_sel, pred_sel = evaluate_binary(y_test_true_sel, test_prob_sel, threshold=best_thr_sel)\n",
    "\n",
    "metrics_sel_df = pd.Series(metrics_sel, name='value').to_frame()\n",
    "display(metrics_sel_df)\n",
    "\n",
    "print('Матрица ошибок:')\n",
    "print(confusion_matrix(y_test_true_sel, pred_sel))\n",
    "\n",
    "print('\\nКлассификационный отчёт:')\n",
    "print(classification_report(y_test_true_sel, pred_sel, digits=4, zero_division=0))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "aa40d736",
   "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>accuracy</th>\n",
       "      <th>balanced_accuracy</th>\n",
       "      <th>precision</th>\n",
       "      <th>recall</th>\n",
       "      <th>f1</th>\n",
       "      <th>roc_auc</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Attention-модель по всем признакам</td>\n",
       "      <td>0.300000</td>\n",
       "      <td>0.5</td>\n",
       "      <td>0.3</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.461538</td>\n",
       "      <td>0.526951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Нейросеть по отобранным признакам</td>\n",
       "      <td>0.316667</td>\n",
       "      <td>0.5</td>\n",
       "      <td>0.3</td>\n",
       "      <td>0.958333</td>\n",
       "      <td>0.456954</td>\n",
       "      <td>0.455357</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                model  accuracy  balanced_accuracy  precision  \\\n",
       "0  Attention-модель по всем признакам  0.300000                0.5        0.3   \n",
       "1   Нейросеть по отобранным признакам  0.316667                0.5        0.3   \n",
       "\n",
       "     recall        f1   roc_auc  \n",
       "0  1.000000  0.461538  0.526951  \n",
       "1  0.958333  0.456954  0.455357  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAGGCAYAAADmRxfNAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAe4RJREFUeJzt3Xd4FNXbxvHvppOEhJ4QWggtoUtCL6EHRBFRQFQ6CAKCIugPVJoFEEWkCIqAShGkK1VEOpHee++EHiBAyu68f+TdkSUBiYsE9P5c116ws1PObHbn7DPnnOdYDMMwEBERERERcYJLehdARERERESefAosRERERETEaQosRERERETEaQosRERERETEaQosRERERETEaQosRERERETEaQosRERERETEaQosRERERETEaQosRERE5LFgs9m4ePEiR44cSe+iiMjfoMBCREQeyPz589m2bZv5fO7cuezevTv9CiQPbM2aNaxYscJ8vmLFCtauXZt+BbrDuXPnePPNN8mXLx8eHh5kz56dokWLcu3atfQumoikkQILkcfU4cOH6dixIyEhIXh5eeHn50flypX58ssvuXXrVnoXT/6Ddu7cSffu3Tl48CB//PEHnTp14vr16+ldLHkAJ0+epHPnzuzcuZOdO3fSuXNnTp48md7F4tChQ5QtW5Zp06bRsWNH5s+fz9KlS1m2bBk+Pj7pXTwRSSOLYRhGehdCRBwtWLCAJk2a4OnpScuWLSlevDgJCQmsWbOGWbNm0bp1a7755pv0Lqb8x1y4cIFKlSpx6NAhABo3bsysWbPSuVTyIOLj46lWrRobNmwAoGLFiqxYsQIPD490LVetWrU4duwYq1atIleuXOlaFhFxngILkcfM0aNHKVmyJLlz5+b3338nZ86cDq8fOnSIBQsW0L1793QqofyXxcfHs2vXLry9vQkLC0vv4kgaWK1Wdu3aBUDx4sVxdXVN1/Js3ryZiIgIfv31V+rUqZOuZRGRh0NdoUQeM59++ik3btxg/PjxKYIKgIIFCzoEFRaLha5duzJlyhSKFCmCl5cX4eHhrFq1ymG748eP07lzZ4oUKUKGDBnImjUrTZo04dixYw7rfffdd1gsFvPh7e1NiRIl+Pbbbx3Wa926Nb6+vinKN3PmTCwWi0N/boD169dTr149/P398fb2JjIyMkUf7/79+2OxWLh4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v+Hl5WW89dZbDsv/6nsnIskshpHG9lwReaxYLBa6dOmSprvukv5WrFhBjRo17tulxj67eP/+/R9dwUSeYK1bt2bmzJmpdrsUkX+exliIiIiIiIjTNMZCRCQdBAQE8Morr9x3nUqVKjlkxxIREXmcKbAQEUkHYWFh5mDYe3nttdceUWlEREScpzEWIiIiIiLiNI2xEBERERERpymwEBERERERpymwEBERERERpz0Rg7dtNhtnzpwhY8aMWCyW9C6OiIiIiMh/gmEYXL9+naCgIFxc7t8m8UQEFmfOnCFPnjzpXQwRERERkf+kkydPkjt37vuu80QEFhkzZgSST8jPzy+dSyMiIiIi8t9w7do18uTJY/4ev58nIrCwd3/y8/NTYCEiIiIi8og9yHAEDd4WERERERGnKbAQERERERGnKbAQERERERGnKbAQERERERGnKbAQERERERGnKbAQERERERGnKbAQERERERGnKbAQERERERGnKbAQERERERGnPREzb4s8Ufr7p3cJ5EnRPza9SyAiIvLQqMVCREREREScpsBCREREREScpsBCREREREScpsBCREREREScpsBCREREREScpsBCRERERESc9rcCi9GjRxMcHIyXlxfly5dnw4YN91z3u+++w2KxODy8vLz+doFFREREROTxk+bAYvr06fTo0YN+/fqxZcsWSpUqRVRUFOfPn7/nNn5+fpw9e9Z8HD9+3KlCi4iIiIjI4yXNgcWwYcPo0KEDbdq0oWjRoowdOxZvb28mTJhwz20sFguBgYHmIyAgwKlCi4iIiIjI4yVNgUVCQgKbN2+mdu3af+7AxYXatWsTHR19z+1u3LhBvnz5yJMnD8899xy7d+/++yUWEREREZHHTpoCi4sXL2K1WlO0OAQEBHDu3LlUtylSpAgTJkxg3rx5TJ48GZvNRqVKlTh16tQ9jxMfH8+1a9ccHiIiIiIi8vj6x7NCVaxYkZYtW1K6dGkiIyOZPXs22bNn5+uvv77nNoMGDcLf39985MmT558upoiIiIiIOCFNgUW2bNlwdXUlJibGYXlMTAyBgYEPtA93d3eeeuopDh06dM91evfuTWxsrPk4efJkWoopIiIiIiKPWJoCCw8PD8LDw1m2bJm5zGazsWzZMipWrPhA+7BarezcuZOcOXPecx1PT0/8/PwcHiIiIiIi8vhyS+sGPXr0oFWrVkRERFCuXDmGDx9OXFwcbdq0AaBly5bkypWLQYMGATBw4EAqVKhAwYIFuXr1KkOHDuX48eO0b9/+4Z6JiIiIiIikmzQHFs2aNePChQv07duXc+fOUbp0aRYvXmwO6D5x4gQuLn82hFy5coUOHTpw7tw5MmfOTHh4OOvWraNo0aIP7yxERERERCRdWQzDMNK7EH/l2rVr+Pv7Exsbq25R8vjr75/eJZAnRf/Y9C6BiIjIfaXld/g/nhVKRERERET+/RRYiIiIiIiI0xRYiIiIiIiI0xRYiIiIiIiI0xRYiIiIiIiI0xRYiIiIiIiI0xRYiIiIiIiI0xRYiIiIiIiI0xRYiIiIiIiI0xRYiIiIiIiI0xRYiIiIiIiI09zSuwBPkuD/LUjvIsgT4JhXepdARERE5NFTi4WIiIiIiDhNLRYiIiIPkVq35UEcG9wgvYsg8tApsBARERF51Pr7p3cJ5EnQPza9S5Am6golIiIiIiJOU2AhIiIiIiJOU2AhIiIiIiJOU2AhIiIiIiJOU2AhIiIiIiJOU2AhIiIiIiJOU2AhIiIiIiJOU2AhIiIiIiJOU2AhIiIiIiJOU2AhIiIiIiJOU2AhIiIiIiJOU2AhIiIiIiJOU2AhIiIiIiJOU2AhIiIiIiJOU2AhIiIiIiJOU2AhIiIiIiJOU2AhIiIiIiJOU2AhIiIiIiJOU2AhIiIiIiJOU2AhIiIiIiJO+1uBxejRowkODsbLy4vy5cuzYcOGB9pu2rRpWCwWGjVq9HcOKyIiIiIij6k0BxbTp0+nR48e9OvXjy1btlCqVCmioqI4f/78fbc7duwYPXv2pGrVqn+7sCIiIiIi8nhKc2AxbNgwOnToQJs2bShatChjx47F29ubCRMm3HMbq9XKK6+8woABAwgJCXGqwCIiIiIi8vhJU2CRkJDA5s2bqV279p87cHGhdu3aREdH33O7gQMHkiNHDtq1a/dAx4mPj+fatWsODxEREREReXylKbC4ePEiVquVgIAAh+UBAQGcO3cu1W3WrFnD+PHjGTdu3AMfZ9CgQfj7+5uPPHnypKWYIiIiIiLyiP2jWaGuX79OixYtGDduHNmyZXvg7Xr37k1sbKz5OHny5D9YShERERERcZZbWlbOli0brq6uxMTEOCyPiYkhMDAwxfqHDx/m2LFjPPvss+Yym82WfGA3N/bv30+BAgVSbOfp6Ymnp2daiiYiIiIiIukoTS0WHh4ehIeHs2zZMnOZzWZj2bJlVKxYMcX6oaGh7Ny5k23btpmPhg0bUqNGDbZt26YuTiIiIiIi/xJparEA6NGjB61atSIiIoJy5coxfPhw4uLiaNOmDQAtW7YkV65cDBo0CC8vL4oXL+6wfaZMmQBSLBcRERERkSdXmgOLZs2aceHCBfr27cu5c+coXbo0ixcvNgd0nzhxAhcXTegtIiIiIvJfkubAAqBr16507do11ddWrFhx322/++67v3NIERERERF5jKlpQUREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnKbAQkREREREnPa3AovRo0cTHByMl5cX5cuXZ8OGDfdcd/bs2URERJApUyZ8fHwoXbo0kyZN+tsFFhERERGRx0+aA4vp06fTo0cP+vXrx5YtWyhVqhRRUVGcP38+1fWzZMnCe++9R3R0NDt27KBNmza0adOGJUuWOF14ERERERF5PKQ5sBg2bBgdOnSgTZs2FC1alLFjx+Lt7c2ECRNSXb969eo8//zzhIWFUaBAAbp3707JkiVZs2aN04UXEREREZHHQ5oCi4SEBDZv3kzt2rX/3IGLC7Vr1yY6OvovtzcMg2XLlrF//36qVauW9tKKiIiIiMhjyS0tK1+8eBGr1UpAQIDD8oCAAPbt23fP7WJjY8mVKxfx8fG4urry1VdfUadOnXuuHx8fT3x8vPn82rVraSmmiIiIiIg8YmkKLP6ujBkzsm3bNm7cuMGyZcvo0aMHISEhVK9ePdX1Bw0axIABAx5F0URERERE5CFIU2CRLVs2XF1diYmJcVgeExNDYGDgPbdzcXGhYMGCAJQuXZq9e/cyaNCgewYWvXv3pkePHubza9eukSdPnrQUVUREREREHqE0jbHw8PAgPDycZcuWmctsNhvLli2jYsWKD7wfm83m0NXpbp6envj5+Tk8RERERETk8ZXmrlA9evSgVatWREREUK5cOYYPH05cXBxt2rQBoGXLluTKlYtBgwYByd2aIiIiKFCgAPHx8SxcuJBJkyYxZsyYh3smIiIiIiKSbtIcWDRr1owLFy7Qt29fzp07R+nSpVm8eLE5oPvEiRO4uPzZEBIXF0fnzp05deoUGTJkIDQ0lMmTJ9OsWbOHdxYiIiIiIpKuLIZhGOldiL9y7do1/P39iY2NTdduUcH/W5Bux5YnxzGvl9O7CPKk6B+b3iWQf4DqCnkQqivkgTwG9URafoeneYI8ERERERGRuymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERpymwEBERERERp/2twGL06NEEBwfj5eVF+fLl2bBhwz3XHTduHFWrViVz5sxkzpyZ2rVr33d9ERERERF58qQ5sJg+fTo9evSgX79+bNmyhVKlShEVFcX58+dTXX/FihU0b96c5cuXEx0dTZ48eahbty6nT592uvAiIiIiIvJ4SHNgMWzYMDp06ECbNm0oWrQoY8eOxdvbmwkTJqS6/pQpU+jcuTOlS5cmNDSUb7/9FpvNxrJly5wuvIiIiIiIPB7SFFgkJCSwefNmateu/ecOXFyoXbs20dHRD7SPmzdvkpiYSJYsWe65Tnx8PNeuXXN4iIiIiIjI4ytNgcXFixexWq0EBAQ4LA8ICODcuXMPtI93332XoKAg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",
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "# Сводное сравнение моделей\n",
    "results_df = pd.DataFrame([\n",
    "    {'model': 'Attention-модель по всем признакам', **metrics_all},\n",
    "    {'model': 'Нейросеть по отобранным признакам', **metrics_sel}\n",
    "])\n",
    "\n",
    "display(results_df)\n",
    "\n",
    "plt.figure(figsize=(8, 4))\n",
    "x = np.arange(len(results_df))\n",
    "width = 0.35\n",
    "plt.bar(x - width/2, results_df['f1'], width, label='F1')\n",
    "plt.bar(x + width/2, results_df['roc_auc'], width, label='ROC-AUC')\n",
    "plt.xticks(x, results_df['model'], rotation=15)\n",
    "plt.title('Сравнение моделей на тестовой выборке')\n",
    "plt.legend()\n",
    "plt.tight_layout()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "77d40ba4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "=== КЛЮЧЕВАЯ ИНФОРМАЦИЯ ДЛЯ ВЫВОДА ===\n",
      "Зависимая переменная: Depression_Score\n",
      "Порог бинаризации: 15.000000\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>share</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Depression_Score</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  share\n",
       "Depression_Score       \n",
       "0                   0.7\n",
       "1                   0.3"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\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>accuracy</th>\n",
       "      <th>balanced_accuracy</th>\n",
       "      <th>precision</th>\n",
       "      <th>recall</th>\n",
       "      <th>f1</th>\n",
       "      <th>roc_auc</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Attention-модель по всем признакам</td>\n",
       "      <td>0.300000</td>\n",
       "      <td>0.5</td>\n",
       "      <td>0.3</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.461538</td>\n",
       "      <td>0.526951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Нейросеть по отобранным признакам</td>\n",
       "      <td>0.316667</td>\n",
       "      <td>0.5</td>\n",
       "      <td>0.3</td>\n",
       "      <td>0.958333</td>\n",
       "      <td>0.456954</td>\n",
       "      <td>0.455357</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                model  accuracy  balanced_accuracy  precision  \\\n",
       "0  Attention-модель по всем признакам  0.300000                0.5        0.3   \n",
       "1   Нейросеть по отобранным признакам  0.316667                0.5        0.3   \n",
       "\n",
       "     recall        f1   roc_auc  \n",
       "0  1.000000  0.461538  0.526951  \n",
       "1  0.958333  0.456954  0.455357  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Лучшая модель по F1 на тесте:\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>accuracy</th>\n",
       "      <th>balanced_accuracy</th>\n",
       "      <th>precision</th>\n",
       "      <th>recall</th>\n",
       "      <th>f1</th>\n",
       "      <th>roc_auc</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Attention-модель по всем признакам</td>\n",
       "      <td>0.3</td>\n",
       "      <td>0.5</td>\n",
       "      <td>0.3</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.461538</td>\n",
       "      <td>0.526951</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                model  accuracy  balanced_accuracy  precision  \\\n",
       "0  Attention-модель по всем признакам       0.3                0.5        0.3   \n",
       "\n",
       "   recall        f1   roc_auc  \n",
       "0     1.0  0.461538  0.526951  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Отобранные признаки:\n",
      "['Meditation', 'Life_Satisfaction_Score', 'Age', 'Work_Stress', 'Family_History_Mental_Illness', 'Therapy', 'Self_Esteem_Score', 'Anxiety_Score', 'Employment_Status', 'Chronic_Illnesses', 'Loneliness_Score', 'Physical_Activity_Hrs']\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>original_feature</th>\n",
       "      <th>attention_importance</th>\n",
       "      <th>share</th>\n",
       "      <th>cumulative_share</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Meditation</td>\n",
       "      <td>0.063162</td>\n",
       "      <td>0.063162</td>\n",
       "      <td>0.063162</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Life_Satisfaction_Score</td>\n",
       "      <td>0.060833</td>\n",
       "      <td>0.060833</td>\n",
       "      <td>0.123995</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Age</td>\n",
       "      <td>0.059858</td>\n",
       "      <td>0.059858</td>\n",
       "      <td>0.183853</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Work_Stress</td>\n",
       "      <td>0.057591</td>\n",
       "      <td>0.057591</td>\n",
       "      <td>0.241444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Family_History_Mental_Illness</td>\n",
       "      <td>0.057522</td>\n",
       "      <td>0.057522</td>\n",
       "      <td>0.298966</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Therapy</td>\n",
       "      <td>0.056520</td>\n",
       "      <td>0.056520</td>\n",
       "      <td>0.355486</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Self_Esteem_Score</td>\n",
       "      <td>0.056422</td>\n",
       "      <td>0.056422</td>\n",
       "      <td>0.411908</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Anxiety_Score</td>\n",
       "      <td>0.053219</td>\n",
       "      <td>0.053219</td>\n",
       "      <td>0.465127</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>Employment_Status</td>\n",
       "      <td>0.052664</td>\n",
       "      <td>0.052664</td>\n",
       "      <td>0.517791</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Chronic_Illnesses</td>\n",
       "      <td>0.049831</td>\n",
       "      <td>0.049831</td>\n",
       "      <td>0.567622</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>Loneliness_Score</td>\n",
       "      <td>0.049665</td>\n",
       "      <td>0.049665</td>\n",
       "      <td>0.617287</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Physical_Activity_Hrs</td>\n",
       "      <td>0.049448</td>\n",
       "      <td>0.049448</td>\n",
       "      <td>0.666735</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 original_feature  attention_importance     share  \\\n",
       "0                      Meditation              0.063162  0.063162   \n",
       "1         Life_Satisfaction_Score              0.060833  0.060833   \n",
       "2                             Age              0.059858  0.059858   \n",
       "3                     Work_Stress              0.057591  0.057591   \n",
       "4   Family_History_Mental_Illness              0.057522  0.057522   \n",
       "5                         Therapy              0.056520  0.056520   \n",
       "6               Self_Esteem_Score              0.056422  0.056422   \n",
       "7                   Anxiety_Score              0.053219  0.053219   \n",
       "8               Employment_Status              0.052664  0.052664   \n",
       "9               Chronic_Illnesses              0.049831  0.049831   \n",
       "10               Loneliness_Score              0.049665  0.049665   \n",
       "11          Physical_Activity_Hrs              0.049448  0.049448   \n",
       "\n",
       "    cumulative_share  \n",
       "0           0.063162  \n",
       "1           0.123995  \n",
       "2           0.183853  \n",
       "3           0.241444  \n",
       "4           0.298966  \n",
       "5           0.355486  \n",
       "6           0.411908  \n",
       "7           0.465127  \n",
       "8           0.517791  \n",
       "9           0.567622  \n",
       "10          0.617287  \n",
       "11          0.666735  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Матрица ошибок: модель по всем признакам\n",
      "[[  0 168]\n",
      " [  0  72]]\n",
      "\n",
      "Матрица ошибок: модель по отобранным признакам\n",
      "[[  7 161]\n",
      " [  3  69]]\n",
      "\n",
      "Порог классификации для модели по всем признакам: 0.05\n",
      "Порог классификации для модели по отобранным признакам: 0.51\n"
     ]
    }
   ],
   "source": [
    "\n",
    "# Финальная ячейка: печать всех данных для корректного вывода по фактическим результатам\n",
    "print('=== КЛЮЧЕВАЯ ИНФОРМАЦИЯ ДЛЯ ВЫВОДА ===')\n",
    "print(f'Зависимая переменная: {target_col}')\n",
    "if 'threshold' in locals():\n",
    "    print(f'Порог бинаризации: {threshold:.6f}')\n",
    "print('\\nРаспределение классов:')\n",
    "display(class_distribution)\n",
    "\n",
    "print('\\nМетрики моделей на тестовой выборке:')\n",
    "display(results_df)\n",
    "\n",
    "best_idx = results_df['f1'].astype(float).idxmax()\n",
    "best_model_row = results_df.loc[[best_idx]]\n",
    "print('Лучшая модель по F1 на тесте:')\n",
    "display(best_model_row)\n",
    "\n",
    "print('\\nОтобранные признаки:')\n",
    "print(selected_features)\n",
    "\n",
    "print('\\nВажность отобранных признаков:')\n",
    "display(selected_fi_df[['original_feature', 'attention_importance', 'share', 'cumulative_share']])\n",
    "\n",
    "print('\\nМатрица ошибок: модель по всем признакам')\n",
    "print(confusion_matrix(y_test_true, pred_all))\n",
    "\n",
    "print('\\nМатрица ошибок: модель по отобранным признакам')\n",
    "print(confusion_matrix(y_test_true_sel, pred_sel))\n",
    "\n",
    "print('\\nПорог классификации для модели по всем признакам:', round(best_thr_all, 4))\n",
    "print('Порог классификации для модели по отобранным признакам:', round(best_thr_sel, 4))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "943ec5ea",
   "metadata": {},
   "source": [
    "Итог\n",
    "\n",
    "В качестве зависимой переменной выбран Depression_Score (бинаризация по 75-му перцентилю, порог = 15). С помощью attention-нейросети оценена важность признаков и отобрано 12 наиболее информативных переменных (в т.ч. Meditation, Life_Satisfaction_Score, Age, Work_Stress, Self_Esteem_Score, Anxiety_Score).\n",
    "\n",
    "Сравнение моделей на тестовой выборке показало, что attention-модель по всем признакам имеет наибольший F1 ≈ 0.462 и ROC-AUC ≈ 0.527. Модель по отобранным признакам демонстрирует сопоставимый результат (F1 ≈ 0.457).\n",
    "\n",
    "Следовательно, отбор признаков практически не ухудшает качество модели, что подтверждает информативность выделенных переменных."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
