{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "a275e61e",
   "metadata": {},
   "source": [
    "# Определение важности признаков с помощью нейросети с механизмом внимания\n",
    "\n",
    "В работе автоматически выбирается ключевая зависимая переменная, выполняется предобработка данных, обучается attention-нейросеть для оценки важности признаков, затем по отобранным признакам строится итоговая нейросеть и оценивается качество классификации."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "317afbab",
   "metadata": {},
   "source": [
    "## 1. Импорт библиотек и загрузка данных"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "1fe875e9",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2026-03-14 17:05:15.599823: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
      "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Размер датасета: (104, 14)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>case</th>\n",
       "      <th>site</th>\n",
       "      <th>Pop</th>\n",
       "      <th>sex</th>\n",
       "      <th>age</th>\n",
       "      <th>hdlngth</th>\n",
       "      <th>skullw</th>\n",
       "      <th>totlngth</th>\n",
       "      <th>taill</th>\n",
       "      <th>footlgth</th>\n",
       "      <th>earconch</th>\n",
       "      <th>eye</th>\n",
       "      <th>chest</th>\n",
       "      <th>belly</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Vic</td>\n",
       "      <td>m</td>\n",
       "      <td>8.0</td>\n",
       "      <td>94.1</td>\n",
       "      <td>60.4</td>\n",
       "      <td>89.0</td>\n",
       "      <td>36.0</td>\n",
       "      <td>74.5</td>\n",
       "      <td>54.5</td>\n",
       "      <td>15.2</td>\n",
       "      <td>28.0</td>\n",
       "      <td>36.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>Vic</td>\n",
       "      <td>f</td>\n",
       "      <td>6.0</td>\n",
       "      <td>92.5</td>\n",
       "      <td>57.6</td>\n",
       "      <td>91.5</td>\n",
       "      <td>36.5</td>\n",
       "      <td>72.5</td>\n",
       "      <td>51.2</td>\n",
       "      <td>16.0</td>\n",
       "      <td>28.5</td>\n",
       "      <td>33.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>Vic</td>\n",
       "      <td>f</td>\n",
       "      <td>6.0</td>\n",
       "      <td>94.0</td>\n",
       "      <td>60.0</td>\n",
       "      <td>95.5</td>\n",
       "      <td>39.0</td>\n",
       "      <td>75.4</td>\n",
       "      <td>51.9</td>\n",
       "      <td>15.5</td>\n",
       "      <td>30.0</td>\n",
       "      <td>34.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>Vic</td>\n",
       "      <td>f</td>\n",
       "      <td>6.0</td>\n",
       "      <td>93.2</td>\n",
       "      <td>57.1</td>\n",
       "      <td>92.0</td>\n",
       "      <td>38.0</td>\n",
       "      <td>76.1</td>\n",
       "      <td>52.2</td>\n",
       "      <td>15.2</td>\n",
       "      <td>28.0</td>\n",
       "      <td>34.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>Vic</td>\n",
       "      <td>f</td>\n",
       "      <td>2.0</td>\n",
       "      <td>91.5</td>\n",
       "      <td>56.3</td>\n",
       "      <td>85.5</td>\n",
       "      <td>36.0</td>\n",
       "      <td>71.0</td>\n",
       "      <td>53.2</td>\n",
       "      <td>15.1</td>\n",
       "      <td>28.5</td>\n",
       "      <td>33.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   case  site  Pop sex  age  hdlngth  skullw  totlngth  taill  footlgth  \\\n",
       "0     1     1  Vic   m  8.0     94.1    60.4      89.0   36.0      74.5   \n",
       "1     2     1  Vic   f  6.0     92.5    57.6      91.5   36.5      72.5   \n",
       "2     3     1  Vic   f  6.0     94.0    60.0      95.5   39.0      75.4   \n",
       "3     4     1  Vic   f  6.0     93.2    57.1      92.0   38.0      76.1   \n",
       "4     5     1  Vic   f  2.0     91.5    56.3      85.5   36.0      71.0   \n",
       "\n",
       "   earconch   eye  chest  belly  \n",
       "0      54.5  15.2   28.0   36.0  \n",
       "1      51.2  16.0   28.5   33.0  \n",
       "2      51.9  15.5   30.0   34.0  \n",
       "3      52.2  15.2   28.0   34.0  \n",
       "4      53.2  15.1   28.5   33.0  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Названия столбцов: ['case', 'site', 'Pop', 'sex', 'age', 'hdlngth', 'skullw', 'totlngth', 'taill', 'footlgth', 'earconch', 'eye', 'chest', 'belly']\n"
     ]
    }
   ],
   "source": [
    "\n",
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")\n",
    "\n",
    "import os\n",
    "import random\n",
    "import json\n",
    "import math\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, StratifiedKFold, cross_val_score\n",
    "from sklearn.compose import ColumnTransformer\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.preprocessing import OneHotEncoder, StandardScaler, LabelEncoder\n",
    "from sklearn.impute import SimpleImputer\n",
    "from sklearn.metrics import (\n",
    "    accuracy_score,\n",
    "    balanced_accuracy_score,\n",
    "    f1_score,\n",
    "    classification_report,\n",
    "    confusion_matrix,\n",
    "    roc_auc_score\n",
    ")\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "SEED = 42\n",
    "random.seed(SEED)\n",
    "np.random.seed(SEED)\n",
    "\n",
    "try:\n",
    "    import tensorflow as tf\n",
    "    tf.random.set_seed(SEED)\n",
    "    from tensorflow import keras\n",
    "    from tensorflow.keras import layers\n",
    "except Exception as e:\n",
    "    raise ImportError(\n",
    "        \"Для выполнения ноутбука требуется TensorFlow. \"\n",
    "        \"Установите его, например: pip install tensorflow\"\n",
    "    ) from e\n",
    "\n",
    "DATA_PATH_CANDIDATES = [\n",
    "    \"possum.csv\",\n",
    "    \"/mnt/data/possum.csv\",\n",
    "]\n",
    "\n",
    "data_path = None\n",
    "for p in DATA_PATH_CANDIDATES:\n",
    "    if os.path.exists(p):\n",
    "        data_path = p\n",
    "        break\n",
    "\n",
    "if data_path is None:\n",
    "    raise FileNotFoundError(\"Файл possum.csv не найден.\")\n",
    "\n",
    "df = pd.read_csv(data_path)\n",
    "print(f\"Размер датасета: {df.shape}\")\n",
    "display(df.head())\n",
    "print(\"Названия столбцов:\", list(df.columns))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aac80824",
   "metadata": {},
   "source": [
    "## 2. Первичная проверка и подготовка названий столбцов"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "80af5c68",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Актуальные столбцы: ['case', 'site', 'Pop', 'sex', 'age', 'hdlngth', 'skullw', 'totlngth', 'taill', 'footlgth', 'earconch', 'eye', 'chest', 'belly']\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>n_missing</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>case</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>site</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Pop</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sex</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>age</th>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>hdlngth</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>skullw</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>totlngth</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>taill</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>footlgth</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>earconch</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>eye</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>chest</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>belly</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          n_missing\n",
       "case              0\n",
       "site              0\n",
       "Pop               0\n",
       "sex               0\n",
       "age               2\n",
       "hdlngth           0\n",
       "skullw            0\n",
       "totlngth          0\n",
       "taill             0\n",
       "footlgth          1\n",
       "earconch          0\n",
       "eye               0\n",
       "chest             0\n",
       "belly             0"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "df = df.copy()\n",
    "df.columns = [str(c).strip() for c in df.columns]\n",
    "\n",
    "# Удаляем полностью пустые столбцы при наличии\n",
    "empty_cols = [c for c in df.columns if df[c].isna().all()]\n",
    "if empty_cols:\n",
    "    df = df.drop(columns=empty_cols)\n",
    "\n",
    "print(\"Актуальные столбцы:\", list(df.columns))\n",
    "print(\"Пропуски по столбцам:\")\n",
    "display(df.isna().sum().to_frame(\"n_missing\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bc709dfb",
   "metadata": {},
   "source": [
    "## 3. Автоматический выбор ключевой зависимой переменной\n",
    "\n",
    "Используется практическое правило:\n",
    "- исключаются очевидные идентификаторы;\n",
    "- рассматриваются в первую очередь категориальные и маломощные дискретные признаки;\n",
    "- среди кандидатов выбирается переменная с наилучшей предсказуемостью по остальным признакам в быстрой baseline-модели."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "99f09cd7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Кандидаты на целевую переменную: ['site', 'Pop', 'sex', 'age']\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>target</th>\n",
       "      <th>cv_f1_macro</th>\n",
       "      <th>max_class_share</th>\n",
       "      <th>final_score</th>\n",
       "      <th>n_classes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Pop</td>\n",
       "      <td>0.990118</td>\n",
       "      <td>0.557692</td>\n",
       "      <td>0.934348</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>site</td>\n",
       "      <td>0.637394</td>\n",
       "      <td>0.317308</td>\n",
       "      <td>0.605663</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>sex</td>\n",
       "      <td>0.648859</td>\n",
       "      <td>0.586538</td>\n",
       "      <td>0.590205</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  target  cv_f1_macro  max_class_share  final_score  n_classes\n",
       "0    Pop     0.990118         0.557692     0.934348          2\n",
       "1   site     0.637394         0.317308     0.605663          7\n",
       "2    sex     0.648859         0.586538     0.590205          2"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Выбранная зависимая переменная: Pop\n"
     ]
    }
   ],
   "source": [
    "\n",
    "def is_identifier(col_name: str, series: pd.Series) -> bool:\n",
    "    name = col_name.lower()\n",
    "    if any(token in name for token in [\"id\", \"index\", \"unnamed\", \"case\"]):\n",
    "        return True\n",
    "    # Уникальный почти для каждой строки числовой столбец считаем идентификатором\n",
    "    if pd.api.types.is_numeric_dtype(series):\n",
    "        nunique = series.nunique(dropna=True)\n",
    "        if nunique >= 0.9 * len(series):\n",
    "            return True\n",
    "    return False\n",
    "\n",
    "candidate_targets = []\n",
    "\n",
    "for col in df.columns:\n",
    "    s = df[col]\n",
    "    if is_identifier(col, s):\n",
    "        continue\n",
    "\n",
    "    nunique = s.nunique(dropna=True)\n",
    "    dtype_kind = s.dtype.kind\n",
    "\n",
    "    # Предпочтение классификационным целям: object/category/bool\n",
    "    if dtype_kind in [\"O\", \"b\"] or nunique <= min(10, max(3, len(df)//10)):\n",
    "        candidate_targets.append(col)\n",
    "\n",
    "if not candidate_targets:\n",
    "    raise ValueError(\"Не удалось найти разумного кандидата на целевую переменную.\")\n",
    "\n",
    "print(\"Кандидаты на целевую переменную:\", candidate_targets)\n",
    "\n",
    "def build_quick_preprocessor(X: pd.DataFrame):\n",
    "    numeric_cols = X.select_dtypes(include=[np.number]).columns.tolist()\n",
    "    categorical_cols = [c for c in X.columns if c not in numeric_cols]\n",
    "\n",
    "    numeric_pipe = Pipeline([\n",
    "        (\"imputer\", SimpleImputer(strategy=\"median\")),\n",
    "        (\"scaler\", StandardScaler())\n",
    "    ])\n",
    "    categorical_pipe = Pipeline([\n",
    "        (\"imputer\", SimpleImputer(strategy=\"most_frequent\")),\n",
    "        (\"ohe\", OneHotEncoder(handle_unknown=\"ignore\"))\n",
    "    ])\n",
    "    preprocessor = ColumnTransformer([\n",
    "        (\"num\", numeric_pipe, numeric_cols),\n",
    "        (\"cat\", categorical_pipe, categorical_cols)\n",
    "    ], remainder=\"drop\")\n",
    "    return preprocessor\n",
    "\n",
    "target_scores = []\n",
    "\n",
    "for target_col in candidate_targets:\n",
    "    X_tmp = df.drop(columns=[target_col])\n",
    "    y_tmp = df[target_col].astype(str).fillna(\"MISSING\")\n",
    "\n",
    "    # исключаем константные цели\n",
    "    if y_tmp.nunique() < 2:\n",
    "        continue\n",
    "\n",
    "    # слишком редкие классы\n",
    "    value_counts = y_tmp.value_counts(normalize=True)\n",
    "    if value_counts.min() < 0.03:\n",
    "        continue\n",
    "\n",
    "    preprocessor = build_quick_preprocessor(X_tmp)\n",
    "    clf = Pipeline([\n",
    "        (\"prep\", preprocessor),\n",
    "        (\"model\", LogisticRegression(max_iter=2000, class_weight=\"balanced\"))\n",
    "    ])\n",
    "\n",
    "    cv = StratifiedKFold(n_splits=min(5, y_tmp.value_counts().min()), shuffle=True, random_state=SEED)\n",
    "    cv = StratifiedKFold(n_splits=max(3, min(5, y_tmp.value_counts().min())), shuffle=True, random_state=SEED)\n",
    "    score = cross_val_score(clf, X_tmp, y_tmp, cv=cv, scoring=\"f1_macro\").mean()\n",
    "    balance_penalty = y_tmp.value_counts(normalize=True).max()\n",
    "    final_score = score - 0.1 * balance_penalty\n",
    "\n",
    "    target_scores.append({\n",
    "        \"target\": target_col,\n",
    "        \"cv_f1_macro\": score,\n",
    "        \"max_class_share\": balance_penalty,\n",
    "        \"final_score\": final_score,\n",
    "        \"n_classes\": y_tmp.nunique()\n",
    "    })\n",
    "\n",
    "target_scores_df = pd.DataFrame(target_scores).sort_values(\"final_score\", ascending=False).reset_index(drop=True)\n",
    "display(target_scores_df)\n",
    "\n",
    "if target_scores_df.empty:\n",
    "    raise ValueError(\"Не удалось выбрать целевую переменную автоматически.\")\n",
    "\n",
    "target_col = target_scores_df.loc[0, \"target\"]\n",
    "print(f\"Выбранная зависимая переменная: {target_col}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "76f2b535",
   "metadata": {},
   "source": [
    "## 4. Формирование матрицы признаков и целевой переменной"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "4c19e116",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Удалённые несодержательные столбцы: ['case']\n",
      "Форма X: (104, 12)\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>count</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Pop</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>other</th>\n",
       "      <td>58</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Vic</th>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       count\n",
       "Pop         \n",
       "other     58\n",
       "Vic       46"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Размерность после предобработки: (104, 13)\n",
      "Число итоговых признаков: 13\n",
      "Первые признаки: ['site', 'age', 'hdlngth', 'skullw', 'totlngth', 'taill', 'footlgth', 'earconch', 'eye', 'chest', 'belly', 'sex_f', 'sex_m']\n"
     ]
    }
   ],
   "source": [
    "\n",
    "# Дополнительно убираем явные идентификаторы из признаков\n",
    "drop_from_features = [c for c in df.columns if c != target_col and is_identifier(c, df[c])]\n",
    "X = df.drop(columns=[target_col] + drop_from_features)\n",
    "y_raw = df[target_col].astype(str).fillna(\"MISSING\")\n",
    "\n",
    "print(\"Удалённые несодержательные столбцы:\", drop_from_features)\n",
    "print(\"Форма X:\", X.shape)\n",
    "print(\"Распределение классов:\")\n",
    "display(y_raw.value_counts().to_frame(\"count\"))\n",
    "\n",
    "label_encoder = LabelEncoder()\n",
    "y = label_encoder.fit_transform(y_raw)\n",
    "class_names = list(label_encoder.classes_)\n",
    "n_classes = len(class_names)\n",
    "\n",
    "numeric_cols = X.select_dtypes(include=[np.number]).columns.tolist()\n",
    "categorical_cols = [c for c in X.columns if c not in numeric_cols]\n",
    "\n",
    "numeric_pipe = Pipeline([\n",
    "    (\"imputer\", SimpleImputer(strategy=\"median\")),\n",
    "    (\"scaler\", StandardScaler())\n",
    "])\n",
    "\n",
    "categorical_pipe = Pipeline([\n",
    "    (\"imputer\", SimpleImputer(strategy=\"most_frequent\")),\n",
    "    (\"ohe\", OneHotEncoder(handle_unknown=\"ignore\", sparse_output=False))\n",
    "])\n",
    "\n",
    "preprocessor = ColumnTransformer([\n",
    "    (\"num\", numeric_pipe, numeric_cols),\n",
    "    (\"cat\", categorical_pipe, categorical_cols)\n",
    "], remainder=\"drop\")\n",
    "\n",
    "X_processed = preprocessor.fit_transform(X)\n",
    "\n",
    "feature_names_num = numeric_cols\n",
    "ohe = preprocessor.named_transformers_[\"cat\"].named_steps[\"ohe\"] if categorical_cols else None\n",
    "feature_names_cat = list(ohe.get_feature_names_out(categorical_cols)) if ohe is not None else []\n",
    "feature_names = feature_names_num + feature_names_cat\n",
    "\n",
    "X_processed = np.asarray(X_processed, dtype=np.float32)\n",
    "\n",
    "print(\"Размерность после предобработки:\", X_processed.shape)\n",
    "print(\"Число итоговых признаков:\", len(feature_names))\n",
    "print(\"Первые признаки:\", feature_names[:20])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "accce3d4",
   "metadata": {},
   "source": [
    "## 5. Разделение на обучающую и тестовую выборки"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "72aa0484",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train: (78, 13) (78,)\n",
      "Test: (26, 13) (26,)\n"
     ]
    }
   ],
   "source": [
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(\n",
    "    X_processed, y,\n",
    "    test_size=0.25,\n",
    "    random_state=SEED,\n",
    "    stratify=y\n",
    ")\n",
    "\n",
    "print(\"Train:\", X_train.shape, y_train.shape)\n",
    "print(\"Test:\", X_test.shape, y_test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd33b281",
   "metadata": {},
   "source": [
    "## 6. Attention-нейросеть для оценки важности признаков"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "a32ef342",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n",
      "I0000 00:00:1773497118.327439   94511 gpu_device.cc:2020] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 7372 MB memory:  -> device: 0, name: NVIDIA GeForce RTX 3080, pci bus id: 0000:06:00.0, compute capability: 8.6\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1mModel: \"attention_classifier\"\u001b[0m\n",
      "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
      "┃\u001b[1m \u001b[0m\u001b[1mLayer (type)                 \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape             \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m        Param #\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mConnected to              \u001b[0m\u001b[1m \u001b[0m┃\n",
      "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
      "│ features (\u001b[38;5;33mInputLayer\u001b[0m)         │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m13\u001b[0m)                │               \u001b[38;5;34m0\u001b[0m │ -                          │\n",
      "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
      "│ attention_hidden (\u001b[38;5;33mDense\u001b[0m)      │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m13\u001b[0m)                │             \u001b[38;5;34m182\u001b[0m │ features[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]             │\n",
      "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
      "│ attention_weights (\u001b[38;5;33mDense\u001b[0m)     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m13\u001b[0m)                │             \u001b[38;5;34m182\u001b[0m │ attention_hidden[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]     │\n",
      "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
      "│ weighted_features (\u001b[38;5;33mMultiply\u001b[0m)  │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m13\u001b[0m)                │               \u001b[38;5;34m0\u001b[0m │ features[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m],            │\n",
      "│                               │                           │                 │ attention_weights[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]    │\n",
      "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
      "│ dense_1 (\u001b[38;5;33mDense\u001b[0m)               │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m)                │             \u001b[38;5;34m896\u001b[0m │ weighted_features[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]    │\n",
      "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
      "│ dropout (\u001b[38;5;33mDropout\u001b[0m)             │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m)                │               \u001b[38;5;34m0\u001b[0m │ dense_1[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]              │\n",
      "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
      "│ dense_2 (\u001b[38;5;33mDense\u001b[0m)               │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m)                │           \u001b[38;5;34m2,080\u001b[0m │ dropout[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]              │\n",
      "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
      "│ dropout_1 (\u001b[38;5;33mDropout\u001b[0m)           │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m)                │               \u001b[38;5;34m0\u001b[0m │ dense_2[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]              │\n",
      "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
      "│ target (\u001b[38;5;33mDense\u001b[0m)                │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m)                 │              \u001b[38;5;34m33\u001b[0m │ dropout_1[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]            │\n",
      "└───────────────────────────────┴───────────────────────────┴─────────────────┴────────────────────────────┘\n",
      "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m3,373\u001b[0m (13.18 KB)\n",
      "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m3,373\u001b[0m (13.18 KB)\n",
      "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
     ]
    }
   ],
   "source": [
    "\n",
    "def build_attention_classifier(input_dim: int, n_classes: int, hidden_units=(64, 32), dropout_rate=0.15):\n",
    "    inputs = keras.Input(shape=(input_dim,), name=\"features\")\n",
    "\n",
    "    # Механизм внимания по признакам\n",
    "    attention_logits = layers.Dense(input_dim, activation=\"tanh\", name=\"attention_hidden\")(inputs)\n",
    "    attention_weights = layers.Dense(input_dim, activation=\"sigmoid\", name=\"attention_weights\")(attention_logits)\n",
    "    weighted_features = layers.Multiply(name=\"weighted_features\")([inputs, attention_weights])\n",
    "\n",
    "    x = weighted_features\n",
    "    for i, units in enumerate(hidden_units, start=1):\n",
    "        x = layers.Dense(units, activation=\"relu\", name=f\"dense_{i}\")(x)\n",
    "        x = layers.Dropout(dropout_rate, seed=SEED)(x)\n",
    "\n",
    "    if n_classes == 2:\n",
    "        outputs = layers.Dense(1, activation=\"sigmoid\", name=\"target\")(x)\n",
    "        loss = \"binary_crossentropy\"\n",
    "        metrics = [\"accuracy\", keras.metrics.AUC(name=\"auc\")]\n",
    "    else:\n",
    "        outputs = layers.Dense(n_classes, activation=\"softmax\", name=\"target\")(x)\n",
    "        loss = \"sparse_categorical_crossentropy\"\n",
    "        metrics = [\"accuracy\"]\n",
    "\n",
    "    model = keras.Model(inputs=inputs, outputs=outputs, name=\"attention_classifier\")\n",
    "    model.compile(\n",
    "        optimizer=keras.optimizers.Adam(learning_rate=1e-3),\n",
    "        loss=loss,\n",
    "        metrics=metrics\n",
    "    )\n",
    "    return model\n",
    "\n",
    "attention_model = build_attention_classifier(X_train.shape[1], n_classes)\n",
    "attention_model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "84317648",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2026-03-14 17:05:19.820227: I external/local_xla/xla/service/service.cc:163] XLA service 0x7f730c00a820 initialized for platform CUDA (this does not guarantee that XLA will be used). Devices:\n",
      "2026-03-14 17:05:19.820240: I external/local_xla/xla/service/service.cc:171]   StreamExecutor device (0): NVIDIA GeForce RTX 3080, Compute Capability 8.6\n",
      "2026-03-14 17:05:19.844330: I tensorflow/compiler/mlir/tensorflow/utils/dump_mlir_util.cc:269] disabling MLIR crash reproducer, set env var `MLIR_CRASH_REPRODUCER_DIRECTORY` to enable.\n",
      "2026-03-14 17:05:20.001566: I external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:473] Loaded cuDNN version 91002\n",
      "I0000 00:00:1773497121.392577   94640 device_compiler.h:196] Compiled cluster using XLA!  This line is logged at most once for the lifetime of the process.\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>accuracy</th>\n",
       "      <th>auc</th>\n",
       "      <th>loss</th>\n",
       "      <th>val_accuracy</th>\n",
       "      <th>val_auc</th>\n",
       "      <th>val_loss</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>283</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.000250</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.000753</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>284</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.000117</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.000749</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>285</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.000115</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.000748</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>286</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.000152</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.000745</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>287</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.000089</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.000742</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     accuracy  auc      loss  val_accuracy  val_auc  val_loss\n",
       "283       1.0  1.0  0.000250           1.0      1.0  0.000753\n",
       "284       1.0  1.0  0.000117           1.0      1.0  0.000749\n",
       "285       1.0  1.0  0.000115           1.0      1.0  0.000748\n",
       "286       1.0  1.0  0.000152           1.0      1.0  0.000745\n",
       "287       1.0  1.0  0.000089           1.0      1.0  0.000742"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAr0AAAGJCAYAAACHJ4v+AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAaN1JREFUeJzt3Xl8FPX9x/HX7G6yuQ/IBSEQQO4jIAgN1hvEsyjVUi8OK7Yqrb9GrUYriFrj0VJUqFRUQMWjWPCkeCB4IiiIitz3mZBw5D535vdHyMqacCc7m+T9fDxWMt/5zsxn5pONn3zznVnDsiwLEREREZEmzGF3ACIiIiIiDU1Fr4iIiIg0eSp6RURERKTJU9ErIiIiIk2eil4RERERafJU9IqIiIhIk6eiV0RERESaPBW9IiIiItLkqegVERERkSZPRa+IiIiINHkqekWaqTfeeAPDMOp89ezZ0+7wmry8vDwMw+CBBx6wOxQRkWbBZXcAImKve++9l27dunmX//a3v9kYjYiISMNQ0SvSzA0ZMoRzzz3Xu/zcc8+Rl5dnX0AiIiINQNMbRJqpiooKAByOY/8YmDlzJoZhsHXrVm+baZr07t0bwzCYOXOmt3306NFERETU2kfNdIrFixd72z777DOuvvpq2rZti9vtJiUlhT//+c+Ulpb6bDt69GgMw6BPnz619puVlYVhGLWOWdfUgSeeeALDMHyK/MWLF9eKa/fu3aSmptK/f3+KioqA6us1fvx4+vXrR3R0NOHh4Zx11lksWrSo7ov2MyUlJYwZM4bw8HC6d+/O8uXLAaisrGTMmDGEhYWRlpbGN998491mwoQJBAUFkZubW2t/N998MzExMZSVlQGQmprKZZddVqvfuHHjMAzjqNemqqqKSy65hBYtWrB69WqffuPGjau1z8suu4zU1FSfttGjR9dq27FjB6GhobW+d1JTUxk9erRP3zlz5mAYRq191CU1NfWIU3N+fq5VVVU89NBDdOzYEbfbTWpqKvfeey/l5eXHvb/DYzJNk8mTJ9OjRw9CQkJITEzk97//PQcOHKgV42WXXcYHH3xAnz59CAkJoXv37sydO9enX8176/C8i0jD0EivSDNVU/S63e6T2v6ll17ihx9+OKUY5syZQ0lJCbfccgstW7Zk2bJlPP300+zcuZM5c+b49HW5XPz44498++239O3b19s+c+ZMQkJCjnmsgwcPkpWVdcx++fn5XHzxxQQFBTF//nxvMV1QUMBzzz3HNddcw9ixYyksLOT5559n6NChLFu2rM6C/HB//vOfmTVrFuPGjaNNmzbceuutADz77LOcf/75PPzwwzz55JNcfPHFbN68mcjISG644QYefPBBXn/9dZ/is6KigjfeeINf//rXx3Xux3LTTTexePFiPvzwQ7p3737K+6sxfvx4b1F+NFVVVdx3330ntO8+ffpwxx13+LS9+OKLfPjhhz5tN910E7NmzeKqq67ijjvuYOnSpWRlZbFmzRrmzZsHwOTJk72/3KxZs4ZHHnnEZ9rP4b9Q/f73v2fmzJmMGTOGP/3pT2zZsoUpU6bw7bff8sUXXxAUFOTtu2HDBkaMGMEf/vAHRo0axYwZM7j66qtZsGABQ4YMOaHzFZF6YIlIszR58mQLsL777juf9nPOOcfq0aOHT9uMGTMswNqyZYtlWZZVVlZmtW3b1rr44ostwJoxY4a376hRo6zw8PBax5szZ44FWIsWLfK2lZSU1OqXlZVlGYZhbdu2rdY+L7/8cmvcuHHe9s8++8wKDQ21rrjiilrHBKwJEyZ4l//yl79YCQkJVr9+/axzzjnH275o0SJvXGVlZda5555rJSQkWBs3bvTZX1VVlVVeXu7TduDAASsxMdG68cYba53H4bKzs63g4GArMzPT2/buu+9agHXJJZdYpmlalmVZa9assQzDsP75z396+6Wnp1sDBw702d/cuXNrXct27dpZl156aa1j33bbbdbPf9Qffm0yMzMtp9Npvfnmm7W2BazbbrutVvull15qtWvXzqdt1KhRPm2rVq2yHA6H93uk5nunJtZRo0Z5l//1r39ZbrfbOu+882rtty7He64rV660AOumm27y6XfnnXdagPXxxx/X2sfh3w8/99lnn1mANXv2bJ/2BQsW1Gpv166dBVj//e9/vW35+flWq1atrL59+3rbat5bX3/99THPW0ROjaY3iDRT+/btAyA+Pv6Et506dSr79u1jwoQJR+yTl5fn8yosLKzVJzQ01Pt1cXExeXl5DBo0CMuy+Pbbb2v1v/HGG3nllVe8f5qeMWMGw4cPJzo6+qjx7tq1i6effpr777+/zqkXUP1n65EjR/LVV18xf/58Onbs6LPe6XQSHBzs7bt//36qqqro378/K1as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rFlcccUVnHfeeSe0v3POOYff//73ZGVlsXLlSi688EKCgoLYsGEDc+bM4cknn+Sqq67y9u/cuTO/+93v+Prrr0lMTOSFF14gJyeHGTNm1Nr3kiVLyMvL805vWLhwIXfeeecpXwMR+YmKXpFmJDc3l8zMTO/y0W7suuGGG1i0aJFP0dunT596K7iCgoJ45513+NOf/kRWVhYhISFceeWVjBs3jrS0tKNuGx4eTnh4+DGPYRgGjz766AnHFhISwvTp0znvvPOYMmUKf/rTnxg9ejTZ2dn8+9//5v3336d79+68/PLLzJkzx+eDLY5k+vTpuFwupk+fTtu2bZk6dSpDhw7lpptuYvfu3dx333107NiRV199tc5RwJEjRzJlyhQuuOCCY06ROBmTJ0/m/fff57bbbvP5AIV33nmn1vzsGhdffDFbtmzx+VP9LbfcclwfMAHwyCOPNPho5nPPPUeHDh2YOXMm8+bNIykpiczMzOOallKXadOm0a9fP/79739z77334nK5SE1N5frrr+fMM8/06dupUyeefvpp7rrrLtatW0f79u15/fXXGTp0aK39/ulPfwIgODiYtm3bMn78+BN+drGIHJ1hHf63OhFp0rZu3Ur79u1ZtGiRz6eSnWw/OXl5eXnEx8czYcKEWp8cV5fvvvuOPn368OKLL3LDDTc0fIDHUPM98vOiV6qlpqbSs2dP3n33XbtDEZFDNKdXRKQRmD59OhERET7P+hURkeOn6Q0izUhERATXXXfdEZ+ve6L9pOG98847rF69mmeffZZx48Yd17QOfwgNDWXo0KENdhOaiEh9U9Er0ozExcXVunHtVPpJw/vjH/9ITk4Ol1xyCRMnTrQ7HK/ExEQ9UktEGhXN6RURERGRJk9zekVERESkyVPRKyIiIiJNXrOb02uaJrt37yYyMrLePo9dREREROqPZVkUFhbSunVrHI76GaNtdkXv7t27SUlJsTsMERERETmGHTt20KZNm3rZV7MreiMjI4HqixgVFdXgxzNNk9zcXOLj4+vtNxU5OcpFYFAeAoPyEBiUh8CgPASOmly43W7atWvnrdvqQ7MremumNERFRfmt6C0rKyMqKkpvJJspF4FBeQgMykNgUB4Cg/IQOGpyERISAlCvU1GVWRERERFp8lT0ioiIiEiTp6JXRERERJq8ZjenV0RERBo3y7KoqqrC4/HUy/5M06SyspKysjLN6fWjoKAgnE6n346noldEREQajYqKCvbs2UNJSUm97dOyLEzTpLCwUM/w9yPDMGjTpg0RERF+OZ6KXhEREWkUTNNky5YtOJ1OWrduTXBwcL0UqTUjxy6XS0Wvn1iWRW5uLjt37qRTp05+GfFV0SsiIiKNQkVFBaZpkpKSQlhYWL3tV0WvPeLj49m6dSuVlZV+KXo1cUVEREQaFc27bRr8/QuGvmtEREREpMlT0dvANucV8+G6/WzIKbQ7FBEREZFmS0VvA5vy8Ubu/98WPliz1+5QREREpAlITU1l8uTJ9bKvxYsXYxgGBw8erJf9BTLdyNbAOiZUP4Zj094imyMRERERu5x77rn06dOnXorVr7/+mvDw8FMPqplR0dvATouv/qbcmKuiV0REROpmWRYejweX69ilWXx8vB8iano0vaGBdYyvHundnFuMZVk2RyMiItK0WJZFSUWVLa/j/f/66NGj+eSTT3jyyScxDAPDMJg5cyaGYfC///2Pfv364Xa7+fzzz9m0aRPDhg0jMTGRiIgIzjjjDD766COf/f18eoNhGDz33HNceeWVhIWF0alTJ95+++2Tvqb//e9/6dGjB263m9TUVP7xj3/4rP/Xv/5Fp06dCAkJITExkauuusq77o033qBXr16EhobSsmVLBg8eTHFx8UnHUp800tvA2rUMw+mAkgoPe/LLaB0TandIIiIiTUZppYfu49+35dirHxxKWPCxS6knn3yS9evX07NnTx588EEAfvzxRwDuuece/v73v9OhQwdiY2PZsWMHl1xyCX/7299wu928+OKLXH755axbt462bdse8RgTJ07k8ccf54knnuDpp5/muuuuY9u2bbRo0eKEzmn58uX85je/4YEHHmDEiBF8+eWX3HrrrbRs2ZLRo0fzzTff8Kc//YmXXnqJQYMGsX//fj777DMA9uzZwzXXXMPjjz/OlVdeSWFhIZ999lnADPqp6G1gQU4HbaJD2HagjI17i1T0ioiINDPR0dEEBwcTFhZGUlISAGvXrgXgwQcfZMiQId6+LVq0IC0tzbv80EMPMW/ePN5++23GjRt3xGOMHj2aa665BoBHHnmEp556imXLlnHRRRedUKyTJk3iggsu4P777wegc+fOrF69mieeeILRo0ezfft2wsPDueyyy4iMjKRdu3b07dsX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ZfLkycfV1zAM3nzzzQaNpzFS0esnVmJPALo7tulmNhERERE/U9HrL0m9AOhubNNjy0RERET8TEWvvxwa6T3N2ElefqHNwYiIiDQRlgUVxfa8jvOm+meffZbWrVtjmqZP+7Bhw7jxxhvZtGkTw4YNIzExkYiICM444ww++uijertEP/zwA+effz6hoaG0bNmSm2++maKiIu/6xYsXM2DAAMLDw4mJieHMM89k27ZtAHz33Xecd955REZGEhUVRb9+/fjmm2/qLTZ/CoinNzQL0SlUBkURXFlA0P71wC/sjkhERKTxqyyBR1qf0i4M4KQ+gPje3RAcfsxuV199NX/84x9ZtGgRF1xwAQD79+9nwYIFzJ8/n6KiIi655BL+9re/4Xa7efHFF7n88stZt24dbdu2PZnIvIqLixk6dCjp6el8/fXX7N27l5tuuolx48Yxc+ZMqqqquOKKKxg7diyvvvoqFRUVLFu2zPvJdNdddx19+/blmWeewel0snLlykb7cc0qev3FMChr2Z2g7K9oWbjO7mhERETET2JjY7n44ot55ZVXvEXvG2+8QVxcHOeddx4Oh4O0tDRv/4ceeoh58+bx9ttvH/GRrsfrlVdeoaysjBdffJHw8OoCfcqUKVx++eU89thjBAUFkZ+fz2WXXUbHjh0B6Natm3f77du3c9ddd9G1a1cAOnXqdErx2ElFrx8ZrXpD9lckl2/ENC0cjqb1+d4iIiJ+FxRWPeJ6CizLoqqqCpfL5R3hPO5jH6frrruOsWPH8q9//Qu3283s2bP57W9/i8PhoKioiAceeID33nuPPXv2UFVVRWlpKdu3bz+Js/G1Zs0a0tLSvAUvwJlnnolpmqxbt46zzz6b0aNHM3ToUIYMGcLgwYP5zW9+Q6tWrYDqT8696aabeOmllxg8eDBXX321tzhubDSn149CU/oC0M3YRl6xntUrIiJyygyjeoqBHa8TKJAvv/xyLMvivffeY8eOHXz22Wdcd911ANx5553MmzePRx55hM8++4yVK1fSq1cvKioqGuqq+ZgxYwZLlixh0KBBvP7663Tu3JmvvvoKgAceeIAff/yRSy+9lI8//pju3bszb948v8RV31T0+pGzdW+g+gkOOQf1BAcREZHmIiQkhOHDhzN79mxeffVVunTpwumnnw7AF198wejRo7nyyivp1asXSUlJbN26tV6O261bN7777juKi4u9bV988QUOh4MuXbp42/r27UtmZiZffvklPXv25JVXXvGu69y5M3/+85/54IMPGD58ODNmzKiX2PxNRa8/xXWmEhdRRgkH92y0OxoRERHxo+uuu4733nuPF154wTvKC9XzZOfOncvKlSv57rvvuPbaa2s96eFUjhkSEsKoUaNYtWoVixYt4o9//CM33HADiYmJbNmyhczMTJYsWcK2bdv44IMP2LBhA926daO0tJRx48axePFitm3bxhdffMHXX3/tM+e3MdGcXn9yBbMnOJW2FRsp3/EtDOhvd0QiIiLiJ+effz4tWrRg3bp1XHvttd72SZMmceONNzJo0CDi4uK4++67KSgoqJdjhoWF8f7773P77bdzxhlnEBYWxq9//WsmTZrkXb927VpmzZrFvn37aNWqFbfddhu///3vqaqqYt++fYwcOZKcnBzi4uIYPnw4EydOrJfY/E1Fr5+VtuwBezZSsOUbYKzd4YiIiIifOBwOdu+ufdNdamoqH3/8sU/bbbfd5rN8ItMdrJ89P7hXr1619l8jMTHxiHN0g4ODefXVV4/7uIFO0xv8LKHbmQDEF/xIjj6OWERERMQvVPT6WexpAwHobWxi/ven9ogVERERaV5mz55NREREna8ePXrYHV5A0/QGf0vsQZUjmGizhOXfLmfMLzvYHZGIiIg0Er/61a8YOHBgnesa6yel+YuKXn9zBmEm9oY93+Dcs4LdBy+jdUyo3VGJiIhIIxAZGUlkZKTdYTRKmt5gg+C2ZwDQx7GJj9futTkaERGRxuXnN2pJ4+TvPKrotUNyPwDSHJv4cXf9PJJERESkqav5831JSYnNkUh9qPnEOafT6ZfjaXqDHZKrP4Glh7GNR3bvszkYERGRxsHpdBITE8PevdV/JQ0LC8M4gY8CPhLLsqiqqsLlctXL/uTYTNMkNzeXsLAwXC7/lKMqeu3QogMedzTu8nzMnNV4zHNwOvQmExEROZakpCQAb+FbHyzLwjRNHA6Hil4/cjgctG3b1m/XXEWvHQwDR3I/2Pwx3c31bMkr5rSECLujEhERCXiGYdCqVSsSEhKorKysl32apsm+ffto2bIlDodmfvpLcHCwX6+3il6bGCkDYPPHnO7YwJo9BSp6RUREToDT6ay3uaCmaRIUFERISIiK3iZMmbVLygAA+hnrWb1H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cN1117F9+3YAli9fTmVlpU9OunbtStu2bZWTBrRlyxays7N9rnt0dDQDBw70XvclS5YQExND//79vX0GDx6Mw+Fg6dKlfo+5KVu8eDEJCQl06dKFW265hX379nnXKQ8NIz8/H4AWLVoAx/ezaMmSJfTq1YvExERvn6FDh1JQUOAdHZMT8/M81Jg9ezZxcXH07NmTzMxMSkpKvOuUh/rn8Xh47bXXKC4uJj093a/vB1f9nYYcLi8vD4/H45MggMTERNauXWtTVE3fwIEDmTlzJl26dGHPnj1MnDiRs846i1WrVpGdnU1wcDAxMTE+2yQmJpKdnW1PwM1AzbWt671Qsy47O5uEhASf9S6XixYtWig39eiiiy5i+PDhtG/fnk2bNnHvvfdy8cUXs2TJEpxOp/LQAEzT5P/+7/8488wz6dmzJ8Bx/SzKzs6u8z1Ts05OTF15ALj22mtp164drVu35vvvv+fuu+9m3bp1zJ07F1Ae6tMPP/xAeno6ZWVlREREMG/ePLp3787KlSv99n5Q0StNysUXX+z9unfv3gwcOJB27drxn//8h9DQUBsjE7Hfb3/7W+/XvXr1onfv3nTs2JHFixdzwQUX2BhZ03XbbbexatUqn3sLxP+OlIfD56v36tWLVq1accEFF7Bp0yY6duzo7zCbtC5durBy5Ury8/N54403GDVqFJ988olfY9D0hgYSFxeH0+msdfdhTk4OSUlJNkXV/MTExNC5c2c2btxIUlISFRUVHDx40KePctKwaq7t0d4LSUlJtW7wrKqqYv/+/cpNA+rQoQNxcXFs3LgRUB7q27hx43j33XdZtGgRbdq08bYfz8+ipKSkOt8zNevk+B0pD3UZOHAggM97QnmoH8HBwZx22mn069ePrKws0tLSePLJJ/36flDR20CCg4Pp168fCxcu9LaZpsnChQtJT0+3MbLmpaioiE2bNtGqVSv69etHUFCQT07WrVvH9u3blZMG1L59e5KSknyue0FBAUuXLvVe9/T0dA4ePMjy5cu9fT7++GNM0/T+T0jq386dO9m3bx+tWrUClIf6YlkW48aNY968eXz88ce0b9/eZ/3x/CxKT0/nhx9+8Pkl5MMPPyQqKoru3bv750QauWPloS4rV64E8HlPKA8NwzRNysvL/ft+qK+78KS21157zXK73dbMmTOt1atXWzfffLMVExPjc/eh1K877rjDWrx4sbVlyxbriy++sAYPHmzFxcVZe/futSzLsv7whz9Ybdu2tT7++GPrm2++sdLT06309HSbo278CgsLrW+//db69ttvLcCaNGmS9e2331rbtm2zLMuyHn30USsmJsZ66623rO+//94aNmyY1b59e6u0tNS7j4suusjq27evtXTpUuvzzz+3OnXqZF1zzTV2nVKjdLQ8FBYWWnfeeae1ZMkSa8uWLdZHH31knX766VanTp2ssrIy7z6Uh1N3yy23WNHR0dbixYutPXv2eF8lJSXePsf6WVRVVWX17NnTuvDCC62VK1daCxYssOLj463MzEw7TqlROlYeNm7caD344IPWN998Y23ZssV66623rA4dOlhnn322dx/KQ/245557rE8++cTasmWL9f3331v33HOPZRiG9cEHH1iW5b/3g4reBvb0009bbdu2tYKDg60BAwZYX331ld0hNWkjRoywWrVqZQUHB1vJycnWiBEjrI0bN3rXl5aWWrfeeqsVGxtrhYWFWVdeeaW1Z88eGyNuGhYtWmQBtV6jRo2yLKv6sWX333+/lZiYaLndbuuCCy6w1q1b57OPffv2Wddcc40VERFhRUVFWWPGjLEKCwttOJvG62h5KCkpsS688EIrPj7eCgoKstq1a2eNHTu21i/hysOpqysHgDVjxgxvn+P5WbR161br4osvtkJDQ624uDjrjjvusCorK/18No3XsfKwfft26+yzz7ZatGhhud1u67TTTrPuuusuKz8/32c/ysOpu/HGG6127dpZwcHBVnx8vHXBBRd4C17L8t/7wbAsyzrhMWkRERERkUZEc3pFREREpMlT0SsiIiIiTZ6KXhERERFp8lT0ioiIiEiTp6JXRERERJo8Fb0iIiIi0uSp6BURERGRJk9Fr4iIiIg0eSp6RURERKTJU9ErIuJnlZWVzJw5k1/+8pfEx8cTGhpK7969eeyxx6ioqLA7PBGRJkkfQywi4mcrV67kjjvu4NZbb6Vv376UlZXxww8/8MADD9CqVSvef/99goKC7A5TRKRJ0UiviIif9ezZk4ULF/LrX/+aDh060L17d0aMGMGnn37KqlWrmDx5MgCGYdT5+r//+z/vvg4cOMDIkSOJjY0lLCyMiy++mA0bNnjX33jjjfTu3Zvy8nIAKioq6Nu3LyNHjvT2ufvuu+ncuTNhYWF06NCB+++/n8rKSr9cCxERf1HRKyLiZy6Xq872+Ph4hg8fzuzZs71tM2bMYM+ePd5Xenq6zzajR4/mm2++4e2332bJkiVYlsUll1ziLVqfeuopiouLueeeewC47777OHjwIFOmTPHuIzIykpkzZ7J69WqefPJJpk+fzj//+c/6Pm0REVvV/ZNXREQaXI8ePdi2bZtPW2VlJU6n07scExNDUlKSdzk4ONj79YYNG3j77bf54osvGDRoEACzZ88mJSWFN998k6uvvpqIiAhefvllzjnnHCIjI5k8eTKLFi0iKirKu5+//vWv3q9TU1O58847ee211/jLX/5S7+csImIXFb0iIjaZP39+rWkEjz/+OC+//PJxbb9mzRpcLhcDBw70trVs2ZIuXbqwZs0ab1t6ejp33nknDz30EHfffTe//OUvffbz+uuv89RTT7Fp0yaKioqoqqryKYpFRJoCFb0iIjZp165drbZNmzbRuXPnej2OaZp88cUXOJ1ONm7c6LNuyZIlXHfddUycOJGhQ4cSHR3Na6+9xj/+8Y96jUFExG6a0ysi4mf79++nsLCwVvs333zDokWLuPbaa49rP926daOqqoqlS5d62/bt28e6devo3r27t+2JJ55g7dq1fPLJJyxYsIAZM2Z413355Ze0a9eO++67j/79+9OpU6daUy5ERJoCFb0iIn62fft2+vTpw/PPP8/GjRvZvHkzL730EsOGDeOss87yeTrD0XTq1Ilhw4YxduxYPv/8c7777juuv/56kpOTGTZsGADffvst48eP57nnnuPMM89k0qRJ3H777WzevNm7j+3bt/Paa6+xadMmnnrqKebNm9dQpy4iYhsVvSIiftazZ08mTJjAzJkz+cUvfkGPHj14/PHHGTduHB988IHPzWrHMmPGDPr168dll11Geno6lmUxf/58goKCKCsr4/rrr2f06NFcfvnlANx8882cd9553HDDDXg8Hn71q1/x5z//mXHjxtGnTx++/PJL7r///oY6dRER2+jDKURERESkydNIr4iIiIg0eSp6RURERKTJU9ErIiIiIk2eil4RERERafJU9IqIiIhIk6eiV0RERESaPBW9IiIiItLkqegVERERkSZPRa+IiIiINHkqekVERESkyVPRKyIiIiJN3v8DpzYGA+1iMn0AAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "callbacks = [\n",
    "    keras.callbacks.EarlyStopping(\n",
    "        monitor=\"val_loss\",\n",
    "        patience=20,\n",
    "        restore_best_weights=True,\n",
    "        min_delta=1e-4\n",
    "    )\n",
    "]\n",
    "\n",
    "history = attention_model.fit(\n",
    "    X_train, y_train,\n",
    "    validation_split=0.2,\n",
    "    epochs=300,\n",
    "    batch_size=16,\n",
    "    verbose=0,\n",
    "    callbacks=callbacks\n",
    ")\n",
    "\n",
    "history_df = pd.DataFrame(history.history)\n",
    "display(history_df.tail())\n",
    "\n",
    "plt.figure(figsize=(8, 4))\n",
    "plt.plot(history_df[\"loss\"], label=\"train_loss\")\n",
    "plt.plot(history_df[\"val_loss\"], label=\"val_loss\")\n",
    "plt.title(\"Динамика функции потерь\")\n",
    "plt.xlabel(\"Эпоха\")\n",
    "plt.ylabel(\"Loss\")\n",
    "plt.legend()\n",
    "plt.grid(True, alpha=0.3)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2ca9e154",
   "metadata": {},
   "source": [
    "## 7. Оценка качества attention-модели"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "5731b31b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Метрики attention-модели:\n",
      "train_accuracy: 1.0000\n",
      "test_accuracy: 1.0000\n",
      "test_balanced_accuracy: 1.0000\n",
      "test_f1_macro: 1.0000\n",
      "test_roc_auc: 1.0000\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>0</th>\n",
       "      <th>1</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>12</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    0   1\n",
       "0  12   0\n",
       "1   0  14"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Классификационный отчёт:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "         Vic       1.00      1.00      1.00        12\n",
      "       other       1.00      1.00      1.00        14\n",
      "\n",
      "    accuracy                           1.00        26\n",
      "   macro avg       1.00      1.00      1.00        26\n",
      "weighted avg       1.00      1.00      1.00        26\n",
      "\n"
     ]
    }
   ],
   "source": [
    "\n",
    "def evaluate_classifier(model, X_train, y_train, X_test, y_test, n_classes):\n",
    "    if n_classes == 2:\n",
    "        train_proba = model.predict(X_train, verbose=0).ravel()\n",
    "        test_proba = model.predict(X_test, verbose=0).ravel()\n",
    "        train_pred = (train_proba >= 0.5).astype(int)\n",
    "        test_pred = (test_proba >= 0.5).astype(int)\n",
    "    else:\n",
    "        train_proba = model.predict(X_train, verbose=0)\n",
    "        test_proba = model.predict(X_test, verbose=0)\n",
    "        train_pred = np.argmax(train_proba, axis=1)\n",
    "        test_pred = np.argmax(test_proba, axis=1)\n",
    "\n",
    "    metrics = {\n",
    "        \"train_accuracy\": accuracy_score(y_train, train_pred),\n",
    "        \"test_accuracy\": accuracy_score(y_test, test_pred),\n",
    "        \"test_balanced_accuracy\": balanced_accuracy_score(y_test, test_pred),\n",
    "        \"test_f1_macro\": f1_score(y_test, test_pred, average=\"macro\")\n",
    "    }\n",
    "\n",
    "    if n_classes == 2:\n",
    "        metrics[\"test_roc_auc\"] = roc_auc_score(y_test, test_proba)\n",
    "\n",
    "    return metrics, test_pred\n",
    "\n",
    "attention_metrics, attention_test_pred = evaluate_classifier(\n",
    "    attention_model, X_train, y_train, X_test, y_test, n_classes\n",
    ")\n",
    "\n",
    "print(\"Метрики attention-модели:\")\n",
    "for k, v in attention_metrics.items():\n",
    "    print(f\"{k}: {v:.4f}\")\n",
    "\n",
    "print(\"\\nМатрица ошибок:\")\n",
    "display(pd.DataFrame(confusion_matrix(y_test, attention_test_pred)))\n",
    "\n",
    "print(\"\\nКлассификационный отчёт:\")\n",
    "print(classification_report(y_test, attention_test_pred, target_names=class_names))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "98f6bfe7",
   "metadata": {},
   "source": [
    "## 8. Извлечение и анализ важности признаков\n",
    "\n",
    "Важность оценивается по средним attention-весам на обучающей выборке.  \n",
    "Для интерпретации агрегируем one-hot признаки обратно к исходным переменным."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "6fa2272f",
   "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>processed_feature</th>\n",
       "      <th>attention_mean</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>site</td>\n",
       "      <td>0.749013</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>footlgth</td>\n",
       "      <td>0.692803</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>sex_f</td>\n",
       "      <td>0.652326</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>hdlngth</td>\n",
       "      <td>0.637448</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>sex_m</td>\n",
       "      <td>0.632902</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>earconch</td>\n",
       "      <td>0.612622</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>taill</td>\n",
       "      <td>0.585922</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>eye</td>\n",
       "      <td>0.537682</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>totlngth</td>\n",
       "      <td>0.527027</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>skullw</td>\n",
       "      <td>0.495276</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>chest</td>\n",
       "      <td>0.448208</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>age</td>\n",
       "      <td>0.440791</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>belly</td>\n",
       "      <td>0.398511</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   processed_feature  attention_mean\n",
       "0               site        0.749013\n",
       "1           footlgth        0.692803\n",
       "2              sex_f        0.652326\n",
       "3            hdlngth        0.637448\n",
       "4              sex_m        0.632902\n",
       "5           earconch        0.612622\n",
       "6              taill        0.585922\n",
       "7                eye        0.537682\n",
       "8           totlngth        0.527027\n",
       "9             skullw        0.495276\n",
       "10             chest        0.448208\n",
       "11               age        0.440791\n",
       "12             belly        0.398511"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>original_feature</th>\n",
       "      <th>attention_mean</th>\n",
       "      <th>importance_share</th>\n",
       "      <th>cumulative_share</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>site</td>\n",
       "      <td>0.749013</td>\n",
       "      <td>0.110671</td>\n",
       "      <td>0.110671</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>footlgth</td>\n",
       "      <td>0.692803</td>\n",
       "      <td>0.102366</td>\n",
       "      <td>0.213037</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>sex</td>\n",
       "      <td>0.642614</td>\n",
       "      <td>0.094950</td>\n",
       "      <td>0.307987</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>hdlngth</td>\n",
       "      <td>0.637448</td>\n",
       "      <td>0.094187</td>\n",
       "      <td>0.402174</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>earconch</td>\n",
       "      <td>0.612622</td>\n",
       "      <td>0.090518</td>\n",
       "      <td>0.492692</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>taill</td>\n",
       "      <td>0.585922</td>\n",
       "      <td>0.086573</td>\n",
       "      <td>0.579266</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>eye</td>\n",
       "      <td>0.537682</td>\n",
       "      <td>0.079446</td>\n",
       "      <td>0.658711</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>totlngth</td>\n",
       "      <td>0.527027</td>\n",
       "      <td>0.077871</td>\n",
       "      <td>0.736583</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>skullw</td>\n",
       "      <td>0.495276</td>\n",
       "      <td>0.073180</td>\n",
       "      <td>0.809763</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>chest</td>\n",
       "      <td>0.448208</td>\n",
       "      <td>0.066225</td>\n",
       "      <td>0.875988</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>age</td>\n",
       "      <td>0.440791</td>\n",
       "      <td>0.065129</td>\n",
       "      <td>0.941118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>belly</td>\n",
       "      <td>0.398511</td>\n",
       "      <td>0.058882</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   original_feature  attention_mean  importance_share  cumulative_share\n",
       "0              site        0.749013          0.110671          0.110671\n",
       "1          footlgth        0.692803          0.102366          0.213037\n",
       "2               sex        0.642614          0.094950          0.307987\n",
       "3           hdlngth        0.637448          0.094187          0.402174\n",
       "4          earconch        0.612622          0.090518          0.492692\n",
       "5             taill        0.585922          0.086573          0.579266\n",
       "6               eye        0.537682          0.079446          0.658711\n",
       "7          totlngth        0.527027          0.077871          0.736583\n",
       "8            skullw        0.495276          0.073180          0.809763\n",
       "9             chest        0.448208          0.066225          0.875988\n",
       "10              age        0.440791          0.065129          0.941118\n",
       "11            belly        0.398511          0.058882          1.000000"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAHqCAYAAAAZLi26AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAh9RJREFUeJzs3XmcjfX7x/H3mcGMfd+3IftedrKVKFtaCRFFlFKDIrKESJI1lK1UtiTKEg0qUiope9llGTOWMZYZzLl+f/jN+TpmjmZw5piZ1/PxmAfnc9/3Ode5zn3uc1/3/bk/t8PMTAAAAAAA4Lbz83UAAAAAAACkVBTdAAAAAAB4CUU3AAAAAABeQtENAAAAAICXUHQDAAAAAOAlFN0AAAAAAHgJRTcAAAAAAF5C0Q0AAAAAgJdQdAMAAAAA4CUU3QCAZO/AgQNyOByaPXu2r0MBAABwQ9ENIEXYu3evnn/+eRUvXlyBgYHKkiWL6tatq/Hjx+vixYu+Di/Z++mnnzRkyBCdOXMmzrS3335bX331VZLE8fnnn2vcuHFJ8loAAAC3g8PMzNdBAMCtWLZsmZ544gkFBASoY8eOqlChgi5duqT169dr0aJFeuaZZ/Thhx/6OsxkbcyYMerbt6/279+voKAgt2mZMmXS448/niRnmVu0aKFt27bpwIEDbu1mpujoaKVNm1b+/v5ejwMAACCh0vg6AAC4Ffv371fbtm1VtGhRrVmzRvnz53dNe/HFF7Vnzx4tW7bMhxEiKTgcDgUGBvo6DAAAgDjoXg4gWRs9erTOnTunGTNmuBXcsUqUKKFevXq5HjscDvXs2VOfffaZSpcurcDAQFWtWlU//PBDnGWPHDmiLl26KG/evAoICFD58uU1c+bMeOMYMmSIHA5HnL+GDRu6zdewYUNVqFAhzvJjxoyRw+FwO4N75coVDR8+XKVKlVJAQIDb8/7222+Jni8+f/31l5555hlXt/x8+fKpS5cuOnnypNt769u3rySpWLFirueOvY76/Pnz+vjjj13tzzzzTKJyuG7dOjkcDi1YsEAjRoxQoUKFFBgYqPvvv1979uxxy92yZct08OBB12vFnnX3dE33mjVrVK9ePWXMmFHZsmXTww8/rJ07d7rNE/vZ7dmzR88884yyZcumrFmzqnPnzrpw4cIN83fta8f+pU2bVkFBQerbt68uXbrkmu/UqVPq06ePKlasqEyZMilLlix66KGH9Oeff7o93/Lly5UmTRqNGTPGrd3hcGjIkCGux2FhYSpevLgaNGjgep3YXH7xxRdx4syUKZPbZyNJ+/bt0xNPPKEcOXIoQ4YMqlWrVrwHqaKiojRkyBCVKlVKgYGByp8/vx599FHt3bs3zvuP7y/2dWfPnp2g9TI+scte+x1xOp2qVKlSvJ/9rl279OSTTyp37txKnz69SpcurQEDBkiSLl68qDJlyqhMmTJul5+cOnVK+fPnV506dRQTE+NqT8h6FKthw4bx5uDaz07637boei1atHDrTRKb3+vXh2vFrsOxZs2aJYfDEee79vbbb8vhcGj58uUen0uSgoKCbvh5xvc+/muben2MknTu3Dnly5dPDodD69atc7V3795dJUuWVIYMGZQjRw7dd999+vHHH+PE2KJFizix9+zZM87rzJo1S/fdd5/y5MmjgIAAlStXTlOmTIn3fV//HenWrZsCAwPd4pOkDz74QOXLl1dAQIAKFCigF198Mc7lN9evC7ly5VLz5s21bdu2OK8NIGXjTDeAZO3rr79W8eLFVadOnQQv8/3332v+/Pl6+eWXFRAQoA8++EAPPvigNm3a5CqIQ0NDVatWLdcOZe7cubVixQo9++yzOnv2rF555ZV4n3vKlCnKlCmTJKl///639N7ee+89vfnmm3rkkUf0+uuvKyAgQD/++GOcrvIJnS8+q1ev1r59+9S5c2fly5dP27dv14cffqjt27fr559/lsPh0KOPPqq///5bc+fO1fvvv69cuXJJknLnzq05c+boueeeU40aNdStWzdJ0l133SUp8TkcNWqU/Pz81KdPH0VERGj06NFq3769fvnlF0nSgAEDFBERoX///Vfvv/++JLlyHZ/vvvtODz30kIoXL64hQ4bo4sWLmjhxourWravNmzfH6Sb/5JNPqlixYho5cqQ2b96s6dOnK0+ePHrnnXf+M4/S1Z3zevXqKTo6Wt9++63GjBmjwMBADRs2TNLVAverr77SE088oWLFiik0NFTTpk1TgwYNtGPHDhUoUECS1KxZM40dO1avvvqqSpUqpVatWsV5rejoaLVu3Vr+/v5avHix0qVLl6AYrxUaGqo6derowoULevnll5UzZ059/PHHatWqlb744gs98sgjkqSYmBi1aNFCISEhatu2rXr1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1F588UUrXLiwpU2b1vLly2f333+/ffjhh655ihYt6rpljqe/a2//k9Bbhv3zzz+WMWNG69+/v9t8199yKaHzefLvv//aI488YtmyZbOsWbPaE088YUePHo33FkfDhg2zggULmp+fn1usu3btsvr161v69OlNktttqRKSQ0+3uYrvVlznzp2zdu3aWbZs2dxy6+m2Xd99953VrVvX0qdPb1myZLGWLVvajh073OaJvZVRWFhYvDmM7zZp8cUZ++fn52eFChWyTp062b///uuaLyoqynr37m358+e39OnTW926dW3jxo1utxWKjo620qVLW5MmTeK8Tnyfyfr1683hcNjHH398w1yaxX9rt71799rjjz9u2bJls8DAQKtRo4Z98803cZa9cOGCDRgwwIoVK+b6HB9//HHbu3dvnHkTcsuw2L906dJZiRIlbNCgQW63i7vRslWqVHG79Zenz37btm2udTswMNBKly5tb775ppmZ/f7775YmTRp76aWX3Ja5cuWKVa9e3QoUKGCnT592tf/XenT9OuDp79r8x26LrufplmE3Wr+uz/mjjz5qmTNntgMHDrg995IlS0ySvfPOOzfMdWJvGZaQbWpsjNff4jF2nY2d/+jRo9aqVSvLmzevpU2b1vLnz28tWrSw9evX33SMS5cutUqVKllgYKAFBQXZO++847oV3rXf72tvGRYrKirKypQpY9WrV7crV6642idNmmRlypSxtGnTWt68ea1Hjx5u64zZ1e39tZ9dtmzZrG7durZ8+fI4cQNI2RxmSTRCDQDcARwOh1588cV4u8rejKCgIA0ZMiTO2fRY69at0zPPPKMDBw7cltcDcOc5cOCAihUrpv3797sN9HWtIUOG6MCBA26D76UEt3ubCgApEdd0AwAAAADgJVzTDQC34JFHHtFdd93lcXrevHn1yCOPJGFEAJJapkyZ1L59+xteg1+pUqU4I94DAFIHupcDSFXoCgkAtw/bVAD4bxTdAAAAAAB4Cdd0AwAAAADgJRTdAAAAAAB4SaobSM3pdOro0aPKnDmzHA6Hr8MBAAAAACRDZqbIyEgVKFBAfn6ez2enuqL76NGjKly4sK/DAAAAAACkAIcPH1ahQoU8Tk91RXfmzJklXU1MlixZfBwNAAAAACA5Onv2rAoXLuyqMT1JdUV3bJfyLFmyUHQDAAAAAG7Jf122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VT/99JPKlSt3y7EAAAAAAHA7JajofvTRR90er1mzRitWrFD58uWVNm1at2lffvllooPo2bOnx+7k69atc3v8/vvvu+4ZDgAAAADAnSxBRXfWrFndHj/yyCNeCQYAAAAAgJQkQUX3rFmzvB0HAAAAAAApzp19zywAAAAAAJKxRA+kdvfdd8c7gJrD4VBgYKBKlCihZ555Ro0aNbotAQIAAAAAkFwl+kz3gw8+qH379iljxoxq1KiRGjVqpEyZMmnv3r2qXr26jh07psaNG2vJkiXeiBcAAAAAgGQj0We6w8PD1bt3b7355ptu7cOHD9fBgwe1atUqDR48WMOGDdPDDz982wIFAAAAACC5SfSZ7gULFuipp56K0962bVstWLBAkvTUU09p9+7dtx4dAAAAAADJWKKL7sDAQP30009x2n/66ScFBgZKkpxOp+v/AAAAAACkVonuXv7SSy+pe/fu+v3331W9enVJ0q+//qrp06frjTfekCR9++23qlKlym0NFAAAAACA5CbRRffAgQNVrFgxTZo0SXPmzJEklS5dWh999JHatWsnSerevbt69OhxeyMFAAAAACCZSXTRLUnt27dX+/btPU5Pnz79TQcEAAAAAEBKkehrugEAAAAAQMIk6Ex3jhw59PfffytXrlzKnj27HA6Hx3lPnTp124IDAAAAACA5S1DR/f777ytz5sySpHHjxnkzHgAAAAAAUowEFd2dOnWK9/8AAAAAAMCzm7qme+/evRo4cKCeeuopnThxQpK0YsUKbd++/bYGBwAAAABAcpboovv7779XxYoV9csvv+jLL7/UuXPnJEl//vmnBg8efNsDBAAAAAAguUp00d2vXz8NHz5cq1evVrp06Vzt9913n37++efbGhwAAAAAAMlZou/TvXXrVn3++edx2vPkyaPw8PDbEhQAAACQWgT1W+brELzuwKjmvg4B8JlEn+nOli2bjh07Fqf9jz/+UMGCBW9LUAAAAAAApASJLrrbtm2r119/XcePH5fD4ZDT6dSGDRvUp08fdezY0RsxAgAAAACQLCW6e/nbb7+tF198UYULF1ZMTIzKlSunmJgYtWvXTgMHDvRGjAAAAABSoZTe9Z5u96lDoovudOnS6aOPPtKbb76pbdu26dy5c7r77rtVsmRJb8QHAAAAAECyleiie9++fSpevLiKFCmiIkWKeCMm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vfdc0yMiImz8+PGWJ08eK168uNt3LTUpVKiQORwO69Wrlw0cONAWLlxoK1assAceeMB69+5tYWFhvg4xycUeFHY6nfb000/bqFGjrH79+la7dm3r27ev/fzzz2Zmtn79egsMDEyVJxVGjhxpTz/9tJmZjRo1ykqWLOkqwBctWmQNGjRItQckrj1R98QTT1jHjh1d+3ipZfublCi6U6hVq1ZZ7dq1zcysVatW1qFDB9e0b7/91ipVqpRqfqAuX75sPXv2NIfDYffdd59VqFDBFi9eHGe+K1euuM52p0YdO3a0woULW+HCha1IkSLmcDgsS5YsVqpUKWvUqJHVr1/fJk+e7Oswk8Tly5etWrVq5ufnZ2+88Ybt3LnTevToEaeHyG+//Wb169c3h8Nhs2fP9lG0Se+LL76wli1bWq1ataxz587Wtm1bmzRpkts80dHRtmzZMnvyySftxRdf9FGkSWfixIn2119/uR6HhobawIEDrXr16nb//ffbiBEj3KYfPnw4VfU4iuV0Ou3cuXPWvHlzmz9/vl25csWyZ89uc+fONbOrRUSHDh2sT58+Po406ezatcuefPJJCwgIsGbNmtngwYNt8ODBceY7fPiwde7c2WrVqpX0QfqQ0+m0qKgoe+6551y/48OHD7fGjRtb5syZrUCBAuZwOGzChAm+DtVnjh075vr/kSNHrF+/fla1alV74IEHrH379laiRAnr16+fDyP0nU8//dTKlCljx48ftzx58tiCBQtc0/r3729NmjTxYXRJL/ZAzfVCQkIsT5481q5dO4/z4NZQdKdQe/bssYoVK1q7du0sc+bMdurUKTO7WkzUqVPHevXq5dsAk0hstzQzs3379lnLli3N4XBYo0aNbOPGjXG6X6VWYWFhNmDAAJszZ45t2rTJfvnlF3vttdesfPnydurUKbc8phZXrlyxadOmWe7cua1gwYKWLVs2W7p0qZm5d8U3M/v888/j9J5I6Y4ePWrvvfeeNW/e3PLly2dVq1a1v//+O858oaGhdubMGR9EmHT+/fdfa9y4sR09etTMru70xtq8ebN16dLF7r77bnvkkUfso48+skOHDplZ6j6T0LlzZ+vevbv16tXLHnzwQVf7nj17LEeOHK4zdKll5+/ixYv23XffuQ7iVaxY0UJDQ13Tr11XYnsEpPTtcnzfjylTptjTTz9tX3zxhZmZbdiwwQYNGmStW7d2O6iVGsR+/nPmzLFq1arZ0qVL3b4vmzdvtp49e9pTTz1lwcHBvgrT5y5dumStW7e24sWLW+XKlV3tP//8s2XKlMm+//57M7v6m5/SxX6noqKi7K233rLFixfb8uXLLSoqyszMtmzZYo0bN3Y7gJWaf6duN4ruFObHH390/fBMmzbNypYta9WqVbNZs2bZkiVLrFOnTla0aNFUsSNz7YZi3759tmfPHjO7eqa/WLFirmvm9u7dmyo2tgkVm7dTp05Z2bJlbf78+XGmpXTXvs/w8HAbOHCgZcyY0apUqWJr1qxxTb8+H6khP9cfcPjrr79swIABVrFiRWvQoIG99957qfIM7v79+83sahFQs2ZNmzx5sqsLo9nVyxVatWplZcqUsVdffdVHUfpebMG4fft2K1u2rDkcDhs9erSZma1du9ZatmxpLVq0MLPU8X0y+9/OflRUlJ05c8bmzJljJUuWtOzZs9sHH3zgmi+15MPs6sGW2P2UH3/80TZs2OBadwYOHGiPPvqo7dixwzV/Sj+wd73YdSEmJsZy585tU6dOdeVg165dtmPHDtclT6lxHACzq5dlxPryyy+tQYMGds8991jr1q3twQcftLvvvtuee+45M0v5363z58+7DmSaXe0NmytXLqtatardddddli1bNmvevLlVq1bNcufObdmzZ3dd7oLbh6I7GYvdSBw9etTVJdrhcLh+pK9cuWKffvqpNW3a1CpUqGCBgYHWvXt3W7dunc9iTgrXXqMS+2NTunRp1/WDsd555x1Lnz69VahQwT744INUea2TmdmJEyds7dq1Nnfu3DjrxksvvWRlypRJNZciXO+HH36wP/74w8yuFgnNmzc3Pz8/69ixo/3zzz++Dc5HYguEAwcO2K5du1zt3377rXXp0sVq1apljz76qH366ae+CtGnVq1aZQ8//LDVqVPHnnzySbdLWS5dumQjR460lStX+i5AH9q6davlz5/ftm3bZmZXv18dOnSwHDlyWJ48eaxIkSL26KOPurY3KflgaGxBGTvQ3i+//GL16tWzixcvmtPptAMHDlj//v0tY8aMVrlyZfvuu+98GW6SunTpkuv/e/futQwZMlijRo2sTp06Nnz4cPvtt9+sadOmljt3bvvqq698GKnvxO7nDB482GrUqGFmV/d5Fi9ebAUKFLC0adNas2bNUs0YLNfbuXOn5cyZ0+bMmeM6i7tz505744037LnnnrPWrVvbmjVrXPlJ6SeiJk6caNmzZ7eXX37ZbXDTv//+244dO2Zff/21TZw40UaMGGHNmze3OnXqWNWqVV37Pyn9oERSoehOAZ577jlr0KCBNW3a1MqUKRNnenh4uB08eDBVjSJsZjZgwAArW7asde/e3XLmzOlqv7ZL+blz56xNmzZWqFAhX4Toc2fOnLFmzZpZwYIFXV3vx48f75oeHh5uuXPndvUSSMlif1QOHDjgKgocDofrDgCxli5damXLlrXs2bNb//793XYQU5N7773XXnrpJdcZXjOzyMhImzVrlj322GNWvHjxOAOIpRYnTpywiRMnWvPmza1WrVrWo0cP+/XXX30dls+dOXPG7r//fuvSpYtrO7xnzx7bsGGDzZ492zZu3Og6+JnSd4LNrvYmev755+3777+3ChUq2EsvvWRm/9sWXb582TZv3mxPPfWUORwOt15HKdXGjRvN39/fPvzwQ1fbvn37bO7cuTZy5EgrU6aMFS1a1Dp27Gjp06e3vHnz2vbt230Yse/ExMRY//79XWP2vPPOO/bQQw/ZoEGD7LfffrNcuXLZqlWrfBylb+zYscOyZctmDofD6tatm6oOWsXnl19+seHDh9u9995rlSpVsnffffeGBzV37NhhDRo0sLZt2yZhlCkfRXcK8Ntvv1mbNm3M4XBYgwYNbMGCBW638zGzVDWystnVMySLFy+2Ll26mMPhsLvvvtt1xM7s6pH0a4ul2G6gKf0aues9/vjj9tBDD9n58+ft22+/tUyZMrluGfHHH3/YlStX7Ntvv/VxlEnr+eeft1q1almjRo2sUqVKrvYrV664doYvXbpkw4cPd3WDTS1if6THjh1rpUqVsgMHDsSZZna1q/VHH32U5PH5wvVnAK7dhsR2vY8diPCNN95ItQdpYi1dutTy5MmTqq8xjbVixQqrVKmSlS5d2jJmzGg//vhjvPPFXu+dGhw5csR69uxpWbNmtUqVKrm979jv2oYNG+zdd9+1bt262b333uurUO8IS5YsMYfDYVWrVrVs2bLZnDlzXN3Ma9WqlaoG+Iz1ySef2L333muvvvqqjR071h544AHz8/Ozdu3a2a5du1wH9FLDgb1rXbx40VatWmW9evWySpUqWb169WzRokWu6bEDFsbauHGjFStWLNXc6SgpUHQnU2FhYTZr1izXj9CHH35ozZo1s2bNmlm1atWse/futnLlStcO4KOPPprqbttjZvbRRx9Z+fLl7eGHH7bSpUtbjx493O7zOXr0aJs4caIPI/SdgwcPWrFixWzr1q1mZtaoUSPXvblPnjxpffv2TTU7etdau3atPf300+ZwOKxOnTo2f/78OIVSVFSUXblyxVVopuRusNe7cuWKVatWza1HROx2KDo62v78809fheYTse/9559/tmHDhtnQoUNtypQpbjsvISEh1rZtW9e9YVO7FStWWPHixV3b3itXrqS6HeBYhw8ftjx58ljhwoWtZcuW9t5779m+fftc0y9fvmwLFixwuzVUSnf58mX77bff7NFHHzWHw2GPPPKIHT58OM58MTExqe6EQnyWLl1qb775pn3zzTeuti+//NKyZs2aKruXFyhQwKZNm+Z67HQ6be7cuZYjRw4rVKiQjRo1yofRJa2lS5da8eLFXYPFmZkdP37c5s6da+3atbPSpUvbk08+aZs3b3ZNj93WfPTRR1akSJEkjzklo+hOpoYNG2avv/66mZnbYD1RUVH2zjvvWO3ata1hw4b20ksv2aBBgywgIMA1Ym5Kd/3O2+nTp23r1q02YsQIq1u3rlWuXNneeust+/77783hcNj69evNLHXszFxr//79Vr58edu+fbstWbLE8uTJ4xp1+dixY1a7du1U0Z0xPpMmTbIWLVrYU089ZTVq1LCOHTu6dZVu06ZNqjmTe70rV65Ys2bNbMSIEa622O9caGiotWvXzpYsWeKr8JJU7MGWX3/91cqUKWP33HOPtWvXzvLnz2/16tWzzz//3DXvxYsX3Qrx1OTYsWN2+vRpM/vfujJixAgrUaKEq2dNahPbcyYqKspmzZplGzZssLZt29rdd99tbdq0sblz51pERIS9/vrrVqBAAV+H63VRUVH2wgsvuI2Vcf78eVuyZIndc889li5dOhswYIBbT5LU9pt9rf3799v8+fNt0aJFcQ4KL1y40EqVKmVjx471UXS+s3fvXitTpozrAERMTIxrPXnhhResbNmyliVLFmvcuHGcHqEp0Zo1a6xJkyaWPXt2e/LJJ93urLFr1y6bOHGiNWnSxCpUqGA9evRwG5Bww4YN9ttvv/ki7BSLojuZOnr0qOvat65du1r37t3dzjD9/fffFhwcbPXq1bP69evHuYduatCrVy+3o50XL1601atXW58+faxEiRJWoEABVxfH1HqWpUOHDvbuu+9ayZIl3XpCTJkyxQoXLuzDyJJebAF17YB6hw8ftnfeeceaNGli9erVs65du9rbb79tfn5+qe4WYbGcTqc9/fTTVqxYsTi36Nm8ebNly5bN7Trv1KBq1arWs2dPMzP77LPPLEuWLNaiRQvLmzevPf30064BClNjkXDixAmrUqWK3X333fbQQw/Z6NGjbcqUKbZ3716rW7eulSpVyrVjl1p6jMSuBxEREfbll1+6ve9PP/3UmjRpYtWqVbMqVapYrly5XKMOp+TLn7Zu3WrZsmWzXLly2dtvv+06SGN2dR0aN26c5cuXzwoVKmRz5szxXaA+FPv5f/zxx1a1alW75557XGdvY3tHnDhxwsaPH2/9+/f3Zag+c+7cOatYsWK8l34tX77c+vXrZz/++KPlyZPHrWt1Snb48GGbNWuW1ahRw7Jnz24DBw50m75x40YbPHiwlS9f3jWeDbyDojuZO3funPXq1csaNGhgjRo1slGjRrnd23Pv3r1uZ8JTutidlzNnzli7du3M4XBYvXr13EblDg8Pt507d9r+/ftdR4hTW9H92WefWUREhC1evNgyZcpkDofDli5dahs2bLDp06dbwYIFU+W1YGZmTz31lPXq1cutqN60aZP179/fGjZsaNWrV3ed5U7JO8E38s8//1jt2rWtWbNmNnbsWNu/f78tXLjQqlSp4rpEIbUICQmxcuXKuW5PU7p0aRs7dqwdPXrUatasaenTp7fGjRv7OErfcDqddvnyZRs7dqzNnTvXXnjhBWvVqpVVrlzZcubMaVWrVjWHw2GPPfaYr0P1iZkzZ1qhQoWsa9eubr9RERERNmXKFPvggw9sxYoVZpY6fqOioqLs3XfftSxZsljp0qVtwYIFrt90p9Np//zzj73yyivmcDjs/fff922wSSz2QM2FCxcsa9asNmvWLDMz69mzp9WqVcvMruYv9qDxtQPGpjYbNmywsmXL2sMPP+wa3f7w4cPWpEkT69y5s5mZNWjQwAYPHuzDKL3v2oO8ly9ftq1bt9qwYcOsSJEiVrx4cbc7jERERNiWLVviLIfbi6I7Gbr2C/HNN99YZGSkrV692p599lmrWbOmtWrVymbPnp2qvzhdu3a1Nm3a2L333mv33HOPZcqUyZ544ok4I7inxhwNHDjQKlSo4Bog7eDBg9aqVSvLmDGjlSxZ0ipXrpyqrnky+9/Bmr///tsee+wxczgcVqVKFbfrls2udum79hq51LD+XLuzf+0ZuXXr1tmTTz5pd999t6VPn94KFy5snTt3ThVnK6/93H/++Wfr0qWLnT171mbPnm2VK1d2HfgcPXq09ejRw+0a3dQkLCzMVq9ebe+//76NHTvWDh486DpQtWfPHgsJCbElS5ZYkSJF7Nlnn00Vg8zFvv99+/ZZr169rGDBghYYGGj33HOP9e7d23bu3Oma99r1LDVsa2IdPXrUnnnmGfPz87OmTZu6jfx/6dIl++WXX1LFuhKfd9991+rUqWNmVw9+ZsqUyTUA39KlS61Tp07xXv+e0kVHR9vBgwdt48aNdvbsWZs1a5Y9+eSTVrZsWcuXL5+VLFnSihcvbidPnjQzs7vvvjtVjufjdDrtt99+s65du1qOHDmsQYMGrlsOw/scZmZCshITEyN/f3+9+eabWrRokcaPH68HHnhA58+f1zfffKMvv/xSYWFhypYtm4YMGaJKlSr5OuQk4XQ65efnpylTpmjUqFFau3atihcvrj179mjNmjUaNWqUTp8+rddee039+/f3dbg+ceTIEZUqVUrLli1Tw4YNJUlLlixReHi4wsLCVL9+fZUsWVK5cuWSw+HwbbBJxMzkcDhkZnrkkUeUJUsWSVJoaKj+/fdf5c+fX3379lXTpk1dy8SuayldbG4kafz48Vq6dKkKFCig9u3b64EHHpAk/fnnn8qYMaOcTqdKly6dKvISq3///qpVq5buv/9+ZcqUSePHj9eSJUu0evVq+fv765VXXpEkjRs3zqdx+kqTJk107tw5ZcqUSfv27VPhwoW1cuVKpUuXzm37snDhQo0cOVJffvmlgoKCfBdwEqpYsaIefPBBPfLII5KkefPm6YcfflDGjBnVrl07tWvXTtmzZ/dxlEnj2u3MmTNnlC1bNknSL7/8oj59+uiXX35R165d1b9/fxUqVMiHkfreggULNH36dK1atUotWrRQ9uzZNWfOHEnS0qVLNWLECK1YsUI5cuTwcaRJq2vXrtq0aZP++ecflStXTr169VK+fPkUERGhkydPKlOmTLrvvvuUP39+jRkzRu+++65CQ0N9HXaS2LNnj7744gsVKFBAGTJkUOvWrXX27Fn9+OOP+uijj7R8+XItXbpULVq08HWoKZ8vK34kXuxZp3///dcyZMhga9eudU1bvHixzZw50yZPnmzDhg2zunXr2t69e30Uqe+0adPGdX1lrJiYGPvoo48sTZo0FhQUZPXq1bMdO3b4KELfeeONN6xJkyZmdvXWLMOGDbMsWbJYUFCQlS1b1nWWJTWdVYl9ry+//LJVr17d1U346NGjNn36dCtfvrxly5bNunTp4nYWKjWI3d4MHTrU8uTJY126dLHq1atb5syZrUOHDvbTTz+lmtFxY9eT7777zqZMmWK//fabORwO27Bhg2ueVatWWd68ea1Hjx42ZMgQCwgISLUDhU2aNMmKFCniGpgnR44cNn36dDO7ev3utWOQnDt3zhwOh4WEhPgk1qS2fPlyy5cvn509e9bVFhMTY59//rllzpzZSpcubR06dHAbUTg1mD17tj311FP2008/2blz51ztn376qd11113m7++faq/njrV582arXLmy9enTx7Jly+a6DOrKlStWp04de/XVV30cYdKbOHGiFS9e3L755huLiIgwh8Nhfn5+1rBhQ1u8eLGrV4TT6bSFCxdas2bNUvz13LE9aubOnWtVqlSxSpUqWcOGDS1Xrlxug8IePnzYrZs5vIuiO5mKr3jKnDmzFStWzMqVK2cHDx50u7Y7pYuJiXEVCP369bMCBQrY0aNH3eY5ceKEtWvXzj755BO75557rE+fPr4I1ac++OADq1y5suua90ceecT141O9enWbOXOmjyP0jaioKGvZsqX169cvzrRPP/3UChQoYA8++KA1adIk1R2siYqKsurVq9uyZctcbYsXL7YyZcpYoUKFbODAgamqOHj66aetUqVKVrBgQWvQoIHbtFOnTtlbb71l9957r9WoUcNGjhzpmyDvAK1atXKNnvzaa69ZtWrVXLcGmzx5so0YMcJ1wGb9+vX2+OOP+zLcJPXtt99a7ty5XQfNr72Eo1OnTtaxY0erWbOmtW/fPlVcyx1r7ty5lidPHitZsqSNHDnSduzY4bpc5cKFC9a7d2+3Wx+lVv3797dcuXJZw4YNbfXq1fb999/byy+/bAUKFEhV64vZ1YMNxYsXdx2MGTBggN177722c+dOq1ChgmXJksUeeugh18B8Fy9ejDMAaEqWN29e1/gHAwYMsCpVqlhUVJRdunTJdUA49oByajrZ4isU3cnUjYqnqlWrugbZSOmmTZsWpwjav3+/1a5d27p16+a61sns6mBYRYsWtVOnTtkbb7xhdevWdZ3VTC327t1rQUFBliVLFitZsqRt2rTJdRS4XLlyqXbwNLOrB7KKFStmu3btcms/fPiwPfbYYzZr1iwrWrSovfTSSz6KMGnF7rz99ddf1qNHD9cIytcaPXq0ORyOVDdS7oABA8zPz8/uuece69u3r9t2xuzq4Gr79u1LlTsxse+5W7du1qdPHztx4oRlzpzZVq9e7ZqnXbt21r17d9fjc+fOuZ3ZTOlOnz5t9957r3Xv3t2OHz/uNq179+42e/ZsW7VqlaVJkybV3ffe7Oq2OFu2bFajRg375JNPUs3tTm/k+rE1JkyYYKVLl7by5cubn5+fdejQwTVOS2qyadMme+qpp+zYsWN24sQJK1SokOt2YcOHD7f69evbCy+8YGapr6hcuHCh3X333WZ29Xae2bNnd93O89dff7Xu3bunqgMQdwKK7mTqv4qn1FB0X7hwwapXr24Oh8OCg4PdRuv88MMPrWLFilavXj175pln7NFHH7UyZcpYu3btXNOrVq2aKkf4PHPmjP3000+uHZlz587Z6NGjrUiRIj6OzLe2bNli99xzj7Vp08Z+/PFH1wGZuXPnWlBQkJld7WbdsmXLVNOl+sCBA+ZwOFyFdXx3Qjh58mSqO3i1ceNGmzZtmg0bNsyqVatm999/v40aNcp1u5X8+fO73YIvNZo7d67VqlXL6tWrZ08//bSr/eeff7b06dO7LtVIDQPvXSt2x3/+/PmWKVMmq1Klin366af21Vdf2YQJE8zhcNiff/5pFy5csHLlyqXoe97f6Kzs4cOHrWXLlhYQEGAdOnSw5cuXp7qiKbaL8JIlS+y5556zcuXK2dChQ129+I4dO2a//fabbd++PdWd4Y51+vRpW7JkiZ0/f94WLFhgNWrUsIMHD5rZ1R4l/fr1c+UmtW1rfv75Z6tYsaKZmbVv396aNWvmmvbjjz9a6dKlU93tPX2NojsZo3i6Ojru9OnTrUiRIpYzZ06bOnWqa9qBAwesd+/e1qlTJ2vSpIlNnDjR9SNWvnx5GzJkiK/CvmNcunTJxowZY3fddZfr6HBq9t1331n58uWtQIEC9sgjj1iFChWscOHCrm7C/fv3t7p16/o4yqT1008/WYMGDczPz8969epl27dvd7tG7tp/U6PNmzdb586drVq1ala/fn2rWbOmlSlTxtdh3RGeffZZczgc1rp1a/vuu++sb9++Vrt2bXv++efNLPXtBJuZ21nb48ePW5s2bSxLlixWvHhxK1++vI0ZM8bMrhYM2bNnd7tfdUo1e/Zs27lzp9vtwWJVrlzZ/P39U9WlGtd+L06ePGkZM2a0xx9/3F544QXLkyeP5c+f3yZMmOC6PRiu+umnnyx//vy2du1a2717t9WvX9+6dOni67B85ujRo1a5cmXr0KGDZcuWzY4dO+aa9uCDD1r79u3NLHX/fic1iu4UIrUXT4cPH7bXX3/dMmTIYBUqVHAbkOfas9n79u2zDh06WJUqVXwR5h0nKirKvv/+e/viiy98HUqSit2p2blzp82bN8+GDRvmdl/uadOm2auvvmr9+vWzr7/+2syu3uIoX758tmDBAp/E7GsffvihZc+e3QoVKmSTJk2yQ4cO8WN9jWXLltkrr7xiw4YNs99//93X4dwx5s2bZxUqVLCCBQta9erV7b333nMd/EwNZ+di3+vGjRutRYsWVqlSJatatap99tlnrnkOHz5smzdvdvUk+f77761kyZKp4sDw4cOHzeFwWKlSpWzGjBl2/Phxt+3K0KFD7aeffvJhhEnr+PHjdt9997kuWXnnnXesTZs2runR0dH22muvWdq0aa127dq2aNEii46O9lW4d5TIyEhr0qSJORwOK1asmJUpU8aioqLMLHVsa+J7jz///LPVrFnT0qdPbwsXLrQFCxZYt27drECBAq4DeqkhN3cKbhmWQkRHR+uXX35RWFiYHnvsMV+Hk6S++eYblS1bVkWLFtWff/7puvXMww8/rIkTJ8a5xcjKlSuVL18+ValSxTcBw6fs/29Pc/HiRZUtW1YBAQG6ePGijhw5ou7du+vtt99W1qxZ3W5j888//6hXr15KkyaNli5d6uN34D3Xvufw8HCdPn1aJ06cUN26dV3zvPLKK5o8ebKKFSumdevWqUCBAr4K945zbf7g7uDBg8qTJ4/Sp08vKfXcdi/WXXfdpRo1aqhcuXI6evSoZsyYocqVK2vq1KmqWrWqa74LFy7ohx9+0PLlyzVhwgQfRuw9135PLly4IH9/f7300kuaPn26GjVqpNdee01lypRRYGCgatSooXfeeUdt27b1cdRJ49ChQ3rkkUe0Y8cOPfPMM6pfv762bdumESNGuM138OBB9ejRQ6tXr9apU6eUOXNmH0V851m1apXOnTun6tWrq3Dhwq7b7KZk177HiRMnatWqVbp06ZJy5sypBx98ULt379bUqVOVIUMG3XffferQoYMeeOCBVJGbO4oPC34g0WKPyO3atcv+/PNPu3TpkjkcDrez++fOnbMlS5ZYtWrVLCAgwHULDc7K4Vq9evWyJk2a2JEjR+zEiRM2e/ZsCwoKspw5c9rkyZPjdH3dvXu329nwlCj2PX/00UdWv359CwwMtIoVK1rVqlXt888/d823f/9+69u3r6/CBJKFa3+vGjVq5Go/e/asfffdd9akSRNLkyaNtW7dOs44EbFnyFOaa3+H33nnHXvuuedcj3fu3Gn16tWzzJkzW5UqVaxo0aKp7nKeWIsWLbLSpUubw+GwQoUK2T///OOadm0ODxw44IvwcId6//33LX/+/NamTRt74403rFGjRubv72+9e/e2s2fP2r59+3wdYqrGmW4kS61bt9bFixcVERGhgIAAff/993HmCQsL0/Tp07V3715Nnz7dB1HiThN7VPfSpUtavHixrly5ovbt27umnzhxQpMmTdKoUaNUtmxZbdq0SQEBAT6MOOnEnnk8fvy4ihcvrpEjR6pixYo6efKkQkJCtGrVKnXr1k19+vRRmjRpfB0ukCxER0drzJgx+uOPPzRhwgS3niFhYWFauXKlXn/9dc2bN0/169f3YaRJJ3Y7PGnSJP3000/6/PPPdeXKFdd2ZdWqVfr+++9VqVIl1alTR4ULF/ZxxEknNg+RkZG6ePGili9frt69eyt37twaOXKkWrRoobRp0/o6TNwhlixZog0bNqhz584qW7as6tevr27duqlDhw6SpNDQUC1atEjjxo3TiBEj9MQTT0iiV5avUHQjWdq0aZOGDRumZcuWqVmzZnrmmWfUuHFjZcuWzTXPxYsXlT59etcPPN1oEKtZs2b68ccf1bJlS33++eeS3H+E/vrrL+3YsUNt27ZNdd1g+/Tpo23btmnlypWutn///VcffPCBvvzyS61atUpFihTxYYTAnS92e/LNN9+oTZs2unLlimbOnOk6yBc7PSYmRuHh4cqbN2+K3hE+c+aMvvrqK7Vv395VNK5atUo9evTQtm3blD59ekVFRSkgIEAOhyNF58KTa9/zk08+qcqVK6tXr16KiIjQwIED9cknn+jBBx/UsGHDdM899/g4WtwJxo0bp2nTpqlUqVJq3LixfvjhB3Xt2lVNmjRxzRMVFaXHH39cV65c0TfffMNBcx9KPXuSSFFq1KihmjVrunZmRo8erTfffFNr1qxR7HGkRo0a6bPPPnMV2hTcqdeJEydc/3c6nWrXrp1q1KihL774Qm+99ZYkuXZ2zEyVKlVyXUOYmnb8zEwZM2bU+fPnFRMT42ovVKiQevbsqStXrmjz5s0+jBC4s40aNUo//fSTa7tRu3ZtLVq0SI8//rg6d+6sVq1aae/eva7p/v7+yps3r6SUva2ZM2eOhg0bpq5du2rVqlWSpCZNmujMmTP666+/JElp06bVoUOHNGPGDHXr1k2XLl3yZchJzul0SpJ69+6tffv2qU2bNsqUKZMKFiyoWbNmacOGDbp8+bKqVauWYq/3R+K88sorWrNmjXLlyqV58+bpu+++07x581zrkiQFBgaqXbt2+vfff3Xu3DkfRgvOdCPZiT3zGHsmOyIiQpMnT9aSJUuUOXNmlStXTv7+/poxY4ZOnz5NsZ3KrVixQs2bN9f48eP1zDPPKHPmzDIzHTt2THPmzNHo0aOVNWtWjR07Vq1bt/Z1uD4XEhKiZ599VsOHD1erVq2UJUsWSVd7jlSuXFmDBw9265IP4KoLFy6oZcuWWrt2rTp27KgxY8YoV65ckqQjR47o+++/15QpU7R161Z1795dw4cPTzVnnY4cOaIFCxZo9erVOn36tGrXrq2uXbtqwoQJypEjh06dOqVNmzbp33//Ve7cudWpUyf17dvX12EnuZMnT6p8+fKaM2eOHnjgAUn/2+eJ7RXx/fffq3LlyipdurSPo8WdZPPmzXrttde0detWPfbYY3rsscd0//33a+/everWrZsKFiyoTz75JNX13ruTUHQj2bi269WZM2d06NAhOZ1O1yjku3bt0pQpU/Tnn38qTZo06tGjhx577DG3a8WQ+ly8eFGDBw/WtGnTVLx4cQ0fPlzNmjWTw+GQ0+nU7t279d577+mzzz5T+fLltXDhQhUrVszXYSeZ2B/g6Oho+fn5yel0qmvXrlqzZo2effZZNWjQQA6HQytXrtSnn36qI0eO+Dpk4I519uxZrVq1SkOGDNG+ffs0YMAADRgwQNLV63X/+ecfrVixQu+9957y5s2b6nqObN++XXPnztX333+v9OnT6/fff9fp06f16quvqlixYqpTp06q7jr9559/qkOHDvrggw9Ur149t2nbtm3T9OnT9eqrr6po0aI+ihB3MqfTqUWLFmn06NGKiIhQunTplDNnTpUrV07jx49XunTpKLp9KWnHbQNuXuzIyp988onVqVPHChUqZAEBAVazZk1bt26da75Dhw653Zsbqde168H+/futTZs25nA4rHXr1vbXX3+5pkVFRdnatWutRo0atmnTJl+E6hOxo+A6nU4bNGiQrVq1yjVt7NixVqhQIatQoYIFBATYAw88YKtXr/ZVqECyEhYWZiNHjrScOXNaUFCQLVq0yDXt3Llz9sMPP9ivv/5qZhbnTgkpzbWjbS9btswiIyPt22+/tWeffdZq1Khh999/v3311Vc+jPDOERkZaWXLlrVRo0aZmfs9lBcvXmwlSpSw8+fP+yo8JBORkZE2fPhwK1SokFWvXt22bdtmZtyT29coupEsxG4oTp48aRkyZLAxY8bY8uXL7ccff7THHnvMHA6HDR8+3MdR4k5y/Phxa9eunW3cuNHtdjxr1661atWqWWBgoPXp08eOHTvmmhY7X2q5vVzszv7LL79s1apVi3PA4fz587Z+/Xrbtm2bhYWF+SJEINmZM2eObd261WJiYmz79u327LPPWpo0aaxhw4aund/UJHY7M2DAACtbtqzr4N758+ft888/tzZt2liDBg3skUcesT///NOXofqU0+m0K1eu2Ouvv27+/v42ZswYO3funJ09e9b++usvK126tA0ePNjXYSIZ2b9/v/Xr18/XYeD/0b0cyUr//v21YcMG/fDDD642p9OpCRMmaOrUqVq2bJnuuusuH0aIO4GZafv27apbt67Spk2r7t276+mnn1axYsWULl06SdL06dP15ptvKm3atOrfv786d+6swMBAH0eedOz/L9c4fPiwypcvr++++041atSQJLdLMqKiolJVXoDEiO2quWXLFkVFRalkyZLKnTu3vvvuO913332Srt42bOPGjRo+fLjWrFmjDh06aPbs2XI4HCl68DTpf/k5cuSISpUqpWXLlqlhw4aSpK+++kqnT5/WxYsXderUKa1cuVKffPKJihcv7tug7wDvvPOORo8eLX9/fwUFBSk8PFzlypXTN9984+vQkExxBx/fo+hGsjJ27Fh9/fXXWrt2raT/bUT27NmjBx54QMOHD2eQJ7gZN26cBg4cqAoVKqhHjx5q0qSJ8uXLJ4fDoYiICI0YMUJjxozRrFmz1KlTJ1+Hm+Tmz5+vkSNHasWKFcqbN6/btV6//vqrDhw4oObNmytDhgw+jBK4szVv3lwXLlzQyZMnlS9fPtcI3dc6c+aM5s2bpz179mjMmDE+iNJ3BgwYoN9++03ffvutjh49qpkzZ2r06NHKlSuX0qdPrxUrVigwMFB58uTxdah3jPDwcM2bN08XLlxQ9erVVbFiRdfAfACSH66kR7JSvnx5rV+/XhMmTND58+ddR+1KlCihzJkzKzo62scR4k5x8eJFSVK3bt00atQobdq0SV26dNHTTz+tVatWKSIiQlmzZtXo0aP1zz//pMqCW5LKlCmjffv2KTIy0lVwX7lyRZL022+/ady4ca7eAQDiN27cOOXIkUPbtm2Tn5+fPv74Y4WGhrrN4+fnp27duundd9+VJLfb+qR0hQoVUmhoqCIiItS3b19t3rxZs2fP1r59+5Q+fXqtWbOGgvs6uXLlUs+ePfXaa6+pUaNGFNxAMkfRjWSladOm6tOnj+bMmaOBAwdq5cqV2r59u/r27avQ0FB16dJFkkQHjtTNzJQ+fXpJ0l133aXTp09r7ty5Wrlypeu2Pv3799evv/6qCxcupNpLEpYvX64KFSqoYsWKatOmjevsXJo0aXT8+HGNGzdOjz76KKP/A/+hZMmSql69urp166b06dNrwoQJGjBggL755hvXweBatWrp008/dXUpT00jCDdt2lQREREqUqSIfv31V/Xv318tW7aU9L8DpACQktG9HMnOxYsXNW3aNC1ZskT79+/XoUOH1LhxY73yyitq1qwZtwiDy9ixY/Xhhx9q165dcdr79u2rLFmyaPLkyWrXrp2PIkx6sddyv/POO5o0aZJ27dqlP/74Q6NGjVJYWJhy5sypggULavPmzUqbNq1+/vlnX4cM3NFiv1Ox1y9fuXJFU6dO1fz58+Xn56e77rpLTqdTK1asiHP2OzWJiIjQjh07VKhQIRUuXFjnz5/XBx98oEmTJungwYO+Dg8AvIrKBHes2Ou116xZo6VLl+rHH39UpUqV1KhRI/Xo0UNt27bV6dOndf78eZUuXVqZM2eWJApuuGTOnFkBAQE6d+6cMmXKpIsXLyp9+vR68skntXjxYgUFBaly5cq+DjPJXFschIaGasSIEcqYMaPuvfdeDR8+XGvXrtWvv/6q7du3q2vXrmratKmvQwbuWLHfJ4fDoaNHj2r//v26fPmyGjZsqJ49e6p169aaMmWKNm/erPTp02vOnDmSlGoPDGfNmlW1a9eWJF2+fFlTp07VtGnT9MEHH/g4MgDwPs5044507YinVapUUYMGDVSwYEHt2rVL586dU6lSpTRixAgVKFDA16HiDrZx40Y1atRIQ4cO1euvv+427YknnlDfvn1Vo0YN185zShf7Pj///HNNnz5djRs31htvvOHrsIBkKfbA8OTJkzVjxgyFhobq1KlTCgoK0qhRo/Twww9LksLCwpQ9e/ZUWWh7Eh0drV9++UVhYWF67LHHfB0OAHgdRTfuKNefAWjTpo2rSPDz89PFixf12Wef6e2331aLFi00YcIEH0aLO03swZprzZo1S6NGjVJQUJD69eunQoUKadGiRRo8eLBCQ0OVLVs23wTrIxEREerQoYN+/fVXZcqUSR9//LHq1q3rmn758mWlTZvWhxECd75rDwzfddddmjRpksqWLatMmTJp0qRJmjFjhvr06aORI0dymx4AAEU37ixPPvmkevTooUaNGunChQt66KGH9OCDD6p///5u9xj89NNP9dprr2nz5s3Kly+fj6PGneDa9eODDz5QSEiISpYsqSJFisjM9Mcff2jhwoW6cuWKSpQooe7du6tHjx6psqvnP//8oyVLlmjBggVyOBxq0qSJnn32WQUFBfk6NCBZiR2JOyQkxK39o48+0ujRo7Vs2TKVKlXKR9EBAO4UqWfoTNzx1qxZoy+++EJVq1Z1tdWvX18rV65UdHS0/P39XbdYqVatmtKnT8/gK3CJLbjHjx+vkSNH6uLFi/r++++1cOFC/frrr6pRo4a2bNmiDRs26IcfflCPHj3clktNSpYsqT59+uj9999XzZo1tWbNGr3wwguaOHEiIwkD/+HacxUFChRQVFSU63FMTIwk6YEHHpDD4WAgQgCAJIpu3EH++OMPVa5cWVmyZNG0adPUoEED1a5dW5s2bVK7du3077//ys/PT5GRkVqxYoWuXLmimjVr+jps+NiSJUv02muvaefOnZKkpUuXatSoUVq+fLnWrl2r1q1b69ixY/r88881depUXblyRVmzZnXtOKeGa7lj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",
      "text/plain": [
       "<Figure size 1000x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "attention_extractor = keras.Model(\n",
    "    inputs=attention_model.input,\n",
    "    outputs=attention_model.get_layer(\"attention_weights\").output\n",
    ")\n",
    "\n",
    "train_attention = attention_extractor.predict(X_train, verbose=0)\n",
    "mean_attention = train_attention.mean(axis=0)\n",
    "\n",
    "feature_importance_df = pd.DataFrame({\n",
    "    \"processed_feature\": feature_names,\n",
    "    \"attention_mean\": mean_attention\n",
    "}).sort_values(\"attention_mean\", ascending=False).reset_index(drop=True)\n",
    "\n",
    "display(feature_importance_df.head(20))\n",
    "\n",
    "def map_processed_feature_to_original(feature_name, numeric_cols, categorical_cols):\n",
    "    if feature_name in numeric_cols:\n",
    "        return feature_name\n",
    "    for cat_col in categorical_cols:\n",
    "        prefix = f\"{cat_col}_\"\n",
    "        if feature_name.startswith(prefix):\n",
    "            return cat_col\n",
    "    return feature_name\n",
    "\n",
    "feature_importance_df[\"original_feature\"] = feature_importance_df[\"processed_feature\"].apply(\n",
    "    lambda x: map_processed_feature_to_original(x, numeric_cols, categorical_cols)\n",
    ")\n",
    "\n",
    "original_importance_df = (\n",
    "    feature_importance_df\n",
    "    .groupby(\"original_feature\", as_index=False)[\"attention_mean\"]\n",
    "    .mean()\n",
    "    .sort_values(\"attention_mean\", ascending=False)\n",
    "    .reset_index(drop=True)\n",
    ")\n",
    "\n",
    "original_importance_df[\"importance_share\"] = (\n",
    "    original_importance_df[\"attention_mean\"] / original_importance_df[\"attention_mean\"].sum()\n",
    ")\n",
    "original_importance_df[\"cumulative_share\"] = original_importance_df[\"importance_share\"].cumsum()\n",
    "\n",
    "display(original_importance_df)\n",
    "\n",
    "plt.figure(figsize=(10, 5))\n",
    "plt.bar(original_importance_df[\"original_feature\"], original_importance_df[\"attention_mean\"])\n",
    "plt.xticks(rotation=60, ha=\"right\")\n",
    "plt.title(\"Средняя attention-важность исходных признаков\")\n",
    "plt.ylabel(\"Attention weight\")\n",
    "plt.grid(True, axis=\"y\", alpha=0.3)\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2fe2dc53",
   "metadata": {},
   "source": [
    "## 9. Отбор важных признаков\n",
    "\n",
    "Используем комбинированное правило:\n",
    "- берём признаки, входящие в первые 80% суммарной важности;\n",
    "- дополнительно сохраняем минимум 3 признака;\n",
    "- такое правило уменьшает размерность без потери основной информации."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "6185a81e",
   "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_mean</th>\n",
       "      <th>importance_share</th>\n",
       "      <th>cumulative_share</th>\n",
       "      <th>selected</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>site</td>\n",
       "      <td>0.749013</td>\n",
       "      <td>0.110671</td>\n",
       "      <td>0.110671</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>footlgth</td>\n",
       "      <td>0.692803</td>\n",
       "      <td>0.102366</td>\n",
       "      <td>0.213037</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>sex</td>\n",
       "      <td>0.642614</td>\n",
       "      <td>0.094950</td>\n",
       "      <td>0.307987</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>hdlngth</td>\n",
       "      <td>0.637448</td>\n",
       "      <td>0.094187</td>\n",
       "      <td>0.402174</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>earconch</td>\n",
       "      <td>0.612622</td>\n",
       "      <td>0.090518</td>\n",
       "      <td>0.492692</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>taill</td>\n",
       "      <td>0.585922</td>\n",
       "      <td>0.086573</td>\n",
       "      <td>0.579266</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>eye</td>\n",
       "      <td>0.537682</td>\n",
       "      <td>0.079446</td>\n",
       "      <td>0.658711</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>totlngth</td>\n",
       "      <td>0.527027</td>\n",
       "      <td>0.077871</td>\n",
       "      <td>0.736583</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>skullw</td>\n",
       "      <td>0.495276</td>\n",
       "      <td>0.073180</td>\n",
       "      <td>0.809763</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>chest</td>\n",
       "      <td>0.448208</td>\n",
       "      <td>0.066225</td>\n",
       "      <td>0.875988</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>age</td>\n",
       "      <td>0.440791</td>\n",
       "      <td>0.065129</td>\n",
       "      <td>0.941118</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>belly</td>\n",
       "      <td>0.398511</td>\n",
       "      <td>0.058882</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   original_feature  attention_mean  importance_share  cumulative_share  selected\n",
       "0              site        0.749013          0.110671          0.110671      True\n",
       "1          footlgth        0.692803          0.102366          0.213037      True\n",
       "2               sex        0.642614          0.094950          0.307987      True\n",
       "3           hdlngth        0.637448          0.094187          0.402174      True\n",
       "4          earconch        0.612622          0.090518          0.492692      True\n",
       "5             taill        0.585922          0.086573          0.579266      True\n",
       "6               eye        0.537682          0.079446          0.658711      True\n",
       "7          totlngth        0.527027          0.077871          0.736583      True\n",
       "8            skullw        0.495276          0.073180          0.809763     False\n",
       "9             chest        0.448208          0.066225          0.875988     False\n",
       "10              age        0.440791          0.065129          0.941118     False\n",
       "11            belly        0.398511          0.058882          1.000000     False"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Отобранные важные признаки: ['site', 'footlgth', 'sex', 'hdlngth', 'earconch', 'taill', 'eye', 'totlngth']\n"
     ]
    }
   ],
   "source": [
    "\n",
    "selected_original_features = original_importance_df.loc[\n",
    "    (original_importance_df[\"cumulative_share\"] <= 0.80),\n",
    "    \"original_feature\"\n",
    "].tolist()\n",
    "\n",
    "if len(selected_original_features) < min(3, len(original_importance_df)):\n",
    "    selected_original_features = original_importance_df[\"original_feature\"].head(min(3, len(original_importance_df))).tolist()\n",
    "\n",
    "selected_original_features = list(dict.fromkeys(selected_original_features))\n",
    "\n",
    "selection_reason_df = original_importance_df.copy()\n",
    "selection_reason_df[\"selected\"] = selection_reason_df[\"original_feature\"].isin(selected_original_features)\n",
    "display(selection_reason_df)\n",
    "\n",
    "print(\"Отобранные важные признаки:\", selected_original_features)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ed9b439a",
   "metadata": {},
   "source": [
    "## 10. Подготовка данных только по отобранным признакам"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "d37bb57f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Размерность после отбора признаков: (104, 9)\n"
     ]
    }
   ],
   "source": [
    "\n",
    "X_selected_raw = X[selected_original_features].copy()\n",
    "\n",
    "numeric_cols_sel = X_selected_raw.select_dtypes(include=[np.number]).columns.tolist()\n",
    "categorical_cols_sel = [c for c in X_selected_raw.columns if c not in numeric_cols_sel]\n",
    "\n",
    "numeric_pipe_sel = Pipeline([\n",
    "    (\"imputer\", SimpleImputer(strategy=\"median\")),\n",
    "    (\"scaler\", StandardScaler())\n",
    "])\n",
    "\n",
    "categorical_pipe_sel = Pipeline([\n",
    "    (\"imputer\", SimpleImputer(strategy=\"most_frequent\")),\n",
    "    (\"ohe\", OneHotEncoder(handle_unknown=\"ignore\", sparse_output=False))\n",
    "])\n",
    "\n",
    "preprocessor_sel = ColumnTransformer([\n",
    "    (\"num\", numeric_pipe_sel, numeric_cols_sel),\n",
    "    (\"cat\", categorical_pipe_sel, categorical_cols_sel)\n",
    "], remainder=\"drop\")\n",
    "\n",
    "X_selected_processed = np.asarray(preprocessor_sel.fit_transform(X_selected_raw), dtype=np.float32)\n",
    "\n",
    "X_train_sel, X_test_sel, y_train_sel, y_test_sel = train_test_split(\n",
    "    X_selected_processed, y,\n",
    "    test_size=0.25,\n",
    "    random_state=SEED,\n",
    "    stratify=y\n",
    ")\n",
    "\n",
    "print(\"Размерность после отбора признаков:\", X_selected_processed.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87e5adc3",
   "metadata": {},
   "source": [
    "## 11. Итоговая нейросеть по отобранным признакам"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "9cd6b45c",
   "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>accuracy</th>\n",
       "      <th>auc</th>\n",
       "      <th>loss</th>\n",
       "      <th>val_accuracy</th>\n",
       "      <th>val_auc</th>\n",
       "      <th>val_loss</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>0.983871</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.175872</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.124785</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>0.983871</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.148650</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.106280</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>0.983871</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.128392</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.091054</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>0.983871</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.125254</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.078101</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>0.983871</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.108362</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.067082</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    accuracy  auc      loss  val_accuracy  val_auc  val_loss\n",
       "15  0.983871  1.0  0.175872           1.0      1.0  0.124785\n",
       "16  0.983871  1.0  0.148650           1.0      1.0  0.106280\n",
       "17  0.983871  1.0  0.128392           1.0      1.0  0.091054\n",
       "18  0.983871  1.0  0.125254           1.0      1.0  0.078101\n",
       "19  0.983871  1.0  0.108362           1.0      1.0  0.067082"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "def build_final_classifier(input_dim: int, n_classes: int, hidden_units=(64, 32), dropout_rate=0.15):\n",
    "    inputs = keras.Input(shape=(input_dim,), name=\"features_selected\")\n",
    "    x = inputs\n",
    "    for i, units in enumerate(hidden_units, start=1):\n",
    "        x = layers.Dense(units, activation=\"relu\", name=f\"sel_dense_{i}\")(x)\n",
    "        x = layers.Dropout(dropout_rate, seed=SEED)(x)\n",
    "\n",
    "    if n_classes == 2:\n",
    "        outputs = layers.Dense(1, activation=\"sigmoid\", name=\"target\")(x)\n",
    "        loss = \"binary_crossentropy\"\n",
    "        metrics = [\"accuracy\", keras.metrics.AUC(name=\"auc\")]\n",
    "    else:\n",
    "        outputs = layers.Dense(n_classes, activation=\"softmax\", name=\"target\")(x)\n",
    "        loss = \"sparse_categorical_crossentropy\"\n",
    "        metrics = [\"accuracy\"]\n",
    "\n",
    "    model = keras.Model(inputs=inputs, outputs=outputs, name=\"selected_features_classifier\")\n",
    "    model.compile(\n",
    "        optimizer=keras.optimizers.Adam(learning_rate=1e-3),\n",
    "        loss=loss,\n",
    "        metrics=metrics\n",
    "    )\n",
    "    return model\n",
    "\n",
    "selected_model = build_final_classifier(X_train_sel.shape[1], n_classes)\n",
    "\n",
    "history_sel = selected_model.fit(\n",
    "    X_train_sel, y_train_sel,\n",
    "    validation_split=0.2,\n",
    "    epochs=300,\n",
    "    batch_size=16,\n",
    "    verbose=0,\n",
    "    callbacks=callbacks\n",
    ")\n",
    "\n",
    "history_sel_df = pd.DataFrame(history_sel.history)\n",
    "display(history_sel_df.tail())\n",
    "\n",
    "plt.figure(figsize=(8, 4))\n",
    "plt.plot(history_sel_df[\"loss\"], label=\"train_loss\")\n",
    "plt.plot(history_sel_df[\"val_loss\"], label=\"val_loss\")\n",
    "plt.title(\"Динамика функции потерь для модели по отобранным признакам\")\n",
    "plt.xlabel(\"Эпоха\")\n",
    "plt.ylabel(\"Loss\")\n",
    "plt.legend()\n",
    "plt.grid(True, alpha=0.3)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "853699df",
   "metadata": {},
   "source": [
    "## 12. Оценка качества итоговой модели"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "077c53d3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:5 out of the last 8 calls to <function TensorFlowTrainer.make_predict_function.<locals>.one_step_on_data_distributed at 0x7f744803bec0> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has reduce_retracing=True option that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.\n",
      "WARNING:tensorflow:6 out of the last 10 calls to <function TensorFlowTrainer.make_predict_function.<locals>.one_step_on_data_distributed at 0x7f744803bec0> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has reduce_retracing=True option that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.\n",
      "Метрики модели по отобранным признакам:\n",
      "train_accuracy: 0.4231\n",
      "test_accuracy: 0.3077\n",
      "test_balanced_accuracy: 0.2857\n",
      "test_f1_macro: 0.2353\n",
      "test_roc_auc: 0.2381\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>0</th>\n",
       "      <th>1</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>6</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   0   1\n",
       "0  0  12\n",
       "1  6   8"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Классификационный отчёт:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "         Vic       0.00      0.00      0.00        12\n",
      "       other       0.40      0.57      0.47        14\n",
      "\n",
      "    accuracy                           0.31        26\n",
      "   macro avg       0.20      0.29      0.24        26\n",
      "weighted avg       0.22      0.31      0.25        26\n",
      "\n"
     ]
    }
   ],
   "source": [
    "\n",
    "selected_metrics, selected_test_pred = evaluate_classifier(\n",
    "    selected_model, X_train_sel, y_train_sel, X_test_sel, y_test_sel, n_classes\n",
    ")\n",
    "\n",
    "print(\"Метрики модели по отобранным признакам:\")\n",
    "for k, v in selected_metrics.items():\n",
    "    print(f\"{k}: {v:.4f}\")\n",
    "\n",
    "print(\"\\nМатрица ошибок:\")\n",
    "display(pd.DataFrame(confusion_matrix(y_test_sel, selected_test_pred)))\n",
    "\n",
    "print(\"\\nКлассификационный отчёт:\")\n",
    "print(classification_report(y_test_sel, selected_test_pred, target_names=class_names))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d1c3bf3d",
   "metadata": {},
   "source": [
    "## 13. Сравнение моделей\n",
    "\n",
    "Ниже выводятся метрики attention-модели по всем признакам и итоговой модели по отобранным признакам."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "2e9b39bd",
   "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>train_accuracy</th>\n",
       "      <th>test_accuracy</th>\n",
       "      <th>test_balanced_accuracy</th>\n",
       "      <th>test_f1_macro</th>\n",
       "      <th>test_roc_auc</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Attention-модель по всем признакам</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Нейросеть по отобранным признакам</td>\n",
       "      <td>0.423077</td>\n",
       "      <td>0.307692</td>\n",
       "      <td>0.285714</td>\n",
       "      <td>0.235294</td>\n",
       "      <td>0.238095</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                model  train_accuracy  test_accuracy  test_balanced_accuracy  test_f1_macro  test_roc_auc\n",
       "0  Attention-модель по всем признакам        1.000000       1.000000                1.000000       1.000000      1.000000\n",
       "1   Нейросеть по отобранным признакам        0.423077       0.307692                0.285714       0.235294      0.238095"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "comparison_df = pd.DataFrame([\n",
    "    {\"model\": \"Attention-модель по всем признакам\", **attention_metrics},\n",
    "    {\"model\": \"Нейросеть по отобранным признакам\", **selected_metrics},\n",
    "])\n",
    "\n",
    "display(comparison_df)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ad9f7fe7",
   "metadata": {},
   "source": [
    "Итог\n",
    "\n",
    "Attention-модель, обученная по всем признакам, показала идеальную точность на тестовой выборке (accuracy = 1.0). После отбора признаков и обучения нейросети с той же архитектурой точность резко снизилась (accuracy ≈ 0.31, F1 ≈ 0.24).\n",
    "\n",
    "Это показывает, что выполненный отбор признаков удалил значимую часть информативных переменных, из-за чего модель потеряла предсказательную способность.\n",
    "\n",
    "Следовательно, лучшей является attention-модель по всем признакам, а применённый подход отбора признаков в данном случае оказался неэффективным."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
