AIM-PIbd-31-Alekseev-I-S/Lab_3/Lab3.ipynb
2024-10-26 00:04:43 +04:00

1184 lines
138 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Начало лабораторной, ухх...\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Бизнес-цели:\n",
"\n",
"1. Повышение безопасности планеты от потенциальных угроз космических объектов.\n",
"2. Оптимизация исследования космических объектов для использования в коммерческих или исследовательских миссиях."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Цели технического проекта:\n",
"\n",
"Для 1-й бизнес-цели: \n",
"* сбор и подготовка данных: очистка данных от пропусков, выбросов и дубликатов. Преобразование категориальных переменных в числовые. Разделение данных на обучающую и тестовую выборки. \n",
"* разработка и обучение модели: исследование различных алгоритмов машинного обучения (линейная регрессия, деревья решений, случайный лес и т.д.). Обучение моделей на обучающей выборке. Оценка качества моделей на тестовой выборке с помощью метрик RMSE, MAE и др.\n",
"* развертывание модели: \n",
" * Создать веб-приложение или API, которое принимает параметры объекта и прогнозирует, опасен ли он для Земли.\n",
" * Модель может использоваться в системах мониторинга космических объектов для предоставления оперативных оценок и предупреждений.\n",
" * Включение автоматической системы оповещения для НАСА и других космических агентств с обновлениями по объектам, представляющим угрозу.\n",
"\n",
"Для 2-й бизнес-цели:\n",
"* сбор и подготовка данных: очистка данных от пропусков, выбросов и дубликатов. Преобразование категориальных переменных в числовые. Разделение данных на обучающую и тестовую выборки. \n",
"* разработка и обучение модели: исследование различных алгоритмов машинного обучения (линейная регрессия, деревья решений, случайный лес и т.д.). Обучение моделей на обучающей выборке. Оценка качества моделей на тестовой выборке с помощью метрик RMSE, MAE и др.\n",
"* развертывание модели:\n",
" * Разработка модели, которая позволяет астрономам и специалистам по космосу загружать данные о новых объектах и получать предсказания о расстоянии их ближайшего сближения с Землей.\n",
" * Создание системы мониторинга с графическим интерфейсом, отображающим траектории движения объектов и предполагаемые даты и расстояния их ближайших подходов.\n",
" * Реализация системы оповещений на основе пороговых значений расстояний для идентификации особо опасных сближений."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['id', 'name', 'est_diameter_min', 'est_diameter_max',\n",
" 'relative_velocity', 'miss_distance', 'orbiting_body', 'sentry_object',\n",
" 'absolute_magnitude', 'hazardous'],\n",
" dtype='object')\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>name</th>\n",
" <th>est_diameter_min</th>\n",
" <th>est_diameter_max</th>\n",
" <th>relative_velocity</th>\n",
" <th>miss_distance</th>\n",
" <th>orbiting_body</th>\n",
" <th>sentry_object</th>\n",
" <th>absolute_magnitude</th>\n",
" <th>hazardous</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2162635</td>\n",
" <td>162635 (2000 SS164)</td>\n",
" <td>1.198271</td>\n",
" <td>2.679415</td>\n",
" <td>13569.249224</td>\n",
" <td>5.483974e+07</td>\n",
" <td>Earth</td>\n",
" <td>False</td>\n",
" <td>16.73</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2277475</td>\n",
" <td>277475 (2005 WK4)</td>\n",
" <td>0.265800</td>\n",
" <td>0.594347</td>\n",
" <td>73588.726663</td>\n",
" <td>6.143813e+07</td>\n",
" <td>Earth</td>\n",
" <td>False</td>\n",
" <td>20.00</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2512244</td>\n",
" <td>512244 (2015 YE18)</td>\n",
" <td>0.722030</td>\n",
" <td>1.614507</td>\n",
" <td>114258.692129</td>\n",
" <td>4.979872e+07</td>\n",
" <td>Earth</td>\n",
" <td>False</td>\n",
" <td>17.83</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3596030</td>\n",
" <td>(2012 BV13)</td>\n",
" <td>0.096506</td>\n",
" <td>0.215794</td>\n",
" <td>24764.303138</td>\n",
" <td>2.543497e+07</td>\n",
" <td>Earth</td>\n",
" <td>False</td>\n",
" <td>22.20</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>3667127</td>\n",
" <td>(2014 GE35)</td>\n",
" <td>0.255009</td>\n",
" <td>0.570217</td>\n",
" <td>42737.733765</td>\n",
" <td>4.627557e+07</td>\n",
" <td>Earth</td>\n",
" <td>False</td>\n",
" <td>20.09</td>\n",
" <td>True</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id name est_diameter_min est_diameter_max \\\n",
"0 2162635 162635 (2000 SS164) 1.198271 2.679415 \n",
"1 2277475 277475 (2005 WK4) 0.265800 0.594347 \n",
"2 2512244 512244 (2015 YE18) 0.722030 1.614507 \n",
"3 3596030 (2012 BV13) 0.096506 0.215794 \n",
"4 3667127 (2014 GE35) 0.255009 0.570217 \n",
"\n",
" relative_velocity miss_distance orbiting_body sentry_object \\\n",
"0 13569.249224 5.483974e+07 Earth False \n",
"1 73588.726663 6.143813e+07 Earth False \n",
"2 114258.692129 4.979872e+07 Earth False \n",
"3 24764.303138 2.543497e+07 Earth False \n",
"4 42737.733765 4.627557e+07 Earth False \n",
"\n",
" absolute_magnitude hazardous \n",
"0 16.73 False \n",
"1 20.00 True \n",
"2 17.83 False \n",
"3 22.20 False \n",
"4 20.09 True "
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"df_subset = pd.read_csv(\".//static//csv//neo.csv\")\n",
"# Отбор первых 15000 записей\n",
"df = df_subset.head(15000)\n",
"print(df.columns)\n",
"df.head()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Проверим датасет на пропущенные значения:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"id 0\n",
"name 0\n",
"est_diameter_min 0\n",
"est_diameter_max 0\n",
"relative_velocity 0\n",
"miss_distance 0\n",
"orbiting_body 0\n",
"sentry_object 0\n",
"absolute_magnitude 0\n",
"hazardous 0\n",
"dtype: int64\n"
]
},
{
"data": {
"text/plain": [
"id False\n",
"name False\n",
"est_diameter_min False\n",
"est_diameter_max False\n",
"relative_velocity False\n",
"miss_distance False\n",
"orbiting_body False\n",
"sentry_object False\n",
"absolute_magnitude False\n",
"hazardous False\n",
"dtype: bool"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Процент пропущенных значений признаков\n",
"for i in df.columns:\n",
" null_rate = df[i].isnull().sum() / len(df) * 100\n",
" if null_rate > 0:\n",
" print(f'{i} Процент пустых значений: %{null_rate:.2f}')\n",
"\n",
"# Проверка на пропущенные данные\n",
"print(df.isnull().sum())\n",
"\n",
"df.isnull().any()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Фух, пропущенных значений не имеется \n",
"\n",
"Разобьём набор на 3 классических выборки: обучающую, тестовую и контрольную"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Размер обучающей выборки: (9000, 9)\n",
"Размер контрольной выборки: (3000, 9)\n",
"Размер тестовой выборки: (3000, 9)\n"
]
}
],
"source": [
"from sklearn.model_selection import train_test_split\n",
"\n",
"# Предварительная обработка данных на всякий\n",
"# Удаление пропусков и дубликатов\n",
"df = df.dropna()\n",
"df = df.drop_duplicates()\n",
"\n",
"# Разделение данных на признаки (X) и целевую переменную (y)\n",
"# В данном случае, предположим, что мы хотим предсказать 'hazardous'\n",
"X = df.drop(columns=['hazardous'])\n",
"y = df['hazardous']\n",
"\n",
"# Разбиение данных на обучающую и тестовую выборки\n",
"# Сначала разделим на обучающую и тестовую\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
"\n",
"# Затем разделим обучающую выборку на обучающую и контрольную\n",
"X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.25, random_state=42)\n",
"\n",
"# Проверка размеров выборок\n",
"print(\"Размер обучающей выборки:\", X_train.shape)\n",
"print(\"Размер контрольной выборки:\", X_val.shape)\n",
"print(\"Размер тестовой выборки:\", X_test.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Построим несколько столбчатых диаграмм для визуализации распределения:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAHHCAYAAABeLEexAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABRcUlEQVR4nO3deVwUZeA/8M9yLQjsEgi7oKh4g6ImmpK3kohYmahhJN6mYgYkKN/yzMQj71IrSzTxl0ceKYnihamESuGBSpgYlAJesIhyCPP7o+/Ol3XBkNQF5/N+veb1cp955plnZmfZjzPPzMoEQRBAREREJGFGhu4AERERkaExEBEREZHkMRARERGR5DEQERERkeQxEBEREZHkMRARERGR5DEQERERkeQxEBEREZHkmRi6A0RE9HQUFhbizp07MDExgYODg6G7Q09RQUEB7ty5AysrK7z00kuG7s4LiWeIiCSiZ8+eaN26taG78dSMHDkSjRo1MnQ3DO7gwYN44403YGNjAwsLC9SrVw8ffPCBobtVa8yfPx9lZWUAgLKyMkRGRhq4R/9n27Zt6NOnD6ytrWFlZYUGDRpg0aJFhu7WC4uBqJaKioqCTCYTJ3NzczRv3hyTJ09Gdna2obtHRM/B6tWr4e3tjby8PKxYsQJxcXGIi4vD3LlzDd21WmPDhg347LPP8Ndff2HJkiXYsGGDobsEAJg+fTqGDh0Ka2trfP3114iLi8PBgwcxadIkQ3fthcVLZrXc3Llz4eLigsLCQhw/fhxr1qzBTz/9hAsXLqBOnTqG7h4RPSNpaWkIDQ3F+PHjsXr1ashkMkN3qVaaO3cuAgMDMW3aNMjlcmzatMnQXUJ8fDwWLlyIyMhITJ8+3dDdkQwGolrOx8cHHTp0AACMHTsWdnZ2WLp0KXbv3o1hw4YZuHdE1VdYWAgzMzMYGfFEdkVWrlwJtVqNlStXMgz9B2+//TZ69eqFK1euoFmzZrC3tzd0l/DZZ5/h1VdfZRh6zviX5gXTu3dvAEB6ejoA4M6dO5g6dSrc3d1hZWUFhUIBHx8fnD17Vm/ZwsJCzJ49G82bN4e5uTkcHR0xaNAg/PHHHwCAa9eu6Vyme3Tq2bOn2NbRo0chk8mwZcsW/M///A/UajUsLS3xxhtvIDMzU2/diYmJ6NevH5RKJerUqYMePXrgxIkTFW5jz549K1z/7Nmz9epu2rQJHh4esLCwgK2tLfz9/Stc/+O2rbyysjIsX74crVq1grm5OVQqFd577z3cvXtXp16jRo0wYMAAvfVMnjxZr82K+r548WK9fQoARUVFmDVrFpo2bQq5XA5nZ2eEh4ejqKiown1VkYsXL6JXr16oU6cO6tWrpzcmobi4GDNnzoSHhweUSiUsLS3RrVs3HDlyRKdeZe+DTCZDVFQUgKoff9rj5fvvv8fHH3+MevXqoU6dOtBoNACAXbt2oXXr1jA3N0fr1q2xc+fOCretoKAAH374IZydnSGXy9GiRQt89tlnEARBrKN9r7V9LO/R9yI/Px/BwcFo1KgR5HI5HBwc8Nprr+HXX3997D6ePXu2zv6wtrbGK6+8gl27dj12Oa3ffvsNPj4+UCgUsLKyQp8+ffDLL7/o1Pnll1/g4eGBSZMmQaVSQS6Xo3Xr1vj666/FOoIgoFGjRnjzzTf11lFYWAilUon33ntPp8+PatSoEUaOHCm+rup7WtF+/v333/HWW2/hpZdegoWFBTp27Ki3T7THwvbt23XKraysdPoBVPx5AoDLly9j8ODBsLW1hbm5OTp06IAff/xRp4522MG1a9fg4OCAV199FXZ2dmjTpk2lx0dFy2unOnXqwN3dHevWrdOpN3LkSFhZWT22rUePu19++QWtW7eGv78/bG1tK91XAJCTk4MxY8ZApVLB3Nwcbdu21bvsp30vPvvsMyxbtgwNGzaEhYUFevTogQsXLuj199GxeZs2bYKRkREWLFigU16V/Vyb8AzRC0YbXuzs7AAAV69exa5duzBkyBC4uLggOzsbX375JXr06IGLFy/CyckJAFBaWooBAwbg0KFD8Pf3xwcffID8/HzExcXhwoULaNKkibiOYcOGoX///jrrjYiIqLA/n376KWQyGaZNm4acnBwsX74cXl5eSE5OhoWFBQDg8OHD8PHxgYeHB2bNmgUjIyOsX78evXv3xs8//4xXXnlFr9369euLgx/v3buHiRMnVrjuGTNmYOjQoRg7dixu3ryJVatWoXv37vjtt99gY2Ojt8z48ePRrVs3AMCOHTv0vnjfe+89REVFYdSoUZgyZQrS09Px+eef47fffsOJEydgampa4X54Erm5uRUO7CwrK8Mbb7yB48ePY/z48XB1dcX58+exbNky/P7771X6sr179y769euHQYMGYejQodi+fTumTZsGd3d3+Pj4AAA0Gg3WrVuHYcOGYdy4ccjPz8c333wDb29vnDp1Cu3atQMAfPTRRxg7dqxO+5s2bcL+/fvFO5yqevxpffLJJzAzM8PUqVNRVFQEMzMzHDhwAH5+fnBzc0NkZCRu376NUaNGoX79+jrLCoKAN954A0eOHMGYMWPQrl077N+/H2FhYfj777+xbNmyqr4FogkTJmD79u2YPHky3NzccPv2bRw/fhyXLl1C+/bt/3X57777DgBw69YtrF69GkOGDMGFCxfQokWLSpdJSUlBt27doFAoEB4eDlNTU3z55Zfo2bMn4uPj0alTJwDA7du3cebMGZiYmCAoKAhNmjTBrl27MH78eNy+fRvTp0+HTCbDu+++i0WLFuHOnTuwtbUV17Nnzx5oNBq8++67T7RPnvQ91bpz5w66d++O/Px8TJkyBWq1Gps2bcKgQYMQHR391M5op6SkoEuXLqhXrx6mT58OS0tLbN26FQMHDsQPP/yAt956q9Jlv/vuO5w/f/6J1rds2TLUrVsXGo0G3377LcaNG4dGjRrBy8ur2ttw+/ZtfPXVV7CyssKUKVNgb29f4b568OABevbsiStXrmDy5MlwcXHBtm3bMHLkSOTm5uoNrt+4cSPy8/MRFBSEwsJCrFixAr1798b58+ehUqkq7MuBAwcwevRoTJ48WeeM1X/ZzzWWQLXS+vXrBQDCwYMHhZs3bwqZmZnC999/L9jZ2QkWFhbCX3/9JQiCIBQWFgqlpaU6y6anpwtyuVyYO3euWPbtt98KAISlS5fqrausrExcDoCwePFivTqtWrUSevToIb4+cuSIAECoV6+eoNFoxPKtW7cKAIQVK1aIbTdr1kzw9vYW1yMIgnD//n3BxcVFeO211/TW9eqrrwqtW7cWX9+8eVMAIMyaNUssu3btmmBsbCx8+umnOsueP39eMDEx0StPS0sTAAgbNmwQy2bNmiWU/4j8/PPPAgAhOjpaZ9nY2Fi98oYNGwq+vr56fQ8KChIe/dg92vfw8HDBwcFB8PDw0Nmn3333nWBkZCT8/PPPOsuvXbtWACCcOHFCb33l9ejRQwAgbNy4USwrKioS1Gq14OfnJ5Y9fPhQKCoq0ln27t27gkqlEkaPHl1p+ydOnBBMTU116lT1+NMeL40bNxbu37+vU79du3aCo6OjkJubK5YdOHBAACA0bNhQLNu1a5cAQJg3b57O8oMHDxZkMplw5coVcf0AhPXr1+ttw6PvhVKpFIKCgird5so8euyU7/PWrVsfu+zAgQMFMzMz4Y8//hDLrl+/LlhbWwvdu3cXyxo2bCgAEKKiosSyhw8fCn369BHkcrlw69YtQRAEITU1VQAgrFmzRmc9b7zxhtCoUSPxczdnzhwBgM7nULueESNGiK+r+p4+up8//PBDAYAQGxsr1rl//77g6uoqqNVqobi4WBCE/zsWtm3bprMOS0tLnX4IQsWfpz59+gju7u5CYWGhWFZWVia8+uqrQrNmzcQy7d/Q9PR0cbsaNGgg+Pj4VHp8lPfo8oIgCL///rsAQFi0aJFYNmLECMHS0vKxbT163AEQAAhHjx4VyyraV8uXLxcACJs2bRLrFRcXC56enoKVlZX4t1f7XpT/bhAEQUhMTBQACCEhITr91X6uzpw5I1hZWQlDhgzRe8+rup9rE14yq+W8vLxgb28PZ2dn+Pv7w8rKCjt37kS9evUAAHK5XByDUVpaitu3b8PKygotWrTQOe3/ww8/oG7dunj//ff11vFfxicEBgbC2tpafD148GA4Ojrip59+AgAkJycjLS0N77zzDm7fvo1bt27h1q1bKCgoQJ8+fXDs2DHxllitwsJCmJubP3a9O3bsQFlZGYYOHSq2eevWLajVajRr1kzv8k9xcTGAf/ZXZbZt2walUonXXntNp00PDw9YWVnptVlSUqJT79atWygsLHxsv//++2+sWrUKM2bM0DvNvm3bNri6uqJly5Y6bWovkz66/opYWVnpnBEwMzPDK6+8gqtXr4plxsbGMDMzA/DPWak7d+7g4cOH6NChQ6WXirKysjB48GC0a9cOq1evFsurevxpjRgxQjxzCAA3btxAcnIyRowYAaVSKZa/9tprcHNz01n2p59+grGxMaZMmaJT/uGHH0IQBOzbt+9f98+jbGxskJiYiOvXrz/xsgDE9+jSpUtYu3YtLC0t0blz50rrl5aW4sCBAxg4cCAaN24sljs6OuKdd97B8ePHxcuIAKBSqTB8+HDxtbGxMYKDg1FUVISDBw8CAJo3b45OnTohOjparHfnzh3s27cPAQEB4udbe1bvr7/+euw2Pel7eu/ePdy6dQs//fQT3Nzc4O3tLc6zsLDApEmTkJWV9a+XIavizp07OHz4MIYOHYr8/Hxx/9++fRve3t5IS0vD33//XeGyX3zxBW7fvo1Zs2Y90Trv3r2LW7du4erVq1i2bBmMjY3Ro0cPvXpV/Rug1bFjR512KtpXP/30E9Rqtc7ZNVNTU0yZMgX37t1DfHy8TpsDBw4UvxsA4JVXXkGnTp3Ev8flXb16Fb6+vmjXrh2+++47nbF8/2U/12S8ZFbLffHFF2jevDlMTEygUqnQokULnQO3rKwMK1aswOrVq5Geno7S0lJxnvayGvDPpbYWLVrAxOTpHhLNmjXTeS2TydC0aVNcu3YNwD93ygD/fBFWJi8vT+dBZLdu3dJr91FpaWkQBKHSeo9e2srNzQWAx17rT0tLQ15eXqUPvMvJydF5feDAgSceoDlr1iw4OTnhvffe0xtDkZaWhkuXLlXa5qPrr0j9+vX1Au5LL72Ec+fO6ZRt2LABS5YsweXLl1FSUiKWu7i46LX58OFDDB06FKWlpdixY4dOqKzq8VdZ+3/++ScA/eMIgN4X8J9//gknJyedAA4Arq6uOm09iUWLFmHEiBFwdnaGh4cH+vfvj8DAQJ2w8jjl3yuFQoHo6Gg4OztXWv/mzZu4f/9+hZfUXF1dUVZWhszMTLRq1QoymQzNmzfXG3Su3V7tZwz45z8mkydPxp9//omGDRti27ZtKCkp0QlTnp6ekMlkiIiIwLx588TPwqP/IXnS9/T9998X/6NV0WWU8v3VXg6sritXrkAQBMyYMQMzZsyosE5OTo5OKAD++Rszf/58hIaGVnrpqDLlL53K5XJ8/vnnepf5CwoKdI4FZ2dnfPjhh499XlTLli31yh7dV3/++SeaNWtW6THw6DFf0eeoefPm2Lp1q15/vb29kZ2dDTs7O72/GdXdzzUdA1Et98orr4h3mVVk/vz5mDFjBkaPHo1PPvkEtra2MDIyQnBwsN4fOkPQ9mHx4sXi2JRHlQ8pxcXFuHHjBl577bV/bVcmk2Hfvn0wNjZ+bJvAP2c4AECtVj+2TQcHB53/aZf3aFDp1KkT5s2bp1P2+eefY/fu3RUuf+nSJURFRWHTpk0VjkUqKyuDu7s7li5dWuHyj/ui1apoXwDQGXS8adMmjBw5EgMHDkRYWBgcHBxgbGyMyMhIcYxaeWFhYUhISMDBgwf1xvU86fFX/uzQs1LZGc/yX+xaQ4cORbdu3bBz504cOHAAixcvxsKFC7Fjxw5xzNXjxMXFAfjnC+aHH37A0KFDsXfv3n89fqviSfaVv78/QkJCEB0djf/5n//Bpk2b0KFDB53g1bZtW8yaNQtz5syp9BgHnvw9DQsLQ9++fTFo0KAn28Bq0K5/6tSpOmeiymvatKle2cKFC2FkZISwsDDcvn37ida5adMmqFQqFBYW4vDhwwgKCoK5ubnOAHBzc3Ps2bMHwD8D9b/99lsEBwfD0dERQ4cO1WvzeXwOHufWrVuwtLTEnj17MHDgQERGRuqcOavufq7pGIhecNu3b0evXr3wzTff6JTn5uaibt264usmTZogMTERJSUlT2VgsJb2DJCWIAi4cuUK2rRpI64X+Od/z1UZhHj27FmUlJQ8NgRq2xUEAS4uLmjevPm/tnvx4kXIZLLHDnZt0qQJDh48iC5dulTpD1bdunX1tulxA58jIiLQrl07vP3225Wu/+zZs+jTp88zvc16+/btaNy4MXbs2KGznoouJXz//fdYvnw5li9fXuFlgqoef5Vp2LAhAP3jCABSU1P16h48eBD5+fk6Z4kuX76s05b2bKP2rKBWZWeQHB0dMWnSJEyaNAk5OTlo3749Pv300yoFovLv/5tvvonExER89tlnlQYie3t71KlTR2/btNthZGQkBl8XFxf8+uuvKCsr0zlDoN3e8ncK2drawtfXF9HR0QgICMCJEyewfPlyvXXMmjUL48ePx+XLl8WA+Oig6yd9T93c3ODl5QVnZ+dKt+vR/laX9sydqalplQc1X79+HStWrEBkZCSsra2fOBB16dJF7PuAAQOQkpKCyMhInUBkbGys0x9fX1/Y2toiNja2wkDk4uJSpX3VsGFDnDt3rtJjQHvMa1X0Ofr999/19n2dOnUQGxuLli1bIiQkBPPnz8fQoUPFM0/V2c+1AccQveCMjY11/vcP/DMW5dHru35+frh16xY+//xzvTYeXf5JaO9q0Nq+fTtu3Lghfpl4eHigSZMm+Oyzz3Dv3j295W/evKnXd2Nj4wpvaS9v0KBBMDY2xpw5c/T6LwiCzh+9hw8f4ocffsArr7zy2Etm2stCn3zyid68hw8f6n3BPomEhATs3r0bCxYsqDTsDB06FH///bfObdVaDx48QEFBQbXXX572LFL5/ZaYmIiEhASdehcuXMDYsWPx7rvvVnrqv6rHX2UcHR3Rrl07bNiwAXl5eWJ5XFwcLl68qFO3f//+KC0t1TuGly1bBplMJh5zCoUCdevWxbFjx3TqlR/7BPxzxqj8OoF/xtk4OTk90WMOyrdXXFz82GWNjY3Rt29f7N69W+eSV3Z2NjZv3oyuXbtCoVCI25uVlYUtW7aI9bSXs+Ryud4X1fDhw3Hx4kWEhYXB2NgY/v7+FfbB0dERvXr1gpeXF7y8vPTG61X3Pe3Xrx8uXrwonjUD/hkPuGbNGqjVanh4eDx2+apwcHBAz5498eWXX+LGjRt68x/9ewIAc+bMgUqlwoQJE/7z+oF/Pov/dnxo919lZ2z79++PU6dO4eTJk2JZRfuqomPg4cOHWLVqFaysrPT+k7Jr1y6d9+nUqVNITEzUC/f29vbiJbu5c+eifv36GDdunNjv6uzn2oBniF5wAwYMwNy5czFq1Ci8+uqrOH/+PKKjo/XGQAQGBmLjxo0IDQ3FqVOn0K1bNxQUFIiPiq/oOSZVYWtri65du2LUqFHIzs7G8uXL0bRpU4wbNw4AYGRkhHXr1sHHxwetWrXCqFGjUK9ePfz99984cuQIFAoF9uzZg4KCAnzxxRdYuXIlmjdvjqNHj4rr0Aapc+fOISEhAZ6enmjSpAnmzZuHiIgIXLt2DQMHDoS1tTXS09Oxc+dOjB8/HlOnTsXBgwcxY8YMnDt3TjylXZkePXrgvffeQ2RkJJKTk9G3b1+YmpoiLS0N27Ztw4oVKzB48OBq7acDBw7gtddee+z/toYPH46tW7diwoQJOHLkCLp06YLS0lJcvnwZW7duxf79+//1zFlVDBgwADt27MBbb70FX19fpKenY+3atXBzc9MJraNGjQIAdO/eXe/pvq+++ioaN25c5ePvcSIjI+Hr64uuXbti9OjRuHPnDlatWoVWrVrp9Of1119Hr1698NFHH+HatWto27YtDhw4gN27dyM4OFjn0RFjx47FggULMHbsWHTo0AHHjh3D77//rrPe/Px81K9fH4MHD0bbtm1hZWWFgwcP4vTp01iyZEmV+q7dLwUFBdi1axeuXbuG4ODgxy4zb948xMXFoWvXrpg0aRJMTEzw5ZdfoqioSOeZUWPGjMGaNWswcuRInDlzBi4uLti1axcOHTqEBQsW6I3n8fX1hZ2dHbZt2wYfH59q//hrdd/T8PBwbN68GW+99ZbObfcXL15EdHS03vjF5ORknf+glJaW4u+//0ZsbKxYlpGRAQCIjY1Fjx49YGFhgS+++AJdu3aFu7s7xo0bh8aNGyM7OxsJCQn466+/9J6XdODAAURHR4s3EjypXbt2oW7duuIls59//lnvPS4tLRX7nZ+fj/Xr16OgoAADBw6sdF9FR0fDx8cHU6ZMQd26dSvcV+PHj8eXX36JkSNHIikpCY0aNcL27dvFM4CPjqdr2rQpunbtiokTJ6KoqAjLly+HnZ0dwsPDK90+CwsLfPXVV/Dy8sKaNWvEnw550v1cKzz/G9voadDe8nn69OnH1issLBQ+/PBDwdHRUbCwsBC6dOkiJCQkCD169NC5pVsQ/rmt86OPPhJcXFwEU1NTQa1WC4MHDxZv/63Obff/7//9PyEiIkJwcHAQLCwsBF9fX+HPP//UW/63334TBg0aJNjZ2QlyuVxo2LChMHToUOHQoUM66/636dHbcn/44Qeha9eugqWlpWBpaSm0bNlSCAoKElJTUwVBEIT3339f6N69u86twFoV3TotCILw1VdfCR4eHoKFhYVgbW0tuLu7C+Hh4cL169fFOk96271MJhOSkpJ0yit6j4qLi4WFCxcKrVq1EuRyufDSSy8JHh4ewpw5c4S8vDy99T3aXqtWrfTKy99mKwj/3Do7f/58oWHDhoJcLhdefvllYe/evXr1tLd9VzRpb1mu6vFX2a3WWj/88IPg6uoqyOVywc3NTdixY4defwRBEPLz84WQkBDByclJMDU1FZo1ayYsXrxY71by+/fvC2PGjBGUSqVgbW0tDB06VMjJydG5/bmoqEgICwsT2rZtK1hbWwuWlpZC27ZthdWrVz92PwvC/x072snCwkJwc3MTli1bpteXivz666+Ct7e3YGVlJdSpU0fo1auXcPLkSb16OTk5wujRo4W6desKZmZmQuvWrYWvv/660nYnTZokABA2b978r33Qqui2+6q8pxU93uDKlSuCn5+foFQqBblcLnTo0EHYuXOnzvq0x8KTTuVvf//jjz+EwMBAQa1WC6ampkK9evWEAQMGCNu3bxfraP+GtmvXTuc9edxjGcrTLq+dzMzMhKZNmwozZ87UuRV9xIgROvWsrKyE9u3bC999951Yp/xxV34bBg8eLCiVSsHc3Fzo2LGjsGvXLr1+ZGdnC6NGjRKPAXd3d72+l//bvWTJEsHZ2VmQy+VCt27dhLNnz+rUrehzJQiCMGrUKEGhUOjctl+V/VybyAThP1wPIarE0aNH0atXL2zbtq3aZ03Ku3btGlxcXJCenl7pWIPZs2fj2rVr//qEWSKpCgkJwTfffIOsrKwX6rcOZTLZY/82SJ327+fixYsxdepUQ3enxuIYIiIiCSgsLMSmTZvg5+f3QoUhoqeFY4ioVrCyskJAQMBjBz23adOm0p8NIJKqnJwcHDx4ENu3b8ft27cf++yb2srb29vgt6pT7cdARLWCdlDh4zyP55wQ1TYXL15EQEAAHBwcsHLlykqf91WblR9oTVRdHENEREREkscxRERERCR5DEREREQkeRxDVAVlZWW4fv06rK2tn+lPJhAREdHTIwgC8vPz4eTkpPcjuI9iIKqC69evV+mHM4mIiKjmyczM1Pvx6UcxEFWB9vHnmZmZ4u8IERERUc2m0Wjg7Oys9zMmFWEgqgLtZTKFQsFAREREVMtUZbgLB1UTERGR5DEQERERkeQxEBEREZHkMRARERGR5DEQERERkeQZNBCVlpZixowZcHFxgYWFBZo0aYJPPvkE5X9eTRAEzJw5E46OjrCwsICXlxfS0tJ02rlz5w4CAgKgUChgY2ODMWPG4N69ezp1zp07h27dusHc3BzOzs5YtGjRc9lGIiIiqvkMGogWLlyINWvW4PPPP8elS5ewcOFCLFq0CKtWrRLrLFq0CCtXrsTatWuRmJgIS0tLeHt7o7CwUKwTEBCAlJQUxMXFYe/evTh27BjGjx8vztdoNOjbty8aNmyIpKQkLF68GLNnz8ZXX331XLeXiIiIaiaD/tr9gAEDoFKp8M0334hlfn5+sLCwwKZNmyAIApycnPDhhx9i6tSpAIC8vDyoVCpERUXB398fly5dgpubG06fPo0OHToAAGJjY9G/f3/89ddfcHJywpo1a/DRRx8hKysLZmZmAIDp06dj165duHz58r/2U6PRQKlUIi8vj88hIiIiqiWe5PvboGeIXn31VRw6dAi///47AODs2bM4fvw4fHx8AADp6enIysqCl5eXuIxSqUSnTp2QkJAAAEhISICNjY0YhgDAy8sLRkZGSExMFOt0795dDEMA4O3tjdTUVNy9e1evX0VFRdBoNDoTERERvbgM+qTq6dOnQ6PRoGXLljA2NkZpaSk+/fRTBAQEAACysrIAACqVSmc5lUolzsvKyoKDg4POfBMTE9ja2urUcXFx0WtDO++ll17SmRcZGYk5c+Y8pa0kIiKims6gZ4i2bt2K6OhobN68Gb/++is2bNiAzz77DBs2bDBktxAREYG8vDxxyszMNGh/iIiI6Nky6BmisLAwTJ8+Hf7+/gAAd3d3/Pnnn4iMjMSIESOgVqsBANnZ2XB0dBSXy87ORrt27QAAarUaOTk5Ou0+fPgQd+7cEZdXq9XIzs7WqaN9ra1Tnlwuh1wufzobSURERDWeQc8Q3b9/H0ZGul0wNjZGWVkZAMDFxQVqtRqHDh0S52s0GiQmJsLT0xMA4OnpidzcXCQlJYl1Dh8+jLKyMnTq1Emsc+zYMZSUlIh14uLi0KJFC73LZURERCQ9Bg1Er7/+Oj799FPExMTg2rVr2LlzJ5YuXYq33noLwD+/ThscHIx58+bhxx9/xPnz5xEYGAgnJycMHDgQAODq6op+/fph3LhxOHXqFE6cOIHJkyfD398fTk5OAIB33nkHZmZmGDNmDFJSUrBlyxasWLECoaGhhtp0IiIiqkkEA9JoNMIHH3wgNGjQQDA3NxcaN24sfPTRR0JRUZFYp6ysTJgxY4agUqkEuVwu9OnTR0hNTdVp5/bt28KwYcMEKysrQaFQCKNGjRLy8/N16pw9e1bo2rWrIJfLhXr16gkLFiyocj/z8vIEAEJeXt5/22AiIiJ6bp7k+9ugzyGqLZ7Xc4g8wjY+s7aJarOkxYGG7gIR1UK15jlERERERDUBAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUmeQQNRo0aNIJPJ9KagoCAAQGFhIYKCgmBnZwcrKyv4+fkhOztbp42MjAz4+vqiTp06cHBwQFhYGB4+fKhT5+jRo2jfvj3kcjmaNm2KqKio57WJREREVAsYNBCdPn0aN27cEKe4uDgA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4+Px4YcfVqmNpKQk5OTkoH379jAxMYGJiQni4+OxcuVKmJiYQKVSobi4GLm5uTrLZWdnQ61WAwDUarXeXWfa1/9WR6FQVHh2CADkcjkUCoXORERERC+uagWiH374Ad988w18fHzEwNC/f398/fXX2L59e5Xa6NOnD86fP4/k5GRx6tChAwICAsR/m5qa4tChQ+IyqampyMjIgKenJwDA09MT58+fR05OjlgnLi4OCoUCbm5uYp3ybWjraNsgIiIiqtYYovv37+uNywEABweHKl8ys7a2RuvWrXXKLC0tYWdnJ5aPGTMGoaGhsLW1hUKhwPvvvw9PT0907twZANC3b1+4ublh+PDhWLRoEbKysvDxxx8jKCgIcrkcADBhwgR8/vnnCA8Px+jRo3H48GFs3boVMTEx1dl0IiIiegFV6wyRp6cnZs2ahcLCQrHswYMHmDNnzlM987Js2TIMGDAAfn5+6N69O9RqNXbs2CHONzY2xt69e2FsbAxPT0+8++67CAwMxNy5c8U6Li4uiImJQVxcHNq2bYslS5Zg3bp1fAYRERERiar1HKLz58+jX79+KCoqQtu2bQEAZ8+ehVwux4EDB9CqVaun3lFD4nOIiAyLzyEioup45s8hcnd3R1paGqKjo3H58mUAwLBhwxAQEFDpQGUiIiKimqpagSgyMhIqlQrjxo3TKf/2229x8+ZNTJs27al0joiIiOh5qNYYoi+//BItW7bUK2/VqhXWrl37nztFRERE9DxVKxBlZWXB0dFRr9ze3h43btz4z50iIiIiep6qFYicnZ3FX5wv78SJE3BycvrPnSIiIiJ6nqo1hmjcuHEIDg5GSUkJevfuDQA4dOgQwsPDq/ykaiIiIqKaolqBKCwsDLdv38akSZNQXFwMADA3N8e0adMQERHxVDtIRERE9KxVKxDJZDIsXLgQM2bMwKVLl2BhYYFmzZqJT4cmIiIiqk2qFYi0rKys0LFjx6fVFyIiIiKDqNagaiIiIqIXCQMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUmeQQPRmjVr0KZNGygUCigUCnh6emLfvn3i/MLCQgQFBcHOzg5WVlbw8/NDdna2ThsZGRnw9fVFnTp14ODggLCwMDx8+FCnztGjR9G+fXvI5XI0bdoUUVFRz2PziIiIqJYwaCCqX78+FixYgKSkJJw5cwa9e/fGm2++iZSUFABASEgI9uzZg23btiE+Ph7Xr1/HoEGDxOVLS0vh6+uL4uJinDx5Ehs2bEBUVBRmzpwp1klPT4evry969eqF5ORkBAcHY+zYsdi/f/9z314iIiKqmWSCIAiG7kR5tra2WLx4MQYPHgx7e3ts3rwZgwcPBgBcvnwZrq6uSEhIQOfOnbFv3z4MGDAA169fh0qlAgCsXbsW06ZNw82bN2FmZoZp06YhJiYGFy5cENfh7++P3NxcxMbGVqlPGo0GSqUSeXl5UCgUT3+j/5dH2MZn1jZRbZa0ONDQXSCiWuhJvr9rzBii0tJSfP/99ygoKICnpyeSkpJQUlICLy8vsU7Lli3RoEEDJCQkAAASEhLg7u4uhiEA8Pb2hkajEc8yJSQk6LShraNtg4iIiMjE0B04f/48PD09UVhYCCsrK+zcuRNubm5ITk6GmZkZbGxsdOqrVCpkZWUBALKysnTCkHa+dt7j6mg0Gjx48AAWFhZ6fSoqKkJRUZH4WqPR/OftJCIioprL4GeIWrRogeTkZCQmJmLixIkYMWIELl68aNA+RUZGQqlUipOzs7NB+0NERETPlsEDkZmZGZo2bQoPDw9ERkaibdu2WLFiBdRqNYqLi5Gbm6tTPzs7G2q1GgCgVqv17jrTvv63OgqFosKzQwAQERGBvLw8ccrMzHwam0pEREQ1lMED0aPKyspQVFQEDw8PmJqa4tChQ+K81NRUZGRkwNPTEwDg6emJ8+fPIycnR6wTFxcHhUIBNzc3sU75NrR1tG1URC6Xi48C0E5ERET04jLoGKKIiAj4+PigQYMGyM/Px+bNm3H06FHs378fSqUSY8aMQWhoKGxtbaFQKPD+++/D09MTnTt3BgD07dsXbm5uGD58OBYtWoSsrCx8/PHHCAoKglwuBwBMmDABn3/+OcLDwzF69GgcPnwYW7duRUxMjCE3nYiIiGoQgwainJwcBAYG4saNG1AqlWjTpg3279+P1157DQCwbNkyGBkZwc/PD0VFRfD29sbq1avF5Y2NjbF3715MnDgRnp6esLS0xIgRIzB37lyxjouLC2JiYhASEoIVK1agfv36WLduHby9vZ/79hIREVHNVOOeQ1QT8TlERIbF5xARUXXUyucQERERERkKAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUkeAxERERFJHgMRERERSR4DEREREUmeQQNRZGQkOnbsCGtrazg4OGDgwIFITU3VqVNYWIigoCDY2dnBysoKfn5+yM7O1qmTkZEBX19f1KlTBw4ODggLC8PDhw916hw9ehTt27eHXC5H06ZNERUV9aw3j4iIiGoJgwai+Ph4BAUF4ZdffkFcXBxKSkrQt29fFBQUiHVCQkKwZ88ebNu2DfHx8bh+/ToGDRokzi8tLYWvry+Ki4tx8uRJbNiwAVFRUZg5c6ZYJz09Hb6+vujVqxeSk5MRHByMsWPHYv/+/c91e4mIiKhmkgmCIBi6E1o3b96Eg4MD4uPj0b17d+Tl5cHe3h6bN2/G4MGDAQCXL1+Gq6srEhIS0LlzZ+zbtw8DBgzA9evXoVKpAABr167FtGnTcPPmTZiZmWHatGmIiYnBhQsXxHX5+/sjNzcXsbGx/9ovjUYDpVKJvLw8KBSKZ7PxADzCNj6ztolqs6TFgYbuAhHVQk/y/V2jxhDl5eUBAGxtbQEASUlJKCkpgZeXl1inZcuWaNCgARISEgAACQkJcHd3F8MQAHh7e0Oj0SAlJUWsU74NbR1tG48qKiqCRqPRmYiIiOjFVWMCUVlZGYKDg9GlSxe0bt0aAJCVlQUzMzPY2Njo1FWpVMjKyhLrlA9D2vnaeY+ro9Fo8ODBA72+REZGQqlUipOzs/NT2UYiIiKqmWpMIAoKCsKFCxfw/fffG7oriIiIQF5enjhlZmYauktERET0DJkYugMAMHnyZOzduxfHjh1D/fr1xXK1Wo3i4mLk5ubqnCXKzs6GWq0W65w6dUqnPe1daOXrPHpnWnZ2NhQKBSwsLPT6I5fLIZfLn8q2ERERUc1n0DNEgiBg8uTJ2LlzJw4fPgwXFxed+R4eHjA1NcWhQ4fEstTUVGRkZMDT0xMA4OnpifPnzyMnJ0esExcXB4VCATc3N7FO+Ta0dbRtEBERkbQZ9AxRUFAQNm/ejN27d8Pa2loc86NUKmFhYQGlUokxY8YgNDQUtra2UCgUeP/99+Hp6YnOnTsDAPr27Qs3NzcMHz4cixYtQlZWFj7++GMEBQWJZ3kmTJiAzz//HOHh4Rg9ejQOHz6MrVu3IiYmxmDbTkRERDWHQc8QrVmzBnl5eejZsyccHR3FacuWLWKdZcuWYcCAAfDz80P37t2hVquxY8cOcb6xsTH27t0LY2NjeHp64t1330VgYCDmzp0r1nFxcUFMTAzi4uLQtm1bLFmyBOvWrYO3t/dz3V4iIiKqmWrUc4hqKj6HiMiw+BwiIqqOWvscIiIiIiJDYCAiIiIiyWMgIiIiIsljICIiIiLJYyAiIiIiyWMgIiIiIsljICIiIiLJYyAiIiIiyWMgIiIiIsljICIiIiLJYyAiIiIiyWMgIiIiIsljICIiIiLJYyAiIiIiyWMgIiIiIsljICIiIiLJYyAiIiIiyWMgIiIiIsljICIiIiLJYyAiIiIiyWMgIiIiIsljICIiIiLJYyAiIiIiyWMgIiIiIsljICIiIiLJYyAiIiIiyWMgIiIiIsljICIiIiLJYyAiIiIiyWMgIiIiIsljICIiIiLJYyAiIiIiyTMxdAeIiKTAI2yjobtAVCMlLQ40dBcA8AwRERERkWED0bFjx/D666/DyckJMpkMu3bt0pkvCAJmzpwJR0dHWFhYwMvLC2lpaTp17ty5g4CAACgUCtjY2GDMmDG4d++eTp1z586hW7duMDc3h7OzMxYtWvSsN42IiIhqEYMGooKCArRt2xZffPFFhfMXLVqElStXYu3atUhMTISlpSW8vb1RWFgo1gkICEBKSgri4uKwd+9eHDt2DOPHjxfnazQa9O3bFw0bNkRSUhIWL16M2bNn46uvvnrm20dERES1g0HHEPn4+MDHx6fCeYIgYPny5fj444/x5ptvAgA2btwIlUqFXbt2wd/fH5cuXUJsbCxOnz6NDh06AABWrVqF/v3747PPPoOTkxOio6NRXFyMb7/9FmZmZmjVqhWSk5OxdOlSneBERERE0lVjxxClp6cjKysLXl5eYplSqUSnTp2QkJAAAEhISICNjY0YhgDAy8sLRkZGSExMFOt0794dZmZmYh1vb2+kpqbi7t27Fa67qKgIGo1GZyIiIqIXV40NRFlZWQAAlUqlU65SqcR5WVlZcHBw0JlvYmICW1tbnToVtVF+HY+KjIyEUqkUJ2dn5/++QURERFRj1dhAZEgRERHIy8sTp8zMTEN3iYiIiJ6hGhuI1Go1ACA7O1unPDs7W5ynVquRk5OjM//hw4e4c+eOTp2K2ii/jkfJ5XIoFAqdiYiIiF5cNTYQubi4QK1W49ChQ2KZRqNBYmIiPD09AQCenp7Izc1FUlKSWOfw4cMoKytDp06dxDrHjh1DSUmJWCcuLg4tWrTASy+99Jy2hoiIiGoygwaie/fuITk5GcnJyQD+GUidnJyMjIwMyGQyBAcHY968efjxxx9x/vx5BAYGwsnJCQMHDgQAuLq6ol+/fhg3bhxOnTqFEydOYPLkyfD394eTkxMA4J133oGZmRnGjBmDlJQUbNmyBStWrEBoaKiBtpqIiIhqGoPedn/mzBn06tVLfK0NKSNGjEBUVBTCw8NRUFCA8ePHIzc3F127dkVsbCzMzc3FZaKjozF58mT06dMHRkZG8PPzw8qVK8X5SqUSBw4cQFBQEDw8PFC3bl3MnDmTt9wTERGRSCYIgmDoTtR0Go0GSqUSeXl5z3Q8EX/riKhiNeW3jv4Lfr6JKvYsP99P8v1dY8cQERERET0vDEREREQkeQxEREREJHkMRERERCR5DEREREQkeQxEREREJHkMRERERCR5DEREREQkeQxEREREJHkMRERERCR5DEREREQkeQxEREREJHkMRERERCR5DEREREQkeQxEREREJHkMRERERCR5DEREREQkeQxEREREJHkMRERERCR5DEREREQkeQxEREREJHkMRERERCR5DEREREQkeQxEREREJHkMRERERCR5DEREREQkeQxEREREJHkMRERERCR5DEREREQkeQxEREREJHkMRERERCR5DEREREQkeQxEREREJHkMRERERCR5kgpEX3zxBRo1agRzc3N06tQJp06dMnSXiIiIqAaQTCDasmULQkNDMWvWLPz6669o27YtvL29kZOTY+iuERERkYFJJhAtXboU48aN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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAHHCAYAAABeLEexAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABFYklEQVR4nO3deVwV9eL/8fcBBZHNXNiSi6i5oKiFZeSeC26VqXk1y31J4ZZa6vVbri2U5pKWS7dyKbu55FKaJu5pZImhuXHVML0p4ga4gsL8/vDHXI8HFE0Endfz8ZjHg/nMZz7zmXPOnPNm5jPn2AzDMAQAAGBhTgXdAQAAgIJGIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIA4B5lGIZOnz6t/fv3F3RX7nkEIuA+06hRI1WvXr2gu3HHdO/eXeXKlSvobsBidu3apaVLl5rz8fHxWrFiRcF16Bpnz57VG2+8ocqVK8vFxUWlSpVSpUqVlJCQUNBdu6cRiAq52bNny2azmVOxYsVUqVIlRUVF6fjx4wXdPQC4L509e1b9+vXTTz/9pP379+uVV17Rb7/9VtDd0qlTpxQeHq4pU6aoQ4cOWrZsmWJiYrRhwwb+cfiLihR0B5A3Y8eOVXBwsC5duqTNmzdr+vTp+u6777Rr1y4VL168oLsHAPeV8PBwc5KkSpUqqU+fPgXcK2nIkCE6duyYYmNjVa1atYLuzn2FQHSPaNmypWrXri1J6t27t0qVKqWJEydq2bJl6ty5cwH3Drh9ly5dkouLi5ycOGGNwmXp0qXas2ePLl68qNDQULm4uBRof5KTkzVnzhzNmDGDMJQPeAe6Rz355JOSpMTEREnS6dOn9dprryk0NFQeHh7y8vJSy5YttWPHDod1L126pNGjR6tSpUoqVqyY/P391a5dOx08eFCSdOjQIbvLdNdPjRo1MtvasGGDbDab5s+fr//7v/+Tn5+f3N3d9fTTT+vIkSMO2966datatGghb29vFS9eXA0bNtSWLVty3MdGjRrluP3Ro0c71P3iiy8UFhYmNzc3lSxZUp06dcpx+zfat2tlZWVp8uTJqlatmooVKyZfX1/169dPZ86csatXrlw5tWnTxmE7UVFRDm3m1Pfx48c7PKaSlJ6erlGjRqlixYpydXVVYGCghg4dqvT09Bwfq5zs2bNHjRs3VvHixfXggw9q3LhxdsszMjI0cuRIhYWFydvbW+7u7qpfv77Wr19vVy+358Fms2n27NmS8v76y369fPXVV3rjjTf04IMPqnjx4kpLS5N09QOoevXqKlasmKpXr64lS5bkuG/nz5/Xq6++qsDAQLm6uqpy5cp6//33ZRiGWSf7uc7u47Wufy7Onj2rgQMHqly5cnJ1dZWPj4+aNWum7du33/AxHj16tN3j4enpqccee8xu7MnN1r3W+vXr5erqqpdeesmu/Ndff1XLli3l5eUlDw8PNWnSRD/99JNdnezL69u2bbMrP3nypN3+Xt/nnKYNGzZI+t94tLi4OD3xxBNyc3NTcHCwZsyY4bA/ycnJ6tWrl3x9fVWsWDHVrFlTc+bMydPjlj11797doc7Jkydv+DjmNmbu/fffl81m06FDh+zKp02bpmrVqsnV1VUBAQGKjIxUSkqKQ5vZx2RISIjCwsK0Y8eOHN8rcuvTtftVunRptW7dWrt27bKrZ7PZFBUVlWs72c9p9j788ssvysrKUkZGhmrXrq1ixYqpVKlS6ty5sw4fPuyw/rp161S/fn25u7urRIkSeuaZZ7R37167OtmP8759+9SxY0d5eXmpVKlSeuWVV3Tp0iWH/l573Fy5ckWtWrVSyZIltWfPHru6eX1PLkw4Q3SPyg4vpUqVkiT9/vvvWrp0qZ577jkFBwfr+PHjmjlzpho2bKg9e/YoICBAkpSZmak2bdpo7dq16tSpk1555RWdPXtWMTEx2rVrlypUqGBuo3PnzmrVqpXddocPH55jf95++23ZbDYNGzZMycnJmjx5spo2bar4+Hi5ublJunpwtmzZUmFhYRo1apScnJw0a9YsPfnkk/rhhx/02GOPObRbtmxZRUdHS5LOnTun/v3757jtESNGqGPHjurdu7dOnDihqVOnqkGDBvr1119VokQJh3X69u2r+vXrS5IWL17s8MHbr18/zZ49Wz169NDLL7+sxMREffjhh/r111+1ZcsWFS1aNMfH4VakpKSY+3atrKwsPf3009q8ebP69u2rqlWr6rffftOkSZP0n//8J08ftmfOnFGLFi3Url07dezYUYsWLdKwYcMUGhqqli1bSpLS0tL0ySefqHPnzurTp4/Onj2rTz/9VBEREfr5559Vq1YtSdLrr7+u3r1727X/xRdf6Pvv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xhuKjIyUq6urJOmll17Shx9+qKFDh6pnz55at26dFixYoBUrVhTYvgMAgMKjQM8QTZ8+XampqWrUqJH8/f3Naf78+WadSZMmqU2bNmrfvr0aNGggPz8/LV682Fzu7Oys5cuXy9nZWeHh4XrhhRfUtWtXjR071qwTHBysFStWKCYmRjVr1tSECRP0ySefKCIi4q7uLwAAKJwK1fcQFVZ8DxFQsPgeIgC34579HiIAAICCQCACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWV6CBaNOmTXrqqacUEBAgm82mpUuX2i3v3r27bDab3dSiRQu7OqdPn1aXLl3k5eWlEiVKqFevXjp37pxdnZ07d6p+/foqVqyYAgMDNW7cuPzeNQAAcA8p0EB0/vx51axZUx999FGudVq0aKFjx46Z07///W+75V26dNHu3bsVExOj5cuXa9OmTerbt6+5PC0tTc2bN1dQUJDi4uI0fvx4jR49Wh9//HG+7RcAALi3FCnIjbds2VItW7a8YR1XV1f5+fnluGzv3r1atWqVfvnlF9WuXVuSNHXqVLVq1Urvv/++AgICNG/ePGVkZOizzz6Ti4uLqlWrpvj4eE2cONEuOAEAAOu6rTNETz75pFJSUhzK09LS9OSTT/7VPtnZsGGDfHx8VLlyZfXv31+nTp0yl8XGxqpEiRJmGJKkpk2bysnJSVu3bjXrNGjQQC4uLmadiIgIJSQk6MyZMzluMz09XWlpaXYTAAC4f91WINqwYYMyMjIcyi9duqQffvjhL3cqW4sWLTR37lytXbtW7733njZu3KiWLVsqMzNTkpSUlCQfHx+7dYoUKaKSJUsqKSnJrOPr62tXJ3s+u871oqOj5e3tbU6BgYF3bJ8AAEDhc0uXzHbu3Gn+vWfPHrtAkZmZqVWrVunBBx+8Y53r1KmT+XdoaKhq1KihChUqaMOGDWrSpMkd2871hg8frsGDB5vzaWlphCIAAO5jtxSIatWqZd7tldOlMTc3N02dOvWOde565cuXV+nSpXXgwAE1adJEfn5+Sk5Otqtz5coVnT592hx35Ofnp+PHj9vVyZ7PbWySq6urXF1d82EPAABAYXRLgSgxMVGGYah8+fL6+eefVaZMGXOZi4uLfHx85OzsfMc7me2///2vTp06JX9/f0lSeHi4UlJSFBcXp7CwMEnSunXrlJWVpTp16ph1Xn/9dV2+fFlFixaVJMXExKhy5cp64IEH8q2vAADg3nFLgSgoKEiSlJWVdUc2fu7cOR04cMCcT0xMVHx8vEqWLKmSJUtqzJgxat++vfz8/HTw4EENHTpUFStWVEREhCSpatWqatGihfr06aMZM2bo8uXLioqKUqdOnRQQECBJev755zVmzBj16tVLw4YN065du/TBBx9o0qRJd2QfAADAve+2b7vfv3+/1q9fr+TkZIeANHLkyDy1sW3bNjVu3Niczx63061bN02fPl07d+7UnDlzlJKSooCAADVv3lxvvvmm3eWsefPmKSoqSk2aNJGTk5Pat2+vKVOmmMu9vb21evVqRUZGKiwsTKVLl9bIkSO55R4AAJhshmEYt7rSv/71L/Xv31+lS5eWn5+fbDbb/xq02bR9+/Y72smClpaWJm9vb6WmpsrLyyvfthM2ZG6+tQ3cy+LGdy3oLgC4B93K5/dtnSF666239Pbbb2vYsGG31UEAAIDC5La+h+jMmTN67rnn7nRfAAAACsRtBaLnnntOq1evvtN9AQAAKBC3dcmsYsWKGjFihH766SeFhoaat7Nne/nll+9I5wAAAO6G2wpEH3/8sTw8PLRx40Zt3LjRbpnNZiMQAQCAe8ptBaLExMQ73Q8AAIACc1tjiAAAAO4nt3WGqGfPnjdc/tlnn91WZwAAAArCbQWiM2fO2M1fvnxZu3btUkpKSo4/+goAAFCY3VYgWrJkiUNZVlaW+vfvrwoVKvzlTgEAANxNd2wMkZOTkwYPHsyPpgIAgHvOHR1UffDgQV25cuVONgkAAJDvbuuSWfav0mczDEPHjh3TihUr1K1btzvSMQAAgLvltgLRr7/+ajfv5OSkMmXKaMKECTe9Aw0AAKCwua1AtH79+jvdDwAAgAJzW4Eo24kTJ5SQkCBJqly5ssqUKXNHOgUAAHA33dag6vPnz6tnz57y9/dXgwYN1KBBAwUEBKhXr166cOHCne4jAABAvrqtQDR48GBt3LhR3377rVJSUpSSkqJly5Zp48aNevXVV+90HwEAAPLVbV0y+/rrr7Vo0SI1atTILGvVqpXc3NzUsWNHTZ8+/U71DwAAIN/d1hmiCxcuyNfX16Hcx8eHS2YAAOCec1uBKDw8XKNGjdKlS5fMsosXL2rMmDEKDw+/Y50DAAC4G27rktnkyZPVokULlS1bVjVr1pQk7dixQ66urlq9evUd7SAAAEB+u61AFBoaqv3792vevHnat2+fJKlz587q0qWL3Nzc7mgHAQAA8tttBaLo6Gj5+vqqT58+duWfffaZTpw4oWHDht2RzgEAANwNtzWGaObMmapSpYpDebVq1TRjxoy/3CkAAIC76bYCUVJSkvz9/R3Ky5Qpo2PHjv3lTgEAANxNtxWIAgMDtWXLFofyLVu2KCAg4C93CgAA4G66rTFEffr00cCBA3X58mU9+eSTkqS1a9dq6NChfFM1AAC459xWIBoyZIhOnTqlAQMGKCMjQ5JUrFgxDRs2TMOHD7+jHQQAAMhvtxWIbDab3nvvPY0YMUJ79+6Vm5ubHnroIbm6ut7p/gEAAOS72wpE2Tw8PPToo4/eqb4AAAAUiNsaVA0AAHA/IRABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLK9BAtGnTJj311FMKCAiQzWbT0qVL7ZYbhqGRI0fK399fbm5uatq0qfbv329X5/Tp0+rSpYu8vLxUokQJ9erVS+fOnbOrs3PnTtWvX1/FihVTYGCgxo0bl9+7BgAA7iEFGojOnz+vmjVr6qOPPspx+bhx4zRlyhTNmDFDW7dulbu7uyIiInTp0iWzTpcu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UwD3Po5v5MZm5OVeNAAAgPuYJcYQAQAA3AiBCAAAWB6BCAAAWB6BCLjG7Nmz+c4pALAgAhHuS927d5fNZnOYDhw4UNBdA3CH5HSMXzuNHj26oLuIe4hlbruH9bRo0UKzZs2yKytTpkwB9QbAnXbs2DHz7/nz52vkyJFKSEgwyzw8PMy/DcNQZmamihThYw854wwR7luurq7y8/Ozmz744AOFhobK3d1dgYGBGjBggM6dO5drGzt27FDjxo3l6ekpLy8vhYWFadu2bebyzZs3q379+nJzc1NgYKBefvllnT9//m7sHmB51x7b3t7estls5vy+ffvk6emplStXKiwsTK6urtq8ebO6d++utm3b2rUzcOBANWrUyJzPyspSdHS0goOD5ebmppo1a2rRokV3d+dw1xGIYClOTk6aMmWKdu/erTlz5mjdunUaOnRorvW7dOmismXL6pdfflFcXJz++c9/qmjRopKkgwcPqkWLFmrfvr127typ+fPna/PmzYqKirpbuwPgJv75z3/q3Xff1d69e1WjRo08rRMdHa25c+dqxowZ2r17twYNGqQXXnhBGzduzOfeoiBx7hD3reXLl9udMm/ZsqUWLlxozpcrV05vvfWWXnrpJU2bNi3HNg4fPqwhQ4aoSpUqkqSHHnrIXBYdHa0uXbpo4MCB5rIpU6aoYcOGmj59uooVK5YPewXgVowdO1bNmjXLc/309HS98847WrNmjflbl+XLl9fmzZs1c+ZMNWzYML+6igJGIMJ9q3Hjxpo+fbo57+7urjVr1ig6Olr79u1TWlqarly5okuXLunChQsqXry4QxuDBw9W79699fnnn6tp06Z67rnnVKFCBUlXL6ft3LlT8+bNM+sbhqGsrCwlJiaqatWq+b+TAG6odu3at1T/wIEDunDhgkOIysjI0MMPP3wnu4ZChkCE+5a7u7sqVqxozh86dEht2rRR//799fbbb6tkyZLavHmzevXqpYyMjBwD0ejRo/X8889rxYoVWrlypUaNGqWvvvpKzz77rM6dO6d+/frp5Zdfdljvb3/7W77uG4C8cXd3t5t3cnLS9b9YdfnyZfPv7DGFK1as0IMPPmhXj98/u78RiGAZcXFxysrK0oQJE+TkdHX43IIFC266XqVKlVSpUiUNGjRInTt31qxZs/Tss8/qkUce0Z49e+xCF4DCrUyZMtq1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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAHHCAYAAABeLEexAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABDi0lEQVR4nO3deVwV9eL/8TegILK6sRnXcBdFvWIZ131JJK1My6tZqLlUQl211Ov35tpCai5lqXW75ZJ9c01vel1wTyNNisyNq6ZpKbgCiinb/P7wx3w9HFA09KDzej4e83gwn/nMZz5zzgznzcxnDk6GYRgCAACwMGdHdwAAAMDRCEQAAMDyCEQAAMDyCEQAAMDyCEQAAMDyCEQAAMDyCEQAAMDyCEQAAMDyCEQAADhAWlqaDh06pJycHEd3BSIQASigTZs2atCggaO7UWL69u2r+++/39HdwB3y66+/as6cOeb80aNHtWDBAsd16BrZ2dmaNGmSGjVqJDc3N1WoUEG1atXShg0bHN01iEB0z5szZ46cnJzMqVy5cqpdu7ZiY2OVmprq6O4BQIlycnJSTEyM1q5dq6NHj2rEiBH6+uuvHd0tXblyRR06dNDo0aPVpk0bLV68WPHx8dq4caMiIiIc3T1IKuPoDuDOmDBhgkJCQnT58mVt27ZNs2bN0n/+8x/t2bNH5cuXd3T3AKBEVK1aVQMHDlSnTp0kSYGBgdq8ebNjOyVp4sSJ2rFjh9auXas2bdo4ujsoBIHIIqKiotS0aVNJ0oABA1SpUiVNnTpVK1asUK9evRzcO+DWXb58Wa6urnJ25oI3rpo+fbpeeuklnTlzRg0aNJCHh4dD+5OTk6Pp06frlVdeIQyVYvwGsah27dpJko4cOSJJOnfunF599VWFhYXJ09NT3t7eioqK0o8//mi37uXLlzVu3DjVrl1b5cqVU2BgoLp166bDhw9LunrP/trbdAWna38hbN68WU5OTlq4cKH+53/+RwEBAfLw8NBjjz2m48eP2217x44d6tSpk3x8fFS+fHm1bt1a27dvL3Qf27RpU+j2x40bZ1f3s88+U3h4uNzd3VWxYkX17Nmz0O1fb9+ulZeXp+nTp6t+/foqV66c/P399fzzz+v8+fM29e6//3516dLFbjuxsbF2bRbW98mTJ9u9ptLVy/Njx45VzZo15ebmpuDgYI0YMUJXrlwp9LUqzL59+9S2bVuVL19eVatW1aRJk2yWZ2VlacyYMQoPD5ePj488PDzUsmVLbdq0yaZeUe+Dk5OTOdajuMdf/vHyxRdf6LXXXlPVqlVVvnx5ZWRkSJKWL1+uBg0aqFy5cmrQoIG+/PLLQvctMzNTr7zyioKDg+Xm5qY6deronXfekWEYZp389/ra8Sj5Cr4XFy5c0JAhQ3T//ffLzc1Nfn5+evjhh/X9999f9zUeN26czevh5eWlBx98UMuXL7+p9Qqbrr0qUtzz5rffflP//v0VFBQkNzc3hYSE6MUXX1RWVpbd7ffrvZ+StHHjRrVs2VIeHh7y9fXV448/rv3799/y/i9evNg8RytXrqxnnnlGv/32m02da8eL1ahRQ82aNdO5c+fk7u4uJycnHT169Lqva9++fW36U6FCBbVp08bulltR522+/OM0/z1ITk7W+fPn5eXlpdatW6t8+fLy8fFRly5dtGfPHrv1f/jhB0VFRcnb21uenp5q3769vv32W5s6+e/H1q1b9fzzz6tSpUry9vZWdHR0ob9n+vbta1M2aNAglStXzu7q2erVq833zcvLS507d9bevXuv+7rdK7hCZFH54aVSpUqSpJ9//lnLly/XU089pZCQEKWmpurDDz9U69attW/fPgUFBUmScnNz1aVLF23YsEE9e/bU3/72N124cEHx8fHas2ePatSoYW6jV69eeuSRR2y2O2rUqEL78+abb8rJyUkjR47UqVOnNH36dHXo0EFJSUlyd3eXdPUXbFRUlMLDwzV27Fg5Ozvr008/Vbt27fT111/rwQcftGv3vvvuU1xcnCTp4sWLevHFFwvd9ujRo9WjRw8NGDBAp0+f1owZM9SqVSv98MMP8vX1tVtn0KBBatmypSRp2bJldh+8zz//vObMmaN+/frp5Zdf1pEjR/T+++/rhx9+0Pbt21W2bNlCX4ebkZaWZu7btfLy8vTYY49p27ZtGjRokOrVq6effvpJ06ZN03//+98bfthK0vnz59WpUyd169ZNPXr00JIlSzRy5EiFhYUpKipKkpSRkaGPP/5YvXr10sCBA3XhwgX961//UmRkpHbu3KnGjRtLkv7xj39owIABNu1/9tlnWrt2rfz8/CQV//jL9/rrr8vV1VWvvvqqrly5IldXV61bt07du3dXaGio4uLidPbsWfXr10/33XefzbqGYeixxx7Tpk2b1L9/fzVu3Fhr167V8OHD9dtvv2natGnFfQtML7zwgpYsWaLY2FiFhobq7Nmz2rZtm/bv368mTZrccP358+dLks6cOaOZM2fqqaee0p49e1SnTp1C63fr1k01a9Y054cOHap69epp0KBBZlm9evUkFf+8OXHihB588EGlpaVp0KBBqlu3rn777TctWbJEly5dUqtWrcx+SlfPG+nq+5vvL3/5iyRp/fr1ioqKUvXq1TVu3Dj9/vvvmjFjhpo3b67vv//ebpD7jfY//1x64IEHFBcXp9TUVL377rvavn17kedovjFjxujy5ctFv/gFVK5c2TwGfv31V7377rt65JFHdPz48etu53rOnj0r6ervv1q1amn8+PG6fPmyPvjgAzVv3lzfffedateuLUnau3evWrZsKW9vb40YMUJly5bVhx9+qDZt2mjLli1q1qyZTduxsbHy9fXVuHHjlJycrFmzZumXX34xQ1lhxo4dq3/9619auHChzR9T8+fPV58+fRQZGamJEyfq0qVLmjVrllq0aKEffvjh3n84wcA97dNPPzUkGevXrzdOnz5tHD9+3Pjiiy+MSpUqGe7u7savv/5qGIZhXL582cjNzbVZ98iRI4abm5sxYcIEs+yTTz4xJBlTp06121ZeXp65niRj8uTJdnXq169vtG7d2pzftGmTIcmoWrWqkZGRYZYvWrTIkGS8++67Ztu1atUyIiMjze0YhmFcunTJCAkJMR5++GG7bf3lL38xGjRoYM6fPn3akGSMHTvWLDt69Kjh4uJivPnmmzbr/vTTT0aZMmXsyg8ePGhIMubOnWuWjR071rj2VPr6668NScaCBQts1l2zZo1debVq1YzOnTvb9T0mJsYoeHoW7PuIESMMPz8/Izw83OY1nT9/vuHs7Gx8/fXXNuvPnj3bkGRs377dbnvXat26tSHJmDdvnll25coVIyAgwOjevbtZlpOTY1y5csVm3fPnzxv+/v7Gc889V2T727dvN8qWLWtTp7jHX/7xUr16dePSpUs29Rs3bmwEBgYaaWlpZtm6desMSUa1atXMsuXLlxuSjDfeeMNm/SeffNJwcnIyDh06ZG5fkvHpp5/a7UPB98LHx8eIiYkpcp+LUvDYubbPixYtKnY71apVM/r06WNXfjPnTXR0tOHs7Gx89913hbZTUOvWrW2Ou2s1btzY8PPzM86ePWuW/fjjj4azs7MRHR1tlhVn/7Oysgw/Pz+jQYMGxu+//27WW7lypSHJGDNmjFnWp08fm/d6z549hrOzsxEVFWVIMo4cOVJof4ta3zAM46OPPjIkGTt37jTLijpv8+Ufp5s2bbKZr1y5snHmzBmz3n//+1+jbNmyNudV165dDVdXV+Pw4cNm2YkTJwwvLy+jVatWZln+7/bw8HAjKyvLLJ80aZIhyVixYoVNf/OPjw8//NCQZMyYMcOmzxcuXDB8fX2NgQMH2pSnpKQYPj4+duX3Im6ZWUSHDh1UpUoVBQcHq2fPnvL09NSXX36pqlWrSpLc3NzMMRi5ubk6e/asPD09VadOHZvL/kuXLlXlypX10ksv2W2jqL9GiiM6OlpeXl7m/JNPPqnAwED95z//kSQlJSXp4MGDevrpp3X27FmdOXNGZ86cUWZmptq3b6+tW7cqLy/Pps3Lly+rXLly193usmXLlJeXpx49ephtnjlzRgEBAapVq5bd7Z+srCxJV1+voixevFg+Pj56+OGHbdoMDw+Xp6enXZvZ2dk29c6cOXPDv2h/++03zZgxQ6NHj5anp6fd9uvVq6e6devatJl/m7Tg9gvj6empZ555xpx3dXXVgw8+qJ9//tksc3Fxkaurq6SrV6XOnTunnJwcNW3atMhbRSkpKXryySfVuHFjzZw50ywv7vGXr0+fPuaVQ0k6efKkkpKS1KdPH/n4+JjlDz/8sEJDQ23W/c9//iMXFxe9/PLLNuWvvPKKDMPQ6tWrb/j6FOTr66sdO3boxIkTN72uJPM92r9/v2bPni0PDw899NBDt9TWtYp73uTl5Wn58uV69NFHzbGG17qZczv/vejbt68qVqxoljds2FAPP/yweU5f63r7v2vXLp06dUqDBw+2OZ87d+6sunXratWqVUX2ZdSoUWrSpImeeuqpYvc/Ly/P7E9SUpLmzZunwMBA84pbvvzz9uzZs8X+HqF+/fqZV+UlqVatWnrssce0Zs0a5ebmKjc3V+vWrVPXrl1VvXp1s15gYKCefvppbdu2zbw9nG/QoEE2V5xffPFFlSlTptDXecWKFRo8eLCGDx+u2NhYm2Xx8fFKS0tTr169bH5vuLi4qFmzZsX6vXG345aZRXzwwQeqXbu2ypQpI39/f9WpU8dmEGpeXp7effddzZw5U0eOHFFubq657NoT+PDhw6pTp47KlCnZQ6dWrVo2805OTqpZs6Z5z//gwYOSrn4QFiU9PV0VKlQw58+cOWPXbkEHDx6UYRhF1it4aystLU2S7EJIwTbT09PN20EFnTp1ymZ+3bp1qlKlynX7WdDYsWMVFBSk559/XkuWLLHb/v79+4tss+D2C3PffffZfQhWqFBBu3fvtimbO3eupkyZogMHDig7O9ssDwkJsWszJydHPXr0UG5urpYtW2YTKot7/BXV/i+//CLJ/jiSZBeqfvnlFwUFBdkEcOn/bjHlt3UzJk2apD59+ig4OFjh4eF65JFHFB0dbfOhdj3Xvlfe3t5asGCBgoODb7ofBRX3vMnKylJGRkaJfP9U/utX2O2+evXqae3atcrMzLQZ6Hy9/b9ee3Xr1tW2bdsK7ce2bdv01VdfacOGDTp27Fix+3/8+HGb/gQGBmrp0qV25/y1562Li4saNmyot99+Wx07drRrM/9cqlu3rt2yevXqaenSpTpz5owMw9ClS5eKfO3y8vJ0/Phx1a9f3ywveMx7enoqMDDQbrxUUlKSFi1apNzcXJ07d86u/fxjJf8Pp4K8vb0LLb+XEIgs4sEHHyz0L798b731lkaPHq3nnntOr7/+uipWrChnZ2cNGTLE7sqLI+T3YfLkyebYlIKu/YWVlZWlkydP6uGHH75hu05OTlq9erVcXFyu26Z09QqHJAUEBFy3TT8/vyK/DK5gUGnWrJneeOMNm7L3339fK1asKHT9/fv3a86cOfrss88KHYuUl5ensLAwTZ06tdD1i/NBW9hrIclm0PFnn32mvn37qmvXrho+fLj8/Pzk4uKiuLg4c4zatYYPH66EhAStX7/eblzPzR5/114dul2KuipybVjL16NHD7Vs2VJffvml1q1bp8mTJ2vixIlatmyZOebqeuLj4yVdHey9dOlS9ejRQytXrrzh8XsjxT1vCvuAvJNux/6PHDlSkZGRateuXaED44vi7++vzz77TNLVsPjJJ5+oU6dO2rZtm8LCwsx61563J06c0MSJE/XEE08UOgD5ThyvN/Ljjz8qKipK7du31/Dhw/XMM8/YjB/KP1bmz59f6O+3kv4juDS69/cQxbJkyRK1bdtW//rXv2zK09LSVLlyZXO+Ro0a2rFjh7Kzs0tkYHC+/L9O8hmGoUOHDqlhw4bmdqWrf6V06NDhhu39+OOPys7Ovm4IzG/XMAyFhISYgxqvZ9++fXJycipysGt+m+vXr1fz5s2L9YuwcuXKdvt0vYHPo0aNUuPGjfXXv/61yO3/+OOPat++/R+6jXkjS5YsUfXq1bVs2TKb7YwdO9au7hdffKHp06dr+vTpat26daFtFef4K0q1atUk2R9H0tUnfArWXb9+vS5cuGBzlejAgQM2beVfbcy/KpivqCtIgYGBGjx4sAYPHqxTp06pSZMmevPNN4sViK59/x9//HHt2LFD77zzzh8ORMU9b6pUqSJvb+9Cn3i6WfmvX8HXXbr6GleuXNnuMfjr7f+17RW8epGcnGwuv9by5cuVkJBww6f8ClOuXDmb/jz22GOqWLGi3n//fX344YdmecHztmbNmmrevLm2bt2qP/3pTzZt5l/RLOo18fDwMI/z8uXLF1nP2dnZ7g+agwcPqm3btub8xYsXdfLkSbsHWsLCwrR48WK5u7tr8eLFGjRokHbv3m3ehsw/Vvz8/Ir1O/ZexBgiSLp6ReDav/6lq2NRCj7W2r17d505c0bvv/++XRsF178Z8+bN04ULF8z5JUuW6OTJk+aHSXh4uGrUqKF33nlHFy9etFv/9OnTdn13cXG57qOx0tWndVxcXDR+/Hi7/huGYT4dIl295bN06VI9+OCD171lln9b6PXXX7dblpOTY/cBezMSEhK0YsUKvf3220WGnR49eui3337TP//5T7tlv//+uzIzM295+9fKv4p07eu2Y8cOJSQk2NTbs2ePBgwYoGeeeUZ/+9vfimyrOMdfUQIDA9W4cWPNnTtX6enpZnl8fLz27dtnU/eRRx5Rbm6u3TE8bdo0OTk5mcect7e3KleurK1bt9rUu3bsk3T1itG125SufqgEBQXd1NccXNteVlbWLa1bUHHPG2dnZ3Xt2lVfffWVdu3aZVfvZs7ta9+La4/1PXv2aN26dXYf1AUV3P+mTZvKz89Ps2fPtnlNVq9erf3796tz58526//P//yPnn766SKvit2MrKws5eTk3PD9yL/CUtjV1SpVqqhp06aaO3euzSPxhw8f1r///W9FRUXJxcVFLi4u6tixo1asWGFzyys1NVWff/65WrRoYXfr6qOPPrK5XT1r1izl5OTYBfEmTZrIw8NDzs7O+vjjj3X06FFNmDDBXB4ZGSlvb2+99dZbNu3lK/g79l7EFSJIkrp06aIJEyaoX79++stf/qKffvpJCxYssBsDER0drXnz5mnYsGHauXOnWrZsqczMTK1fv16DBw/W448/fkvbr1ixolq0aKF+/fopNTVV06dPV82aNTVw4EBJMk/iqKgo1a9fX/369VPVqlX122+/adOmTfL29tZXX32lzMxMffDBB3rvvfdUu3Ztm+/YyP9A2L17txISEhQREaEaNWrojTfe0KhRo3T06FF17dpVXl5eOnLkiL788ksNGjRIr776qtavX6/Ro0dr9+7d+uqrr667L61bt9bzzz+vuLg4JSUlqWPHjipbtqwOHjyoxYsX691339WTTz55S6/TunXr9PDDD1/3L7hnn31WixYt0gsvvKBNmzapefPmys3N1YEDB7Ro0SKtXbv2hlfOiqNLly5atmyZnnjiCXXu3FlHjhzR7NmzFRoaavPh269fP0lSq1atzFsR+f7yl7+oevXqxT7+ricuLk6dO3dWixYt9Nxzz+ncuXOaMWOG6tevb9OfRx99VG3bttU//vEPHT16VI0aNdK6deu0YsUKDRkyxOarIwYMGKC3335bAwYMUNOmTbV161b997//tdnuhQsXdN999+nJJ59Uo0aN5OnpqfXr1+u7777TlClTitX3/NclMzNTy5cv19GjRzVkyJBi73tRinveSFdvW65bt06tW7c2v67h5MmTWrx4sbZt23ZTj5xPnjxZUVFRioiIUP/+/c3H7n18fIr8HrCi9r9s2bKaOHGi+vXrp9atW6tXr17mY/f333+/hg4datPWr7/+KldX10IHFRdHZmamzS2z+fPn6/Lly3riiSds6p0+fVpr1qyRdHUg+cSJE+Xj46O2bdvaHSPS1XFmHTt2VEREhAYMGGA+dl+uXDnzKwwk6Y033lB8fLxatGihwYMHq0yZMvrwww915coVu+8Ck64Gtvbt26tHjx5KTk7WzJkz1aJFCz322GNF7mODBg00cuRIvf322+rZs6caNmwob29vzZo1S88++6yaNGminj17qkqVKjp27JhWrVql5s2bF/qH8D3FIc+24Y7JfzSzsEdpr3X58mXjlVdeMQIDAw13d3ejefPmRkJCQqGP1l66dMn4xz/+YYSEhBhly5Y1AgICjCeffNJ8TPRWHrv/3//9X2PUqFGGn5+f4e7ubnTu3Nn45Zdf7Nb/4YcfjG7duhmV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PV2SVLFiRUlSYmKisrOz1aFDB7NO3bp19ac//UkJCQmSpISEBIWFhZlhSJIiIyOVkZGhvXv3mnWubSO/Tn4bBV25ckUZGRk2EwAAuHeVmkCUl5enIUOGqHnz5mrQoIEkKSUlRa6urvL19bWp6+/vr5SUFLPOtWEof3n+suvVycjI0O+//27Xl7i4OPn4+JhTcHBwiewjAAAonUpNIIqJidGePXv0xRdfOLorGjVqlNLT083p+PHjju4SAAC4jco4ugOSFBsbq5UrV2rr1q267777zPKAgABlZWUpLS3N5ipRamqqAgICzDo7d+60aS//KbRr6xR8Mi01NVXe3t5yd3e364+bm5vc3NxKZN8AAEDp59ArRIZhKDY2Vl9++aU2btyokJAQm+Xh4eEqW7asNmzYYJYlJyfr2LFjioiIkCRFRETop59+0qlTp8w68fHx8vb2VmhoqFnn2jby6+S3AQAArM2hV4hiYmL0+eefa8WKFfLy8jLH/Pj4+Mjd3V0+Pj7q37+/hg0bpooVK8rb21svvfSSIiIi9NBDD0mSOnbsqNDQUD377LOaNGmSUlJS9NprrykmJsa8yvPCCy/o/fff14gRI/Tcc89p48aNWrRokVatWuWwfQcAAKWHQ68QzZo1S+np6WrTpo0CAwPNaeHChWadadOmqUuXLurevbtatWqlgIAALVu2zFzu4uKilStXysXFRREREXrmmWcUHR2tCRMmmHVCQkK0atUqxcfHq1GjRpoyZYo+/vhjRUZG3tH9BQAApVOp+h6i0orvIQIci+8hAnAr7trvIQIAAHAEAhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEA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fbuCgoL+cKcAAADupFsaQzRw4EANGTJE2dnZateunSRpw4YNGjFiBN9UDQAA7jq3FIiGDx+us2fPavDgwcrKypIklStXTiNHjtSoUaNKtIMAAAC32y0FIicnJ02cOFGjR4/W/v375e7urlq1asnNza2k+wcAAHDb3VIgyufp6akHHnigpPoCAADgELc0qBoAAOBeQiACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACW59BAtHXrVj366KMKCgqSk5OTli9fbrPcMAyNGTNGgYGBcnd3V4cOHXTw4EGbOufOnVPv3r3l7e0tX19f9e/fXxcvXrSps3v3brVs2VLlypVTcHCwJk2adLt3DQAA3EUcGogyMzPVqFEjffDBB4UunzRpkt577z3Nnj1bO3bskIeHhyIjI3X58mWzTu/evbV3717Fx8dr5cqV2rp1qwYNGmQuz8jIUMeOHVWtWjUlJiZq8uTJGjdunD766KPbvn8AAODuUMaRG4+KilJUVFShywzD0PTp0/Xaa6/p8ccflyTNmzdP/v7+Wr58uXr27Kn9+/drzZo1+u6779S0aVNJ0owZM/TII4/onXfeUVBQkBYsWKCsrCx98skncnV1Vf369ZWUlKSpU6faBCcAAGBdpXYM0ZEjR5SSkqIOHTqYZT4+PmrWrJkSEhIkSQkJCfL19TXDkCR16NBBzs7O2rFjh1mnVatWcnV1NetERkYqOTlZ58+fL3TbV65cUUZGhs0EAADuXaU2EKWkpEiS/P39bcr9/f3NZSkpKfLz87NZXqZMGVWsWNGmTmFtXLuNguLi4uTj42NOwcHBf3yHAABAqVVqA5EjjRo1Sunp6eZ0/PhxR3cJAADcRqU2EAUEBEiSUlNTbcpTU1PNZQEBATp16pTN8pycHJ07d86mTmFtXLuNgtzc3OTt7W0zAQCAe1epDUQhISEKCAjQhg0bzLKMjAzt2LFDERERkqSIiAilpaUpMTHRrLNx40bl5eWpWbNmZp2tW7cqOzvbrBMfH686deqoQoUKd2hvAABAaebQQHTx4kUlJSUpKSlJ0tWB1ElJSTp27JicnJw0ZMgQvfHGG/r3v/+tn376SdHR0QoKClLXrl0lSfXq1VOnTp00cOBA7dy5U9u3b1dsbKx69uypoKAgSdLTTz8tV1dX9e/fX3v37tXChQv17rvvatiwYQ7aawAAUNo49LH7Xbt2qW3btuZ8fkjp06eP5syZoxEjRigzM1ODBg1SWlqaWrRooTVr1qhcuXLmOgsWLFBsbKzat28vZ2dnde/eXe+995653MfHR+vWrVNMTIzCw8NVuXJljRkzhkfuAQCAyckwDMPRnSjtMjIy5OPjo/T09Ns6nih8+Lzb1jZwN0ucHO3oLgC4C93M53epHUMEAABwpxCIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5ZXqQDRu3Dg5OTnZTHXr1jWXX758WTExMapUqZI8PT3VvXt3paam2rRx7Ngxde7cWeXLl5efn5+GDx+unJycO70rAACgFCvj6A7cSP369bV+/XpzvkyZ/+vy0KFDtWrVKi1evFg+Pj6KjY1Vt27dtH37dklSbm6uOnfurICAAH3zzTc6efKkoqOjVbZsWb311lt3fF8AAEDpVOoDUZkyZRQQEGBXnp6ern/961/6/PPP1a5dO0nSp59+qnr16unbb7/VQw89pHXr1mnfvn1av369/P391bhxY73++usaOXKkxo0bJ1dX1zu9OwAAoBQq1bfMJOngwYMKCgpS9erV1bt3bx07dkySlJiYqOzsbHXo0MGsW7duXf3pT39SQkKCJCkhIUFhYWHy9/c360RGRiojI0N7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58yZI19fX/373/+2+S/np06d0qOPPip3d3eFhIRowYIFdv0+duyYHn/8cXl6esrb21s9evRQamqqubxv377q2rWrzTpDhgxRmzZtzPklS5YoLCxM7u7uqlSpkjp06KDMzMw/9oICuCUEIgAONXfuXHl4eGjHjh2aNGmSJkyYoPj4eEmSs7Oz3nvvPe3du1dz587Vxo0bNWLECHPdZcuW6eTJk+bUrVs31alTR/7+/sVaX5IuXbqkiRMn6uOPP9bevXvl5+envn376vjx49q0aZOWLFmimTNn6tSpU+Y6eXl5evzxx3Xu3Dlt2bJF8fHx+vnnn/XXv/612Pt98uRJ9erVS88995z279+vzZs3q1u3buLfSwIOYgCAg7Ru3dpo0aKFTdkDDzxgjBw5stD6ixcvNipVqlTosqlTpxq+vr5GcnJykdsruP6nn35qSDKSkpLMsuTkZEOSsXPnTrNs//79hiRj2rRphmEYxrp16wwXFxfj2LFjZp29e/farNenTx/j8ccft9n+3/72N6N169aGYRhGYmKiIck4evRokf0FcOdwhQiAQzVs2NBmPjAw0Lwas379erVv315Vq1aVl5eXnn32WZ09e1aXLl2yWWf16tX6+9//roULF6p27dpmeXHWd3V1tenD/v37VaZMGYWHh5tldevWla+vr02d4OBgBQcHm2WhoaHy9fXV/v37i7XfjRo1Uvv27RUWFqannnpK//znP3X+/PlirQug5BGIADhU2bJlbeadnJyUl5eno0ePqkuXLmrYsKGWLl2qxMREffDBB5KkrKwss/6+ffvUs2dPvf322+rYsaNZXtz13d3d5eTkVOL75ezsbHf7Kzs72/zZxcVF8fHxWr16tUJDQzVjxgzVqVNHR44cKfG+ALgxAhGAUikxMVF5eXmaMmWKHnroIdWuXVsnTpywqXPmzBk9+uij6t69u4YOHXrT6xembt26ysnJUWJiolmWnJystLQ0c75evXo6fvy4jh8/bpbt27dPaWlpCg0NlSRVqVJFJ0+etGk7KSnJZt7JyUnNmzfX+PHj9cMPP8jV1VVffvnlDfsIoOQRiACUSjVr1lR2drZmzJihn3/+WfPnz9fs2bNt6nTv3l3ly5fXuHHjlJKSYk65ubnFWr8wderUUadOnfT8889rx44dSkxM1IABA+Tu7m7W6dChg8LCwtS7d299//332rlzp6Kjo9W6dWs1bdpUktSuXTvt2rVL8+bN08GDBzV27Fjt2bPHbGPHjh166623tGvXLh07dkzLli3T6dOnVa9evRJ6BQHcDAIRgFKpUaNGmjp1qiZOnKgGDRpowYIFiouLs6mzdetW7dmzR9WqVVNgYKA5HT9+vFjrF+XTTz9VUFCQWrdurW7dumnQoEHy8/Mzlzs5OWnFihWqUKGCWrVqpQ4dOqh69epauHChWScyMlKjR4/WiBEj9MADD+jChQuKjo42l3t7e2vr1q165JFHVLt2bb322muaMmWKoqKi/uArB+BWOBkFb3IDAABYDFeIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5f0/BRab59HF1SIAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib\n",
"import matplotlib.ticker as ticker\n",
"\n",
"# Визуализация распределения для обучающей выборки\n",
"sns.countplot(x=y_train)\n",
"plt.title('Распределение hazardous в обучающей выборке')\n",
"plt.show()\n",
"\n",
"# Визуализация распределения для контрольной выборки\n",
"sns.countplot(x=y_val)\n",
"plt.title('Распределение hazardous в контрольной выборке')\n",
"plt.show()\n",
"\n",
"# Визуализация распределения для тестовой выборки\n",
"sns.countplot(x=y_test)\n",
"plt.title('Распределение hazardous в тестовой выборке')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Конструирование признаков\n",
"\n",
"Задача 1: оценить безопасность планеты относительно потенциальных угроз космических объектов. Цель технического проекта: определить объекты с наиболее высоким риском столкновения на основе их ближайших приближений к Земле.\n",
"\n",
"Задача 2: оценить возможную оптимизацию исследования космических объектов для использования в коммерческих или исследовательских миссиях. Цель технического проекта: использование системы приоритезации для определения наиболее перспективных объектов для дальнейшего исследования или использования.\n",
"\n",
"**Унитарное кодирование**\n",
"\n",
"Унитарное кодирование категориальных признаков (one-hot encoding). Преобразуем категориальные признаки в бинарные векторы.\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" id name est_diameter_min est_diameter_max \\\n",
"0 2162635 162635 (2000 SS164) 1.198271 2.679415 \n",
"1 2277475 277475 (2005 WK4) 0.265800 0.594347 \n",
"2 2512244 512244 (2015 YE18) 0.722030 1.614507 \n",
"3 3596030 (2012 BV13) 0.096506 0.215794 \n",
"4 3667127 (2014 GE35) 0.255009 0.570217 \n",
"\n",
" relative_velocity miss_distance absolute_magnitude hazardous \\\n",
"0 13569.249224 5.483974e+07 16.73 False \n",
"1 73588.726663 6.143813e+07 20.00 True \n",
"2 114258.692129 4.979872e+07 17.83 False \n",
"3 24764.303138 2.543497e+07 22.20 False \n",
"4 42737.733765 4.627557e+07 20.09 True \n",
"\n",
" orbiting_body_Earth sentry_object_False \n",
"0 True True \n",
"1 True True \n",
"2 True True \n",
"3 True True \n",
"4 True True \n"
]
}
],
"source": [
"from sklearn.preprocessing import OneHotEncoder\n",
"\n",
"# Загрузка данных\n",
"df = pd.read_csv(\".//static//csv//neo.csv\")\n",
"\n",
"# Выбор категориальных признаков, которые нужно закодировать\n",
"categorical_columns = ['orbiting_body', 'sentry_object']\n",
"\n",
"# Применение one-hot encoding с использованием pandas get_dummies()\n",
"df_encoded = pd.get_dummies(df, columns=categorical_columns)\n",
"\n",
"# Проверка результата\n",
"print(df_encoded.head())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Дискретизация числовых признаков**\n",
"\n",
"Процесс преобразования непрерывных числовых значений в дискретные категории или интервалы (бины). Используем переменные, отвечающие за растояние объекта от Земли(miss_distance) и абсолютную звёздную величину объекта, которая отражает его яркость(absolute_magnitude)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" miss_distance miss_distance_binned\n",
"0 5.483974e+07 (44881889.084, 59840270.268]\n",
"1 6.143813e+07 (59840270.268, 74798651.452]\n",
"2 4.979872e+07 (44881889.084, 59840270.268]\n",
"3 2.543497e+07 (14965126.716, 29923507.9]\n",
"4 4.627557e+07 (44881889.084, 59840270.268]\n",
" absolute_magnitude absolute_magnitude_binned\n",
"0 16.73 (9.229000000000001, 21.34]\n",
"1 20.00 (9.229000000000001, 21.34]\n",
"2 17.83 (9.229000000000001, 21.34]\n",
"3 22.20 (21.34, 23.7]\n",
"4 20.09 (9.229000000000001, 21.34]\n"
]
}
],
"source": [
"import pandas as pd\n",
"\n",
"# Пример: дискретизация признака 'miss_distance' на 5 равных интервалов\n",
"df['miss_distance_binned'] = pd.cut(df['miss_distance'], bins=5)\n",
"\n",
"# Пример: дискретизация признака 'absolute_magnitude' на квантильные интервалы (4 квантиля)\n",
"df['absolute_magnitude_binned'] = pd.qcut(df['absolute_magnitude'], q=4)\n",
"\n",
"# Проверка результата\n",
"print(df[['miss_distance', 'miss_distance_binned']].head())\n",
"print(df[['absolute_magnitude', 'absolute_magnitude_binned']].head())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Ручной синтез**\n",
"\n",
"Создание новых признаков на основе экспертных знаний и логики предметной области. В нашем случае можно задействовать расстояния объекта от Земли и скорость движения объекта, синтезировав новый признак - \"скорость в сравнении с расстоянием\". Этот признак показывает, что объект может быть более опасным, если его скорость велика, а расстояние до Земли — маленькое."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Создание нового признака 'Speed VS Distance'\n",
"df['high_risk'] = ((df['miss_distance'] < threshold_distance) & (df['relative_velocity'] > threshold_velocity)).astype(int)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Масштабирование признаков**\n",
"\n",
"Процесс преобразования числовых признаков таким образом, чтобы они имели одинаковый масштаб. Это важно для многих алгоритмов машинного обучения, которые чувствительны к масштабу признаков, таких как линейная регрессия, метод опорных векторов (SVM) и нейронные сети."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.preprocessing import StandardScaler, MinMaxScaler\n",
"\n",
"# Пример масштабирования числовых признаков\n",
"numerical_features = ['miss_distance', 'absolute_magnitude']\n",
"\n",
"scaler = StandardScaler()\n",
"train_data_encoded[numerical_features] = scaler.fit_transform(train_data_encoded[numerical_features])\n",
"val_data_encoded[numerical_features] = scaler.transform(val_data_encoded[numerical_features])\n",
"test_data_encoded[numerical_features] = scaler.transform(test_data_encoded[numerical_features])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Конструирование признаков с применением фреймворка Featuretools"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting featuretools\n",
" Downloading featuretools-1.31.0-py3-none-any.whl.metadata (15 kB)\n",
"Collecting cloudpickle>=1.5.0 (from featuretools)\n",
" Downloading cloudpickle-3.1.0-py3-none-any.whl.metadata (7.0 kB)\n",
"Collecting holidays>=0.17 (from featuretools)\n",
" Downloading holidays-0.59-py3-none-any.whl.metadata (25 kB)\n",
"Requirement already satisfied: numpy>=1.25.0 in c:\\users\\admin\\studioprojects\\aim-pibd-31-alekseev-i-s\\aimenv\\lib\\site-packages (from featuretools) (2.1.2)\n",
"Requirement already satisfied: packaging>=20.0 in c:\\users\\admin\\studioprojects\\aim-pibd-31-alekseev-i-s\\aimenv\\lib\\site-packages (from featuretools) (24.1)\n",
"Requirement already satisfied: pandas>=2.0.0 in c:\\users\\admin\\studioprojects\\aim-pibd-31-alekseev-i-s\\aimenv\\lib\\site-packages (from featuretools) (2.2.3)\n",
"Requirement already satisfied: psutil>=5.7.0 in c:\\users\\admin\\studioprojects\\aim-pibd-31-alekseev-i-s\\aimenv\\lib\\site-packages (from featuretools) (6.0.0)\n",
"Requirement already satisfied: scipy>=1.10.0 in c:\\users\\admin\\studioprojects\\aim-pibd-31-alekseev-i-s\\aimenv\\lib\\site-packages (from featuretools) (1.14.1)\n",
"Collecting tqdm>=4.66.3 (from featuretools)\n",
" Downloading tqdm-4.66.5-py3-none-any.whl.metadata (57 kB)\n",
"Collecting woodwork>=0.28.0 (from featuretools)\n",
" Downloading woodwork-0.31.0-py3-none-any.whl.metadata (10 kB)\n",
"Requirement already satisfied: python-dateutil in c:\\users\\admin\\studioprojects\\aim-pibd-31-alekseev-i-s\\aimenv\\lib\\site-packages (from holidays>=0.17->featuretools) (2.9.0.post0)\n",
"Requirement already satisfied: pytz>=2020.1 in c:\\users\\admin\\studioprojects\\aim-pibd-31-alekseev-i-s\\aimenv\\lib\\site-packages (from pandas>=2.0.0->featuretools) (2024.2)\n",
"Requirement already satisfied: tzdata>=2022.7 in c:\\users\\admin\\studioprojects\\aim-pibd-31-alekseev-i-s\\aimenv\\lib\\site-packages (from pandas>=2.0.0->featuretools) (2024.2)\n",
"Requirement already satisfied: colorama in c:\\users\\admin\\studioprojects\\aim-pibd-31-alekseev-i-s\\aimenv\\lib\\site-packages (from tqdm>=4.66.3->featuretools) (0.4.6)\n",
"Requirement already satisfied: scikit-learn>=1.1.0 in c:\\users\\admin\\studioprojects\\aim-pibd-31-alekseev-i-s\\aimenv\\lib\\site-packages (from woodwork>=0.28.0->featuretools) (1.5.2)\n",
"Collecting importlib-resources>=5.10.0 (from woodwork>=0.28.0->featuretools)\n",
" Downloading importlib_resources-6.4.5-py3-none-any.whl.metadata (4.0 kB)\n",
"Requirement already satisfied: six>=1.5 in c:\\users\\admin\\studioprojects\\aim-pibd-31-alekseev-i-s\\aimenv\\lib\\site-packages (from python-dateutil->holidays>=0.17->featuretools) (1.16.0)\n",
"Requirement already satisfied: joblib>=1.2.0 in c:\\users\\admin\\studioprojects\\aim-pibd-31-alekseev-i-s\\aimenv\\lib\\site-packages (from scikit-learn>=1.1.0->woodwork>=0.28.0->featuretools) (1.4.2)\n",
"Requirement already satisfied: threadpoolctl>=3.1.0 in c:\\users\\admin\\studioprojects\\aim-pibd-31-alekseev-i-s\\aimenv\\lib\\site-packages (from scikit-learn>=1.1.0->woodwork>=0.28.0->featuretools) (3.5.0)\n",
"Downloading featuretools-1.31.0-py3-none-any.whl (587 kB)\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ---------------------------------------- 0.0/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ----------------- ---------------------- 262.1/587.9 kB ? eta -:--:--\n",
" ---------------------------------- ---- 524.3/587.9 kB 50.4 kB/s eta 0:00:02\n",
" ---------------------------------- ---- 524.3/587.9 kB 50.4 kB/s eta 0:00:02\n",
" ---------------------------------- ---- 524.3/587.9 kB 50.4 kB/s eta 0:00:02\n",
" ---------------------------------- ---- 524.3/587.9 kB 50.4 kB/s eta 0:00:02\n",
" ---------------------------------- ---- 524.3/587.9 kB 50.4 kB/s eta 0:00:02\n",
" ---------------------------------- ---- 524.3/587.9 kB 50.4 kB/s eta 0:00:02\n",
" ---------------------------------- ---- 524.3/587.9 kB 50.4 kB/s eta 0:00:02\n",
" ---------------------------------- ---- 524.3/587.9 kB 50.4 kB/s eta 0:00:02\n",
" --------------------------------------- 587.9/587.9 kB 47.1 kB/s eta 0:00:00\n",
"Downloading cloudpickle-3.1.0-py3-none-any.whl (22 kB)\n",
"Downloading holidays-0.59-py3-none-any.whl (1.1 MB)\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.1 MB ? eta -:--:--\n",
" --------- ------------------------------ 0.3/1.1 MB ? eta -:--:--\n",
" --------- ------------------------------ 0.3/1.1 MB ? eta -:--:--\n",
" --------- ------------------------------ 0.3/1.1 MB ? eta -:--:--\n",
" --------- ------------------------------ 0.3/1.1 MB ? eta -:--:--\n",
" --------- ------------------------------ 0.3/1.1 MB ? eta -:--:--\n",
" --------- ------------------------------ 0.3/1.1 MB ? eta -:--:--\n",
" --------- ------------------------------ 0.3/1.1 MB ? eta -:--:--\n",
" --------- ------------------------------ 0.3/1.1 MB ? eta -:--:--\n",
" --------- ------------------------------ 0.3/1.1 MB ? eta -:--:--\n",
" --------- ------------------------------ 0.3/1.1 MB ? eta -:--:--\n",
" --------- ------------------------------ 0.3/1.1 MB ? eta -:--:--\n",
" --------- ------------------------------ 0.3/1.1 MB ? eta -:--:--\n",
" --------- ------------------------------ 0.3/1.1 MB ? eta -:--:--\n",
" --------- ------------------------------ 0.3/1.1 MB ? eta -:--:--\n",
" --------- ------------------------------ 0.3/1.1 MB ? eta -:--:--\n",
" --------- ------------------------------ 0.3/1.1 MB ? eta -:--:--\n",
" ------------------ --------------------- 0.5/1.1 MB 80.7 kB/s eta 0:00:08\n",
" ------------------ --------------------- 0.5/1.1 MB 80.7 kB/s eta 0:00:08\n",
" ------------------ --------------------- 0.5/1.1 MB 80.7 kB/s eta 0:00:08\n",
" ------------------ --------------------- 0.5/1.1 MB 80.7 kB/s eta 0:00:08\n",
" ------------------ --------------------- 0.5/1.1 MB 80.7 kB/s eta 0:00:08\n",
" ------------------ --------------------- 0.5/1.1 MB 80.7 kB/s eta 0:00:08\n",
" ------------------ --------------------- 0.5/1.1 MB 80.7 kB/s eta 0:00:08\n",
" ------------------ --------------------- 0.5/1.1 MB 80.7 kB/s eta 0:00:08\n",
" ------------------ --------------------- 0.5/1.1 MB 80.7 kB/s eta 0:00:08\n",
" ------------------ --------------------- 0.5/1.1 MB 80.7 kB/s eta 0:00:08\n",
" ------------------ --------------------- 0.5/1.1 MB 80.7 kB/s eta 0:00:08\n",
" ------------------ --------------------- 0.5/1.1 MB 80.7 kB/s eta 0:00:08\n",
" ------------------ --------------------- 0.5/1.1 MB 80.7 kB/s eta 0:00:08\n",
" ------------------ --------------------- 0.5/1.1 MB 80.7 kB/s eta 0:00:08\n",
" ------------------ --------------------- 0.5/1.1 MB 80.7 kB/s eta 0:00:08\n",
" ------------------ --------------------- 0.5/1.1 MB 80.7 kB/s eta 0:00:08\n",
" ------------------ --------------------- 0.5/1.1 MB 80.7 kB/s eta 0:00:08\n",
" ------------------ --------------------- 0.5/1.1 MB 80.7 kB/s eta 0:00:08\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ---------------------------- ----------- 0.8/1.1 MB 73.9 kB/s eta 0:00:05\n",
" ------------------------------------- -- 1.0/1.1 MB 71.3 kB/s eta 0:00:01\n",
" ------------------------------------- -- 1.0/1.1 MB 71.3 kB/s eta 0:00:01\n",
" ------------------------------------- -- 1.0/1.1 MB 71.3 kB/s eta 0:00:01\n",
" ------------------------------------- -- 1.0/1.1 MB 71.3 kB/s eta 0:00:01\n",
" ---------------------------------------- 1.1/1.1 MB 71.6 kB/s eta 0:00:00\n",
"Downloading tqdm-4.66.5-py3-none-any.whl (78 kB)\n",
"Downloading woodwork-0.31.0-py3-none-any.whl (215 kB)\n",
"Downloading importlib_resources-6.4.5-py3-none-any.whl (36 kB)\n",
"Installing collected packages: tqdm, importlib-resources, cloudpickle, holidays, woodwork, featuretools\n",
"Successfully installed cloudpickle-3.1.0 featuretools-1.31.0 holidays-0.59 importlib-resources-6.4.5 tqdm-4.66.5 woodwork-0.31.0\n",
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"source": [
"pip install --upgrade featuretools"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting setuptoolsNote: you may need to restart the kernel to use updated packages.\n",
"\n",
" Downloading setuptools-75.2.0-py3-none-any.whl.metadata (6.9 kB)\n",
"Downloading setuptools-75.2.0-py3-none-any.whl (1.2 MB)\n",
" ---------------------------------------- 0.0/1.2 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.2 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.2 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.2 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.2 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.2 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.2 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.2 MB ? eta -:--:--\n",
" ---------------------------------------- 0.0/1.2 MB ? eta -:--:--\n",
" -------- ------------------------------- 0.3/1.2 MB ? eta -:--:--\n",
" -------- ------------------------------- 0.3/1.2 MB ? eta -:--:--\n",
" -------- ------------------------------- 0.3/1.2 MB ? eta -:--:--\n",
" -------- ------------------------------- 0.3/1.2 MB ? eta -:--:--\n",
" -------- ------------------------------- 0.3/1.2 MB ? eta -:--:--\n",
" -------- ------------------------------- 0.3/1.2 MB ? eta -:--:--\n",
" -------- ------------------------------- 0.3/1.2 MB ? eta -:--:--\n",
" -------- ------------------------------- 0.3/1.2 MB ? eta -:--:--\n",
" -------- ------------------------------- 0.3/1.2 MB ? eta -:--:--\n",
" -------- ------------------------------- 0.3/1.2 MB ? eta -:--:--\n",
" -------- ------------------------------- 0.3/1.2 MB ? eta -:--:--\n",
" -------- ------------------------------- 0.3/1.2 MB ? eta -:--:--\n",
" -------- ------------------------------- 0.3/1.2 MB ? eta -:--:--\n",
" ---------------- ----------------------- 0.5/1.2 MB 98.1 kB/s eta 0:00:08\n",
" ---------------- ----------------------- 0.5/1.2 MB 98.1 kB/s eta 0:00:08\n",
" ---------------- ----------------------- 0.5/1.2 MB 98.1 kB/s eta 0:00:08\n",
" ---------------- ----------------------- 0.5/1.2 MB 98.1 kB/s eta 0:00:08\n",
" ---------------- ----------------------- 0.5/1.2 MB 98.1 kB/s eta 0:00:08\n",
" ---------------- ----------------------- 0.5/1.2 MB 98.1 kB/s eta 0:00:08\n",
" ---------------- ----------------------- 0.5/1.2 MB 98.1 kB/s eta 0:00:08\n",
" ------------------------- -------------- 0.8/1.2 MB 126.2 kB/s eta 0:00:04\n",
" ------------------------- -------------- 0.8/1.2 MB 126.2 kB/s eta 0:00:04\n",
" ------------------------- -------------- 0.8/1.2 MB 126.2 kB/s eta 0:00:04\n",
" ------------------------- -------------- 0.8/1.2 MB 126.2 kB/s eta 0:00:04\n",
" ------------------------- -------------- 0.8/1.2 MB 126.2 kB/s eta 0:00:04\n",
" ------------------------- -------------- 0.8/1.2 MB 126.2 kB/s eta 0:00:04\n",
" ------------------------- -------------- 0.8/1.2 MB 126.2 kB/s eta 0:00:04\n",
" ------------------------- -------------- 0.8/1.2 MB 126.2 kB/s eta 0:00:04\n",
" ------------------------- -------------- 0.8/1.2 MB 126.2 kB/s eta 0:00:04\n",
" --------------------------------- ------ 1.0/1.2 MB 126.8 kB/s eta 0:00:02\n",
" --------------------------------- ------ 1.0/1.2 MB 126.8 kB/s eta 0:00:02\n",
" --------------------------------- ------ 1.0/1.2 MB 126.8 kB/s eta 0:00:02\n",
" --------------------------------- ------ 1.0/1.2 MB 126.8 kB/s eta 0:00:02\n",
" --------------------------------- ------ 1.0/1.2 MB 126.8 kB/s eta 0:00:02\n",
" --------------------------------- ------ 1.0/1.2 MB 126.8 kB/s eta 0:00:02\n",
" --------------------------------- ------ 1.0/1.2 MB 126.8 kB/s eta 0:00:02\n",
" ---------------------------------------- 1.2/1.2 MB 130.3 kB/s eta 0:00:00\n",
"Installing collected packages: setuptools\n",
"Successfully installed setuptools-75.2.0\n"
]
}
],
"source": [
"pip install --upgrade setuptools"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\Admin\\StudioProjects\\AIM-PIbd-31-Alekseev-I-S\\aimenv\\Lib\\site-packages\\woodwork\\type_sys\\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.\n",
" pd.to_datetime(\n",
"c:\\Users\\Admin\\StudioProjects\\AIM-PIbd-31-Alekseev-I-S\\aimenv\\Lib\\site-packages\\woodwork\\type_sys\\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.\n",
" pd.to_datetime(\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" est_diameter_min est_diameter_max relative_velocity miss_distance \\\n",
"id \n",
"1 1.198271 2.679415 13569.249224 5.483974e+07 \n",
"2 0.265800 0.594347 73588.726663 6.143813e+07 \n",
"3 0.722030 1.614507 114258.692129 4.979872e+07 \n",
"4 0.096506 0.215794 24764.303138 2.543497e+07 \n",
"5 0.255009 0.570217 42737.733765 4.627557e+07 \n",
"\n",
" orbiting_body sentry_object absolute_magnitude hazardous \n",
"id \n",
"1 Earth False 16.73 False \n",
"2 Earth False 20.00 True \n",
"3 Earth False 17.83 False \n",
"4 Earth False 22.20 False \n",
"5 Earth False 20.09 True \n",
" est_diameter_min est_diameter_max relative_velocity miss_distance \\\n",
"id \n",
"17465 0.265800 0.594347 6639.199305 7.248720e+07 \n",
"10057 0.023150 0.051765 66065.475247 2.182677e+07 \n",
"6905 0.148784 0.332690 35092.567329 6.261058e+07 \n",
"40989 0.007321 0.016370 24301.494107 2.765938e+06 \n",
"23499 0.044112 0.098637 33502.608133 7.025798e+07 \n",
"\n",
" orbiting_body sentry_object absolute_magnitude hazardous \n",
"id \n",
"17465 Earth False 20.00 False \n",
"10057 Earth False 25.30 False \n",
"6905 Earth False 21.26 False \n",
"40989 Earth False 27.80 False \n",
"23499 Earth False 23.90 False \n",
" est_diameter_min est_diameter_max relative_velocity miss_distance \\\n",
"id \n",
"66148 0.020163 0.045086 24899.946486 7.427192e+06 \n",
"68694 0.175612 0.392681 67322.863166 3.526971e+07 \n",
"17013 0.031809 0.071128 20216.336390 5.832689e+07 \n",
"69199 0.007321 0.016370 40616.528788 2.591562e+07 \n",
"45632 0.199781 0.446725 86281.198262 6.763452e+07 \n",
"\n",
" orbiting_body sentry_object absolute_magnitude hazardous \n",
"id \n",
"66148 Earth False 25.60 False \n",
"68694 Earth False 20.90 True \n",
"17013 Earth False 24.61 False \n",
"69199 Earth False 27.80 False \n",
"45632 Earth False 20.62 True \n"
]
}
],
"source": [
"import pandas as pd\n",
"import featuretools as ft\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"# Загрузка данных\n",
"df = pd.read_csv(\".//static//csv//neo.csv\")\n",
"\n",
"# Создание уникального идентификатора для каждой строки\n",
"df['id'] = range(1, len(df) + 1)\n",
"\n",
"# Предобработка данных (например, кодирование категориальных признаков, удаление дубликатов)\n",
"# Удаление дубликатов по всем столбцам\n",
"df = df.drop_duplicates()\n",
"\n",
"# Создание EntitySet\n",
"es = ft.EntitySet(id='objects_data')\n",
"\n",
"# Добавление датафрейма с объектами\n",
"es = es.add_dataframe(\n",
" dataframe_name='objects',\n",
" dataframe=df,\n",
" index='id'\n",
")\n",
"\n",
"# Генерация признаков с помощью глубокой синтезы признаков\n",
"feature_matrix, feature_defs = ft.dfs(entityset=es, target_dataframe_name='objects', max_depth=1)\n",
"\n",
"# Выводим первые 5 строк сгенерированного набора признаков\n",
"print(feature_matrix.head())\n",
"\n",
"# Разделение данных на обучающую и тестовую выборки\n",
"train_data, test_data = train_test_split(df, test_size=0.3, random_state=42)\n",
"\n",
"# Разделение оставшейся части на валидационную и тестовую выборки\n",
"val_data, test_data = train_test_split(test_data, test_size=0.5, random_state=42)\n",
"\n",
"# Преобразование признаков для контрольной и тестовой выборок\n",
"val_feature_matrix = ft.calculate_feature_matrix(features=feature_defs, entityset=es, instance_ids=val_data['id'])\n",
"test_feature_matrix = ft.calculate_feature_matrix(features=feature_defs, entityset=es, instance_ids=test_data['id'])\n",
"\n",
"# Вывод первых 5 строк сгенерированных признаков для валидационной и тестовой выборок\n",
"print(val_feature_matrix.head())\n",
"print(test_feature_matrix.head())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Оценка качества каждого набора признаков\n",
"\n",
"Представим основные оценки качества наборов признаков: \n",
"\n",
"* Предсказательная способность Метрики: RMSE, MAE, R²\n",
"\n",
" Методы: Обучение модели на обучающей выборке и оценка на контрольной и тестовой выборках.\n",
"\n",
"* Скорость вычисления \n",
"\n",
" Методы: Измерение времени выполнения генерации признаков и обучения модели.\n",
"\n",
"* Надежность \n",
"\n",
" Методы: Кросс-валидация, анализ чувствительности модели к изменениям в данных.\n",
"\n",
"* Корреляция \n",
"\n",
" Методы: Анализ корреляционной матрицы признаков, удаление мультиколлинеарных признаков.\n",
"\n",
"* Цельность \n",
"\n",
" Методы: Проверка логической связи между признаками и целевой переменной, интерпретация результатов модели."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Время обучения модели: 0.02 секунд\n",
"Среднеквадратичная ошибка: 0.07\n"
]
}
],
"source": [
"import time\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.linear_model import LinearRegression\n",
"from sklearn.metrics import mean_squared_error\n",
"\n",
"# Разделение данных на обучающую и валидационную выборки. Удаляем целевую переменную\n",
"X = feature_matrix.drop('hazardous', axis=1)\n",
"y = feature_matrix['hazardous']\n",
"\n",
"# One-hot encoding для категориальных переменных (преобразование категориальных объектов в числовые)\n",
"X = pd.get_dummies(X, drop_first=True)\n",
"\n",
"# Проверяем, есть ли пропущенные значения, и заполняем их медианой или другим подходящим значением\n",
"X.fillna(X.median(), inplace=True)\n",
"\n",
"X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)\n",
"\n",
"# Обучение модели\n",
"model = LinearRegression()\n",
"\n",
"# Начинаем отсчет времени\n",
"start_time = time.time()\n",
"model.fit(X_train, y_train)\n",
"\n",
"# Время обучения модели\n",
"train_time = time.time() - start_time\n",
"\n",
"# Предсказания и оценка модели и вычисляем среднеквадратичную ошибку\n",
"predictions = model.predict(X_val)\n",
"mse = mean_squared_error(y_val, predictions)\n",
"\n",
"print(f'Время обучения модели: {train_time:.2f} секунд')\n",
"print(f'Среднеквадратичная ошибка: {mse:.2f}')"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\Admin\\StudioProjects\\AIM-PIbd-31-Alekseev-I-S\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n",
" warnings.warn(\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"RMSE: 0.2413462854539548\n",
"R²: 0.3235665248509211\n",
"MAE: 0.1107915015411713 \n",
"\n",
"Кросс-валидация RMSE: 0.24639371360520584 \n",
"\n",
"Train RMSE: 0.09113402717915829\n",
"Train R²: 0.9059198959348872\n",
"Train MAE: 0.04106869598722959\n",
"\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\Admin\\StudioProjects\\AIM-PIbd-31-Alekseev-I-S\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n",
" warnings.warn(\n"
]
}
],
"source": [
"from sklearn.ensemble import RandomForestRegressor\n",
"from sklearn.metrics import r2_score, mean_absolute_error\n",
"from sklearn.model_selection import cross_val_score\n",
"\n",
"\n",
"# Удаление строк с NaN\n",
"feature_matrix = feature_matrix.dropna()\n",
"val_feature_matrix = val_feature_matrix.dropna()\n",
"test_feature_matrix = test_feature_matrix.dropna()\n",
"\n",
"# Разделение данных на обучающую и тестовую выборки\n",
"X_train = feature_matrix.drop('hazardous', axis=1)\n",
"y_train = feature_matrix['hazardous']\n",
"X_val = val_feature_matrix.drop('hazardous', axis=1)\n",
"y_val = val_feature_matrix['hazardous']\n",
"X_test = test_feature_matrix.drop('hazardous', axis=1)\n",
"y_test = test_feature_matrix['hazardous']\n",
"\n",
"X_test = X_test.reindex(columns=X_train.columns, fill_value=0) \n",
"\n",
"# Кодирования категориальных переменных с использованием одноразового кодирования\n",
"X = pd.get_dummies(X, drop_first=True)\n",
"\n",
"# Разобьём тренировочный тест и примерку модели\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
"\n",
"# Выбор модели\n",
"model = RandomForestRegressor(random_state=42)\n",
"\n",
"# Обучение модели\n",
"model.fit(X_train, y_train)\n",
"\n",
"# Предсказание и оценка\n",
"y_pred = model.predict(X_test)\n",
"\n",
"rmse = mean_squared_error(y_test, y_pred, squared=False)\n",
"r2 = r2_score(y_test, y_pred)\n",
"mae = mean_absolute_error(y_test, y_pred)\n",
"\n",
"print()\n",
"print(f\"RMSE: {rmse}\")\n",
"print(f\"R²: {r2}\")\n",
"print(f\"MAE: {mae} \\n\")\n",
"\n",
"# Кросс-валидация\n",
"scores = cross_val_score(model, X_train, y_train, cv=5, scoring='neg_mean_squared_error')\n",
"rmse_cv = (-scores.mean())**0.5\n",
"print(f\"Кросс-валидация RMSE: {rmse_cv} \\n\")\n",
"\n",
"# Анализ важности признаков\n",
"feature_importances = model.feature_importances_\n",
"feature_names = X_train.columns\n",
"\n",
"# Проверка на переобучение\n",
"y_train_pred = model.predict(X_train)\n",
"\n",
"rmse_train = mean_squared_error(y_train, y_train_pred, squared=False)\n",
"r2_train = r2_score(y_train, y_train_pred)\n",
"mae_train = mean_absolute_error(y_train, y_train_pred)\n",
"\n",
"print(f\"Train RMSE: {rmse_train}\")\n",
"print(f\"Train R²: {r2_train}\")\n",
"print(f\"Train MAE: {mae_train}\")\n",
"print()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Выводы:\n",
"\n",
"Выбранная модель, а именно Модель случайного леса, показала неплохие результаты прогнозирования потенциальной опасности различных объектов. Метрики качества и кросс-валидация позволяют предположить, что модель не сильно переобучена и может быть использована для практических целей.\n",
"\n",
"* Точность предсказаний: Модель демонстрирует довольно неплохой(хотя мог бы быть и получше) R² (0.3236) на обучающей выборке и R² (0.9060), что указывает на приемлемую точность предсказания модели. Значения RMSE и MAE не высоки (0.09113 и 0.04106), что свидетельствует о том, что модель достаточно точно предсказывает значения.\n",
"\n",
"* Переобучение: Разница между RMSE на обучающей и тестовой выборках незначительна, что указывает на то, что модель не склонна к переобучению. Однако в будущем стоит следить за этой метрикой при добавлении новых признаков или усложнении модели, чтобы избежать излишней подгонки под тренировочные данные. Также стоит быть осторожным и продолжать мониторинг этого показателя. R² на обучающей выборке ниже, чем на тестовой - еще один признак того, что модель не склонна к прееобучению\n",
"\n",
"* Кросс-валидация: При кросс-валидации наблюдается небольшое увеличение ошибки RMSE по сравнению с тестовой выборкой (рост на 2-3%). Это может указывать на небольшую нестабильность модели при использовании разных подвыборок данных."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "aimenv",
"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.12.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}