1184 lines
138 KiB
Plaintext
1184 lines
138 KiB
Plaintext
{
|
||
"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
|
||
}
|