{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "b99f6df3",
   "metadata": {},
   "source": [
    "# Классификация цен на авиабилеты четырьмя способами\n",
    "\n",
    "В работе решается задача классификации по датасету цен на авиабилеты. Числовая целевая переменная автоматически преобразуется в 4 класса по квартилям, после чего сравниваются четыре подхода: классический классификатор по всем признакам, классический обёрточный метод отбора признаков, нейросеть по всем признакам и ансамбль нейросетей по трём методам отбора признаков."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "c91d2fd3",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "import os\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn.base import clone\n",
    "from sklearn.compose import ColumnTransformer\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import OneHotEncoder, StandardScaler, LabelEncoder\n",
    "from sklearn.impute import SimpleImputer\n",
    "from sklearn.metrics import (\n",
    "    accuracy_score, f1_score, precision_score, recall_score,\n",
    "    classification_report, confusion_matrix, ConfusionMatrixDisplay\n",
    ")\n",
    "from sklearn.ensemble import RandomForestClassifier, ExtraTreesClassifier\n",
    "from sklearn.feature_selection import RFE, SelectKBest, mutual_info_classif, SelectFromModel\n",
    "from sklearn.neural_network import MLPClassifier\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "RANDOM_STATE = 42\n",
    "DATA_PATH = 'flights.csv'\n",
    "\n",
    "assert os.path.exists(DATA_PATH), f'Файл {DATA_PATH} не найден.'\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "104fe9f6",
   "metadata": {},
   "source": [
    "## Загрузка и первичный осмотр данных"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "cd74a1d9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Размер: (15393, 7)\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>id</th>\n",
       "      <th>from</th>\n",
       "      <th>to</th>\n",
       "      <th>airline</th>\n",
       "      <th>departure</th>\n",
       "      <th>arrival</th>\n",
       "      <th>price</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>CPT</td>\n",
       "      <td>DUR</td>\n",
       "      <td>FlySafair</td>\n",
       "      <td>1742053500</td>\n",
       "      <td>1742061000</td>\n",
       "      <td>762</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>CPT</td>\n",
       "      <td>DUR</td>\n",
       "      <td>LIFT Airline</td>\n",
       "      <td>1742015400</td>\n",
       "      <td>1742022900</td>\n",
       "      <td>865</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>CPT</td>\n",
       "      <td>DUR</td>\n",
       "      <td>LIFT Airline</td>\n",
       "      <td>1742038200</td>\n",
       "      <td>1742045700</td>\n",
       "      <td>865</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>CPT</td>\n",
       "      <td>DUR</td>\n",
       "      <td>FlySafair</td>\n",
       "      <td>1742057400</td>\n",
       "      <td>1742064900</td>\n",
       "      <td>762</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>CPT</td>\n",
       "      <td>DUR</td>\n",
       "      <td>FlySafair</td>\n",
       "      <td>1742055600</td>\n",
       "      <td>1742063100</td>\n",
       "      <td>962</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id from   to       airline   departure     arrival  price\n",
       "0   1  CPT  DUR     FlySafair  1742053500  1742061000    762\n",
       "1   2  CPT  DUR  LIFT Airline  1742015400  1742022900    865\n",
       "2   3  CPT  DUR  LIFT Airline  1742038200  1742045700    865\n",
       "3   4  CPT  DUR     FlySafair  1742057400  1742064900    762\n",
       "4   5  CPT  DUR     FlySafair  1742055600  1742063100    962"
      ]
     },
     "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>id</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>from</th>\n",
       "      <td>object</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>to</th>\n",
       "      <td>object</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>airline</th>\n",
       "      <td>object</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>departure</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>arrival</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>price</th>\n",
       "      <td>int64</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            dtype\n",
       "id          int64\n",
       "from       object\n",
       "to         object\n",
       "airline    object\n",
       "departure   int64\n",
       "arrival     int64\n",
       "price       int64"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "df = pd.read_csv(DATA_PATH)\n",
    "print('Размер:', df.shape)\n",
    "display(df.head())\n",
    "print('\\nТипы данных:')\n",
    "display(df.dtypes.to_frame('dtype'))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "95d77e71",
   "metadata": {},
   "source": [
    "## Нормализация имён столбцов и выбор целевой переменной"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "11a2e258",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Выбранная зависимая переменная: price\n",
      "Уникальных значений у целевой переменной: 707\n"
     ]
    }
   ],
   "source": [
    "\n",
    "def normalize_columns(columns):\n",
    "    out = []\n",
    "    for c in columns:\n",
    "        c = str(c).strip().lower().replace(' ', '_').replace('-', '_').replace('/', '_')\n",
    "        while '__' in c:\n",
    "            c = c.replace('__', '_')\n",
    "        out.append(c)\n",
    "    return out\n",
    "\n",
    "df = df.copy()\n",
    "df.columns = normalize_columns(df.columns)\n",
    "\n",
    "target_candidates = ['price', 'fare', 'ticket_price', 'cost']\n",
    "target_col = next((c for c in target_candidates if c in df.columns), None)\n",
    "\n",
    "if target_col is None:\n",
    "    numeric_cols = df.select_dtypes(include=[np.number]).columns.tolist()\n",
    "    uniqueness = {c: df[c].nunique() for c in numeric_cols}\n",
    "    target_col = sorted(numeric_cols, key=lambda c: uniqueness[c], reverse=True)[0]\n",
    "\n",
    "print('Выбранная зависимая переменная:', target_col)\n",
    "print('Уникальных значений у целевой переменной:', df[target_col].nunique())\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bc958f47",
   "metadata": {},
   "source": [
    "## Подготовка данных к задаче классификации"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "481271c0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Размер матрицы признаков: (15393, 10)\n",
      "Распределение классов:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>count</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>target_class</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>high</th>\n",
       "      <td>3834</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>low</th>\n",
       "      <td>3896</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mid_high</th>\n",
       "      <td>3817</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mid_low</th>\n",
       "      <td>3846</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              count\n",
       "target_class       \n",
       "high           3834\n",
       "low            3896\n",
       "mid_high       3817\n",
       "mid_low        3846"
      ]
     },
     "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>from</th>\n",
       "      <th>to</th>\n",
       "      <th>airline</th>\n",
       "      <th>departure_hour</th>\n",
       "      <th>departure_dayofweek</th>\n",
       "      <th>departure_month</th>\n",
       "      <th>arrival_hour</th>\n",
       "      <th>arrival_dayofweek</th>\n",
       "      <th>arrival_month</th>\n",
       "      <th>flight_duration_hours</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>CPT</td>\n",
       "      <td>DUR</td>\n",
       "      <td>FlySafair</td>\n",
       "      <td>15</td>\n",
       "      <td>5</td>\n",
       "      <td>3</td>\n",
       "      <td>17</td>\n",
       "      <td>5</td>\n",
       "      <td>3</td>\n",
       "      <td>2.083333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>CPT</td>\n",
       "      <td>DUR</td>\n",
       "      <td>LIFT Airline</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>3</td>\n",
       "      <td>7</td>\n",
       "      <td>5</td>\n",
       "      <td>3</td>\n",
       "      <td>2.083333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>CPT</td>\n",
       "      <td>DUR</td>\n",
       "      <td>LIFT Airline</td>\n",
       "      <td>11</td>\n",
       "      <td>5</td>\n",
       "      <td>3</td>\n",
       "      <td>13</td>\n",
       "      <td>5</td>\n",
       "      <td>3</td>\n",
       "      <td>2.083333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>CPT</td>\n",
       "      <td>DUR</td>\n",
       "      <td>FlySafair</td>\n",
       "      <td>16</td>\n",
       "      <td>5</td>\n",
       "      <td>3</td>\n",
       "      <td>18</td>\n",
       "      <td>5</td>\n",
       "      <td>3</td>\n",
       "      <td>2.083333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>CPT</td>\n",
       "      <td>DUR</td>\n",
       "      <td>FlySafair</td>\n",
       "      <td>16</td>\n",
       "      <td>5</td>\n",
       "      <td>3</td>\n",
       "      <td>18</td>\n",
       "      <td>5</td>\n",
       "      <td>3</td>\n",
       "      <td>2.083333</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  from   to       airline  departure_hour  departure_dayofweek  \\\n",
       "0  CPT  DUR     FlySafair              15                    5   \n",
       "1  CPT  DUR  LIFT Airline               5                    5   \n",
       "2  CPT  DUR  LIFT Airline              11                    5   \n",
       "3  CPT  DUR     FlySafair              16                    5   \n",
       "4  CPT  DUR     FlySafair              16                    5   \n",
       "\n",
       "   departure_month  arrival_hour  arrival_dayofweek  arrival_month  \\\n",
       "0                3            17                  5              3   \n",
       "1                3             7                  5              3   \n",
       "2                3            13                  5              3   \n",
       "3                3            18                  5              3   \n",
       "4                3            18                  5              3   \n",
       "\n",
       "   flight_duration_hours  \n",
       "0               2.083333  \n",
       "1               2.083333  \n",
       "2               2.083333  \n",
       "3               2.083333  \n",
       "4               2.083333  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "data = df.copy()\n",
    "\n",
    "# Удаление несодержательных идентификаторов\n",
    "drop_cols = [c for c in data.columns if c == 'id' or c.startswith('unnamed')]\n",
    "data = data.drop(columns=drop_cols, errors='ignore')\n",
    "\n",
    "# Временные признаки\n",
    "for col in ['departure', 'arrival']:\n",
    "    if col in data.columns:\n",
    "        dt = pd.to_datetime(data[col], unit='s', errors='coerce')\n",
    "        data[f'{col}_hour'] = dt.dt.hour\n",
    "        data[f'{col}_dayofweek'] = dt.dt.dayofweek\n",
    "        data[f'{col}_month'] = dt.dt.month\n",
    "\n",
    "if {'departure', 'arrival'}.issubset(data.columns):\n",
    "    dep_dt = pd.to_datetime(data['departure'], unit='s', errors='coerce')\n",
    "    arr_dt = pd.to_datetime(data['arrival'], unit='s', errors='coerce')\n",
    "    data['flight_duration_hours'] = (arr_dt - dep_dt).dt.total_seconds() / 3600.0\n",
    "\n",
    "data = data.drop(columns=['departure', 'arrival'], errors='ignore')\n",
    "\n",
    "# Цель -> 4 класса по квартилям\n",
    "y_raw = data[target_col].copy()\n",
    "q = y_raw.quantile([0.25, 0.5, 0.75]).values\n",
    "bins = [-np.inf, q[0], q[1], q[2], np.inf]\n",
    "labels = ['low', 'mid_low', 'mid_high', 'high']\n",
    "data['target_class'] = pd.cut(y_raw, bins=bins, labels=labels, include_lowest=True)\n",
    "\n",
    "# На случай совпадающих квартилей\n",
    "if data['target_class'].isna().any():\n",
    "    data['target_class'] = pd.qcut(y_raw.rank(method='first'), q=4, labels=labels)\n",
    "\n",
    "X = data.drop(columns=[target_col, 'target_class'], errors='ignore')\n",
    "y = data['target_class'].astype(str)\n",
    "\n",
    "print('Размер матрицы признаков:', X.shape)\n",
    "print('Распределение классов:')\n",
    "display(y.value_counts().sort_index().to_frame('count'))\n",
    "display(X.head())\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "df1b1c1c",
   "metadata": {},
   "source": [
    "## Разделение выборки и препроцессинг"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "e44af8dc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Числовые признаки: ['departure_hour', 'departure_dayofweek', 'departure_month', 'arrival_hour', 'arrival_dayofweek', 'arrival_month', 'flight_duration_hours']\n",
      "Категориальные признаки: ['from', 'to', 'airline']\n",
      "Train: (12314, 10) Test: (3079, 10)\n",
      "Классы: ['high', 'low', 'mid_high', 'mid_low']\n"
     ]
    }
   ],
   "source": [
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(\n",
    "    X, y,\n",
    "    test_size=0.2,\n",
    "    random_state=RANDOM_STATE,\n",
    "    stratify=y\n",
    ")\n",
    "\n",
    "numeric_features = X_train.select_dtypes(include=[np.number]).columns.tolist()\n",
    "categorical_features = [c for c in X_train.columns if c not in numeric_features]\n",
    "\n",
    "print('Числовые признаки:', numeric_features)\n",
    "print('Категориальные признаки:', categorical_features)\n",
    "print('Train:', X_train.shape, 'Test:', X_test.shape)\n",
    "\n",
    "numeric_transformer = Pipeline([\n",
    "    ('imputer', SimpleImputer(strategy='median')),\n",
    "    ('scaler', StandardScaler())\n",
    "])\n",
    "\n",
    "try:\n",
    "    ohe = OneHotEncoder(handle_unknown='ignore', sparse_output=True)\n",
    "except TypeError:\n",
    "    ohe = OneHotEncoder(handle_unknown='ignore', sparse=True)\n",
    "\n",
    "categorical_transformer = Pipeline([\n",
    "    ('imputer', SimpleImputer(strategy='most_frequent')),\n",
    "    ('onehot', ohe)\n",
    "])\n",
    "\n",
    "preprocessor = ColumnTransformer([\n",
    "    ('num', numeric_transformer, numeric_features),\n",
    "    ('cat', categorical_transformer, categorical_features)\n",
    "], remainder='drop')\n",
    "\n",
    "label_encoder = LabelEncoder()\n",
    "y_train_enc = label_encoder.fit_transform(y_train)\n",
    "y_test_enc = label_encoder.transform(y_test)\n",
    "class_names = list(label_encoder.classes_)\n",
    "\n",
    "print('Классы:', class_names)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a7f3fcde",
   "metadata": {},
   "source": [
    "## Служебная функция оценки"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "22512036",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "results = []\n",
    "\n",
    "def evaluate_classifier(name, model, X_train_data, y_train_data, X_test_data, y_test_data, class_names):\n",
    "    model = clone(model)\n",
    "    model.fit(X_train_data, y_train_data)\n",
    "    pred = model.predict(X_test_data)\n",
    "\n",
    "    metrics = {\n",
    "        'model': name,\n",
    "        'accuracy': accuracy_score(y_test_data, pred),\n",
    "        'f1_macro': f1_score(y_test_data, pred, average='macro'),\n",
    "        'precision_macro': precision_score(y_test_data, pred, average='macro', zero_division=0),\n",
    "        'recall_macro': recall_score(y_test_data, pred, average='macro', zero_division=0),\n",
    "    }\n",
    "\n",
    "    print(f'===== {name} =====')\n",
    "    for k, v in metrics.items():\n",
    "        if k != 'model':\n",
    "            print(f'{k}: {v:.4f}')\n",
    "\n",
    "    print('\\nОтчёт по классам:')\n",
    "    print(classification_report(y_test_data, pred, target_names=class_names, zero_division=0))\n",
    "\n",
    "    cm = confusion_matrix(y_test_data, pred)\n",
    "    disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=class_names)\n",
    "    fig, ax = plt.subplots(figsize=(5, 4))\n",
    "    disp.plot(ax=ax, colorbar=False)\n",
    "    ax.set_title(name)\n",
    "    plt.show()\n",
    "\n",
    "    return metrics, model\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "12bdff45",
   "metadata": {},
   "source": [
    "## 1. Классификатор по всем признакам"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "d18e5550",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "===== RandomForest по всем признакам =====\n",
      "accuracy: 0.7483\n",
      "f1_macro: 0.7479\n",
      "precision_macro: 0.7477\n",
      "recall_macro: 0.7481\n",
      "\n",
      "Отчёт по классам:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "        high       0.83      0.83      0.83       767\n",
      "         low       0.80      0.81      0.80       779\n",
      "    mid_high       0.70      0.70      0.70       764\n",
      "     mid_low       0.66      0.65      0.66       769\n",
      "\n",
      "    accuracy                           0.75      3079\n",
      "   macro avg       0.75      0.75      0.75      3079\n",
      "weighted avg       0.75      0.75      0.75      3079\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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t331ifLgwQM4OjpqhAmQc8jq5bEKWndu4Dk5OeXb/uqxfh0dHbRs2TJPXS+vy93dXaNdX18fLi4ueWqpWLGi+smb69atWwgPD4etrW2+63j27BmAnFD/8ccfMXjwYEyaNAktWrTABx98gO7du2uEYUko6H4COdv94MGDSElJgbGx8WvHefkwjVwux7Rp0/C///0PAPD8+XMkJiaiVq1arx3j1q1buHr16hu318sGDBiAtWvXYvz48QgMDISvr2++j7Xi8urYJiYmcHBwKPAc5TfffIP09HRMmTIFX3zxRb592rRpg5CQEABA27Zt8dtvv+XpM3DgwDfWplKpsGLFCqxatQr37t1Ddna2epm1tXWe/lOnTsXZs2chk8mQmpqa75hFeS0ASu/vwUB6BzRs2FD9DrVr165o2rQpPvnkE0RERKiPG//888/o378/unbtigkTJqBChQrQ0dHBwoULNSY/5NLR0cl3XaIUfvG+oHVroyZDQ8M8bSqVCl5eXvjmm2/yvU1ucBoaGuL48eM4duwY/vzzTxw4cAC//fYb3n//fRw6dKjA+yMlS5YsQe3atZGVlYXz589j3rx50NXVxcyZMws9hkqlQqtWrTBx4sR8l1evXj1PW+/evTFx4kScPXsWGzduxLRp0976PhS3Fy9eYPHixZg8ebLG3uervv32W7x48QJhYWFYuHAhhg0bhp9//lmjz4wZM9RHH3J16tRJ4/qCBQswffp0DBw4EHPnzoWVlRXkcjnGjBmT7553SEgIAgMD8d1332Ho0KEIDQ3VeINa1NcCoPT+Hgykd0zuA6t58+b47rvvMGnSJADAjh074OLigp07d2qcpC3KC8vLqlSpAiDn3e+rIiIi8vQ9cuQIkpKSNPaSbt68qTFWachdV0REBFxcXNTtmZmZuHfvXoF7Vi+rVq0arly5ghYtWhR4wjuXXC5HixYt0KJFC3zzzTdYsGABpk6dimPHjqFly5ZvvP3bevl+vurmzZuwsbF5494RANSrVw8BAQEAcj5eEBkZia+//hrTp0+Hra2t+qT961SrVg3JycmF2ra5rK2t0blzZ3z66ad49uwZevbsme/hrOJy69YtNG/eXH09OTkZ0dHRaN++fZ6+8+bNg6mpKUaPHv3aMXMnVLRr1w4VKlRA3759MXXqVPWRAQDw8vLKs11efaOyY8cONG/eHOvX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",
      "text/plain": [
       "<Figure size 500x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "classic_full_model = Pipeline([\n",
    "    ('preprocessor', preprocessor),\n",
    "    ('clf', RandomForestClassifier(\n",
    "        n_estimators=250,\n",
    "        max_depth=None,\n",
    "        min_samples_leaf=1,\n",
    "        random_state=RANDOM_STATE,\n",
    "        n_jobs=-1,\n",
    "        class_weight='balanced_subsample'\n",
    "    ))\n",
    "])\n",
    "\n",
    "res1, model1 = evaluate_classifier(\n",
    "    'RandomForest по всем признакам',\n",
    "    classic_full_model,\n",
    "    X_train, y_train_enc, X_test, y_test_enc,\n",
    "    class_names\n",
    ")\n",
    "results.append(res1)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5acf1295",
   "metadata": {},
   "source": [
    "## Кодирование признаков для методов отбора и нейросетей"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "50b8da3a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Размерность после кодирования: (12314, 42)\n",
      "Число признаков после кодирования: 42\n",
      "Пример признаков: ['num__departure_hour', 'num__departure_dayofweek', 'num__departure_month', 'num__arrival_hour', 'num__arrival_dayofweek', 'num__arrival_month', 'num__flight_duration_hours', 'cat__from_CPT', 'cat__from_DUR', 'cat__from_GBE']\n"
     ]
    }
   ],
   "source": [
    "\n",
    "X_train_prepared = preprocessor.fit_transform(X_train)\n",
    "X_test_prepared = preprocessor.transform(X_test)\n",
    "\n",
    "feature_names = [str(f) for f in preprocessor.get_feature_names_out()]\n",
    "\n",
    "if hasattr(X_train_prepared, 'toarray'):\n",
    "    X_train_dense = X_train_prepared.toarray().astype(np.float32)\n",
    "    X_test_dense = X_test_prepared.toarray().astype(np.float32)\n",
    "else:\n",
    "    X_train_dense = np.asarray(X_train_prepared, dtype=np.float32)\n",
    "    X_test_dense = np.asarray(X_test_prepared, dtype=np.float32)\n",
    "\n",
    "print('Размерность после кодирования:', X_train_dense.shape)\n",
    "print('Число признаков после кодирования:', len(feature_names))\n",
    "print('Пример признаков:', feature_names[:10])\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "addeef93",
   "metadata": {},
   "source": [
    "## 2. Классический обёрточный метод отбора признаков"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "07492c02",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Отобрано признаков: 14\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>selected_feature</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>cat__from_DUR</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>cat__from_HRE</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>cat__from_JNB</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>cat__from_LUN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>cat__from_MPM</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>cat__from_VFA</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>cat__to_DUR</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>cat__to_GBE</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>cat__to_JNB</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>cat__to_LUN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>cat__to_MPM</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>cat__airline_Air Botswana</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>cat__airline_LAM</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>cat__airline_Uganda Airlines</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                selected_feature\n",
       "0                  cat__from_DUR\n",
       "1                  cat__from_HRE\n",
       "2                  cat__from_JNB\n",
       "3                  cat__from_LUN\n",
       "4                  cat__from_MPM\n",
       "5                  cat__from_VFA\n",
       "6                    cat__to_DUR\n",
       "7                    cat__to_GBE\n",
       "8                    cat__to_JNB\n",
       "9                    cat__to_LUN\n",
       "10                   cat__to_MPM\n",
       "11     cat__airline_Air Botswana\n",
       "12              cat__airline_LAM\n",
       "13  cat__airline_Uganda Airlines"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "===== LogisticRegression + RFE =====\n",
      "accuracy: 0.5986\n",
      "f1_macro: 0.6119\n",
      "precision_macro: 0.6399\n",
      "recall_macro: 0.5980\n",
      "\n",
      "Отчёт по классам:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "        high       0.88      0.64      0.74       767\n",
      "         low       0.83      0.73      0.78       779\n",
      "    mid_high       0.44      0.51      0.47       764\n",
      "     mid_low       0.41      0.51      0.46       769\n",
      "\n",
      "    accuracy                           0.60      3079\n",
      "   macro avg       0.64      0.60      0.61      3079\n",
      "weighted avg       0.64      0.60      0.61      3079\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "base_estimator = LogisticRegression(\n",
    "    max_iter=2000,\n",
    "    solver='lbfgs',\n",
    "    class_weight='balanced',\n",
    "    random_state=RANDOM_STATE\n",
    ")\n",
    "\n",
    "n_select = max(5, min(15, X_train_dense.shape[1] // 3))\n",
    "selector_rfe = RFE(\n",
    "    estimator=base_estimator,\n",
    "    n_features_to_select=n_select,\n",
    "    step=0.2\n",
    ")\n",
    "selector_rfe.fit(X_train_dense, y_train_enc)\n",
    "\n",
    "mask_rfe = selector_rfe.get_support()\n",
    "selected_features_rfe = [f for f, m in zip(feature_names, mask_rfe) if m]\n",
    "\n",
    "print('Отобрано признаков:', len(selected_features_rfe))\n",
    "display(pd.DataFrame({'selected_feature': selected_features_rfe}))\n",
    "\n",
    "X_train_rfe = X_train_dense[:, mask_rfe]\n",
    "X_test_rfe = X_test_dense[:, mask_rfe]\n",
    "\n",
    "wrapper_model = LogisticRegression(\n",
    "    max_iter=2000,\n",
    "    solver='lbfgs',\n",
    "    class_weight='balanced',\n",
    "    random_state=RANDOM_STATE\n",
    ")\n",
    "\n",
    "res2, model2 = evaluate_classifier(\n",
    "    'LogisticRegression + RFE',\n",
    "    wrapper_model,\n",
    "    X_train_rfe, y_train_enc, X_test_rfe, y_test_enc,\n",
    "    class_names\n",
    ")\n",
    "results.append(res2)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ec0d782e",
   "metadata": {},
   "source": [
    "## 3. Нейросеть по всем признакам"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "3d4139a0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "===== MLP по всем признакам =====\n",
      "accuracy: 0.7577\n",
      "f1_macro: 0.7546\n",
      "precision_macro: 0.7551\n",
      "recall_macro: 0.7573\n",
      "\n",
      "Отчёт по классам:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "        high       0.83      0.84      0.84       767\n",
      "         low       0.77      0.88      0.82       779\n",
      "    mid_high       0.71      0.69      0.70       764\n",
      "     mid_low       0.71      0.62      0.66       769\n",
      "\n",
      "    accuracy                           0.76      3079\n",
      "   macro avg       0.76      0.76      0.75      3079\n",
      "weighted avg       0.76      0.76      0.75      3079\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "nn_full_model = MLPClassifier(\n",
    "    hidden_layer_sizes=(64, 32),\n",
    "    activation='relu',\n",
    "    alpha=1e-4,\n",
    "    batch_size=256,\n",
    "    learning_rate_init=1e-3,\n",
    "    max_iter=80,\n",
    "    early_stopping=True,\n",
    "    random_state=RANDOM_STATE\n",
    ")\n",
    "\n",
    "res3, model3 = evaluate_classifier(\n",
    "    'MLP по всем признакам',\n",
    "    nn_full_model,\n",
    "    X_train_dense, y_train_enc, X_test_dense, y_test_enc,\n",
    "    class_names\n",
    ")\n",
    "results.append(res3)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8c7b7264",
   "metadata": {},
   "source": [
    "## 4. Ансамбль нейросетей по трём методам отбора признаков"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "de650706",
   "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>method</th>\n",
       "      <th>n_features</th>\n",
       "      <th>features_preview</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>SelectKBest_mutual_info</td>\n",
       "      <td>14</td>\n",
       "      <td>num__departure_hour, num__departure_dayofweek,...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>SelectFromModel_ExtraTrees</td>\n",
       "      <td>21</td>\n",
       "      <td>num__departure_hour, num__departure_dayofweek,...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>RFE_logreg</td>\n",
       "      <td>14</td>\n",
       "      <td>cat__from_DUR, cat__from_HRE, cat__from_JNB, c...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                       method  n_features  \\\n",
       "0     SelectKBest_mutual_info          14   \n",
       "1  SelectFromModel_ExtraTrees          21   \n",
       "2                  RFE_logreg          14   \n",
       "\n",
       "                                    features_preview  \n",
       "0  num__departure_hour, num__departure_dayofweek,...  \n",
       "1  num__departure_hour, num__departure_dayofweek,...  \n",
       "2  cat__from_DUR, cat__from_HRE, cat__from_JNB, c...  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "# Метод 1: filter\n",
    "k_best_k = max(5, min(15, X_train_dense.shape[1] // 3))\n",
    "selector_kbest = SelectKBest(score_func=mutual_info_classif, k=k_best_k)\n",
    "selector_kbest.fit(X_train_dense, y_train_enc)\n",
    "mask_kbest = selector_kbest.get_support()\n",
    "\n",
    "# Метод 2: embedded\n",
    "selector_embedded = SelectFromModel(\n",
    "    ExtraTreesClassifier(n_estimators=200, random_state=RANDOM_STATE, n_jobs=-1),\n",
    "    threshold='median'\n",
    ")\n",
    "selector_embedded.fit(X_train_dense, y_train_enc)\n",
    "mask_embedded = selector_embedded.get_support()\n",
    "\n",
    "# Метод 3: wrapper\n",
    "mask_wrapper = mask_rfe.copy()\n",
    "\n",
    "selection_methods = {\n",
    "    'SelectKBest_mutual_info': mask_kbest,\n",
    "    'SelectFromModel_ExtraTrees': mask_embedded,\n",
    "    'RFE_logreg': mask_wrapper\n",
    "}\n",
    "\n",
    "selection_summary = []\n",
    "for method_name, mask in selection_methods.items():\n",
    "    feats = [f for f, m in zip(feature_names, mask) if m]\n",
    "    selection_summary.append({\n",
    "        'method': method_name,\n",
    "        'n_features': len(feats),\n",
    "        'features_preview': ', '.join(feats[:8])\n",
    "    })\n",
    "display(pd.DataFrame(selection_summary))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "b9fbf96e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "===== Ансамбль MLP по 3 методам отбора признаков =====\n",
      "accuracy: 0.7178\n",
      "f1_macro: 0.7200\n",
      "precision_macro: 0.7260\n",
      "recall_macro: 0.7175\n",
      "\n",
      "Отчёт по классам:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "        high       0.83      0.78      0.80       767\n",
      "         low       0.83      0.76      0.79       779\n",
      "    mid_high       0.65      0.62      0.64       764\n",
      "     mid_low       0.60      0.71      0.65       769\n",
      "\n",
      "    accuracy                           0.72      3079\n",
      "   macro avg       0.73      0.72      0.72      3079\n",
      "weighted avg       0.73      0.72      0.72      3079\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "test_probas = []\n",
    "\n",
    "for i, (method_name, mask) in enumerate(selection_methods.items()):\n",
    "    Xtr = X_train_dense[:, mask]\n",
    "    Xte = X_test_dense[:, mask]\n",
    "\n",
    "    nn_member = MLPClassifier(\n",
    "        hidden_layer_sizes=(64, 32),\n",
    "        activation='relu',\n",
    "        alpha=1e-4,\n",
    "        batch_size=256,\n",
    "        learning_rate_init=1e-3,\n",
    "        max_iter=80,\n",
    "        early_stopping=True,\n",
    "        random_state=RANDOM_STATE + i\n",
    "    )\n",
    "    nn_member.fit(Xtr, y_train_enc)\n",
    "    test_probas.append(nn_member.predict_proba(Xte))\n",
    "\n",
    "avg_proba = np.mean(np.stack(test_probas, axis=0), axis=0)\n",
    "ensemble_pred = avg_proba.argmax(axis=1)\n",
    "\n",
    "res4 = {\n",
    "    'model': 'Ансамбль MLP по 3 методам отбора признаков',\n",
    "    'accuracy': accuracy_score(y_test_enc, ensemble_pred),\n",
    "    'f1_macro': f1_score(y_test_enc, ensemble_pred, average='macro'),\n",
    "    'precision_macro': precision_score(y_test_enc, ensemble_pred, average='macro', zero_division=0),\n",
    "    'recall_macro': recall_score(y_test_enc, ensemble_pred, average='macro', zero_division=0),\n",
    "}\n",
    "results.append(res4)\n",
    "\n",
    "print('===== Ансамбль MLP по 3 методам отбора признаков =====')\n",
    "for k, v in res4.items():\n",
    "    if k != 'model':\n",
    "        print(f'{k}: {v:.4f}')\n",
    "\n",
    "print('\\nОтчёт по классам:')\n",
    "print(classification_report(y_test_enc, ensemble_pred, target_names=class_names, zero_division=0))\n",
    "\n",
    "cm = confusion_matrix(y_test_enc, ensemble_pred)\n",
    "disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=class_names)\n",
    "fig, ax = plt.subplots(figsize=(5, 4))\n",
    "disp.plot(ax=ax, colorbar=False)\n",
    "ax.set_title('Ансамбль MLP')\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8f3e260c",
   "metadata": {},
   "source": [
    "## Сравнение моделей"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "3e551a31",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>model</th>\n",
       "      <th>accuracy</th>\n",
       "      <th>f1_macro</th>\n",
       "      <th>precision_macro</th>\n",
       "      <th>recall_macro</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>MLP по всем признакам</td>\n",
       "      <td>0.757714</td>\n",
       "      <td>0.754581</td>\n",
       "      <td>0.755056</td>\n",
       "      <td>0.757263</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>RandomForest по всем признакам</td>\n",
       "      <td>0.748295</td>\n",
       "      <td>0.747865</td>\n",
       "      <td>0.747687</td>\n",
       "      <td>0.748084</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Ансамбль MLP по 3 методам отбора признаков</td>\n",
       "      <td>0.717766</td>\n",
       "      <td>0.719962</td>\n",
       "      <td>0.725995</td>\n",
       "      <td>0.717522</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>LogisticRegression + RFE</td>\n",
       "      <td>0.598571</td>\n",
       "      <td>0.611858</td>\n",
       "      <td>0.639892</td>\n",
       "      <td>0.598009</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                        model  accuracy  f1_macro  \\\n",
       "0                       MLP по всем признакам  0.757714  0.754581   \n",
       "1              RandomForest по всем признакам  0.748295  0.747865   \n",
       "2  Ансамбль MLP по 3 методам отбора признаков  0.717766  0.719962   \n",
       "3                    LogisticRegression + RFE  0.598571  0.611858   \n",
       "\n",
       "   precision_macro  recall_macro  \n",
       "0         0.755056      0.757263  \n",
       "1         0.747687      0.748084  \n",
       "2         0.725995      0.717522  \n",
       "3         0.639892      0.598009  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Лучшая модель по F1-macro:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>model</th>\n",
       "      <th>accuracy</th>\n",
       "      <th>f1_macro</th>\n",
       "      <th>precision_macro</th>\n",
       "      <th>recall_macro</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>MLP по всем признакам</td>\n",
       "      <td>0.757714</td>\n",
       "      <td>0.754581</td>\n",
       "      <td>0.755056</td>\n",
       "      <td>0.757263</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   model  accuracy  f1_macro  precision_macro  recall_macro\n",
       "0  MLP по всем признакам  0.757714  0.754581         0.755056      0.757263"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "results_df = pd.DataFrame(results).sort_values(['f1_macro', 'accuracy'], ascending=False).reset_index(drop=True)\n",
    "display(results_df)\n",
    "\n",
    "print('Лучшая модель по F1-macro:')\n",
    "display(results_df.iloc[[0]])\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a157244a",
   "metadata": {},
   "source": [
    "Итог\n",
    "\n",
    "Построены четыре модели классификации: классический классификатор по всем признакам, модель с обёрточным отбором признаков (RFE), нейросеть по всем признакам и ансамбль нейросетей по различным методам отбора признаков.\n",
    "\n",
    "Сравнение метрик на тестовой выборке показало, что наилучшие результаты демонстрирует MLP по всем признакам (accuracy ≈ 0.758, F1-macro ≈ 0.755). Модели с отбором признаков и ансамбль нейросетей показали более низкую точность.\n",
    "\n",
    "Следовательно, лучшей является нейросеть MLP, обученная по всем признакам."
   ]
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
