{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "53933068",
   "metadata": {},
   "source": [
    "# Классификация оттока клиентов банка нейросетью и анализ важности признаков\n",
    "\n",
    "В работе автоматически определяется зависимая переменная, выполняется предобработка данных, обучается нейросеть для классификации и рассчитываются методы объяснения вкладов признаков.\n",
    "\n",
    "Финального текстового вывода в ноутбуке нет. В последней ячейке выводятся все значения, необходимые для написания итогового заключения по реальным результатам."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d9afdad9",
   "metadata": {},
   "source": [
    "## 1. Импорт библиотек и загрузка данных"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "5c2a96e2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Используемый файл: Bank Customer Churn Prediction.csv\n",
      "Форма датасета: (10000, 12)\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>customer_id</th>\n",
       "      <th>credit_score</th>\n",
       "      <th>country</th>\n",
       "      <th>gender</th>\n",
       "      <th>age</th>\n",
       "      <th>tenure</th>\n",
       "      <th>balance</th>\n",
       "      <th>products_number</th>\n",
       "      <th>credit_card</th>\n",
       "      <th>active_member</th>\n",
       "      <th>estimated_salary</th>\n",
       "      <th>churn</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>15634602</td>\n",
       "      <td>619</td>\n",
       "      <td>France</td>\n",
       "      <td>Female</td>\n",
       "      <td>42</td>\n",
       "      <td>2</td>\n",
       "      <td>0.00</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>101348.88</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>15647311</td>\n",
       "      <td>608</td>\n",
       "      <td>Spain</td>\n",
       "      <td>Female</td>\n",
       "      <td>41</td>\n",
       "      <td>1</td>\n",
       "      <td>83807.86</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>112542.58</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>15619304</td>\n",
       "      <td>502</td>\n",
       "      <td>France</td>\n",
       "      <td>Female</td>\n",
       "      <td>42</td>\n",
       "      <td>8</td>\n",
       "      <td>159660.80</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>113931.57</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>15701354</td>\n",
       "      <td>699</td>\n",
       "      <td>France</td>\n",
       "      <td>Female</td>\n",
       "      <td>39</td>\n",
       "      <td>1</td>\n",
       "      <td>0.00</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>93826.63</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>15737888</td>\n",
       "      <td>850</td>\n",
       "      <td>Spain</td>\n",
       "      <td>Female</td>\n",
       "      <td>43</td>\n",
       "      <td>2</td>\n",
       "      <td>125510.82</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>79084.10</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   customer_id  credit_score country  gender  age  tenure    balance  products_number  credit_card  active_member  estimated_salary  churn\n",
       "0     15634602           619  France  Female   42       2       0.00                1            1              1         101348.88      1\n",
       "1     15647311           608   Spain  Female   41       1   83807.86                1            0              1         112542.58      0\n",
       "2     15619304           502  France  Female   42       8  159660.80                3            1              0         113931.57      1\n",
       "3     15701354           699  France  Female   39       1       0.00                2            0              0          93826.63      0\n",
       "4     15737888           850   Spain  Female   43       2  125510.82                1            1              1          79084.10      0"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Типы данных:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>dtype</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>customer_id</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>credit_score</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>country</th>\n",
       "      <td>object</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>gender</th>\n",
       "      <td>object</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>age</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tenure</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>balance</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>products_number</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>credit_card</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>active_member</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>estimated_salary</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>churn</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                    dtype\n",
       "customer_id         int64\n",
       "credit_score        int64\n",
       "country            object\n",
       "gender             object\n",
       "age                 int64\n",
       "tenure              int64\n",
       "balance           float64\n",
       "products_number     int64\n",
       "credit_card         int64\n",
       "active_member       int64\n",
       "estimated_salary  float64\n",
       "churn               int64"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import os\n",
    "import re\n",
    "import json\n",
    "import math\n",
    "import warnings\n",
    "from pathlib import Path\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn.compose import ColumnTransformer\n",
    "from sklearn.impute import SimpleImputer\n",
    "from sklearn.inspection import permutation_importance\n",
    "from sklearn.metrics import (\n",
    "    accuracy_score,\n",
    "    balanced_accuracy_score,\n",
    "    precision_score,\n",
    "    recall_score,\n",
    "    f1_score,\n",
    "    roc_auc_score,\n",
    "    confusion_matrix,\n",
    "    classification_report,\n",
    ")\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.neural_network import MLPClassifier\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.preprocessing import OneHotEncoder, StandardScaler\n",
    "\n",
    "warnings.filterwarnings(\"ignore\")\n",
    "pd.set_option(\"display.max_columns\", 200)\n",
    "pd.set_option(\"display.width\", 200)\n",
    "\n",
    "def find_csv(candidates=None):\n",
    "    if candidates is None:\n",
    "        candidates = [\n",
    "            \"Bank Customer Churn Prediction.csv\",\n",
    "            \"bank_customer_churn_prediction.csv\",\n",
    "            \"bank_churn.csv\",\n",
    "            \"churn.csv\",\n",
    "        ]\n",
    "    search_dirs = [Path(\".\"), Path(\"/mnt/data\")]\n",
    "    for d in search_dirs:\n",
    "        for name in candidates:\n",
    "            p = d / name\n",
    "            if p.exists():\n",
    "                return p\n",
    "    csvs = []\n",
    "    for d in search_dirs:\n",
    "        csvs.extend(sorted(d.glob(\"*.csv\")))\n",
    "    if len(csvs) == 1:\n",
    "        return csvs[0]\n",
    "    if csvs:\n",
    "        # берём наиболее подходящий файл по названию\n",
    "        ranked = sorted(\n",
    "            csvs,\n",
    "            key=lambda p: (\n",
    "                \"churn\" not in p.name.lower(),\n",
    "                \"bank\" not in p.name.lower(),\n",
    "                len(p.name),\n",
    "            ),\n",
    "        )\n",
    "        return ranked[0]\n",
    "    raise FileNotFoundError(\"CSV-файл не найден.\")\n",
    "\n",
    "csv_path = find_csv()\n",
    "df_raw = pd.read_csv(csv_path)\n",
    "\n",
    "print(f\"Используемый файл: {csv_path}\")\n",
    "print(f\"Форма датасета: {df_raw.shape}\")\n",
    "display(df_raw.head())\n",
    "print(\"\\nТипы данных:\")\n",
    "display(df_raw.dtypes.rename(\"dtype\").to_frame())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "56ed7556",
   "metadata": {},
   "source": [
    "## 2. Нормализация названий столбцов и выбор зависимой переменной"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "dc6bd3ca",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>original_name</th>\n",
       "      <th>normalized_name</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>customer_id</td>\n",
       "      <td>customer_id</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>credit_score</td>\n",
       "      <td>credit_score</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>country</td>\n",
       "      <td>country</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>gender</td>\n",
       "      <td>gender</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>age</td>\n",
       "      <td>age</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>tenure</td>\n",
       "      <td>tenure</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>balance</td>\n",
       "      <td>balance</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>products_number</td>\n",
       "      <td>products_number</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>credit_card</td>\n",
       "      <td>credit_card</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>active_member</td>\n",
       "      <td>active_member</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>estimated_salary</td>\n",
       "      <td>estimated_salary</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>churn</td>\n",
       "      <td>churn</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       original_name   normalized_name\n",
       "0        customer_id       customer_id\n",
       "1       credit_score      credit_score\n",
       "2            country           country\n",
       "3             gender            gender\n",
       "4                age               age\n",
       "5             tenure            tenure\n",
       "6            balance           balance\n",
       "7    products_number   products_number\n",
       "8        credit_card       credit_card\n",
       "9      active_member     active_member\n",
       "10  estimated_salary  estimated_salary\n",
       "11             churn             churn"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Выбранная зависимая переменная: churn\n",
      "Найденные идентификаторы / несодержательные поля: ['customer_id']\n"
     ]
    }
   ],
   "source": [
    "def normalize_col(name: str) -> str:\n",
    "    name = str(name).strip().lower()\n",
    "    name = name.replace(\"%\", \"pct\")\n",
    "    name = re.sub(r\"[^a-zA-Z0-9а-яА-Я]+\", \"_\", name)\n",
    "    name = re.sub(r\"_+\", \"_\", name).strip(\"_\")\n",
    "    return name\n",
    "\n",
    "original_cols = list(df_raw.columns)\n",
    "normalized_cols = [normalize_col(c) for c in original_cols]\n",
    "\n",
    "rename_map = dict(zip(original_cols, normalized_cols))\n",
    "df = df_raw.rename(columns=rename_map).copy()\n",
    "\n",
    "mapping_df = pd.DataFrame({\n",
    "    \"original_name\": original_cols,\n",
    "    \"normalized_name\": normalized_cols\n",
    "})\n",
    "display(mapping_df)\n",
    "\n",
    "candidate_targets = [\n",
    "    \"churn\", \"exited\", \"target\", \"label\", \"default\", \"is_churn\", \"left\"\n",
    "]\n",
    "\n",
    "target_col = None\n",
    "for c in candidate_targets:\n",
    "    if c in df.columns:\n",
    "        target_col = c\n",
    "        break\n",
    "\n",
    "if target_col is None:\n",
    "    # запасной вариант: бинарный столбец с самым подходящим названием\n",
    "    binary_candidates = []\n",
    "    for c in df.columns:\n",
    "        nun = df[c].dropna().nunique()\n",
    "        if nun == 2:\n",
    "            binary_candidates.append(c)\n",
    "    if binary_candidates:\n",
    "        ranked = sorted(\n",
    "            binary_candidates,\n",
    "            key=lambda c: (\n",
    "                all(k not in c for k in [\"churn\", \"exit\", \"target\", \"label\", \"default\", \"left\"]),\n",
    "                len(c)\n",
    "            )\n",
    "        )\n",
    "        target_col = ranked[0]\n",
    "\n",
    "if target_col is None:\n",
    "    raise ValueError(\"Не удалось автоматически определить зависимую переменную.\")\n",
    "\n",
    "print(f\"Выбранная зависимая переменная: {target_col}\")\n",
    "\n",
    "id_like_cols = [c for c in df.columns if c != target_col and (\"id\" in c or c.endswith(\"_id\"))]\n",
    "print(\"Найденные идентификаторы / несодержательные поля:\", id_like_cols)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5f780643",
   "metadata": {},
   "source": [
    "## 3. Подготовка признаков"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "14056451",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Количество содержательных признаков до кодирования: 10\n",
      "Список признаков:\n",
      "['credit_score', 'country', 'gender', 'age', 'tenure', 'balance', 'products_number', 'credit_card', 'active_member', 'estimated_salary']\n",
      "\n",
      "Числовые признаки: ['credit_score', 'age', 'tenure', 'balance', 'products_number', 'credit_card', 'active_member', 'estimated_salary']\n",
      "Категориальные признаки: ['country', 'gender']\n",
      "\n",
      "Распределение классов:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>share</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>churn</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.7963</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.2037</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        share\n",
       "churn        \n",
       "0      0.7963\n",
       "1      0.2037"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Количество пропусков по столбцам:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>missing_count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>credit_score</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>country</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>gender</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>age</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tenure</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>balance</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>products_number</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>credit_card</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>active_member</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>estimated_salary</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  missing_count\n",
       "credit_score                  0\n",
       "country                       0\n",
       "gender                        0\n",
       "age                           0\n",
       "tenure                        0\n",
       "balance                       0\n",
       "products_number               0\n",
       "credit_card                   0\n",
       "active_member                 0\n",
       "estimated_salary              0"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "X = df.drop(columns=[target_col]).copy()\n",
    "y_raw = df[target_col].copy()\n",
    "\n",
    "# удаляем идентификаторы\n",
    "drop_cols = [c for c in id_like_cols if c in X.columns]\n",
    "X = X.drop(columns=drop_cols, errors=\"ignore\")\n",
    "\n",
    "# приведение целевой переменной к бинарному виду\n",
    "if y_raw.dtype == object:\n",
    "    y_clean = y_raw.astype(str).str.strip().str.lower()\n",
    "    unique_vals = sorted(y_clean.dropna().unique())\n",
    "    if len(unique_vals) != 2:\n",
    "        raise ValueError(f\"Целевая переменная {target_col} не бинарная: {unique_vals}\")\n",
    "    y = (y_clean == unique_vals[-1]).astype(int)\n",
    "else:\n",
    "    unique_vals = sorted(pd.Series(y_raw.dropna().unique()).tolist())\n",
    "    if len(unique_vals) != 2:\n",
    "        raise ValueError(f\"Целевая переменная {target_col} не бинарная: {unique_vals}\")\n",
    "    y = (y_raw == unique_vals[-1]).astype(int)\n",
    "\n",
    "numeric_features = X.select_dtypes(include=[np.number]).columns.tolist()\n",
    "categorical_features = [c for c in X.columns if c not in numeric_features]\n",
    "\n",
    "print(f\"Количество содержательных признаков до кодирования: {X.shape[1]}\")\n",
    "print(\"Список признаков:\")\n",
    "print(X.columns.tolist())\n",
    "print(\"\\nЧисловые признаки:\", numeric_features)\n",
    "print(\"Категориальные признаки:\", categorical_features)\n",
    "\n",
    "print(\"\\nРаспределение классов:\")\n",
    "class_share = y.value_counts(normalize=True).sort_index().rename(\"share\")\n",
    "display(class_share.to_frame())\n",
    "\n",
    "print(\"\\nКоличество пропусков по столбцам:\")\n",
    "display(X.isna().sum().rename(\"missing_count\").to_frame().sort_values(\"missing_count\", ascending=False).head(20))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e519081a",
   "metadata": {},
   "source": [
    "## 4. Разбиение выборки и конвейер предобработки"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "438d9331",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Число признаков после кодирования: 13\n",
      "Первые 20 преобразованных признаков:\n",
      "['num__credit_score', 'num__age', 'num__tenure', 'num__balance', 'num__products_number', 'num__credit_card', 'num__active_member', 'num__estimated_salary', 'cat__country_France', 'cat__country_Germany', 'cat__country_Spain', 'cat__gender_Female', 'cat__gender_Male']\n"
     ]
    }
   ],
   "source": [
    "X_trainval, X_test, y_trainval, y_test = train_test_split(\n",
    "    X, y, test_size=0.20, random_state=42, stratify=y\n",
    ")\n",
    "\n",
    "X_train, X_val, y_train, y_val = train_test_split(\n",
    "    X_trainval, y_trainval, test_size=0.20, random_state=42, stratify=y_trainval\n",
    ")\n",
    "\n",
    "numeric_transformer = Pipeline(\n",
    "    steps=[\n",
    "        (\"imputer\", SimpleImputer(strategy=\"median\")),\n",
    "        (\"scaler\", StandardScaler()),\n",
    "    ]\n",
    ")\n",
    "\n",
    "categorical_transformer = Pipeline(\n",
    "    steps=[\n",
    "        (\"imputer\", SimpleImputer(strategy=\"most_frequent\")),\n",
    "        (\"onehot\", OneHotEncoder(handle_unknown=\"ignore\")),\n",
    "    ]\n",
    ")\n",
    "\n",
    "preprocessor = ColumnTransformer(\n",
    "    transformers=[\n",
    "        (\"num\", numeric_transformer, numeric_features),\n",
    "        (\"cat\", categorical_transformer, categorical_features),\n",
    "    ]\n",
    ")\n",
    "\n",
    "X_train_proc = preprocessor.fit_transform(X_train)\n",
    "X_val_proc = preprocessor.transform(X_val)\n",
    "X_test_proc = preprocessor.transform(X_test)\n",
    "X_trainval_proc = preprocessor.transform(X_trainval)\n",
    "\n",
    "feature_names = preprocessor.get_feature_names_out()\n",
    "print(f\"Число признаков после кодирования: {len(feature_names)}\")\n",
    "print(\"Первые 20 преобразованных признаков:\")\n",
    "print(feature_names[:20].tolist())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "06d970ed",
   "metadata": {},
   "source": [
    "## 5. Обучение нейросети"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "bb36151b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>epoch</th>\n",
       "      <th>train_loss</th>\n",
       "      <th>train_accuracy</th>\n",
       "      <th>val_accuracy</th>\n",
       "      <th>val_balanced_accuracy</th>\n",
       "      <th>val_precision_macro</th>\n",
       "      <th>val_recall_macro</th>\n",
       "      <th>val_f1_macro</th>\n",
       "      <th>val_roc_auc</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>50</th>\n",
       "      <td>51</td>\n",
       "      <td>0.305017</td>\n",
       "      <td>0.874375</td>\n",
       "      <td>0.848125</td>\n",
       "      <td>0.687788</td>\n",
       "      <td>0.792460</td>\n",
       "      <td>0.687788</td>\n",
       "      <td>0.718826</td>\n",
       "      <td>0.842068</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51</th>\n",
       "      <td>52</td>\n",
       "      <td>0.304558</td>\n",
       "      <td>0.875000</td>\n",
       "      <td>0.848125</td>\n",
       "      <td>0.687788</td>\n",
       "      <td>0.792460</td>\n",
       "      <td>0.687788</td>\n",
       "      <td>0.718826</td>\n",
       "      <td>0.841873</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>53</td>\n",
       "      <td>0.304035</td>\n",
       "      <td>0.874844</td>\n",
       "      <td>0.848125</td>\n",
       "      <td>0.685506</td>\n",
       "      <td>0.794318</td>\n",
       "      <td>0.685506</td>\n",
       "      <td>0.717047</td>\n",
       "      <td>0.841810</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>53</th>\n",
       "      <td>54</td>\n",
       "      <td>0.303556</td>\n",
       "      <td>0.875625</td>\n",
       "      <td>0.849375</td>\n",
       "      <td>0.688573</td>\n",
       "      <td>0.796404</td>\n",
       "      <td>0.688573</td>\n",
       "      <td>0.720262</td>\n",
       "      <td>0.841820</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54</th>\n",
       "      <td>55</td>\n",
       "      <td>0.303062</td>\n",
       "      <td>0.875938</td>\n",
       "      <td>0.849375</td>\n",
       "      <td>0.688573</td>\n",
       "      <td>0.796404</td>\n",
       "      <td>0.688573</td>\n",
       "      <td>0.720262</td>\n",
       "      <td>0.841938</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>55</th>\n",
       "      <td>56</td>\n",
       "      <td>0.302570</td>\n",
       "      <td>0.876094</td>\n",
       "      <td>0.848125</td>\n",
       "      <td>0.687788</td>\n",
       "      <td>0.792460</td>\n",
       "      <td>0.687788</td>\n",
       "      <td>0.718826</td>\n",
       "      <td>0.841875</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>56</th>\n",
       "      <td>57</td>\n",
       "      <td>0.302126</td>\n",
       "      <td>0.875781</td>\n",
       "      <td>0.848750</td>\n",
       "      <td>0.688181</td>\n",
       "      <td>0.794422</td>\n",
       "      <td>0.688181</td>\n",
       "      <td>0.719543</td>\n",
       "      <td>0.841815</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>57</th>\n",
       "      <td>58</td>\n",
       "      <td>0.301631</td>\n",
       "      <td>0.876406</td>\n",
       "      <td>0.848750</td>\n",
       "      <td>0.689322</td>\n",
       "      <td>0.793505</td>\n",
       "      <td>0.689322</td>\n",
       "      <td>0.720422</td>\n",
       "      <td>0.841543</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>58</th>\n",
       "      <td>59</td>\n",
       "      <td>0.301215</td>\n",
       "      <td>0.876406</td>\n",
       "      <td>0.850625</td>\n",
       "      <td>0.691641</td>\n",
       "      <td>0.798460</td>\n",
       "      <td>0.691641</td>\n",
       "      <td>0.723455</td>\n",
       "      <td>0.841630</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>59</th>\n",
       "      <td>60</td>\n",
       "      <td>0.300726</td>\n",
       "      <td>0.876406</td>\n",
       "      <td>0.850625</td>\n",
       "      <td>0.691641</td>\n",
       "      <td>0.798460</td>\n",
       "      <td>0.691641</td>\n",
       "      <td>0.723455</td>\n",
       "      <td>0.841550</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    epoch  train_loss  train_accuracy  val_accuracy  val_balanced_accuracy  val_precision_macro  val_recall_macro  val_f1_macro  val_roc_auc\n",
       "50     51    0.305017        0.874375      0.848125               0.687788             0.792460          0.687788      0.718826     0.842068\n",
       "51     52    0.304558        0.875000      0.848125               0.687788             0.792460          0.687788      0.718826     0.841873\n",
       "52     53    0.304035        0.874844      0.848125               0.685506             0.794318          0.685506      0.717047     0.841810\n",
       "53     54    0.303556        0.875625      0.849375               0.688573             0.796404          0.688573      0.720262     0.841820\n",
       "54     55    0.303062        0.875938      0.849375               0.688573             0.796404          0.688573      0.720262     0.841938\n",
       "55     56    0.302570        0.876094      0.848125               0.687788             0.792460          0.687788      0.718826     0.841875\n",
       "56     57    0.302126        0.875781      0.848750               0.688181             0.794422          0.688181      0.719543     0.841815\n",
       "57     58    0.301631        0.876406      0.848750               0.689322             0.793505          0.689322      0.720422     0.841543\n",
       "58     59    0.301215        0.876406      0.850625               0.691641             0.798460          0.691641      0.723455     0.841630\n",
       "59     60    0.300726        0.876406      0.850625               0.691641             0.798460          0.691641      0.723455     0.841550"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Лучшая эпоха по validation F1-macro: 26\n"
     ]
    }
   ],
   "source": [
    "clf = MLPClassifier(\n",
    "    hidden_layer_sizes=(64, 32),\n",
    "    activation=\"relu\",\n",
    "    solver=\"adam\",\n",
    "    alpha=1e-4,\n",
    "    learning_rate_init=1e-3,\n",
    "    max_iter=1,\n",
    "    warm_start=True,\n",
    "    random_state=42,\n",
    ")\n",
    "\n",
    "history = []\n",
    "best_model = None\n",
    "best_val_f1 = -np.inf\n",
    "best_state = None\n",
    "\n",
    "for epoch in range(60):\n",
    "    clf.fit(X_train_proc, y_train)\n",
    "\n",
    "    train_pred = clf.predict(X_train_proc)\n",
    "    val_pred = clf.predict(X_val_proc)\n",
    "    train_proba = clf.predict_proba(X_train_proc)[:, 1]\n",
    "    val_proba = clf.predict_proba(X_val_proc)[:, 1]\n",
    "\n",
    "    row = {\n",
    "        \"epoch\": epoch + 1,\n",
    "        \"train_loss\": float(clf.loss_),\n",
    "        \"train_accuracy\": accuracy_score(y_train, train_pred),\n",
    "        \"val_accuracy\": accuracy_score(y_val, val_pred),\n",
    "        \"val_balanced_accuracy\": balanced_accuracy_score(y_val, val_pred),\n",
    "        \"val_precision_macro\": precision_score(y_val, val_pred, average=\"macro\", zero_division=0),\n",
    "        \"val_recall_macro\": recall_score(y_val, val_pred, average=\"macro\", zero_division=0),\n",
    "        \"val_f1_macro\": f1_score(y_val, val_pred, average=\"macro\", zero_division=0),\n",
    "        \"val_roc_auc\": roc_auc_score(y_val, val_proba),\n",
    "    }\n",
    "    history.append(row)\n",
    "\n",
    "    if row[\"val_f1_macro\"] > best_val_f1:\n",
    "        best_val_f1 = row[\"val_f1_macro\"]\n",
    "        best_state = {\n",
    "            \"coefs_\": [w.copy() for w in clf.coefs_],\n",
    "            \"intercepts_\": [b.copy() for b in clf.intercepts_],\n",
    "            \"n_layers_\": clf.n_layers_,\n",
    "            \"n_outputs_\": clf.n_outputs_,\n",
    "            \"out_activation_\": clf.out_activation_,\n",
    "            \"classes_\": clf.classes_.copy(),\n",
    "            \"loss_curve_\": list(getattr(clf, \"loss_curve_\", [])),\n",
    "            \"_label_binarizer\": getattr(clf, \"_label_binarizer\", None),\n",
    "            \"best_iteration\": epoch + 1,\n",
    "        }\n",
    "\n",
    "history_df = pd.DataFrame(history)\n",
    "display(history_df.tail(10))\n",
    "\n",
    "# восстанавливаем лучшую модель по валидации\n",
    "clf_best = MLPClassifier(\n",
    "    hidden_layer_sizes=(64, 32),\n",
    "    activation=\"relu\",\n",
    "    solver=\"adam\",\n",
    "    alpha=1e-4,\n",
    "    learning_rate_init=1e-3,\n",
    "    max_iter=1,\n",
    "    warm_start=True,\n",
    "    random_state=42,\n",
    ")\n",
    "clf_best.fit(X_train_proc, y_train)\n",
    "\n",
    "clf_best.coefs_ = [w.copy() for w in best_state[\"coefs_\"]]\n",
    "clf_best.intercepts_ = [b.copy() for b in best_state[\"intercepts_\"]]\n",
    "clf_best.n_layers_ = best_state[\"n_layers_\"]\n",
    "clf_best.n_outputs_ = best_state[\"n_outputs_\"]\n",
    "clf_best.out_activation_ = best_state[\"out_activation_\"]\n",
    "clf_best.classes_ = best_state[\"classes_\"]\n",
    "clf_best.loss_curve_ = best_state[\"loss_curve_\"]\n",
    "if best_state[\"_label_binarizer\"] is not None:\n",
    "    clf_best._label_binarizer = best_state[\"_label_binarizer\"]\n",
    "\n",
    "print(f\"Лучшая эпоха по validation F1-macro: {best_state['best_iteration']}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "684dba63",
   "metadata": {},
   "source": [
    "## 6. Оценка качества модели"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "417869e1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>split</th>\n",
       "      <th>accuracy</th>\n",
       "      <th>balanced_accuracy</th>\n",
       "      <th>precision_macro</th>\n",
       "      <th>recall_macro</th>\n",
       "      <th>f1_macro</th>\n",
       "      <th>roc_auc</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>train</td>\n",
       "      <td>0.869062</td>\n",
       "      <td>0.721479</td>\n",
       "      <td>0.841031</td>\n",
       "      <td>0.721479</td>\n",
       "      <td>0.758535</td>\n",
       "      <td>0.881983</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>validation</td>\n",
       "      <td>0.856875</td>\n",
       "      <td>0.698989</td>\n",
       "      <td>0.815710</td>\n",
       "      <td>0.698989</td>\n",
       "      <td>0.733349</td>\n",
       "      <td>0.845008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>test</td>\n",
       "      <td>0.861500</td>\n",
       "      <td>0.703607</td>\n",
       "      <td>0.829262</td>\n",
       "      <td>0.703607</td>\n",
       "      <td>0.740066</td>\n",
       "      <td>0.852868</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        split  accuracy  balanced_accuracy  precision_macro  recall_macro  f1_macro   roc_auc\n",
       "0       train  0.869062           0.721479         0.841031      0.721479  0.758535  0.881983\n",
       "1  validation  0.856875           0.698989         0.815710      0.698989  0.733349  0.845008\n",
       "2        test  0.861500           0.703607         0.829262      0.703607  0.740066  0.852868"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Матрица ошибок на тесте:\n",
      "[[1545   48]\n",
      " [ 229  178]]\n",
      "\n",
      "Классификационный отчёт на тесте:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0     0.8709    0.9699    0.9177      1593\n",
      "           1     0.7876    0.4373    0.5624       407\n",
      "\n",
      "    accuracy                         0.8615      2000\n",
      "   macro avg     0.8293    0.7036    0.7401      2000\n",
      "weighted avg     0.8540    0.8615    0.8454      2000\n",
      "\n"
     ]
    }
   ],
   "source": [
    "def classification_metrics(y_true, y_pred, y_proba):\n",
    "    return {\n",
    "        \"accuracy\": accuracy_score(y_true, y_pred),\n",
    "        \"balanced_accuracy\": balanced_accuracy_score(y_true, y_pred),\n",
    "        \"precision_macro\": precision_score(y_true, y_pred, average=\"macro\", zero_division=0),\n",
    "        \"recall_macro\": recall_score(y_true, y_pred, average=\"macro\", zero_division=0),\n",
    "        \"f1_macro\": f1_score(y_true, y_pred, average=\"macro\", zero_division=0),\n",
    "        \"roc_auc\": roc_auc_score(y_true, y_proba),\n",
    "    }\n",
    "\n",
    "pred_train = clf_best.predict(X_train_proc)\n",
    "pred_val = clf_best.predict(X_val_proc)\n",
    "pred_test = clf_best.predict(X_test_proc)\n",
    "\n",
    "proba_train = clf_best.predict_proba(X_train_proc)[:, 1]\n",
    "proba_val = clf_best.predict_proba(X_val_proc)[:, 1]\n",
    "proba_test = clf_best.predict_proba(X_test_proc)[:, 1]\n",
    "\n",
    "metrics_df = pd.DataFrame([\n",
    "    {\"split\": \"train\", **classification_metrics(y_train, pred_train, proba_train)},\n",
    "    {\"split\": \"validation\", **classification_metrics(y_val, pred_val, proba_val)},\n",
    "    {\"split\": \"test\", **classification_metrics(y_test, pred_test, proba_test)},\n",
    "])\n",
    "display(metrics_df)\n",
    "\n",
    "cm = confusion_matrix(y_test, pred_test)\n",
    "print(\"Матрица ошибок на тесте:\")\n",
    "print(cm)\n",
    "\n",
    "print(\"\\nКлассификационный отчёт на тесте:\")\n",
    "print(classification_report(y_test, pred_test, digits=4, zero_division=0))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cb4828cb",
   "metadata": {},
   "source": [
    "## 7. Объяснение вкладов признаков\n",
    "\n",
    "Используются два подхода:\n",
    "1. **Permutation importance** по тестовой выборке.\n",
    "2. **Весовая важность** по первой матрице весов нейросети с агрегацией к исходным признакам."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "6ae6d7e7",
   "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>feature</th>\n",
       "      <th>permutation_importance_mean</th>\n",
       "      <th>permutation_importance_std</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>age</td>\n",
       "      <td>0.128388</td>\n",
       "      <td>0.011757</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>products_number</td>\n",
       "      <td>0.114786</td>\n",
       "      <td>0.007941</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>active_member</td>\n",
       "      <td>0.047192</td>\n",
       "      <td>0.010103</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>country</td>\n",
       "      <td>0.017122</td>\n",
       "      <td>0.005304</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>credit_score</td>\n",
       "      <td>0.003505</td>\n",
       "      <td>0.004715</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>balance</td>\n",
       "      <td>0.003404</td>\n",
       "      <td>0.005860</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>gender</td>\n",
       "      <td>0.002775</td>\n",
       "      <td>0.003615</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>estimated_salary</td>\n",
       "      <td>0.000920</td>\n",
       "      <td>0.003214</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>credit_card</td>\n",
       "      <td>0.000638</td>\n",
       "      <td>0.002761</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>tenure</td>\n",
       "      <td>-0.000415</td>\n",
       "      <td>0.004435</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            feature  permutation_importance_mean  permutation_importance_std\n",
       "0               age                     0.128388                    0.011757\n",
       "1   products_number                     0.114786                    0.007941\n",
       "2     active_member                     0.047192                    0.010103\n",
       "3           country                     0.017122                    0.005304\n",
       "4      credit_score                     0.003505                    0.004715\n",
       "5           balance                     0.003404                    0.005860\n",
       "6            gender                     0.002775                    0.003615\n",
       "7  estimated_salary                     0.000920                    0.003214\n",
       "8       credit_card                     0.000638                    0.002761\n",
       "9            tenure                    -0.000415                    0.004435"
      ]
     },
     "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>feature</th>\n",
       "      <th>processed_weight_importance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>country</td>\n",
       "      <td>26.624398</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>gender</td>\n",
       "      <td>18.597539</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>age</td>\n",
       "      <td>12.513567</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>products_number</td>\n",
       "      <td>11.926637</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>active_member</td>\n",
       "      <td>11.507690</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>balance</td>\n",
       "      <td>10.565397</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>credit_score</td>\n",
       "      <td>9.607942</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>tenure</td>\n",
       "      <td>9.539036</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>estimated_salary</td>\n",
       "      <td>9.422905</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>credit_card</td>\n",
       "      <td>8.958306</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            feature  processed_weight_importance\n",
       "0           country                    26.624398\n",
       "1            gender                    18.597539\n",
       "2               age                    12.513567\n",
       "3   products_number                    11.926637\n",
       "4     active_member                    11.507690\n",
       "5           balance                    10.565397\n",
       "6      credit_score                     9.607942\n",
       "7            tenure                     9.539036\n",
       "8  estimated_salary                     9.422905\n",
       "9       credit_card                     8.958306"
      ]
     },
     "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>feature</th>\n",
       "      <th>permutation_importance_mean</th>\n",
       "      <th>permutation_importance_std</th>\n",
       "      <th>processed_weight_importance</th>\n",
       "      <th>rank_permutation</th>\n",
       "      <th>rank_weight</th>\n",
       "      <th>rank_mean</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>age</td>\n",
       "      <td>0.128388</td>\n",
       "      <td>0.011757</td>\n",
       "      <td>12.513567</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>country</td>\n",
       "      <td>0.017122</td>\n",
       "      <td>0.005304</td>\n",
       "      <td>26.624398</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>products_number</td>\n",
       "      <td>0.114786</td>\n",
       "      <td>0.007941</td>\n",
       "      <td>11.926637</td>\n",
       "      <td>2.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>active_member</td>\n",
       "      <td>0.047192</td>\n",
       "      <td>0.010103</td>\n",
       "      <td>11.507690</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>gender</td>\n",
       "      <td>0.002775</td>\n",
       "      <td>0.003615</td>\n",
       "      <td>18.597539</td>\n",
       "      <td>7.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>4.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>credit_score</td>\n",
       "      <td>0.003505</td>\n",
       "      <td>0.004715</td>\n",
       "      <td>9.607942</td>\n",
       "      <td>5.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>balance</td>\n",
       "      <td>0.003404</td>\n",
       "      <td>0.005860</td>\n",
       "      <td>10.565397</td>\n",
       "      <td>6.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>estimated_salary</td>\n",
       "      <td>0.000920</td>\n",
       "      <td>0.003214</td>\n",
       "      <td>9.422905</td>\n",
       "      <td>8.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>8.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>tenure</td>\n",
       "      <td>-0.000415</td>\n",
       "      <td>0.004435</td>\n",
       "      <td>9.539036</td>\n",
       "      <td>10.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>9.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>credit_card</td>\n",
       "      <td>0.000638</td>\n",
       "      <td>0.002761</td>\n",
       "      <td>8.958306</td>\n",
       "      <td>9.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>9.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            feature  permutation_importance_mean  permutation_importance_std  processed_weight_importance  rank_permutation  rank_weight  rank_mean\n",
       "0               age                     0.128388                    0.011757                    12.513567               1.0          3.0        2.0\n",
       "1           country                     0.017122                    0.005304                    26.624398               4.0          1.0        2.5\n",
       "2   products_number                     0.114786                    0.007941                    11.926637               2.0          4.0        3.0\n",
       "3     active_member                     0.047192                    0.010103                    11.507690               3.0          5.0        4.0\n",
       "4            gender                     0.002775                    0.003615                    18.597539               7.0          2.0        4.5\n",
       "5      credit_score                     0.003505                    0.004715                     9.607942               5.0          7.0        6.0\n",
       "6           balance                     0.003404                    0.005860                    10.565397               6.0          6.0        6.0\n",
       "7  estimated_salary                     0.000920                    0.003214                     9.422905               8.0          9.0        8.5\n",
       "8            tenure                    -0.000415                    0.004435                     9.539036              10.0          8.0        9.0\n",
       "9       credit_card                     0.000638                    0.002761                     8.958306               9.0         10.0        9.5"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 1) permutation importance считаем через pipeline\n",
    "full_pipeline = Pipeline(\n",
    "    steps=[\n",
    "        (\"preprocessor\", preprocessor),\n",
    "        (\"model\", clf_best),\n",
    "    ]\n",
    ")\n",
    "\n",
    "perm = permutation_importance(\n",
    "    estimator=full_pipeline,\n",
    "    X=X_test,\n",
    "    y=y_test,\n",
    "    n_repeats=10,\n",
    "    random_state=42,\n",
    "    scoring=\"f1_macro\",\n",
    ")\n",
    "\n",
    "perm_df = pd.DataFrame({\n",
    "    \"feature\": X.columns,\n",
    "    \"permutation_importance_mean\": perm.importances_mean,\n",
    "    \"permutation_importance_std\": perm.importances_std,\n",
    "}).sort_values(\"permutation_importance_mean\", ascending=False).reset_index(drop=True)\n",
    "\n",
    "display(perm_df.head(15))\n",
    "\n",
    "# 2) весовая важность\n",
    "first_layer_weights = np.abs(clf_best.coefs_[0])\n",
    "processed_weight_importance = first_layer_weights.sum(axis=1)\n",
    "\n",
    "weight_df = pd.DataFrame({\n",
    "    \"processed_feature\": feature_names,\n",
    "    \"processed_weight_importance\": processed_weight_importance,\n",
    "})\n",
    "\n",
    "def original_feature_name(processed_name: str) -> str:\n",
    "    # num__credit_score -> credit_score\n",
    "    # cat__country_France -> country\n",
    "    if processed_name.startswith(\"num__\"):\n",
    "        return processed_name.replace(\"num__\", \"\", 1)\n",
    "    if processed_name.startswith(\"cat__\"):\n",
    "        tail = processed_name.replace(\"cat__\", \"\", 1)\n",
    "        # для категориальных признаков берём исходное имя слева\n",
    "        candidates = sorted(categorical_features, key=len, reverse=True)\n",
    "        for c in candidates:\n",
    "            prefix = c + \"_\"\n",
    "            if tail == c or tail.startswith(prefix):\n",
    "                return c\n",
    "        return tail\n",
    "    return processed_name\n",
    "\n",
    "weight_df[\"feature\"] = weight_df[\"processed_feature\"].apply(original_feature_name)\n",
    "\n",
    "weight_agg_df = (\n",
    "    weight_df.groupby(\"feature\", as_index=False)[\"processed_weight_importance\"]\n",
    "    .sum()\n",
    "    .sort_values(\"processed_weight_importance\", ascending=False)\n",
    "    .reset_index(drop=True)\n",
    ")\n",
    "\n",
    "display(weight_agg_df.head(15))\n",
    "\n",
    "summary_importance = perm_df.merge(weight_agg_df, on=\"feature\", how=\"outer\").fillna(0)\n",
    "summary_importance[\"rank_permutation\"] = summary_importance[\"permutation_importance_mean\"].rank(ascending=False, method=\"average\")\n",
    "summary_importance[\"rank_weight\"] = summary_importance[\"processed_weight_importance\"].rank(ascending=False, method=\"average\")\n",
    "summary_importance[\"rank_mean\"] = (summary_importance[\"rank_permutation\"] + summary_importance[\"rank_weight\"]) / 2\n",
    "summary_importance = summary_importance.sort_values([\"rank_mean\", \"permutation_importance_mean\"], ascending=[True, False]).reset_index(drop=True)\n",
    "\n",
    "display(summary_importance.head(15))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5efb72fe",
   "metadata": {},
   "source": [
    "## 8. Визуализация важности признаков"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "85bd84e1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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fvutmjdvLnt7e9nb26t58+b69ttvrW4N/ffff2vp0qVq0KCBPDw8HnqejHhfUqtjx446dOhQsndGSzxPp06d9Mcff1j9G0908+ZNXb9+Pd3nR87FjAWALNGnTx/NmzdPQUFBOnDggHx8fLRq1SqFhYVp1qxZGT4z8OWXX+rcuXOW9cfbtm3Te++9J0nq1q2b5ZfRvn37av78+WrdurWGDRumXLlyacaMGSpUqFCS25dmhDJlyqhBgwZ64403FBcXp1mzZilfvnwaPny4Vb2LFy9aljek5IcfftCCBQtUr1495c2bV2fOnNH8+fPl6uqa7EWYD9O6dWvNmDFDLVu21Msvv6yoqCh99NFHKlOmjA4fPvzAY1u0aKFXXnlFw4cPV5s2bVSkSBFVr15dgYGB+uyzz3T16lUFBARo7969+uKLL9S+fXs988wzVm2cOXPG8jT3P/74Q3PnzpWHh0eGXcCd1niS4+zsrA0bNigwMFB16tTRjz/+qPXr1+vtt9+2/FodEBCg1157TcHBwQoPD1fz5s2VK1cunTx5UitXrtTs2bP1wgsvZEifHqRXr16aNGmSevXqpVq1amnbtm2W2ZV7JV6I/M477+ill15Srly51KZNGzVv3lyOjo5q06aNXnvtNcXGxmr+/PkqWLBgkuWD/v7++uSTT/Tee++pTJkyKliwYJIZCenuDRsmT56sHj16KCAgQF26dLHcbtbHx0eDBw/OnMHIQFWqVFGLFi2sbjcrSePHj7fUee+997Rp0yY1aNBAffv2lYODg+bNm6e4uDhNmTIlVefJiPcltd566y2tWrVKL774onr27Cl/f39duXJF69at06effqrq1aurW7du+vrrr/X6669ry5Ytql+/vhISEvT777/r66+/tjyLBU+YLLsfFYDH3oNuN2sYhvH3338bPXr0MPLnz284OjoaVatWTXI7zIy63WxAQIDl1pD3vxJvfZnowoULxgsvvGB4eHgYbm5uxnPPPWecPHkyVedRGm83O3XqVGP69OlG8eLFDScnJ6Nhw4bGoUOHrI5NvM3mwIEDrcoTb02ZePvJo0ePGs2bNzfy5ctnODo6GsWLFzdeeukl4/Dhw+mK0TAM4/PPPzfKli1rODk5GRUqVDBCQkKMsWPHJnlflcwtfC9fvmwUKFDA6rabt2/fNsaPH2/4+voauXLlMooXL26M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OcxHH32khIQEPfXUU1q9erVOnjypiIgIzZkzJ8nSp5UrV2rhwoU6ceKExo4dq71791ouhu7atavy58+vdu3aafv27Tp79qxCQ0M1YMAAXbx4UQkJCdq2bZuWLl2qDh066K+//tJff/1lufj43qUsD1OuXDl17dpV3bt315o1a3T27Fnt3btXwcHBWr9+vaS7Mwk7d+5U//79FR4erpMnT+rbb7994MXbY8eO1bJlyzR27FhFREToyJEjyf5y/zBLly5V6dKlU3xew4wZM3Tr1i3Lcp/EJUOJ//vRRx/p22+/1aZNmyRJTZs2Vd26ddW+fXv99NNPioyM1M6dO/XOO+9o//79aYrtxo0b+uyzzzRlypRk9/fr109XrlxRly5dtG/fPp0+fVobN25Ujx49Hri06mGOHTum8PBwXblyRdHR0QoPD7eapcgoZcuW1fnz57V8+XKdPn1ac+bM0TfffGNVJz3v89ChQ7V582ZNnDhRJ06c0BdffKG5c+dq2LBhGd4HAHeRWABADlOqVCn9+uuveuaZZzR06FBVqVJFzZo10+bNm/XJJ59Y1R0/fryWL1+uatWqafHixVq2bJllbXzu3Lm1bds2lShRQh06dFDFihX16quv6tatW/Lw8NCFCxcUEBCgGzduaMCAASpSpIiKFCmijh07Srq7jCctQkJC1L17dw0dOlTly5dX+/bttW/fPssyp2rVqmnr1q06ceKEGjZsKD8/P40ZM+aBS7AaNWqklStXat26dapRo4YaN26svXv3piku6e6X95RuRXr27FlNmDBB8+bNk5OTU7J1ihcvrvfff1+vv/66bt68KZPJpB9++EFPP/20evTooXLlyumll17SuXPnVKhQoTTFdvv2bUsbyfH29lZYWJgSEhLUvHlzVa1aVYMGDZKXl5fVtQ5p9eyzz8rPz0/fffedQkND5efnZ5ntykht27bV4MGD1b9/f9WoUUM7d+60uoZESt/7XLNmTX399ddavny5qlSpojFjxmjChAlWy+IAZCyTkdYrAQEAOYLJZNI333yT7qcmR0ZGqlGjRkmW3iTy8vJKsqQIAPDkYsYCAJAse3t7q4u475fWX94BAI83EgsAQLKKFy+uffv2pbj/+PHjjzAaAEB2x12hAOAxxUpXAMCjxIwFAAAAAJuRWAAAAACwGYkFAAAAAJuRWAAAAACwGYkFAAAAAJuRWAAAAACwGYkFAAAAAJuRWAAAAACwGYkFAAAAAJv9P11Lzb3+BU0AAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 800x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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IiIi+pJIBEEQVB0ElQ9bt27FwIEDkZycDJlMViptpqSkfJjE7b8LalKdUmmTiL5s8XPbqzoEIqLPRs5nteTkZBgYGBRYl3MsKF+bNm1ClSpVULFiRURFRWHChAno1atXqSUVRERERPT5YGJB+Xr27BmmTJmCZ8+ewcrKCj179sTs2bNVHRYRERERlUFMLChf48ePx/jx41UdBhERERGVA5xhS0RERERESmNiQURERERESmNiQURERERESmNiQURERERESmNiQURERERESmNiQURERERESuPtZqlMuDXdu9BfcyQiIiKisos9FkREREREpDQmFkREREREpDQmFkREREREpDQmFkREREREpDQmFkREREREpDQmFkREREREpDTebpbKBJepx6Am1VF1GERUxsTPba/qEIiIqIjYY0FEREREREpjYkFEREREREpjYkFEREREREpjYkFEREREREpjYkFEREREREpjYkFEREREREpjYkFEREREREpjYkFEREREREpjYkFEREREREr7YhILOzs7LF26VNVhlEkSiQQHDhxQdRhEREREVI59MYlFafPz80OXLl1UHQYRERERUZlQrhKLrKwsVYdARcRrRURERPRlUWli0axZM4wcORIjR46EoaEhTE1NERgYCEEQAHwYvjRz5kwMGDAABgYGGDZsGABg7969qFmzJqRSKezs7LBo0SKFdpOSktCxY0fIZDLY29tj69atCuXx8fGQSCSIjIwU17158wYSiQShoaHiutu3b6NDhw4wMDCAvr4+mjRpgri4OEybNg0bN27E//73P0gkEnG7rKwsjBw5ElZWVtDW1oatrS2CgoKKdC4kEgnWrVuHrl27QkdHB46Ojvj999/F8pCQEBgZGSlsc+DAAUgkEnF52rRpqFOnDjZs2IDKlStDT08Pw4cPR3Z2NubPnw9LS0uYm5tj9uzZufafmJiItm3bQiaToUqVKtizZ49C+ePHj9GrVy8YGRnB2NgYnTt3Rnx8vFie04Mze/ZsWFtbw8nJqUjHTURERESfB5X3WGzcuBEaGhqIiIjAsmXLsHjxYqxbt04sX7hwIWrXro3r168jMDAQV69eRa9evfD111/j5s2bmDZtGgIDAxESEiJu4+fnh8ePH+PMmTPYs2cPVq9ejaSkpGLF9fTpUzRt2hRSqRSnT5/G1atXMWjQILx//x4B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yqpUA/yUmpoaduzYgatXr8LFxQVjxozBggULxHItLS0cP34c5ubmaNeuHVxdXTF37lxx+FD37t3h4+OD5s2bw8zMDNu3b893X/369UNUVBSaNGmCypUrK5QFBwdjwIABGDduHJycnNClSxdcvnw5V73S9G/uc9y4cbhy5Qrc3Nwwa9YsLF68GN7e3gA+DJ06fPgwmjZtioEDB6JatWr4+uuv8ejRI1hYWCi9byIiIiIq/yRCzi/cFcOWLVvw/v17+Pn54erVq/Dx8cHr16+hpaWFkJAQhbsNERUkJSUFhoaGsPHfBTWpjqrDIaL/UPzcf2/YLBERlY6cz2rJyckwMDAosG6J5lh888034vN69erh0aNHuHPnDipXrgxTU9OSNElEREREROVYiYZCfUpHRwd169ZlUvH/tW3bFnp6enk+ivIbF0RERERE5U2Jeiw+niydl8WLF5comM/FunXr8M8//+RZpszvaxARERERlVUlSiyuX78uPr9w4QLq1asn/n6ERCIpncjKsYoVK6o6BCIiIiKi/1SJEoszZ86Iz/X19bFt2zZUqVKl1IIiIiIiIqLypVTmWBARERER0ZeNiQURERERESmtREOhfv/9d/G5XC7HqVOncOvWLXFdp06dlI+MiIiIiIjKjRIlFl26dFFY/vbbb8XnEokE2dnZSgVFRERERETlS4kSC7lcXtpx0Bfu1nTvQn/NkYiIiIjKLs6xICIiIiIipZUosXj58iWGDBmCgQMH4vXr15g3bx5q1aoFPz8/pKSklHaMRERERERUxpUosRg+fDiioqKQmJiIbt26YcuWLRgyZAgiIiLw448/lnaMRERERERUxpVojsXp06dx/PhxODg4oEKFCjhx4gRatGiBmjVrws/Pr5RDJCIiIiKisq5EPRZpaWkwNzeHgYEBdHR0YGtrCwCoVq0aXr58WaoBEhERERFR2VeixKJixYp49OgRAODIkSOoVKkSAOD58+cwNzcvveiIiIiIiKhcKNFQqKCgIBgaGgIAGjduLK6Pi4vDwIEDSycy+qK4TD0GNamOqsMgonzEz22v6hCIiKiMK1Fi0bNnzzzX9+7dW6lgiIiIiIiofCpRYlHYLWX5Q2dERERERF+WEiUWRkZGkEgkudYLggCJRILs7GylAyMiIiIiovKjRIlFlSpVkJSUhIkTJ6JRo0alHRMRERER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9vb2SEpKws8//1zodvr6+ggICMCYMWMgl8vRuHFjJCcnIywsDAYGBvD19S2NQyYiIiKicoJ3hSpHAgICoK6ujho1asDMzAxZWVkICwtDdnY22rRpA1dXV/j7+8PIyEgc4lQUGzZswPv371GvXj34+/tj1qxZRdpu5syZCAwMRFBQEJydneHj44NDhw7B3t6+pIdIREREROWURPh4cD3RfywlJQWGhoaw8d8FNamOqsMhKtfi57ZXdQhERPSZyfmslpycDAMDgwLrsseCiIiIiIiUxsSCiIiIiIiUxsSCiIiIiIiUxsSCiIiIiIiUxsSCiIiIiIiUxsSCiIiIiIiUxsSCiIiIiIiUxsSCiIiIiIiUpqHqAIgA4NZ070J/dIWIiIiIyi72WBARERERkdKYWBARERERkdKYWBARERERkdKYWBARERERkdKYWBARERERkdKYWBARERERkdKYWBARERERkdL4OxZUJrhMPQY1qY6qwyAql+Lntld1CEREROyxICIiIiIi5TGxICIiIiIipTGxICIiIiIipTGxICIiIiIipTGxICIiIiIipTGxICIiIiIipTGxICIiIiIipTGxICIiIiIipX22iYWfnx+6dOmi6jCK5b+MWSKR4MCBA//JvoiIiIjo81fuE4v4+HhIJBJERkYqrF+2bBlCQkL+9f2XxwSGiIiIiKi0aag6gH+LoaGhqkP4rGVlZUFLS0vVYRARERFRGVFmeizkcjmCgoJgb28PmUyG2rVrY8+ePQCAv//+G/369YOZmRlkMhkcHR0RHBwMALC3twcAuLm5QSKRoFmzZgBy9yQ0a9YMP/zwA/z9/VGhQgVYWFhg7dq1SEtLw8CBA6Gvrw8HBwccOXJE3CY7OxuDBw8WY3JycsKyZcvE8mnTpmHjxo343//+B4lEAolEgtDQUADA48eP0atXLxgZGcHY2BidO3dGfHy8Qttjx46FkZERTExMMH78eAiCUOTztWfPHri6ukImk8HExAStWrVCWloaAODy5cto3bo1TE1NYWhoCC8vL1y7dq3A9iZMmIBq1apBR0cHVapUQWBgIN69e6dwrHXq1MG6detgb28PbW1tbNq0CSYmJsjMzFRoq0uXLujfv3+Rj4WIiIiIyr8yk1gEBQVh06ZN+PXXX3H79m2MGTMG33zzDc6ePYvAwEBER0fjyJEjiImJwS+/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zz8RGBhY5PNkaGiI7t27Q09Pjz8WSERERPSFKhN3haLyr2XLlqhZsyaWL19erO1y7jTAu0IRlRzvCkVERP+WcndXKCq//v77b4SGhiI0NBSrV69WdThEREREpCJMLMqghIQE1KhRI9/y6OhoVK5c+T+MKH9ubm74+++/MW/ePDg5Oak6HCIiIiJSESYWZZC1tTUiIyMLLC8r4uPjVR0CEREREZUBTCzKIA0NDTg4OKg6DCIiIiKiIiszd4UiIiIiIqLyi4kFEREREREpjYkFEREREREpjYkFEREREREpjYkFEREREREpjXeFojLh1nTvQn/NkYiIiIjKLvZYEBERERGR0phYEBERERGR0phYEBERERGR0phYEBERERGR0phYEBERERGR0phYEBERERGR0ni7WSoTXKYeg5pUR9VhEJUZ8XPbqzoEIiKiYmGPBRERERERKY2JBRERERERKY2JBRERERERKY2JBRERERERKY2JBRERERERKY2JBRERERERKY2JBRERERERKY2JBRERERERKY2JBRERERERKY2JRRkUHx8PiUSCyMhIAEBoaCgkEgnevHmj0riK4tPYiYiIiOjLwMSiHPD09ERiYiIMDQ0BACEhITAyMlJtUEREREREH2Fi8S969+5dqbSjpaUFS0tLSCSSUmmvNGRlZak6BCIiIiIqQ5hYFJNcLsf8+fPh4OAAqVSKypUrY/bs2eIQoJ07d8LLywva2trYunUrAGDdunVwdnaGtrY2qlevjtWrVyu0GRERATc3N2hra8Pd3R3Xr19XKP94KFRoaCgGDhyI5ORkSCQSSCQSTJs2rdC4MzMzMWHCBNjY2EAqlcLBwQHr168HAGRnZ2Pw4MGwt7eHTCaDk5MTli1bprC9n58funTpgtmzZ8Pa2hpOTk5Fip2IiIiIvgwaqg6gvJk0aRLWrl2LJUuWoHHjxkhMTMSdO3fE8okTJ2LRokXih+2tW7diypQpWLlyJdzc3HD9+nUMHToUurq68PX1RWpqKjp06IDWrVtjy5YtePjwIUaPHp3v/j09PbF06VJMmTIFsbGxAAA9Pb1C4x4wYAAuXryI5cuXo3bt2nj48CFevnwJ4EOyVKlSJezevRsmJib4888/MWzYMFhZWaFXr15iG6dOnYKBgQFOnDgBAMWOHfiQ4GRmZorLKSkphcZORERERGUfE4ti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",
      "text/plain": [
       "<Figure size 800x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "top_n = 10\n",
    "plot_df = perm_df.head(top_n).sort_values(\"permutation_importance_mean\")\n",
    "\n",
    "plt.figure(figsize=(8, 5))\n",
    "plt.barh(plot_df[\"feature\"], plot_df[\"permutation_importance_mean\"])\n",
    "plt.title(\"Топ-10 признаков по permutation importance\")\n",
    "plt.xlabel(\"Среднее снижение F1-macro\")\n",
    "plt.ylabel(\"Признак\")\n",
    "plt.tight_layout()\n",
    "plt.show()\n",
    "\n",
    "plot_df2 = weight_agg_df.head(top_n).sort_values(\"processed_weight_importance\")\n",
    "\n",
    "plt.figure(figsize=(8, 5))\n",
    "plt.barh(plot_df2[\"feature\"], plot_df2[\"processed_weight_importance\"])\n",
    "plt.title(\"Топ-10 признаков по весовой важности нейросети\")\n",
    "plt.xlabel(\"Агрегированная абсолютная важность\")\n",
    "plt.ylabel(\"Признак\")\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b726d7d6",
   "metadata": {},
   "source": [
    "## 9. Финальная ячейка для написания итогового вывода\n",
    "\n",
    "Эта ячейка печатает только ключевую информацию, по которой затем можно написать краткий итог по реальным результатам."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "47590446",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "=== КЛЮЧЕВАЯ ИНФОРМАЦИЯ ДЛЯ ВЫВОДА ===\n",
      "Зависимая переменная: churn\n",
      "\n",
      "Число исходных признаков: 10\n",
      "Число признаков после кодирования: 13\n",
      "Архитектура нейросети: (64, 32)\n",
      "\n",
      "Распределение классов:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>share</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>churn</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.7963</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.2037</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        share\n",
       "churn        \n",
       "0      0.7963\n",
       "1      0.2037"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Метрики модели:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>split</th>\n",
       "      <th>accuracy</th>\n",
       "      <th>balanced_accuracy</th>\n",
       "      <th>precision_macro</th>\n",
       "      <th>recall_macro</th>\n",
       "      <th>f1_macro</th>\n",
       "      <th>roc_auc</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>train</td>\n",
       "      <td>0.869062</td>\n",
       "      <td>0.721479</td>\n",
       "      <td>0.841031</td>\n",
       "      <td>0.721479</td>\n",
       "      <td>0.758535</td>\n",
       "      <td>0.881983</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>validation</td>\n",
       "      <td>0.856875</td>\n",
       "      <td>0.698989</td>\n",
       "      <td>0.815710</td>\n",
       "      <td>0.698989</td>\n",
       "      <td>0.733349</td>\n",
       "      <td>0.845008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>test</td>\n",
       "      <td>0.861500</td>\n",
       "      <td>0.703607</td>\n",
       "      <td>0.829262</td>\n",
       "      <td>0.703607</td>\n",
       "      <td>0.740066</td>\n",
       "      <td>0.852868</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        split  accuracy  balanced_accuracy  precision_macro  recall_macro  f1_macro   roc_auc\n",
       "0       train  0.869062           0.721479         0.841031      0.721479  0.758535  0.881983\n",
       "1  validation  0.856875           0.698989         0.815710      0.698989  0.733349  0.845008\n",
       "2        test  0.861500           0.703607         0.829262      0.703607  0.740066  0.852868"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Топ-10 признаков по перестановочной важности:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>permutation_importance_mean</th>\n",
       "      <th>permutation_importance_std</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>age</td>\n",
       "      <td>0.128388</td>\n",
       "      <td>0.011757</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>products_number</td>\n",
       "      <td>0.114786</td>\n",
       "      <td>0.007941</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>active_member</td>\n",
       "      <td>0.047192</td>\n",
       "      <td>0.010103</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>country</td>\n",
       "      <td>0.017122</td>\n",
       "      <td>0.005304</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>credit_score</td>\n",
       "      <td>0.003505</td>\n",
       "      <td>0.004715</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>balance</td>\n",
       "      <td>0.003404</td>\n",
       "      <td>0.005860</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>gender</td>\n",
       "      <td>0.002775</td>\n",
       "      <td>0.003615</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>estimated_salary</td>\n",
       "      <td>0.000920</td>\n",
       "      <td>0.003214</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>credit_card</td>\n",
       "      <td>0.000638</td>\n",
       "      <td>0.002761</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>tenure</td>\n",
       "      <td>-0.000415</td>\n",
       "      <td>0.004435</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            feature  permutation_importance_mean  permutation_importance_std\n",
       "0               age                     0.128388                    0.011757\n",
       "1   products_number                     0.114786                    0.007941\n",
       "2     active_member                     0.047192                    0.010103\n",
       "3           country                     0.017122                    0.005304\n",
       "4      credit_score                     0.003505                    0.004715\n",
       "5           balance                     0.003404                    0.005860\n",
       "6            gender                     0.002775                    0.003615\n",
       "7  estimated_salary                     0.000920                    0.003214\n",
       "8       credit_card                     0.000638                    0.002761\n",
       "9            tenure                    -0.000415                    0.004435"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Топ-10 признаков по весовой важности нейросети:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>processed_weight_importance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>country</td>\n",
       "      <td>26.624398</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>gender</td>\n",
       "      <td>18.597539</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>age</td>\n",
       "      <td>12.513567</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>products_number</td>\n",
       "      <td>11.926637</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>active_member</td>\n",
       "      <td>11.507690</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>balance</td>\n",
       "      <td>10.565397</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>credit_score</td>\n",
       "      <td>9.607942</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>tenure</td>\n",
       "      <td>9.539036</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>estimated_salary</td>\n",
       "      <td>9.422905</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>credit_card</td>\n",
       "      <td>8.958306</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            feature  processed_weight_importance\n",
       "0           country                    26.624398\n",
       "1            gender                    18.597539\n",
       "2               age                    12.513567\n",
       "3   products_number                    11.926637\n",
       "4     active_member                    11.507690\n",
       "5           balance                    10.565397\n",
       "6      credit_score                     9.607942\n",
       "7            tenure                     9.539036\n",
       "8  estimated_salary                     9.422905\n",
       "9       credit_card                     8.958306"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Сводный рейтинг важности признаков:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>permutation_importance_mean</th>\n",
       "      <th>permutation_importance_std</th>\n",
       "      <th>processed_weight_importance</th>\n",
       "      <th>rank_permutation</th>\n",
       "      <th>rank_weight</th>\n",
       "      <th>rank_mean</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>age</td>\n",
       "      <td>0.128388</td>\n",
       "      <td>0.011757</td>\n",
       "      <td>12.513567</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>country</td>\n",
       "      <td>0.017122</td>\n",
       "      <td>0.005304</td>\n",
       "      <td>26.624398</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>products_number</td>\n",
       "      <td>0.114786</td>\n",
       "      <td>0.007941</td>\n",
       "      <td>11.926637</td>\n",
       "      <td>2.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>active_member</td>\n",
       "      <td>0.047192</td>\n",
       "      <td>0.010103</td>\n",
       "      <td>11.507690</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>gender</td>\n",
       "      <td>0.002775</td>\n",
       "      <td>0.003615</td>\n",
       "      <td>18.597539</td>\n",
       "      <td>7.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>4.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>credit_score</td>\n",
       "      <td>0.003505</td>\n",
       "      <td>0.004715</td>\n",
       "      <td>9.607942</td>\n",
       "      <td>5.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>balance</td>\n",
       "      <td>0.003404</td>\n",
       "      <td>0.005860</td>\n",
       "      <td>10.565397</td>\n",
       "      <td>6.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>estimated_salary</td>\n",
       "      <td>0.000920</td>\n",
       "      <td>0.003214</td>\n",
       "      <td>9.422905</td>\n",
       "      <td>8.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>8.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>tenure</td>\n",
       "      <td>-0.000415</td>\n",
       "      <td>0.004435</td>\n",
       "      <td>9.539036</td>\n",
       "      <td>10.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>9.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>credit_card</td>\n",
       "      <td>0.000638</td>\n",
       "      <td>0.002761</td>\n",
       "      <td>8.958306</td>\n",
       "      <td>9.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>9.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            feature  permutation_importance_mean  permutation_importance_std  processed_weight_importance  rank_permutation  rank_weight  rank_mean\n",
       "0               age                     0.128388                    0.011757                    12.513567               1.0          3.0        2.0\n",
       "1           country                     0.017122                    0.005304                    26.624398               4.0          1.0        2.5\n",
       "2   products_number                     0.114786                    0.007941                    11.926637               2.0          4.0        3.0\n",
       "3     active_member                     0.047192                    0.010103                    11.507690               3.0          5.0        4.0\n",
       "4            gender                     0.002775                    0.003615                    18.597539               7.0          2.0        4.5\n",
       "5      credit_score                     0.003505                    0.004715                     9.607942               5.0          7.0        6.0\n",
       "6           balance                     0.003404                    0.005860                    10.565397               6.0          6.0        6.0\n",
       "7  estimated_salary                     0.000920                    0.003214                     9.422905               8.0          9.0        8.5\n",
       "8            tenure                    -0.000415                    0.004435                     9.539036              10.0          8.0        9.0\n",
       "9       credit_card                     0.000638                    0.002761                     8.958306               9.0         10.0        9.5"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Последние эпохи обучения:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>epoch</th>\n",
       "      <th>train_loss</th>\n",
       "      <th>val_accuracy</th>\n",
       "      <th>val_balanced_accuracy</th>\n",
       "      <th>val_f1_macro</th>\n",
       "      <th>val_roc_auc</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>50</th>\n",
       "      <td>51</td>\n",
       "      <td>0.305017</td>\n",
       "      <td>0.848125</td>\n",
       "      <td>0.687788</td>\n",
       "      <td>0.718826</td>\n",
       "      <td>0.842068</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51</th>\n",
       "      <td>52</td>\n",
       "      <td>0.304558</td>\n",
       "      <td>0.848125</td>\n",
       "      <td>0.687788</td>\n",
       "      <td>0.718826</td>\n",
       "      <td>0.841873</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>53</td>\n",
       "      <td>0.304035</td>\n",
       "      <td>0.848125</td>\n",
       "      <td>0.685506</td>\n",
       "      <td>0.717047</td>\n",
       "      <td>0.841810</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>53</th>\n",
       "      <td>54</td>\n",
       "      <td>0.303556</td>\n",
       "      <td>0.849375</td>\n",
       "      <td>0.688573</td>\n",
       "      <td>0.720262</td>\n",
       "      <td>0.841820</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54</th>\n",
       "      <td>55</td>\n",
       "      <td>0.303062</td>\n",
       "      <td>0.849375</td>\n",
       "      <td>0.688573</td>\n",
       "      <td>0.720262</td>\n",
       "      <td>0.841938</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>55</th>\n",
       "      <td>56</td>\n",
       "      <td>0.302570</td>\n",
       "      <td>0.848125</td>\n",
       "      <td>0.687788</td>\n",
       "      <td>0.718826</td>\n",
       "      <td>0.841875</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>56</th>\n",
       "      <td>57</td>\n",
       "      <td>0.302126</td>\n",
       "      <td>0.848750</td>\n",
       "      <td>0.688181</td>\n",
       "      <td>0.719543</td>\n",
       "      <td>0.841815</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>57</th>\n",
       "      <td>58</td>\n",
       "      <td>0.301631</td>\n",
       "      <td>0.848750</td>\n",
       "      <td>0.689322</td>\n",
       "      <td>0.720422</td>\n",
       "      <td>0.841543</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>58</th>\n",
       "      <td>59</td>\n",
       "      <td>0.301215</td>\n",
       "      <td>0.850625</td>\n",
       "      <td>0.691641</td>\n",
       "      <td>0.723455</td>\n",
       "      <td>0.841630</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>59</th>\n",
       "      <td>60</td>\n",
       "      <td>0.300726</td>\n",
       "      <td>0.850625</td>\n",
       "      <td>0.691641</td>\n",
       "      <td>0.723455</td>\n",
       "      <td>0.841550</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    epoch  train_loss  val_accuracy  val_balanced_accuracy  val_f1_macro  val_roc_auc\n",
       "50     51    0.305017      0.848125               0.687788      0.718826     0.842068\n",
       "51     52    0.304558      0.848125               0.687788      0.718826     0.841873\n",
       "52     53    0.304035      0.848125               0.685506      0.717047     0.841810\n",
       "53     54    0.303556      0.849375               0.688573      0.720262     0.841820\n",
       "54     55    0.303062      0.849375               0.688573      0.720262     0.841938\n",
       "55     56    0.302570      0.848125               0.687788      0.718826     0.841875\n",
       "56     57    0.302126      0.848750               0.688181      0.719543     0.841815\n",
       "57     58    0.301631      0.848750               0.689322      0.720422     0.841543\n",
       "58     59    0.301215      0.850625               0.691641      0.723455     0.841630\n",
       "59     60    0.300726      0.850625               0.691641      0.723455     0.841550"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Первые 10 фактических и предсказанных значений на тесте:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>y_true</th>\n",
       "      <th>y_pred</th>\n",
       "      <th>y_pred_proba</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.012914</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.046042</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.027165</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.068894</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.093616</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.134348</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.023030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.242828</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.607625</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.068606</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   y_true  y_pred  y_pred_proba\n",
       "0       0       0      0.012914\n",
       "1       0       0      0.046042\n",
       "2       0       0      0.027165\n",
       "3       0       0      0.068894\n",
       "4       0       0      0.093616\n",
       "5       0       0      0.134348\n",
       "6       0       0      0.023030\n",
       "7       0       0      0.242828\n",
       "8       0       1      0.607625\n",
       "9       0       0      0.068606"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Матрица ошибок:\n",
      "[[1545   48]\n",
      " [ 229  178]]\n"
     ]
    }
   ],
   "source": [
    "print(\"=== КЛЮЧЕВАЯ ИНФОРМАЦИЯ ДЛЯ ВЫВОДА ===\")\n",
    "print(f\"Зависимая переменная: {target_col}\")\n",
    "print()\n",
    "\n",
    "print(f\"Число исходных признаков: {X.shape[1]}\")\n",
    "print(f\"Число признаков после кодирования: {len(feature_names)}\")\n",
    "print(\"Архитектура нейросети: (64, 32)\")\n",
    "print()\n",
    "\n",
    "print(\"Распределение классов:\")\n",
    "display(class_share.to_frame())\n",
    "\n",
    "print(\"Метрики модели:\")\n",
    "display(metrics_df)\n",
    "\n",
    "print(\"Топ-10 признаков по перестановочной важности:\")\n",
    "display(perm_df.head(10))\n",
    "\n",
    "print(\"Топ-10 признаков по весовой важности нейросети:\")\n",
    "display(weight_agg_df.head(10))\n",
    "\n",
    "print(\"Сводный рейтинг важности признаков:\")\n",
    "display(summary_importance.head(10))\n",
    "\n",
    "print(\"Последние эпохи обучения:\")\n",
    "display(history_df.tail(10)[[\"epoch\", \"train_loss\", \"val_accuracy\", \"val_balanced_accuracy\", \"val_f1_macro\", \"val_roc_auc\"]])\n",
    "\n",
    "pred_preview = pd.DataFrame({\n",
    "    \"y_true\": y_test.reset_index(drop=True).iloc[:10],\n",
    "    \"y_pred\": pd.Series(pred_test).iloc[:10],\n",
    "    \"y_pred_proba\": pd.Series(proba_test).iloc[:10],\n",
    "})\n",
    "print(\"Первые 10 фактических и предсказанных значений на тесте:\")\n",
    "display(pred_preview)\n",
    "\n",
    "print(\"Матрица ошибок:\")\n",
    "print(cm)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fb9d9614",
   "metadata": {},
   "source": [
    "Итог\n",
    "\n",
    "Зависимой переменной выбрана churn. Нейросеть с архитектурой (64, 32) показала на тестовой выборке accuracy = 0.862, balanced accuracy = 0.704, F1-macro = 0.740, ROC-AUC = 0.853, что соответствует приемлемому качеству классификации.\n",
    "\n",
    "По перестановочной важности наибольший вклад в прогноз вносят age, products_number, active_member, country. По весовой важности дополнительно выделяются gender, balance, credit_score. В сводном рейтинге наиболее значимыми признаками являются age, country, products_number, active_member, gender.\n",
    "\n",
    "Следовательно, вероятность оттока в первую очередь связана с возрастом клиента, числом продуктов, активностью клиента и страной, а сама модель даёт достаточно информативный и практически пригодный результат."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
