{ "cells": [ { "cell_type": "markdown", "id": "83c83caf533cefef", "metadata": {}, "source": [ "# Imputing missing values — восстановление пропущенных значений\n", "\n", "## Цель работы\n", "Сравнить различные методы импутации (восстановления) пропущенных значений и оценить их влияние на качество предсказания регрессионной модели.\n", "\n", "## Используемые алгоритмы\n", "1. **Zero Imputation** — замена пропусков на 0\n", "2. **Mean Imputation** — замена на среднее значение каждого признака\n", "3. **KNN Imputation** — восстановление на основе k ближайших соседей\n", "4. **Iterative Imputation** — итеративное восстановление через регрессию\n", "\n", "## Датасеты\n", "1. **Встроенный**: Diabetes dataset (прогрессирование диабета)\n", "2. **Внешний**: Boston dataset (openml ID 531) — цены на недвижимость" ] }, { "cell_type": "code", "execution_count": 1, "id": "303b7bfd-746b-47de-bffa-426025f7e64d", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import openml\n", "\n", "from sklearn.datasets import load_diabetes\n", "from sklearn.ensemble import RandomForestRegressor\n", "from sklearn.experimental import enable_iterative_imputer\n", "from sklearn.impute import IterativeImputer, KNNImputer, SimpleImputer\n", "from sklearn.model_selection import cross_val_score\n", "from sklearn.pipeline import make_pipeline\n", "from sklearn.preprocessing import RobustScaler" ] }, { "cell_type": "markdown", "id": "61e3110a-75c7-49e6-b876-af4fa2e05ccc", "metadata": {}, "source": [ "## 1. Загрузка встроенного датасета (Diabetes)" ] }, { "cell_type": "code", "execution_count": 2, "id": "332702a6-4696-4e17-8940-2d2087b7bb53", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Diabetes shape: (300, 10)\n" ] } ], "source": [ "X_diabetes, y_diabetes = load_diabetes(return_X_y=True)\n", "X_diabetes = X_diabetes[:300]\n", "y_diabetes = y_diabetes[:300]\n", "\n", "print(f\"Diabetes shape: {X_diabetes.shape}\")" ] }, { "cell_type": "markdown", "id": "9fd4921f-80d3-4e37-8883-3c1404a5ebef", "metadata": {}, "source": [ "## 2. Загрузка внешнего датасета (Boston Housing, openml ID 531)" ] }, { "cell_type": "code", "execution_count": 3, "id": "ba038b1c-c4f3-4417-943e-79e929cf2f92", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Boston shape: (300, 11)\n", "Features: ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'TAX', 'PTRATIO', 'B', 'LSTAT']\n" ] } ], "source": [ "dataset = openml.datasets.get_dataset(531)\n", "X_boston, y_boston, _, _ = dataset.get_data(target=dataset.default_target_attribute)\n", "\n", "# Оставляем только числовые колонки\n", "X_boston = X_boston.select_dtypes(include=[np.number])\n", "\n", "X_boston = X_boston.iloc[:300]\n", "y_boston = y_boston[:300]\n", "\n", "print(f\"Boston shape: {X_boston.shape}\")\n", "print(f\"Features: {list(X_boston.columns)}\")" ] }, { "cell_type": "markdown", "id": "aa9cea18-edf6-42d0-b1f2-f544d416b11a", "metadata": {}, "source": [ "## 3. Функция для добавления пропусков" ] }, { "cell_type": "code", "execution_count": 4, "id": "9c7adf58-8896-46bd-8ca4-24164082cee3", "metadata": {}, "outputs": [], "source": [ "def add_missing_values(X_full, y_full, rng, missing_rate=0.75):\n", " n_samples, n_features = X_full.shape\n", " \n", " n_missing_samples = int(n_samples * missing_rate)\n", " missing_samples = np.zeros(n_samples, dtype=bool)\n", " missing_samples[:n_missing_samples] = True\n", " rng.shuffle(missing_samples)\n", " missing_features = rng.randint(0, n_features, n_missing_samples)\n", " \n", " X_missing = X_full.copy()\n", " X_missing[missing_samples, missing_features] = np.nan\n", " \n", " return X_missing, y_full.copy()" ] }, { "cell_type": "code", "execution_count": 5, "id": "42d9078e-7b9c-44c3-becc-95fc76f3a6b4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Пропусков в Diabetes: 225\n", "Пропусков в Boston: 225\n" ] } ], "source": [ "rng = np.random.RandomState(42)\n", "\n", "X_miss_diabetes, y_miss_diabetes = add_missing_values(X_diabetes, y_diabetes, rng)\n", "X_miss_boston, y_miss_boston = add_missing_values(X_boston.values, y_boston, rng)\n", "\n", "print(f\"Пропусков в Diabetes: {np.isnan(X_miss_diabetes).sum()}\")\n", "print(f\"Пропусков в Boston: {np.isnan(X_miss_boston).sum()}\")" ] }, { "cell_type": "markdown", "id": "dc1185c1-b395-48b7-8ed6-669858778172", "metadata": {}, "source": [ "## 4. Функция оценки качества" ] }, { "cell_type": "code", "execution_count": 6, "id": "b9a2586e-f1a2-4674-9587-e6cac08353bb", "metadata": {}, "outputs": [], "source": [ "def get_score(X, y, imputer=None):\n", " regressor = RandomForestRegressor(random_state=42, n_estimators=100)\n", " \n", " if imputer is not None:\n", " if isinstance(imputer, KNNImputer):\n", " estimator = make_pipeline(RobustScaler(), imputer, regressor)\n", " else:\n", " estimator = make_pipeline(imputer, regressor)\n", " else:\n", " estimator = regressor\n", " \n", " scores = cross_val_score(estimator, X, y, scoring=\"neg_mean_squared_error\", cv=5)\n", " return -scores.mean(), scores.std()" ] }, { "cell_type": "markdown", "id": "b9407a0a-2008-4963-a6f9-a00f90f91c58", "metadata": {}, "source": [ "## 5. Оценка на полных данных (без пропусков)" ] }, { "cell_type": "code", "execution_count": 7, "id": "c8c6472c-a801-4d84-b263-e6ca90fc219c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Diabetes full data MSE: 3280.8053 (+- 204.9818)\n", "Boston full data MSE: 11.7523 (+- 4.2667)\n" ] } ], "source": [ "score_full_diabetes, std_full_diabetes = get_score(X_diabetes, y_diabetes)\n", "score_full_boston, std_full_boston = get_score(X_boston, y_boston)\n", "\n", "print(f\"Diabetes full data MSE: {score_full_diabetes:.4f} (+- {std_full_diabetes:.4f})\")\n", "print(f\"Boston full data MSE: {score_full_boston:.4f} (+- {std_full_boston:.4f})\")" ] }, { "cell_type": "markdown", "id": "2fe7a2d7-7ac8-418b-9c31-20fc15722955", "metadata": {}, "source": [ "## 6. Zero Imputation (замена на 0)" ] }, { "cell_type": "code", "execution_count": 8, "id": "399a216c-04f5-4ec4-bf86-806e50a6ca53", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Diabetes Zero Imputation MSE: 3486.2388\n", "Boston Zero Imputation MSE: 12.6945\n" ] } ], "source": [ "imputer = SimpleImputer(strategy=\"constant\", fill_value=0, add_indicator=True)\n", "\n", "score_zero_diabetes, std_zero_diabetes = get_score(X_miss_diabetes, y_miss_diabetes, imputer)\n", "score_zero_boston, std_zero_boston = get_score(X_miss_boston, y_miss_boston, imputer)\n", "\n", "print(f\"Diabetes Zero Imputation MSE: {score_zero_diabetes:.4f}\")\n", "print(f\"Boston Zero Imputation MSE: {score_zero_boston:.4f}\")" ] }, { "cell_type": "markdown", "id": "749b0715-4a7e-4b2d-b037-a629b156f62a", "metadata": {}, "source": [ "## 7. Mean Imputation (замена на среднее)" ] }, { "cell_type": "code", "execution_count": 9, "id": "f4674b11-66c1-4f10-bc93-66161cb4c4b5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Diabetes Mean Imputation MSE: 3502.5785\n", "Boston Mean Imputation MSE: 14.7035\n" ] } ], "source": [ "imputer = SimpleImputer(strategy=\"mean\", add_indicator=True)\n", "\n", "score_mean_diabetes, std_mean_diabetes = get_score(X_miss_diabetes, y_miss_diabetes, imputer)\n", "score_mean_boston, std_mean_boston = get_score(X_miss_boston, y_miss_boston, imputer)\n", "\n", "print(f\"Diabetes Mean Imputation MSE: {score_mean_diabetes:.4f}\")\n", "print(f\"Boston Mean Imputation MSE: {score_mean_boston:.4f}\")" ] }, { "cell_type": "markdown", "id": "2fa65a7c-456a-439b-b4f4-91137ba7c693", "metadata": {}, "source": [ "## 8. KNN Imputation" ] }, { "cell_type": "code", "execution_count": 10, "id": "df083835-9c54-4b48-81ee-b0a290c30d1b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Diabetes KNN Imputation MSE: 3528.8370\n", "Boston KNN Imputation MSE: 13.5778\n" ] } ], "source": [ "imputer = KNNImputer(add_indicator=True, n_neighbors=5)\n", "\n", "score_knn_diabetes, std_knn_diabetes = get_score(X_miss_diabetes, y_miss_diabetes, imputer)\n", "score_knn_boston, std_knn_boston = get_score(X_miss_boston, y_miss_boston, imputer)\n", "\n", "print(f\"Diabetes KNN Imputation MSE: {score_knn_diabetes:.4f}\")\n", "print(f\"Boston KNN Imputation MSE: {score_knn_boston:.4f}\")" ] }, { "cell_type": "markdown", "id": "b7d52ff2-30f6-4923-a276-5e808149a478", "metadata": {}, "source": [ "## 9. Iterative Imputation" ] }, { "cell_type": "code", "execution_count": 11, "id": "45f028f6-1624-49b1-bb02-fa4273460cbe", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Diabetes Iterative Imputation MSE: 3390.3575\n", "Boston Iterative Imputation MSE: 13.3785\n" ] } ], "source": [ "imputer = IterativeImputer(add_indicator=True, max_iter=10, random_state=42)\n", "\n", "score_iter_diabetes, std_iter_diabetes = get_score(X_miss_diabetes, y_miss_diabetes, imputer)\n", "score_iter_boston, std_iter_boston = get_score(X_miss_boston, y_miss_boston, imputer)\n", "\n", "print(f\"Diabetes Iterative Imputation MSE: {score_iter_diabetes:.4f}\")\n", "print(f\"Boston Iterative Imputation MSE: {score_iter_boston:.4f}\")" ] }, { "cell_type": "markdown", "id": "a40d952b-150c-4247-8923-9e4f4a7d78de", "metadata": {}, "source": [ "## 10. Собираем результаты в массивы" ] }, { "cell_type": "code", "execution_count": 12, "id": "c4daa7f0-f523-4728-8895-e8886dfcf1c0", "metadata": {}, "outputs": [], "source": [ "mses_diabetes = [score_full_diabetes, score_zero_diabetes, score_mean_diabetes, \n", " score_knn_diabetes, score_iter_diabetes]\n", "stds_diabetes = [std_full_diabetes, std_zero_diabetes, std_mean_diabetes, \n", " std_knn_diabetes, std_iter_diabetes]\n", "\n", "mses_boston = [score_full_boston, score_zero_boston, score_mean_boston, \n", " score_knn_boston, score_iter_boston]\n", "stds_boston = [std_full_boston, std_zero_boston, std_mean_boston, \n", " std_knn_boston, std_iter_boston]\n", "\n", "x_labels = [\"Full Data\", \"Zero Imputation\", \"Mean Imputation\", \n", " \"KNN Imputation\", \"Iterative Imputation\"]" ] }, { "cell_type": "markdown", "id": "de45a13b-61b5-42dc-9298-c75e2f80aac8", "metadata": {}, "source": [ "## 11. Визуализация" ] }, { "cell_type": "code", "execution_count": 13, "id": "978b607b-82f2-4881-a8cd-2b883603bd8c", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAAV7dJREFUeJzt3QeYVNXdP/ADIogi2FERFewN7C2J3WCNGqPGGBWxlwQ19jf2XqJRo4YUIRqjsetrjb3FgiYae40lsRsFxAYy/+d38s7+Z5cFFoSzO7ufz/OM7M7cmbnn3tm5x+/9nXM7VSqVSgIAAACAgjqXfDMAAAAACEIpAAAAAIoTSgEAAABQnFAKAAAAgOKEUgAAAAAUJ5QCAAAAoDihFAAAAADFCaUAAAAAKE4oBQAAAEBxQimANuq4445LnTp1mqbnLrroommLLbaY7usEANBWRf9n8ODBrb0awFQQSgEUMGLEiBwwVW+zzDJLWnDBBdOgQYPSeeedl8aMGdOm98Nnn32WQ7J77723+HvHe9Zuu27duqXevXun9dZbL51yyinpgw8+mObXfu6553K7Xn/99em6zgC0/2N53Oabb760/vrrp1tvvXWGve/bb7+dj1VPPvlkai1xzF1++eWbfSyOobEtzjrrrNSR1X4uunTpkuaaa660yiqrpKFDh+b+Rj32waCELkXeBYDshBNOSP369Uvjxo1L7777bu5gHHjggenss89ON954YxowYEDDlvr5z3+ejjjiiDax5aJDdPzxxzd0TFvDT3/607Taaqulr7/+OgdRf/3rX9Oxxx6bt92VV16ZNthgg6l+zegkRruiTXF2FQBaeiyvVCrpvffey2HVZpttlv73f/93hlQpRygVx6o4Tq244op20GS8+OKLqXPn1qu72HjjjdMuu+ySPxujRo1KTz31VPrDH/6QLrzwwnT66aengw8+uC77YDAjCaUACtp0003Tqquu2vD7kUceme6+++7cif3e976Xnn/++dS9e/f/fkF36ZJv/Nd3vvOd9IMf/KDR5ojO3ne/+9207bbb5oBpgQUWsLkAKHos33333XMF7+WXX27ofCuLaurWtOSSS6Yf//jHje477bTT0pZbbpl+9rOfpaWXXjoHmMD/Z/geQCuLCp+jjz46vfHGG+mPf/zjZOeUGj58eF4+hgtEx2vZZZdNF1100SRf+y9/+Us+qxrDBWPZa6+9dqJlPvnkk1yt1bdv3/yaiy++eD6bN2HChIay/HnnnTf/HGfqqqXpsX5VL7zwQg6MolQ93is661H5VSuqw+L5SyyxRF5m7rnnTt/+9rfTHXfcMc3bbuDAgemXv/xlbsOvfvWrhvtjW+63335pqaWWyiFfvNd2223XaJhenNmO+0IMvai2q1oef8MNN6TNN988D7OM7bLYYoulE088MVdqAUDVHHPMkY81TU8kjR07NgcR1eNrHJNiiFtU0dSK42AcD+N1evTokZc76qij8mNxTIoq4bDbbrs1HKviGFZ11VVX5WFisQ7zzDNPDkX+/e9/N3qPmGcpXjvu33rrrfPPcWw/5JBDZthx7bXXXsvH2egbzDrrrGnNNddMN998c7NDIpsOo68O3a8dsvbyyy/nk1Dzzz9/7kcstNBC6Yc//GGuSJrUnFLV13/ooYdylVK0ebbZZkvbbLPNRMP/o98TfZs47sf6Rt8gTnh903mqog9yxRVX5M/HySef3HD/V199lY455pi873r16pXXK07A3XPPPQ3LTKkP9o9//COvW//+/fM2iW0zZMiQ9NFHH03z+kJpTsEDtAE777xz7oBGiLTnnntOcrkIoJZbbrlcVRWdmxgqEOFLdKT233//RstG522HHXZI++yzT9p1111zoBWdw9tuuy2Xl1dLwtddd93cSd17773TwgsvnIfFRQXXO++8kwOf6AzF++677765E/f9738/P7c61PDZZ59N3/rWt1KfPn3ycMPoVMVwuuj0XnPNNfk5ITpQp556atpjjz3S6quvnkaPHp0ef/zx9Le//a1hfaZFhGFxljq2XbWzN3LkyNyO6KxGpzU6ddGGKHuPDmZ0NtdZZ508JDDm9Iptv8wyy+TnVv+Njmx02qMTG/9GRVt0HmO9zzzzzGleXwDqW4QgH374YQ6X3n///XT++eenTz/9tFGFTDwWx+oIGOIYFSeIbr/99nTooYfmY+4555zTcAyNauk4psawwAivXnnllRyiVI9JcX8cf/baa68cWoS111674VgVYVUEV3GMjeGE5557bn7+3//+9xx0VUX4FHNZrrHGGjkcu/POO9MvfvGLfNIljvFTEs+Pdjf18ccfT3RfrEesY/Qz4lgbwUwMY4ttcvXVVzf0DVoqApxY9y+//DL95Cc/yeFLbMebbrop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llvSa6+9lrbddtv0rW99K+2www4NzzvzzDNzuHb88cen22+/PQ0dOjQtueSSaeONN57ie/bt2zddc801+XUjBOrZs2fq3r17fmzs2LHp4IMPTgMGDEiffvppOuaYY/L6RMDVuXPn9Nhjj+Ug7s4770zLLbfcJCvGDjvssPwesd0WWWSRdMYZZ+Qw75VXXklzzTVXw3L/8z//k37xi1+keeedN1ewDRkypGEbA9BxjftiXKoncfysJ3FSC5ix6u17jBmn3o4RzBiOvR04lJowYUL60Y9+lLp06ZIuu+yyXKFT9atf/SpX/ZxyyikN91188cU5uHnppZdy0BOWWGKJHKzUhimxTDw/Xm/ppZdOb7/9dg60IsiJAKclxo0bly666KK02GKL5d+jUurSSy9N7733Xq7cWnbZZXNV0z333NMolIqQKiqzQqxjBDkRqrUklJppppkagqGoZIoArCqCqlqxLSIweu6559Lyyy+ffw5RRRXVZ5P60o02RSVYVKCF3/72t+mOO+5Iv//979Ohhx7asOzJJ5+c1l133fxztGfzzTdPX3zxRQ73morqq7hVjR49eoptBaA+Dd9+eKonw1N9rW+lUkkdgb4DranevseYcertGMGM0VGOva2lzQ3fqxUVRQ8//HC64YYb0uyzz97osaeeeioHPhEAVW8RMIXaYWurrLJKo+c9//zzaa211moUcEVQFNVF//rXv1q8bjFsrRpIhRg+GMPzYj1q73v//fcbPS/eu+nvsU7f1Msvv5yHBfbv3z9XUMW6hDfffLPFrxHbLcK22B5VM888c66warqOUZFVFUMgQ9O2Vp166ql57qrqLUJBAIBJ0XcAgI6hzVZKxbC4s846K91888252qmpCJG23HLLdPrpp0/0WDUkmZGldhHW1IqQq7n7otqrpapVWrVJbIRELRHbIobbRWXTggsumN83KqRicvcZobat1YBvUm098sgj89DC2kopwRRA+7TblbulenL+Zue39irQDH0HWlO9fY8x4zhGQAcNpWIepN133z2ddtppDZOTN7XyyivnuY+iIiiG97XUMsssk58XwU81TIkhdFGJtdBCC6UZ7ZFHHpno91inUB1iF1cfjKGJoXbS81CdC6p2AvWPPvoozzEVgdR3vvOdfN+DDz44xec1FZVfsVxsjwi4qqFYTHQek8VPq5hQPm4AtH8zz9L4BE1bZ56ItknfgdZUb99jzDiOEdABh+/F1fPianAxsfmPf/zj9O677za6ffDBB3m5/fffP/3nP//JQ9YiNImhZzFx+G677TbZ4GW//fZLb731VvrJT36SJzmPoYHHHntsruRp6XxS30QEPjHHVcx7FVfeu+qqq/Jk5yEmLV9zzTVzGBfD5eIqgT//+c8bPT/CogjT4sp/sS2iYiyuxBdzRf3mN7/JE5LHRO+1lUnVOaji9eMqfTHv1ahRo5r90o1J4WPuqFgu5qOKSeBjUvcICQEAAADabSgVw/XeeOONfAW7GIbX9Lbaaqvl5WKIWgQ8EUB997vfTSussEKu5onJvycXLvXp0ye/dlyNbuDAgfnKcRG4NA1/ZpSf/exn6fHHH8+VUCeddFI6++yzG1WDxQTl48ePz3NhRXtimabrH1fui8nFY86qAw44ILc3hjs+8cQTecjeQQcdlK/yVyuqyeJqgcOGDcvbLq5o2JwIxGLS9J133jlXo0XIFWFfBF8AAAAA00uniqnki4mhhhE0fZOhcO1BzCkVE54PvmJw6jrrf4cVAkBrGLblMBt+Ko7dUWkdF1QpTd8BaA2OETDj+w5trlIKAAAAgPZPKAUAAABAcW3y6nvt1euvv97aqwAAAADQJqiUAgAAAKA4oRQAAAAAxQmlAAAAAChOKAUAAABAcUIpAAAAAIoTSgEAAABQnFAKAAAAgOKEUgAAAAAUJ5QCAAAAoDihFAAAAADFCaUAAAAAKE4oBQAAAEBxQikAAAAAihNKAQAAAFCcUAoAAACA4oRSAAAAABQnlAIAAACgOKEUAAAAAMUJpQAAAAAoTigFAAAAQHFCKQAAAACKE0oBAAAAUJxQCgAAAIDihFIAAAAAFCeUAgAAAKA4oRQAAAAAxQmlAAAAAChOKAUAAABAcUIpAAAAAIrrUv4t4b/O3fTc1LNnT5sDAGgRfQcAaF9USgEAAABQnFAKAAAAgOKEUgAAAAAUJ5QCAAAAoDihFAAAAADFCaUAAAAAKE4oBQAAAEBxQikAAAAAihNKAQAAAFCcUAoAAACA4oRSAAAAABQnlAIAAACgOKEUAAAAAMUJpQAAAAAoTigFAAAAQHFCKQAAAACKE0oBAAAAUJxQCgAAAIDiupR/S/ivoUNT6trV1gCg9Q0b1tprQEvoOwBMnuMZ9UalFAAAAADFCaUAAAAAKE4oBQAAAEBxQikAAAAAihNKAQAAAFCcUAoAAACA4oRSAAAAABQnlAIAAACgOKEUAAAAAMUJpQAAAAAoTigFAAAAQHFCKQAAAACKE0oBAAAAUJxQCgAAAIDihFIAAAAAFCeUAgAAAKA4oRQAAAAAxQmlAAAAAChOKAUAAABAcUIpAAAAAIoTSgEAAABQnFAKAAAAgOKEUgAAAAAUJ5QCAAAAoDihFAAAAADFCaUAAAAAKE4oBQAAAEBxQikAAAAAihNKAQAAAFCcUAoAAACA4oRSAAAAABQnlAIAAACgOKEUab311ksHHnigLQEAAAB0nFBq8ODBqVOnTmmfffaZ6LH9998/PxbLtLYRI0akOeaYI7UF07ou9957b96en3zySaP7r7322nTiiSdOxzUEAAAAaOOhVOjbt2+64oor0ueff95w3xdffJH+9Kc/pYUXXrhV160jmGuuudLss8/e2qsBAAAAdCBtIpRaeeWVczAVFTtV8XMEUiuttFKjZSdMmJBOPfXU1K9fv9S9e/c0cODAdPXVVzc8/vXXX6fdd9+94fGllloqnXvuuY1eIyqvtt5663TWWWelBRZYIM0999y5KmvcuHEtXufjjjsurbjiiuniiy/O69mjR4+033775fc/44wz0vzzz5/mm2++dPLJJzd6XlQqXXTRRWnTTTfN69e/f/9G699cNdOTTz6Z73v99dfz47vttlsaNWpUvi9usS7h0ksvTauuumoOmOL9f/SjH6X3338/PxbPXX/99fPPc845Z6MKtKbD9z7++OO0yy675OVmnXXWvK4vv/zyRJVat99+e1pmmWVy2zfZZJP0zjvvtHj7AQAAAB1bl9RGDBkyJA0fPjzttNNO+fcIeyJ8iRCmVgRSf/zjH9Ovf/3rtMQSS6T7778//fjHP07zzjtvWnfddXNotdBCC6Wrrroqh01//etf01577ZXDp+23377hde655558X/z7yiuvpB122CGHTHvuuWeL1/nVV19Nt956a7rtttvyzz/4wQ/Sa6+9lpZccsl033335feOdm200UZpjTXWaHje0UcfnU477bQclkWQ9MMf/jA9/fTTOeCZkrXXXjv98pe/TMccc0x68cUX830RCoUI1WIYXgRxEUYdfPDBOXi65ZZbcuh3zTXXpG233TY/r2fPnjkUa048J0KoG2+8MS93+OGH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AKA4oRQAAAAAxQmlAAAAAChOKAUAAABAcUIpAAAAAIoTSgEAAABQnFAKAAAAgOKEUgAAAAAUJ5QCAAAAoDihFAAAAADFCaUAAAAAKE4oBQAAAEBxQikAAAAAihNKkRZddNH0y1/+0pYAAAAAimnzodTgwYPT1ltv3ei+q6++Os0yyyzpF7/4RcMynTp1Sqeddlqj5a6//vp8f9W9996bf19uueXS119/3WjZOeaYI40YMWKS63HcccelFVdcMbUF07ou0b5oZ1MjR45Me+2113RaOwAAAIB2EEo19bvf/S7ttNNO6aKLLko/+9nPGu6PkOr0009PH3/88RRf47XXXkuXXHLJDF7T+jHvvPOmWWedtbVXAwAAAOhAuqQ6csYZZ6Rjjz02XXHFFWmbbbZp9NhGG22UXnnllXTqqafm5SbnJz/5SX6dH/3oR6lbt27TtC5RnfXJJ5+k1VdfPZ177rnpyy+/TAcffHA66qij0pFHHpl+//vf56DnxBNPTLvttlt+zuuvv5769euXLr/88nTeeeelv/3tb2nxxRdPF1xwQVp33XUbqpkOPPDA/Nq1FV/R3kqlkh8//vjj8/3VKrDhw4fn9Tn77LPzzxG6zTXXXGnLLbfM26JHjx65Sqy6HtXnxTaIqqsYvhfvGbfw5ptv5m101113pc6dO6dNNtkknX/++al379758XhOrFOEgkcffXQOAjfddNP029/+Ns0+++zTtD0BaH/Gfj4u1aWxY1M9mm222Vp7FYCO8j1Jhzq+MG0cl9tZKHX44YenCy+8MN10001pww03nOjxmWaaKZ1yyik5aPrpT3+aFlpooUm+VoQvf/zjH3PQcsghh0zzOt199935fe6///700EMPpd133z399a9/Teuss0569NFH05///Oe09957p4033rjR+hx66KF5Dqdll102B0kRHv3zn/9Mc8899xTfc4cddkjPPPNMuu2229Kdd96Z7+vVq1f+NwKkCLsi+Ipgar/99kuHHXZY3m5rr712fs9jjjkmvfjii3n5CKuamjBhQtpqq63yY/fdd18aP3582n///fP7RrBV9eqrr+ZgKvZHhFLbb799Hj558sknT/SaEdjFrWr06NFTva0BqD891hue6lN9rnecvGov9B3oKOr3e5JpY393JO3puJw6+vC9W2+9NVf83HDDDc0GUlVRTRRzLUUF0OREBVMsE1VVo0aNmub1imqkCIGWWmqpNGTIkPzvZ599lqulllhiiVwx1bVr1/Tggw82et4BBxyQtt1227TMMsvkYYgRKkVlVUt07949B0ZdunRJ888/f77FfdWwbf3118+VTxtssEE66aST0pVXXpkfi/WI94kqqerzmgulojrq6aefTn/605/SKqusktZYY4081DECqph7qja8iqqt5ZdfPn3nO99JO++8c35uc2I7x3tXb3379p2q7QwAdCz6DgDQMdRFpdSAAQPShx9+mIOkGC7XXJhSFfNKRSAzpQqoqGqKidJj+aiwmhYxYXpUJ1XF8LYIaWqrt6L66f3332/0vLXWWqvh5wiXVl111fT888+nbyoqp6IT98ILL+RqpKhy+uKLL3JQ1tI5o2I9IjSqDY6ioismSI/HVltttXxfBF+1Q/UWWGCBidpZFeFcDG2sinUTTAG0f5/e+99h43Vn1fNbew06PH0HOoq6/Z5k2ji+QH2GUn369MlX3IsqoJjfKCqnJjV3UQydGzRoUO7MxDxLkxJhUAw1i2WicmlazDzzzI1+jyqk5u6LqqKWipCraZnfuHFTHmse81VtscUWad99983tiiquqNCK8O2rr76a7hOZT007Y96uaZ27C4D6NVv3xseKumFuplan70BHUbffk0wbxxeoz+F7YZFFFslDyN59990cTI0ZM2aSy8bcRv/7v/+bHn744cm+5nbbbZernaoTh5fyyCOPNPwc1UxPPPFEHspXvRJetG1szSR4Tz75ZKPnx1C8r7/+utF98RoRCkX115prrpmWXHLJ9Pbbb0/xeU3Ferz11lv5VvXcc8/lidejYgoAAACgQ4VSIYZ8xWTbMUwsqqEmNWH2CiuskHbaaac839OURIB18cUXNwqBZrS42t51112Xh9nFJOIxUXjMSRViDqeoaop5qWIy8ZjbKeZuqhVD52Ji9AirYlhjTAYaV/GLiqqYvD0mOb/00kvTr3/964me9+mnn+a5n+J5MayvqbiKYXX7xdUBH3vssbTLLrvkqwPGMEMAAACADhdKhbiKXQRTEapMLpg64YQTWjRsLuafiltULJUSQVjcBg4cmIfY3XjjjWmeeebJj8Wwu7gy4C233JLDocsvvzwdd9xxjZ4fk6RHtVgMZ4zKqlgmXiuu5BdzZMW8VpdddlmeX6pWXIFvn332yVfSi+fF5PFNxTC8mFB+zjnnzEMhI6Tq379/vpIgAAAAwPTSqeI6hcXEvE/9+vVLf//73/NVAjuqCBLjKnyj7hqcevbo2tqrAwCNrT7MFpnUsXvUqNSzZ8/i20ffAWgXHF/oQEa3sO9Qd5VSAAAAANQ/oRQAAAAAxXUp/5YdV0w0brQkAAAAgEopAAAAAFqB4XsAAAAAFCeUAgAAAKA4oRQAAAAAxQmlAAAAAChOKAUAAABAcUIpAAAAAIoTSgEAAABQnFAKAAAAgOKEUgAAAAAUJ5QCAAAAoDihFAAAAADFCaUAAAAAKE4oBQAAAEBxQikAAAAAihNKAQAAAFCcUAoAAACA4oRSAAAAABQnlAIAAACgOKEUAAAAAMUJpQAAAAAoTigFAAAAQHFCKQAAAACKE0oBAAAAUJxQCgAAAIDihFIAAAAAFCeUAgAAAKA4oRQAAAAAxXUp/5bwf1Y9N6WePW0OAKBl9B0AoF1RKQUAAABAcUIpAAAAAIoTSgEAAABQnFAKAAAAgOKEUgAAAAAUJ5QCAAAAoDihFAAAAADFCaUAAAAAKE4oBQAAAEBxQikAAAAAihNKAQAAAFCcUAoAAACA4oRSAAAAABQnlAIAAACgOKEUAAAAAMUJpQAAAAAoTigFAAAAQHFCKQAAAACK61L+LeG/hg4dmrp27WpzADBdDRs2zBZtp/QdgHrhWAQto1IKAAAAgOKEUgAAAAAUJ5QCAAAAoDihFAAAAADFCaUAAAAAKE4oBQAAAEBxQikAAAAAihNKAQAAAFCcUAoAAACA4oRSAAAAABQnlAIAAACgOKEUAAAAAMUJpQAAAAAoTigFAAAAQHFCKQAAAACKE0oBAAAAUJxQCgAAAIDihFIAAAAAFCeUAgAAAKA4oRQAAAAAxQmlAAAAAChOKAUAAABAcUIpAAAAAIoTSgEAAABQnFAKAAAAgOKEUgAAAAAUJ5QCAAAAoDihFAAAAADFCaUAAAAAKE4oBQAAAEBxQikAAAAAihNKAQAAAFBcuwilFl100fTLX/6ytVejLr3++uupU6dO6cknn2ztVQEAAAA6kKkKpQYPHpy23nrrht/XW2+9dOCBB6ZSRowYkeaYY46J7h85cmTaa6+9Zuh7l27rjFiXpvsv9O3bN73zzjtp+eWXn45rCAAAADB5XVIb8NVXX6WuXbtO8/PnnXfe6bo+HclMM82U5p9//tZeDQAAAKCDmebhe1F1c99996Vzzz03D/+KWwwFC88880zadNNNU48ePVLv3r3TzjvvnD788MNGlT4HHHBArvaZZ5550qBBg/L9Z599dlphhRXSbLPNlit49ttvv/Tpp5/mx+6999602267pVGjRjW833HHHTfR8L0f/ehHaYcddmi0ruPGjcvvc8kll+TfJ0yYkE499dTUr1+/1L179zRw4MB09dVXT1X74z1POumktMsuu+R2LrLIIunGG29MH3zwQdpqq63yfQMGDEiPP/74RJVe119/fVpiiSXSLLPMktv+1ltvTbaaKbZTbLPJbfevv/467b777g1tWmqppfIyVbGt/vCHP6Qbbrih4XmxTZsbvhevv/rqq6du3bqlBRZYIB1xxBFp/PjxjfbfT3/603TYYYelueaaK4da1X0BAAAAMEMrpSLweOmll/KwrxNOOKGhYumTTz5JG2ywQdpjjz3SOeeckz7//PN0+OGHp+233z7dfffdDc+PgGTfffdNDz30UMN9nTt3Tuedd14OVl577bUcSkXwceGFF6a11147B0/HHHNMevHFF/PyEfw0tdNOO6Xtttsuh1nVx2+//fb02WefpW222Sb/HoHUH//4x/TrX/86h0P3339/+vGPf5zXf911123xNoj2nXLKKenoo4/OP0f4Fus5ZMiQdOaZZ+Z2R2j17LPP5uAnxHqcfPLJOSCL6rBo4w9/+MNG22FatnsEbQsttFC66qqr0txzz53++te/5iGNESrFtj/kkEPS888/n0aPHp2GDx+enxeB0ttvv93o9f/973+nzTbbLIdfsY4vvPBC2nPPPXOAVhs8xf47+OCD06OPPpoefvjhvPy3vvWttPHGG7d4+wHQPsTJn7Zk7Nixqa2IE21A+9DWvuto29rSsYj6MFsH7TNMcyjVq1evHKrMOuusjYZ//epXv0orrbRSDmuqLr744lz5FGHKkksume+LMOiMM85o9Jq18yRVK5H22WefHErFe8V7RrgzueFmUXkUO/O6667LIVH405/+lL73ve+l2WefPX355Zd53e6888601lpr5cf79++fHnzwwTRs2LCpCqUivNl7773zzxGWXXTRRWm11VbLoViIUCre47333mtY5ziYxTZaY401GsKdZZZZJj322GO5Omlat3sMwzv++OMbfo9gL8KiK6+8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9bh/63Gdp1Z7b6P21bf2vv86Qhu1r751a8efz06V1rq2LwAAAAAdlkopAAAAAIoTSgEAAABQnFAKAAAAgOKEUhR3wQUXpEUXXTTNMsssaY011kiPPfZYXe6F4447LnXq1KnRbemll254/Isvvkj7779/mnvuuVOPHj3Stttum957771Gr/Hmm2+mzTffPM0666xpvvnmS4ceemgaP358agvuv//+tOWWW6YFF1wwt+36669v9HhMR3fMMcekBRZYIHXv3j1ttNFG6eWXX260zH/+85+00047pZ49e6Y55pgj7b777unTTz9ttMw//vGP9J3vfCd/Hvr27ZvOOOOM1BbbO3jw4In29yabbFK37T311FPTaqutlmafffb82dt6663Tiy++2GiZ6fUZvvfee9PKK6+cJ2ZcfPHF04gRI1JbbO9666030T7eZ5996rK9F110URowYED+LMZtrbXWSrfeemu73LctaW972rfNOe2003KbDjzwwLrex1PbP7jqqqvycTeWX2GFFdItt9yS2qqWfAc1Fdu66ec22lqPfaJ633/xuWzavrjF31i97rvp0c9ry/38ybVv3Lhx6fDDD8+fu9lmmy0vs8suu6S33357un/O23K/tV73X2ju7zFuZ555Zl3sv+nVD29qWv9uW11MdA6lXHHFFZWuXbtWLr744sqzzz5b2XPPPStzzDFH5b333qu7nXDsscdWlltuuco777zTcPvggw8aHt9nn30qffv2rdx1112Vxx9/vLLmmmtW1l577YbHx48fX1l++eUrG220UeXvf/975ZZbbqnMM888lSOPPLLSFsT6/M///E/l2muvjYshVK677rpGj5922mmVXr16Va6//vrKU089Vfne975X6devX+Xzzz9vWGaTTTapDBw4sPLII49UHnjggcriiy9e2XHHHRseHzVqVKV3796VnXbaqfLMM89ULr/88kr37t0rw4YNq7S19u666665PbX7+z//+U+jZeqpvYMGDaoMHz48r8eTTz5Z2WyzzSoLL7xw5dNPP52un+HXXnutMuuss1YOPvjgynPPPVc5//zzKzPNNFPltttua3PtXXfddfN3Uu0+jn1Wj+298cYbKzfffHPlpZdeqrz44ouVo446qjLzzDPn9re3fduS9ranfdvUY489Vll00UUrAwYMqAwdOrTh/nrbx1PbP3jooYfyupxxxhl53X7+85/nff70009X2qKWfAc1Fcv37Nmz0ef23XffrdRjn6je99/777/fqG133HFH7ivcc889dbvvpkc/ry338yfXvk8++SR/9/35z3+uvPDCC5WHH364svrqq1dWWWWV6fo5b+v91nrdf6G2XXGLde7UqVPl1VdfrYv9Nz364c2Zlr/btkAoRVHxhb///vs3/P71119XFlxwwcqpp55ad3sivtgigGhOHOyic3XVVVc13Pf888/nL9U48FW/bDt37tyok3LRRRflTsyXX35ZaUuaHgwmTJhQmX/++StnnnlmozZ369YtBy0hOpnxvJEjRzYsc+utt+YDxr///e/8+4UXXliZc845G7X38MMPryy11FKV1jSpg/tWW201yefUc3urHe5Y//vuu2+6foYPO+yw3AGotcMOO+SDcVtqbzW4qP2f+qbqub0hPnu/+93v2v2+bdre9rxvx4wZU1liiSXy/yDXtrEe9/HU9g+23377yuabb97ovjXWWKOy9957V+pBc99BTcX/sMT/XNR7n6g97r/4W1tsscVyf6je99209vPqqZ/fXL+uuYA/lnvjjTem2+e8Lfdb29v+i7ZusMEGk12mre6/ae2HNzWtf7dtgeF7FPPVV1+lJ554IpcRVnXu3Dn//vDDD9flnohyyCgr7d+/fx62FUMhQrQzSoNr2xrloQsvvHBDW+PfKBvu3bt3wzKDBg1Ko0ePTs8++2xqy/75z3+md999t1H7evXqlct8a9sXQ9hWXXXVhmVi+djnjz76aMMy66yzTuratWujbRDlqx9//HFqa2IYS5TYLrXUUmnfffdNH330UcNj9d7eUaNG5X/nmmuu6foZjmVqX6O6TGv/zTdtb9Vll12W5plnnrT88sunI488Mn322WcNj9Vre7/++ut0xRVXpLFjx+Zhbe193zZtb3vet1HWH8Pvmq5Xve3jaekftMX9MT2+g5qKIeCLLLJIHu691VZbten+waT6RO1t/8Xn9Y9//GMaMmRIHv7THvbdtPTz2ls/P/4mY39GX256fc7bcr+1Pe2/GNJ2880352kzpqSt7r9R09APnx5/t21Fl9ZeATqODz/8MP/PQm0HOMTvL7zwQqo38QcecwbEF/0777yTjj/++DxX0DPPPJO/ECJ4aHpgi7bGYyH+bW5bVB9ry6rr19z617YvDoS1unTpkr9sa5fp16/fRK9RfWzOOedMbUWMw//+97+f1/fVV19NRx11VNp0003zl/xMM81U1+2dMGFCnovmW9/6Vv4f9ur6TI/P8KSWif/x/fzzz/N497bQ3vCjH/0o/w9EdFZi7q+YbyICw2uvvXaybak+1tba+/TTT+dQJuYkiLkIrrvuurTsssumJ598sl3u20m1tz3u2xDB29/+9rc0cuTIiR6rt7/faekfTGrd2vrxc3LfQU1F/+Liiy/O86XF/7CcddZZae21187hxkILLZTqpU8Uc6a0p/0Xc9t88sknec6e9rDvprWf1576+XHciOPCjjvumOclnF6f87bcb21P++8Pf/hD3v7R3slpq/tvwjT2w6fH321bIZSCaRRf7FXR6YgvuvifniuvvLJV/kebGeuHP/xhw89RXRD7fLHFFstnoTbccMO63vxRbREH5AcffDB1BJNq71577dVoH8ckkbFvozMX+7reRKcrAqj4H6Krr7467brrrum+++5L7dWk2hvBVHvbt2+99VYaOnRouuOOO9rc5MlMv+/cCFlrq/0i1FhmmWXSsGHD0oknnlg3faKWVC/Uk9///ve5vRFyt4d919FFNcr222+fJ4iOi2a0l895e+63NhUBcFQ9Tel42Fb33/4drB/eHMP3KCaGTUQy3/SqAfH7/PPPX/d7IpLsJZdcMr3yyiu5PVEGG2fSJtXW+Le5bVF9rC2rrt/k9mX8+/777zd6PK7qFFeoaw/bIMp+4zMd+7ue23vAAQekm266Kd1zzz2Nzt5Or8/wpJaJM5GtEd5Oqr3Nic5KqN3H9dTeOMMWV0tbZZVV8lVeBg4cmM4999x2u28n1d72uG+jrD++b+KqeFGRGbcI4M4777z8c5wVrad9PC39g0mtW1s/dkzNd1BTM888c1pppZUaPrf10idqT/vvjTfeSHfeeWfaY4892u2+a2k/rz3086uBVOzXCPknVyU1LZ/zttxvbQ/7LzzwwAO58nlq/ybbyv77Jv3w6fF321YIpSj6PwzxPwt33XVXo3LF+L32bFK9irkD4qx7nIGPdkYHpLat8YUZ45arbY1/Y7hJbZBRPSBWh5y0VVEKHF9ute2L4Rwxd1Jt++KLNP7nqeruu+/O+7z6P4SxTFzyNToFtdsgKh7a0tC95vzrX//KY/Njf9dje+OMYBwIY4hTrGfTYYXT6zMcy9S+RnWZ0n/zU2pvc6LqJtTu43ppb3Pis/jll1+2u307pfa2x30bZ7ljfaMd1VvMZxdniqs/19M+npb+QVvaHzPqO6ipGFoT+6z6ua2XPlF72H9Vw4cPz0P1Yy639rrvWtrPq/d+fjWQijmGImice+65p/vnvC33W+t9/9VWLsZ6x4moetp/06MfPj3+btuM1p5pnY4lLjUaVwAYMWJEvlrZXnvtlS812tYuk9sSP/vZzyr33ntv5Z///Ge+tHFcWjYupx1XT6hexjMu7Xn33Xfny3iutdZa+db0ctzf/e5386VA4xLb8847b6PLcbemuKpTXCY8bvFVcfbZZ+efq1cliUuOxr674YYbKv/4xz/yVS+aXnI0LkW70korVR599NHKgw8+mK8SteOOOza6IkTv3r0rO++8c74kanw+4vLjw4YNa1PtjccOOeSQfLWL2N933nlnZeWVV87t+eKLL+qyvfvuu2++MlB8hmsvjfvZZ581LDM9PsPVS8ofeuih+aohF1xwwQy7pPw3ae8rr7xSOeGEE3I7Yx/H57p///6VddZZpy7be8QRR+QruERb4u8zfo8rQf7lL39pd/t2Su1tb/t2UppeYbDe9vGU+gfxvRn7tSqOu126dKmcddZZed3iqkpxpaKnn3660ha15Du3aRuPP/74yu23354vcf7EE09UfvjDH1ZmmWWWfKn2eusT1fv+q16JLP6m4qq5TdXjvpse/by42tn555/fJvv5k2vfV199Vfne975XWWihhfL3X+3fZO0Vkpu2b0qf83rrt9br/qsaNWpUPkbFlWOb05b33/Toh4e4gve1115bqWrJ321bJJSiuPhyiD+wrl275kuPPvLII3W5F+Ky2AsssEBuR58+ffLv8T8/VfHHv99+++XLkscX5jbbbJO/bGq9/vrrlU033bTSvXv3/KUYX5bjxo2rtAX33HNPPgg0vcUlZquXHT366KNzyBIHsA033LDy4osvNnqNjz76KIcyPXr0yJcZ32233fJBptZTTz1V+fa3v51fI7ZjfJm2tfbGASL+xy3+hy06zYssskhlzz33nOggXU/tba6tcYvLWE/vz3Bs2xVXXDH/rUQYUPsebaW9b775Zg4p5pprrrxvFl988fw/4tHhqcf2DhkyJH9OYx3icxt/n9VAqr3t2ym1t73t25aGUvW4jyfXP4j2VY8/VVdeeWVlySWXzMsvt9xylZtvvrnSVrXkO7dpGw888MCG7RHH2s0226zyt7/9rVKPfaJ6338hQqbYZ037OvW676ZHPy++dyNQbIv9/Mm1L0KJSf1NxvMm1b4pfc7rrd9ar/uvKk7qxvErTvo2py3vv+nVD09NntOSv9u2qFP8p7WrtQAAAADoWMwpBQAAAEBxQikAAAAAihNKAQAAAFCcUAoAAACA4oRSAAAAABQnlAIAAACgOKEUAAAAAMUJpQAAAAAoTigFAAAAQHFCKQCaNXjw4NSpU6e0zz77TPTY/vvvnx+LZcIHH3yQ9t1337Twwgunbt26pfnnnz8NGjQoPfTQQw3PWXTRRfNzmt5OO+00ewAA2gF9B2BqdZnqZwDQYfTt2zddccUV6Zxzzkndu3fP933xxRfpT3/6Uw6gqrbddtv01VdfpT/84Q+pf//+6b333kt33XVX+uijjxq93gknnJD23HPPRvfNPvvshVoDAMxo+g7A1BBKATBJK6+8cnr11VfTtddem3baaad8X/wcgVS/fv3y75988kl64IEH0r333pvWXXfdfN8iiyySVl999YleLwKoqKICANonfQdgahi+B8BkDRkyJA0fPrzh94svvjjttttuDb/36NEj366//vr05Zdf2poA0MHpOwAtJZQCYLJ+/OMfpwcffDC98cYb+RbzRMV9VV26dEkjRozIQ/fmmGOO9K1vfSsdddRR6R//+MdEr3X44Yc3hFjVW1RZAQDth74D0FKG7wEwWfPOO2/afPPNc/BUqVTyz/PMM0+jZWJOqbg/AqZHHnkk3XrrremMM85Iv/vd7xomQw+HHnpoo99Dnz597AEAaEf0HYCWEkoB0KIy/AMOOCD/fMEFFzS7zCyzzJI23njjfDv66KPTHnvskY499thGIVSEWYsvvrgtDgDtnL4D0BKG7wEwRZtsskm+ut64cePSoEGDWrTFll122TR27FhbFwA6IH0HoCVUSgEwRTPNNFN6/vnnG36u9dFHH6XtttsunxEdMGBAvsLe448/nofvbbXVVo2WHTNmTHr33Xcb3TfrrLOmnj172gsA0I7oOwAtIZQCoEUmFRzFZOVrrLFGOuecc9Krr76aq6n69u2b9txzzzzhea1jjjkm32rtvffe6de//rW9AADtjL4DMCWdKjFrLQAAAAAUZE4pAAAAAIoTSgEAAABQnFAKAAAAgOKEUgAAAAAUJ5QCAAAAoDihFAAAAADFCaUAAAAAKE4oBQAAAEBxQikAAAAAihNKAQAAAFCcUAoAAACA4oRSAAAAAKTS/h9bc8jYmwtRnwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n_bars = len(mses_diabetes)\n", "xval = np.arange(n_bars)\n", "colors = [\"r\", \"g\", \"b\", \"orange\", \"black\"]\n", "\n", "plt.figure(figsize=(12, 6))\n", "\n", "# Diabetes\n", "ax1 = plt.subplot(121)\n", "for j in xval:\n", " ax1.barh(j, mses_diabetes[j], xerr=stds_diabetes[j], color=colors[j], alpha=0.6, align=\"center\")\n", "\n", "ax1.set_title(\"Diabetes Data\")\n", "ax1.set_yticks(xval)\n", "ax1.set_xlabel(\"MSE\")\n", "ax1.invert_yaxis()\n", "ax1.set_yticklabels(x_labels)\n", "\n", "# Boston\n", "ax2 = plt.subplot(122)\n", "for j in xval:\n", " ax2.barh(j, mses_boston[j], xerr=stds_boston[j], color=colors[j], alpha=0.6, align=\"center\")\n", "\n", "ax2.set_title(\"Boston Housing Data\")\n", "ax2.set_yticks(xval)\n", "ax2.set_xlabel(\"MSE\")\n", "ax2.invert_yaxis()\n", "ax2.set_yticklabels([\"\"] * n_bars)\n", "\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "f9d88502-87f4-4a98-b62c-99053a52a490", "metadata": {}, "source": [ "## 12. Интерпретация результатов\n", "\n", "- Full Data — baseline\n", "- Zero Imputation — наихудший\n", "- Mean Imputation — лучше Zero\n", "- KNN Imputation — хорош, но требует масштабирования\n", "- Iterative Imputation — лучший среди методов\n", "\n", "**Вывод:** Iterative Imputation показывает результаты, наиболее близкие к полным данным." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.14.3" } }, "nbformat": 4, "nbformat_minor": 5 }