3935 lines
320 KiB
Plaintext
3935 lines
320 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Начало 4-й лабораторной\n",
|
||
"#### Ближайшие объекты к Земле"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"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",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>90831</th>\n",
|
||
" <td>3763337</td>\n",
|
||
" <td>(2016 VX1)</td>\n",
|
||
" <td>0.026580</td>\n",
|
||
" <td>0.059435</td>\n",
|
||
" <td>52078.886692</td>\n",
|
||
" <td>1.230039e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>25.00</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>90832</th>\n",
|
||
" <td>3837603</td>\n",
|
||
" <td>(2019 AD3)</td>\n",
|
||
" <td>0.016771</td>\n",
|
||
" <td>0.037501</td>\n",
|
||
" <td>46114.605073</td>\n",
|
||
" <td>5.432121e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>26.00</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>90833</th>\n",
|
||
" <td>54017201</td>\n",
|
||
" <td>(2020 JP3)</td>\n",
|
||
" <td>0.031956</td>\n",
|
||
" <td>0.071456</td>\n",
|
||
" <td>7566.807732</td>\n",
|
||
" <td>2.840077e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>24.60</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>90834</th>\n",
|
||
" <td>54115824</td>\n",
|
||
" <td>(2021 CN5)</td>\n",
|
||
" <td>0.007321</td>\n",
|
||
" <td>0.016370</td>\n",
|
||
" <td>69199.154484</td>\n",
|
||
" <td>6.869206e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>27.80</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>90835</th>\n",
|
||
" <td>54205447</td>\n",
|
||
" <td>(2021 TW7)</td>\n",
|
||
" <td>0.039862</td>\n",
|
||
" <td>0.089133</td>\n",
|
||
" <td>27024.455553</td>\n",
|
||
" <td>5.977213e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>24.12</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>90836 rows × 10 columns</p>\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",
|
||
"90831 3763337 (2016 VX1) 0.026580 0.059435 \n",
|
||
"90832 3837603 (2019 AD3) 0.016771 0.037501 \n",
|
||
"90833 54017201 (2020 JP3) 0.031956 0.071456 \n",
|
||
"90834 54115824 (2021 CN5) 0.007321 0.016370 \n",
|
||
"90835 54205447 (2021 TW7) 0.039862 0.089133 \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",
|
||
"90831 52078.886692 1.230039e+07 Earth False \n",
|
||
"90832 46114.605073 5.432121e+07 Earth False \n",
|
||
"90833 7566.807732 2.840077e+07 Earth False \n",
|
||
"90834 69199.154484 6.869206e+07 Earth False \n",
|
||
"90835 27024.455553 5.977213e+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 \n",
|
||
"... ... ... \n",
|
||
"90831 25.00 False \n",
|
||
"90832 26.00 False \n",
|
||
"90833 24.60 False \n",
|
||
"90834 27.80 False \n",
|
||
"90835 24.12 False \n",
|
||
"\n",
|
||
"[90836 rows x 10 columns]"
|
||
]
|
||
},
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import seaborn as sns\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn import set_config\n",
|
||
"\n",
|
||
"set_config(transform_output=\"pandas\")\n",
|
||
"df = pd.read_csv(\".//static//csv//neo.csv\")\n",
|
||
"print(df.columns)\n",
|
||
"df"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Бизнес-цели:\n",
|
||
"\n",
|
||
"1. Идентификация потенциально опасных объектов\n",
|
||
"\n",
|
||
"Описание: классифицировать астероиды как потенциально опасные или безопасные (используя целевой признак \"hazardous\"). Эта задача актуальна для оценки рисков и подготовки соответствующих действий по защите Земли.\n",
|
||
"\n",
|
||
"2. Прогнозирование минимального расстояния до Земли\n",
|
||
"\n",
|
||
"Описание: предсказать минимальное расстояние до Земли для новых объектов на основе характеристик астероида (скорости, размера и других параметров). Это позволит планировать исследования и наблюдения в зависимости от опасности. "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Определение достижимого уровня качества модели для первой задачи "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Разделение набора данных на обучающую и тестовые выборки (80/20) для задачи классификации\n",
|
||
"\n",
|
||
"Целевой признак -- hazardous"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'X_train'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>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>2639</th>\n",
|
||
" <td>3634614</td>\n",
|
||
" <td>(2013 GT66)</td>\n",
|
||
" <td>0.024241</td>\n",
|
||
" <td>0.054205</td>\n",
|
||
" <td>43303.999094</td>\n",
|
||
" <td>4.814117e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>25.20</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>29138</th>\n",
|
||
" <td>54143560</td>\n",
|
||
" <td>(2021 JU1)</td>\n",
|
||
" <td>0.030238</td>\n",
|
||
" <td>0.067615</td>\n",
|
||
" <td>21770.790211</td>\n",
|
||
" <td>5.646643e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>24.72</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>36927</th>\n",
|
||
" <td>3836085</td>\n",
|
||
" <td>(2018 VQ3)</td>\n",
|
||
" <td>0.201630</td>\n",
|
||
" <td>0.450858</td>\n",
|
||
" <td>109358.123029</td>\n",
|
||
" <td>6.435051e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>20.60</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>61855</th>\n",
|
||
" <td>3769804</td>\n",
|
||
" <td>(2017 DJ34)</td>\n",
|
||
" <td>0.160160</td>\n",
|
||
" <td>0.358129</td>\n",
|
||
" <td>78494.609756</td>\n",
|
||
" <td>5.595780e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>21.10</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>15916</th>\n",
|
||
" <td>3824978</td>\n",
|
||
" <td>(2018 KS)</td>\n",
|
||
" <td>0.006991</td>\n",
|
||
" <td>0.015633</td>\n",
|
||
" <td>19077.749486</td>\n",
|
||
" <td>3.834648e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>27.90</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>29491</th>\n",
|
||
" <td>3827304</td>\n",
|
||
" <td>(2018 RR1)</td>\n",
|
||
" <td>0.002658</td>\n",
|
||
" <td>0.005943</td>\n",
|
||
" <td>19826.895880</td>\n",
|
||
" <td>3.852881e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>30.00</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>18373</th>\n",
|
||
" <td>3735468</td>\n",
|
||
" <td>(2015 WY1)</td>\n",
|
||
" <td>0.103408</td>\n",
|
||
" <td>0.231228</td>\n",
|
||
" <td>82856.544926</td>\n",
|
||
" <td>7.314334e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>22.05</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>25031</th>\n",
|
||
" <td>3802041</td>\n",
|
||
" <td>(2018 FE3)</td>\n",
|
||
" <td>0.009651</td>\n",
|
||
" <td>0.021579</td>\n",
|
||
" <td>34243.774201</td>\n",
|
||
" <td>4.257719e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>27.20</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>35456</th>\n",
|
||
" <td>3430406</td>\n",
|
||
" <td>(2008 TR10)</td>\n",
|
||
" <td>0.221083</td>\n",
|
||
" <td>0.494356</td>\n",
|
||
" <td>19557.289783</td>\n",
|
||
" <td>2.152970e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>20.40</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>14305</th>\n",
|
||
" <td>3285300</td>\n",
|
||
" <td>(2005 OG3)</td>\n",
|
||
" <td>0.298233</td>\n",
|
||
" <td>0.666868</td>\n",
|
||
" <td>20309.404706</td>\n",
|
||
" <td>1.770015e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>19.75</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>72668 rows × 10 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" id name est_diameter_min est_diameter_max \\\n",
|
||
"2639 3634614 (2013 GT66) 0.024241 0.054205 \n",
|
||
"29138 54143560 (2021 JU1) 0.030238 0.067615 \n",
|
||
"36927 3836085 (2018 VQ3) 0.201630 0.450858 \n",
|
||
"61855 3769804 (2017 DJ34) 0.160160 0.358129 \n",
|
||
"15916 3824978 (2018 KS) 0.006991 0.015633 \n",
|
||
"... ... ... ... ... \n",
|
||
"29491 3827304 (2018 RR1) 0.002658 0.005943 \n",
|
||
"18373 3735468 (2015 WY1) 0.103408 0.231228 \n",
|
||
"25031 3802041 (2018 FE3) 0.009651 0.021579 \n",
|
||
"35456 3430406 (2008 TR10) 0.221083 0.494356 \n",
|
||
"14305 3285300 (2005 OG3) 0.298233 0.666868 \n",
|
||
"\n",
|
||
" relative_velocity miss_distance orbiting_body sentry_object \\\n",
|
||
"2639 43303.999094 4.814117e+07 Earth False \n",
|
||
"29138 21770.790211 5.646643e+07 Earth False \n",
|
||
"36927 109358.123029 6.435051e+07 Earth False \n",
|
||
"61855 78494.609756 5.595780e+07 Earth False \n",
|
||
"15916 19077.749486 3.834648e+07 Earth False \n",
|
||
"... ... ... ... ... \n",
|
||
"29491 19826.895880 3.852881e+07 Earth False \n",
|
||
"18373 82856.544926 7.314334e+07 Earth False \n",
|
||
"25031 34243.774201 4.257719e+07 Earth False \n",
|
||
"35456 19557.289783 2.152970e+07 Earth False \n",
|
||
"14305 20309.404706 1.770015e+07 Earth False \n",
|
||
"\n",
|
||
" absolute_magnitude hazardous \n",
|
||
"2639 25.20 False \n",
|
||
"29138 24.72 False \n",
|
||
"36927 20.60 False \n",
|
||
"61855 21.10 False \n",
|
||
"15916 27.90 False \n",
|
||
"... ... ... \n",
|
||
"29491 30.00 False \n",
|
||
"18373 22.05 False \n",
|
||
"25031 27.20 False \n",
|
||
"35456 20.40 False \n",
|
||
"14305 19.75 False \n",
|
||
"\n",
|
||
"[72668 rows x 10 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'y_train'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>hazardous</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>2639</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>29138</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>36927</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>61855</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>15916</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>29491</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>18373</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>25031</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>35456</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>14305</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>72668 rows × 1 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" hazardous\n",
|
||
"2639 False\n",
|
||
"29138 False\n",
|
||
"36927 False\n",
|
||
"61855 False\n",
|
||
"15916 False\n",
|
||
"... ...\n",
|
||
"29491 False\n",
|
||
"18373 False\n",
|
||
"25031 False\n",
|
||
"35456 False\n",
|
||
"14305 False\n",
|
||
"\n",
|
||
"[72668 rows x 1 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'X_test'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>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>9040</th>\n",
|
||
" <td>2474532</td>\n",
|
||
" <td>474532 (2003 VG1)</td>\n",
|
||
" <td>0.472667</td>\n",
|
||
" <td>1.056915</td>\n",
|
||
" <td>21779.237137</td>\n",
|
||
" <td>3.443050e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>18.75</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>67305</th>\n",
|
||
" <td>3774018</td>\n",
|
||
" <td>(2017 HF1)</td>\n",
|
||
" <td>0.084053</td>\n",
|
||
" <td>0.187949</td>\n",
|
||
" <td>53291.016226</td>\n",
|
||
" <td>6.862591e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>22.50</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>77741</th>\n",
|
||
" <td>54269585</td>\n",
|
||
" <td>(2022 GQ2)</td>\n",
|
||
" <td>0.018220</td>\n",
|
||
" <td>0.040742</td>\n",
|
||
" <td>43089.046433</td>\n",
|
||
" <td>2.592726e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>25.82</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>81520</th>\n",
|
||
" <td>54097970</td>\n",
|
||
" <td>(2020 XS)</td>\n",
|
||
" <td>0.152952</td>\n",
|
||
" <td>0.342011</td>\n",
|
||
" <td>93246.455599</td>\n",
|
||
" <td>4.709054e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>21.20</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>508</th>\n",
|
||
" <td>3730802</td>\n",
|
||
" <td>(2015 TT238)</td>\n",
|
||
" <td>0.031956</td>\n",
|
||
" <td>0.071456</td>\n",
|
||
" <td>37708.258544</td>\n",
|
||
" <td>4.232149e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>24.60</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>28261</th>\n",
|
||
" <td>3532365</td>\n",
|
||
" <td>(2010 MH1)</td>\n",
|
||
" <td>0.139494</td>\n",
|
||
" <td>0.311918</td>\n",
|
||
" <td>37604.980238</td>\n",
|
||
" <td>7.369507e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>21.40</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1159</th>\n",
|
||
" <td>54073345</td>\n",
|
||
" <td>(2020 UE)</td>\n",
|
||
" <td>0.020728</td>\n",
|
||
" <td>0.046349</td>\n",
|
||
" <td>36720.077728</td>\n",
|
||
" <td>3.366114e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>25.54</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>48095</th>\n",
|
||
" <td>3836195</td>\n",
|
||
" <td>(2018 VT7)</td>\n",
|
||
" <td>0.006991</td>\n",
|
||
" <td>0.015633</td>\n",
|
||
" <td>7616.496535</td>\n",
|
||
" <td>6.376350e+06</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>27.90</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>90234</th>\n",
|
||
" <td>3752902</td>\n",
|
||
" <td>(2016 JG12)</td>\n",
|
||
" <td>0.084053</td>\n",
|
||
" <td>0.187949</td>\n",
|
||
" <td>21894.554692</td>\n",
|
||
" <td>5.736984e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>22.50</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12013</th>\n",
|
||
" <td>3445077</td>\n",
|
||
" <td>(2009 BM58)</td>\n",
|
||
" <td>0.038420</td>\n",
|
||
" <td>0.085909</td>\n",
|
||
" <td>49828.611609</td>\n",
|
||
" <td>4.305599e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>24.20</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>18168 rows × 10 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" id name est_diameter_min est_diameter_max \\\n",
|
||
"9040 2474532 474532 (2003 VG1) 0.472667 1.056915 \n",
|
||
"67305 3774018 (2017 HF1) 0.084053 0.187949 \n",
|
||
"77741 54269585 (2022 GQ2) 0.018220 0.040742 \n",
|
||
"81520 54097970 (2020 XS) 0.152952 0.342011 \n",
|
||
"508 3730802 (2015 TT238) 0.031956 0.071456 \n",
|
||
"... ... ... ... ... \n",
|
||
"28261 3532365 (2010 MH1) 0.139494 0.311918 \n",
|
||
"1159 54073345 (2020 UE) 0.020728 0.046349 \n",
|
||
"48095 3836195 (2018 VT7) 0.006991 0.015633 \n",
|
||
"90234 3752902 (2016 JG12) 0.084053 0.187949 \n",
|
||
"12013 3445077 (2009 BM58) 0.038420 0.085909 \n",
|
||
"\n",
|
||
" relative_velocity miss_distance orbiting_body sentry_object \\\n",
|
||
"9040 21779.237137 3.443050e+07 Earth False \n",
|
||
"67305 53291.016226 6.862591e+07 Earth False \n",
|
||
"77741 43089.046433 2.592726e+07 Earth False \n",
|
||
"81520 93246.455599 4.709054e+07 Earth False \n",
|
||
"508 37708.258544 4.232149e+07 Earth False \n",
|
||
"... ... ... ... ... \n",
|
||
"28261 37604.980238 7.369507e+07 Earth False \n",
|
||
"1159 36720.077728 3.366114e+07 Earth False \n",
|
||
"48095 7616.496535 6.376350e+06 Earth False \n",
|
||
"90234 21894.554692 5.736984e+07 Earth False \n",
|
||
"12013 49828.611609 4.305599e+07 Earth False \n",
|
||
"\n",
|
||
" absolute_magnitude hazardous \n",
|
||
"9040 18.75 False \n",
|
||
"67305 22.50 False \n",
|
||
"77741 25.82 False \n",
|
||
"81520 21.20 False \n",
|
||
"508 24.60 False \n",
|
||
"... ... ... \n",
|
||
"28261 21.40 False \n",
|
||
"1159 25.54 False \n",
|
||
"48095 27.90 False \n",
|
||
"90234 22.50 False \n",
|
||
"12013 24.20 False \n",
|
||
"\n",
|
||
"[18168 rows x 10 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'y_test'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>hazardous</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>9040</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>67305</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>77741</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>81520</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>508</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>28261</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1159</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>48095</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>90234</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12013</th>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>18168 rows × 1 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" hazardous\n",
|
||
"9040 False\n",
|
||
"67305 False\n",
|
||
"77741 False\n",
|
||
"81520 False\n",
|
||
"508 False\n",
|
||
"... ...\n",
|
||
"28261 False\n",
|
||
"1159 False\n",
|
||
"48095 False\n",
|
||
"90234 False\n",
|
||
"12013 False\n",
|
||
"\n",
|
||
"[18168 rows x 1 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from typing import Tuple\n",
|
||
"import pandas as pd\n",
|
||
"from pandas import DataFrame\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"\n",
|
||
"# Устанавливаем случайное состояние\n",
|
||
"random_state = 42\n",
|
||
"\n",
|
||
"def split_stratified_into_train_val_test(\n",
|
||
" df_input,\n",
|
||
" stratify_colname=\"y\",\n",
|
||
" frac_train=0.6,\n",
|
||
" frac_val=0.15,\n",
|
||
" frac_test=0.25,\n",
|
||
" random_state=None,\n",
|
||
") -> Tuple[DataFrame, DataFrame, DataFrame, DataFrame, DataFrame, DataFrame]:\n",
|
||
" \n",
|
||
" if frac_train + frac_val + frac_test != 1.0:\n",
|
||
" raise ValueError(\n",
|
||
" \"fractions %f, %f, %f do not add up to 1.0\"\n",
|
||
" % (frac_train, frac_val, frac_test)\n",
|
||
" )\n",
|
||
" if stratify_colname not in df_input.columns:\n",
|
||
" raise ValueError(\"%s is not a column in the dataframe\" % (stratify_colname))\n",
|
||
" X = df_input # Contains all columns.\n",
|
||
" y = df_input[\n",
|
||
" [stratify_colname]\n",
|
||
" ] # Dataframe of just the column on which to stratify.\n",
|
||
" # Split original dataframe into train and temp dataframes.\n",
|
||
" df_train, df_temp, y_train, y_temp = train_test_split(\n",
|
||
" X, y, stratify=y, test_size=(1.0 - frac_train), random_state=random_state\n",
|
||
" )\n",
|
||
" if frac_val <= 0:\n",
|
||
" assert len(df_input) == len(df_train) + len(df_temp)\n",
|
||
" return df_train, pd.DataFrame(), df_temp, y_train, pd.DataFrame(), y_temp\n",
|
||
" # Split the temp dataframe into val and test dataframes.\n",
|
||
" relative_frac_test = frac_test / (frac_val + frac_test)\n",
|
||
" df_val, df_test, y_val, y_test = train_test_split(\n",
|
||
" df_temp,\n",
|
||
" y_temp,\n",
|
||
" stratify=y_temp,\n",
|
||
" test_size=relative_frac_test,\n",
|
||
" random_state=random_state,\n",
|
||
" )\n",
|
||
" assert len(df_input) == len(df_train) + len(df_val) + len(df_test)\n",
|
||
" return df_train, df_val, df_test, y_train, y_val, y_test\n",
|
||
"\n",
|
||
"X_train, X_val, X_test, y_train, y_val, y_test = split_stratified_into_train_val_test(\n",
|
||
" df, stratify_colname=\"hazardous\", frac_train=0.80, frac_val=0, frac_test=0.20, random_state=random_state\n",
|
||
")\n",
|
||
"\n",
|
||
"display(\"X_train\", X_train)\n",
|
||
"display(\"y_train\", y_train)\n",
|
||
"\n",
|
||
"display(\"X_test\", X_test)\n",
|
||
"display(\"y_test\", y_test)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Формирование конвейера для классификации данных\n",
|
||
"preprocessing_num -- конвейер для обработки числовых данных: заполнение пропущенных значений и стандартизация\n",
|
||
"\n",
|
||
"preprocessing_cat -- конвейер для обработки категориальных данных: заполнение пропущенных данных и унитарное кодирование\n",
|
||
"\n",
|
||
"features_preprocessing -- трансформер для предобработки признаков\n",
|
||
"\n",
|
||
"features_engineering -- трансформер для конструирования признаков\n",
|
||
"\n",
|
||
"drop_columns -- трансформер для удаления колонок\n",
|
||
"\n",
|
||
"pipeline_end -- основной конвейер предобработки данных и конструирования признаков"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"from sklearn.base import BaseEstimator, TransformerMixin\n",
|
||
"from sklearn.compose import ColumnTransformer\n",
|
||
"from sklearn.discriminant_analysis import StandardScaler\n",
|
||
"from sklearn.impute import SimpleImputer\n",
|
||
"from sklearn.pipeline import Pipeline\n",
|
||
"from sklearn.preprocessing import OneHotEncoder\n",
|
||
"\n",
|
||
"class EarthObjectsFeatures(BaseEstimator, TransformerMixin):\n",
|
||
" def __init__(self):\n",
|
||
" pass\n",
|
||
" def fit(self, X, y=None):\n",
|
||
" return self\n",
|
||
" def transform(self, X, y=None):\n",
|
||
" X[\"Length_to_Width_Ratio\"] = X[\"x\"] / X[\"y\"]\n",
|
||
" return X\n",
|
||
" def get_feature_names_out(self, features_in):\n",
|
||
" return np.append(features_in, [\"Length_to_Width_Ratio\"], axis=0)\n",
|
||
" \n",
|
||
"\n",
|
||
"columns_to_drop = [\"name\", \"orbiting_body\"]\n",
|
||
"num_columns = [\"est_diameter_min\", \"est_diameter_max\",\n",
|
||
" \"relative_velocity\", \"miss_distance\", \"sentry_object\",\n",
|
||
" \"absolute_magnitude\", \"hazardous\"]\n",
|
||
"cat_columns = []\n",
|
||
"\n",
|
||
"num_imputer = SimpleImputer(strategy=\"median\")\n",
|
||
"num_scaler = StandardScaler()\n",
|
||
"preprocessing_num = Pipeline(\n",
|
||
" [\n",
|
||
" (\"imputer\", num_imputer),\n",
|
||
" (\"scaler\", num_scaler),\n",
|
||
" ]\n",
|
||
")\n",
|
||
"\n",
|
||
"cat_imputer = SimpleImputer(strategy=\"constant\", fill_value=\"unknown\")\n",
|
||
"cat_encoder = OneHotEncoder(handle_unknown=\"ignore\", sparse_output=False, drop=\"first\")\n",
|
||
"preprocessing_cat = Pipeline(\n",
|
||
" [\n",
|
||
" (\"imputer\", cat_imputer),\n",
|
||
" (\"encoder\", cat_encoder),\n",
|
||
" ]\n",
|
||
")\n",
|
||
"\n",
|
||
"features_preprocessing = ColumnTransformer(\n",
|
||
" verbose_feature_names_out=False,\n",
|
||
" transformers=[\n",
|
||
" (\"prepocessing_num\", preprocessing_num, num_columns),\n",
|
||
" (\"prepocessing_cat\", preprocessing_cat, cat_columns),\n",
|
||
" ],\n",
|
||
" remainder=\"passthrough\"\n",
|
||
")\n",
|
||
"\n",
|
||
"\n",
|
||
"drop_columns = ColumnTransformer(\n",
|
||
" verbose_feature_names_out=False,\n",
|
||
" transformers=[\n",
|
||
" (\"drop_columns\", \"drop\", columns_to_drop),\n",
|
||
" ],\n",
|
||
" remainder=\"passthrough\",\n",
|
||
")\n",
|
||
"\n",
|
||
"features_postprocessing = ColumnTransformer(\n",
|
||
" verbose_feature_names_out=False,\n",
|
||
" transformers=[\n",
|
||
" (\"prepocessing_cat\", preprocessing_cat, [\"Cabin_type\"]),\n",
|
||
" ],\n",
|
||
" remainder=\"passthrough\",\n",
|
||
")\n",
|
||
"\n",
|
||
"pipeline_end = Pipeline(\n",
|
||
" [\n",
|
||
" (\"features_preprocessing\", features_preprocessing),\n",
|
||
" (\"drop_columns\", drop_columns),\n",
|
||
" ]\n",
|
||
")\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Демонстрация работы конвейера"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 19,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>est_diameter_min</th>\n",
|
||
" <th>est_diameter_max</th>\n",
|
||
" <th>relative_velocity</th>\n",
|
||
" <th>miss_distance</th>\n",
|
||
" <th>sentry_object</th>\n",
|
||
" <th>absolute_magnitude</th>\n",
|
||
" <th>hazardous</th>\n",
|
||
" <th>id</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>2639</th>\n",
|
||
" <td>-0.331616</td>\n",
|
||
" <td>-0.331616</td>\n",
|
||
" <td>-0.188160</td>\n",
|
||
" <td>0.494297</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.577785</td>\n",
|
||
" <td>-0.328347</td>\n",
|
||
" <td>3634614</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>29138</th>\n",
|
||
" <td>-0.312486</td>\n",
|
||
" <td>-0.312486</td>\n",
|
||
" <td>-1.040729</td>\n",
|
||
" <td>0.866716</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.412170</td>\n",
|
||
" <td>-0.328347</td>\n",
|
||
" <td>54143560</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>36927</th>\n",
|
||
" <td>0.234246</td>\n",
|
||
" <td>0.234246</td>\n",
|
||
" <td>2.427134</td>\n",
|
||
" <td>1.219399</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>-1.009355</td>\n",
|
||
" <td>-0.328347</td>\n",
|
||
" <td>3836085</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>61855</th>\n",
|
||
" <td>0.101960</td>\n",
|
||
" <td>0.101960</td>\n",
|
||
" <td>1.205148</td>\n",
|
||
" <td>0.843963</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>-0.836840</td>\n",
|
||
" <td>-0.328347</td>\n",
|
||
" <td>3769804</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>15916</th>\n",
|
||
" <td>-0.386643</td>\n",
|
||
" <td>-0.386643</td>\n",
|
||
" <td>-1.147355</td>\n",
|
||
" <td>0.056145</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.509367</td>\n",
|
||
" <td>-0.328347</td>\n",
|
||
" <td>3824978</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>29491</th>\n",
|
||
" <td>-0.400466</td>\n",
|
||
" <td>-0.400466</td>\n",
|
||
" <td>-1.117694</td>\n",
|
||
" <td>0.064301</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>2.233931</td>\n",
|
||
" <td>-0.328347</td>\n",
|
||
" <td>3827304</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>18373</th>\n",
|
||
" <td>-0.079077</td>\n",
|
||
" <td>-0.079077</td>\n",
|
||
" <td>1.377851</td>\n",
|
||
" <td>1.612734</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>-0.509061</td>\n",
|
||
" <td>-0.328347</td>\n",
|
||
" <td>3735468</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>25031</th>\n",
|
||
" <td>-0.378159</td>\n",
|
||
" <td>-0.378159</td>\n",
|
||
" <td>-0.546884</td>\n",
|
||
" <td>0.245400</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.267846</td>\n",
|
||
" <td>-0.328347</td>\n",
|
||
" <td>3802041</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>35456</th>\n",
|
||
" <td>0.296300</td>\n",
|
||
" <td>0.296300</td>\n",
|
||
" <td>-1.128369</td>\n",
|
||
" <td>-0.696130</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>-1.078361</td>\n",
|
||
" <td>-0.328347</td>\n",
|
||
" <td>3430406</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>14305</th>\n",
|
||
" <td>0.542404</td>\n",
|
||
" <td>0.542404</td>\n",
|
||
" <td>-1.098590</td>\n",
|
||
" <td>-0.867440</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>-1.302631</td>\n",
|
||
" <td>-0.328347</td>\n",
|
||
" <td>3285300</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>72668 rows × 8 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" est_diameter_min est_diameter_max relative_velocity miss_distance \\\n",
|
||
"2639 -0.331616 -0.331616 -0.188160 0.494297 \n",
|
||
"29138 -0.312486 -0.312486 -1.040729 0.866716 \n",
|
||
"36927 0.234246 0.234246 2.427134 1.219399 \n",
|
||
"61855 0.101960 0.101960 1.205148 0.843963 \n",
|
||
"15916 -0.386643 -0.386643 -1.147355 0.056145 \n",
|
||
"... ... ... ... ... \n",
|
||
"29491 -0.400466 -0.400466 -1.117694 0.064301 \n",
|
||
"18373 -0.079077 -0.079077 1.377851 1.612734 \n",
|
||
"25031 -0.378159 -0.378159 -0.546884 0.245400 \n",
|
||
"35456 0.296300 0.296300 -1.128369 -0.696130 \n",
|
||
"14305 0.542404 0.542404 -1.098590 -0.867440 \n",
|
||
"\n",
|
||
" sentry_object absolute_magnitude hazardous id \n",
|
||
"2639 0.0 0.577785 -0.328347 3634614 \n",
|
||
"29138 0.0 0.412170 -0.328347 54143560 \n",
|
||
"36927 0.0 -1.009355 -0.328347 3836085 \n",
|
||
"61855 0.0 -0.836840 -0.328347 3769804 \n",
|
||
"15916 0.0 1.509367 -0.328347 3824978 \n",
|
||
"... ... ... ... ... \n",
|
||
"29491 0.0 2.233931 -0.328347 3827304 \n",
|
||
"18373 0.0 -0.509061 -0.328347 3735468 \n",
|
||
"25031 0.0 1.267846 -0.328347 3802041 \n",
|
||
"35456 0.0 -1.078361 -0.328347 3430406 \n",
|
||
"14305 0.0 -1.302631 -0.328347 3285300 \n",
|
||
"\n",
|
||
"[72668 rows x 8 columns]"
|
||
]
|
||
},
|
||
"execution_count": 19,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"preprocessing_result = pipeline_end.fit_transform(X_train)\n",
|
||
"preprocessed_df = pd.DataFrame(\n",
|
||
" preprocessing_result,\n",
|
||
" columns=pipeline_end.get_feature_names_out(),\n",
|
||
")\n",
|
||
"\n",
|
||
"preprocessed_df"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Формирование набора моделей для классификации\n",
|
||
" logistic -- логистическая регрессия\n",
|
||
"\n",
|
||
"ridge -- гребневая регрессия\n",
|
||
"\n",
|
||
"decision_tree -- дерево решений\n",
|
||
"\n",
|
||
"knn -- k-ближайших соседей\n",
|
||
"\n",
|
||
"naive_bayes -- наивный Байесовский классификатор\n",
|
||
"\n",
|
||
"gradient_boosting -- метод градиентного бустинга (набор деревьев решений)\n",
|
||
"\n",
|
||
"random_forest -- метод случайного леса (набор деревьев решений)\n",
|
||
"\n",
|
||
"mlp -- многослойный персептрон (нейронная сеть)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 20,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from sklearn import ensemble, linear_model, naive_bayes, neighbors, neural_network, tree\n",
|
||
"\n",
|
||
"class_models = {\n",
|
||
" \"logistic\": {\"model\": linear_model.LogisticRegression()},\n",
|
||
" # \"ridge\": {\"model\": linear_model.RidgeClassifierCV(cv=5, class_weight=\"balanced\")},\n",
|
||
" \"ridge\": {\"model\": linear_model.LogisticRegression(penalty=\"l2\", class_weight=\"balanced\")},\n",
|
||
" \"decision_tree\": {\n",
|
||
" \"model\": tree.DecisionTreeClassifier(max_depth=7, random_state=random_state)\n",
|
||
" },\n",
|
||
" \"knn\": {\"model\": neighbors.KNeighborsClassifier(n_neighbors=7)},\n",
|
||
" \"naive_bayes\": {\"model\": naive_bayes.GaussianNB()},\n",
|
||
" \"gradient_boosting\": {\n",
|
||
" \"model\": ensemble.GradientBoostingClassifier(n_estimators=210)\n",
|
||
" },\n",
|
||
" \"random_forest\": {\n",
|
||
" \"model\": ensemble.RandomForestClassifier(\n",
|
||
" max_depth=11, class_weight=\"balanced\", random_state=random_state\n",
|
||
" )\n",
|
||
" },\n",
|
||
" \"mlp\": {\n",
|
||
" \"model\": neural_network.MLPClassifier(\n",
|
||
" hidden_layer_sizes=(7,),\n",
|
||
" max_iter=500,\n",
|
||
" early_stopping=True,\n",
|
||
" random_state=random_state,\n",
|
||
" )\n",
|
||
" },\n",
|
||
"}"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Обучение моделей на обучающем наборе данных и оценка на тестовом"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 21,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Model: logistic\n",
|
||
"Model: ridge\n",
|
||
"Model: decision_tree\n",
|
||
"Model: knn\n",
|
||
"Model: naive_bayes\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"c:\\Users\\Admin\\StudioProjects\\AIM-PIbd-31-Alekseev-I-S\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
|
||
" _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
|
||
"c:\\Users\\Admin\\StudioProjects\\AIM-PIbd-31-Alekseev-I-S\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
|
||
" _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Model: gradient_boosting\n",
|
||
"Model: random_forest\n",
|
||
"Model: mlp\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"c:\\Users\\Admin\\StudioProjects\\AIM-PIbd-31-Alekseev-I-S\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
|
||
" _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
|
||
"c:\\Users\\Admin\\StudioProjects\\AIM-PIbd-31-Alekseev-I-S\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
|
||
" _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"from sklearn import metrics\n",
|
||
"\n",
|
||
"for model_name in class_models.keys():\n",
|
||
" print(f\"Model: {model_name}\")\n",
|
||
" model = class_models[model_name][\"model\"]\n",
|
||
"\n",
|
||
" model_pipeline = Pipeline([(\"pipeline\", pipeline_end), (\"model\", model)])\n",
|
||
" model_pipeline = model_pipeline.fit(X_train, y_train.values.ravel())\n",
|
||
"\n",
|
||
" y_train_predict = model_pipeline.predict(X_train)\n",
|
||
" y_test_probs = model_pipeline.predict_proba(X_test)[:, 1]\n",
|
||
" y_test_predict = np.where(y_test_probs > 0.5, 1, 0)\n",
|
||
"\n",
|
||
" class_models[model_name][\"pipeline\"] = model_pipeline\n",
|
||
" class_models[model_name][\"probs\"] = y_test_probs\n",
|
||
" class_models[model_name][\"preds\"] = y_test_predict\n",
|
||
"\n",
|
||
" class_models[model_name][\"Precision_train\"] = metrics.precision_score(\n",
|
||
" y_train, y_train_predict\n",
|
||
" )\n",
|
||
" class_models[model_name][\"Precision_test\"] = metrics.precision_score(\n",
|
||
" y_test, y_test_predict\n",
|
||
" )\n",
|
||
" class_models[model_name][\"Recall_train\"] = metrics.recall_score(\n",
|
||
" y_train, y_train_predict\n",
|
||
" )\n",
|
||
" class_models[model_name][\"Recall_test\"] = metrics.recall_score(\n",
|
||
" y_test, y_test_predict\n",
|
||
" )\n",
|
||
" class_models[model_name][\"Accuracy_train\"] = metrics.accuracy_score(\n",
|
||
" y_train, y_train_predict\n",
|
||
" )\n",
|
||
" class_models[model_name][\"Accuracy_test\"] = metrics.accuracy_score(\n",
|
||
" y_test, y_test_predict\n",
|
||
" )\n",
|
||
" class_models[model_name][\"ROC_AUC_test\"] = metrics.roc_auc_score(\n",
|
||
" y_test, y_test_probs\n",
|
||
" )\n",
|
||
" class_models[model_name][\"F1_train\"] = metrics.f1_score(y_train, y_train_predict)\n",
|
||
" class_models[model_name][\"F1_test\"] = metrics.f1_score(y_test, y_test_predict)\n",
|
||
" class_models[model_name][\"MCC_test\"] = metrics.matthews_corrcoef(\n",
|
||
" y_test, y_test_predict\n",
|
||
" )\n",
|
||
" class_models[model_name][\"Cohen_kappa_test\"] = metrics.cohen_kappa_score(\n",
|
||
" y_test, y_test_predict\n",
|
||
" )\n",
|
||
" class_models[model_name][\"Confusion_matrix\"] = metrics.confusion_matrix(\n",
|
||
" y_test, y_test_predict\n",
|
||
" )"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Сводная таблица оценок качества для использованных моделей классификации"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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ubm5KmX16tWDlZUV8vLyxDILCwu1r1j4r2bNmsHT0xOLFi0q1v7f10BERKRvlPPjlixZolK+aNEilc+GhoYIDg7Grl27cO/ePbH85s2b2Ldvn0rbbt26wdDQEBEREcXirCAIePjwYTleAVHF4lBMqrEcHBwwefJkREREICwsDO+++y7i4+OxYsUKvPbaa/jwww8BFM25Cw8Px2effYZ27dqhZ8+eSExMxPr161GvXj2tT9v++usvtG/fHj179oSvry+MjIywc+dOpKWloVevXmK7gIAArFy5El999RW8vLzg6OiIdu3aFTuegYEBVq5cic6dO6Np06YYOHAgXFxccP36dcTGxuLAgQPl/0URERFVA02bNkXv3r2xYsUKPHr0CG+++SYOHz6s9slceHg4Dh48iJYtW+KTTz6BXC7HsmXL0LhxY8TExIjt6tWrh6+++gqTJ08WX3VkZWWFhIQE7Ny5E8OGDcO4ceMq8SqJXhwTO6rRwsPD4eDggGXLlmHMmDGws7PDsGHDMHv2bJUJ0SNHjoQgCJg/fz7GjRuHJk2aYPfu3fj8889hamqq8fhubm7o3bs3Dh8+jB9//BFGRkZo0KABtm3bhu7du4vtpk2bhjt37mDevHl4/Pgx2rZtqzaxA4DQ0FAcPXoUERERmD9/PhQKBerVq4ehQ4eW3xdDRERUDa1duxYODg7YtGkTdu3ahXbt2uH333+Hm5ubSruAgADs27cP48aNw9SpU+Hm5oYZM2YgLi4O169fV2k7adIk1K9fHwsXLkRERASAovgeEhKCd999t9KujehlSQSO7yJSS6FQwMHBAd26dcMPP/yg6+4QERHRS+ratStiY2Nx48YNXXeFqNxxjh0RgNzc3GJj6zdu3IiMjAwEBQXpplNERET0wp49e6by+caNG9i7dy/jOtVYfGJHBODYsWMYM2YMevToAXt7e1y4cAFr1qxBw4YNER0dDalUqusuEhERURm4uLhgwIAB4rtrV65ciby8PFy8eFHje+uIqjPOsSMC4OHhATc3NyxZsgQZGRmws7NDv3798PXXXzOpIyIiqobCwsLw888/IzU1FSYmJggMDMTs2bOZ1FGNxSd2RERERERE1Rzn2BEREREREVVzTOyIiIiIiIiqOc6xq6YUCgXu3bsHKysrrS/QJqqpBEHA48eP4erqCgOD8r1HlZubi/z8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b98ehYWFmDhxIhwcHAxuLzw8HKGhoejbty/mzp2LgIAAXL16Fd9//z3+/ve/o3379rV0ZKazbVVDbFvV0NTdsHi/JLujV9jfDbbZvb0pdm9vqrderbbCV5+H4KvPK565LXfmVCOcOSWzx4FrRNmir46ITIrZrBtzwXLxbyMjGMrm8noZ48DOCCqVCocOHcLChQtRWFgIX19fzJs3Dz179oSnpydGjhyJtm3bwsfHB7NmzcKECRMMbk+hUGDnzp14//33MXToUFy/fh2enp7o0qULPDz4EkoisyD+t+irIyKTYjYTyZChbEYldTKgEELmdxlaqMLCQri4uKAromCj4GV6U7D2b2bqLshaqfoB9qYvwu3bt6FSqaptu+U/Wx27x8HGRveUotLS+zi6N67a901Elq/8d0j3p8bAxtp87r2TE/XFy6bugmyVihIcwHcmyWaA+cwrdkREOvDhKUREROaFD08xjAM7IiJdOBWTiIjIvHAqpkEc2BER6aBQCyj0nPpTqGWeHERERCZgKJvL6+WMAzsiIh0UQkCh5xZkfeVERERUcwxlc3m9nHFgR0SkC6diEhERmRdOxTSIAzsiIh0UGgGFnvfh6CsnIiKimmMom8vr5YwDOyIiXYQoW/TVERERUe0ylM3l9TLGgR0RkQ4KTdmir46IiIhql6FsLq+XMw7siIh00YiyRV8dERER1S5D2VxeL2Mc2BER6cCnYhIREZkXPhXTMA7siIh04T12RERE5oX32BnEgR0RkQ4KjdD7olO5P3WLiIjIFAxlc3m9nHFgR0Ski4CBK3a12hMiIiICDGdzeb2McWBHRKQLp2ISERGZF07FNIgDOyIiHRRqAYWeU3+GpoEQERFRzTCUzeX1csaBHRGRLrxiR0REZF54xc4gDuyIiHThwI6IiMi8cGBnEAd2RES6qAX03oUt86keREREJmEom6V6+eLAjohIB76gnIiIyLzwBeWGcWBHRKQLp2ISERGZF07FNIgDOyIiXdQaABoDdURERFSrDGWzVC9fHNgREelk6KygvM8IEhERmUYlV+xkns8c2BER6cKpmEREROaFUzEN4sCOiEgXtRoQat11Gj3lREREVHMMZTMg+3zmwI6ISBdesSMiIjIvvGJnEAd2RES6aAy8K0cj7+AgIiIyCUPZLNXLFwd2RES6aAT0PnlL5sFBRERkEoay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iCVLljzmN2p6ho7r9OnTon379sLe3l74+/uLb775psL3+vAN2kIIUVhYKN555x3h7e0tbG1thY+Pj4iOjta6QZ6IiKoHs5nZzGymx6UQwsKfJUtERERERCRznIpJRERERERk4TiwIyIiIiIisnAc2BEREREREVk4DuyIiIiIiIgsHAd2REREREREFo4DOyIiIiIiIgvHgR0REREREZGF48COiIiIiIjIwnFgR3VabGws+vbtK33u2rUrxo4dW+v9OHDgABQKBQoKCvS2USgU2Lp1q9HbjIuLQ5s2bR6rX5mZmVAoFEhOTn6s7RARERmL2WwYs5keFQd2VOtiY2OhUCigUChgZ2cHPz8/zJw5E6WlpTW+7y1btuCDDz4wqq0xv/CJiIjqAmYzkeWzMXUHSJ4iIyOxatUqPHjwADt37sTbb78NW1tbTJkypULb4uJi2NnZVct+69evXy3bISIiqmuYzUSWjVfsyCSUSiU8PT3h6+uLt956C+Hh4di2bRuAP6dofPTRR/D29kZgYCAAIDs7GwMGDICrqyvq16+PqKgoZGZmSttUq9UYP348XF1d0aBBA0yaNAlCCK39Pjzd48GDB5g8eTJ8fHygVCrh5+eHr776CpmZmXj++ecBAG5ublAoFIiNjQUAaDQazJ49G02bNoWDgwNat26NTZs2ae1n586dCAgIgIODA55//nmtfhpr8uTJCAgIQL169dCsWTNMnToVJSUlFdotX74cPj4+qFevHgYMGIDbt29r1X/55ZcICgqCvb09mjdvjqVLl1a5L0REVPcxmyvHbCZzxoEdmQUHBwcUFxdLn/fu3Yu0tDQkJCRgx44dKCkpQUREBJydnXH48GEcPXoUTk5OiIyMlNabN28eVq9ejZUrV+LIkSPIz8/Ht99+a3C/Q4YMwX//+18sXrwYqampWL58OZycnODj44PNmzcDANLS0pCTk4NFixYBAGbPno34+HgsW7YMKSkpGDduHF599VUcPHgQQFnI9evXD71790ZycjKGDx+O9957r8rfibOzM1avXo3z589j0aJFWLFiBRYsWKDV5tKlS9i4cSO2b9+O3bt348yZMxg1apRUv27dOkybNg0fffQRUlNTMWvWLEydOhVr1qypcn+IiEhemM0VMZvJrAmiWhYTEyOioqKEEEJoNBqRkJAglEqlmDBhglTv4eEhHjx4IK2zdu1aERgYKDQajVT24MED4eDgIH744QchhBBeXl5i7ty5Un1JSYlo3LixtC8hhAgLCxNjxowRQgiRlpYmAIiEhASd/dy/f78AIG7duiWV3b9/X9SrV08cO3ZMq+2wYcPEoEGDhBBCTJkyRQQHB2vVT548ucK2HgZAfPvtt3rrP/nkE9GuXTvp8/Tp04W1tbW4cuWKVLZr1y5hZWUlcnJyhBBCPPXUU2L9+vVa2/nggw9EaGioEEKIjIwMAUCcOXNG736JiKjuYzbrxmwmS8J77MgkduzYAScnJ5SUlECj0WDw4MGIi4uT6kNCQrTm7p89exaXLl2Cs7Oz1nbu37+P9PR03L59Gzk5OejQoYNUZ2Njg/bt21eY8lEuOTkZ1tbWCAsLM7rfly5dwr179/DCCy9olRcXF+Ppp58GAKSmpmr1AwBCQ0ON3ke5DRs2YPHixUhPT0dRURFKS0uhUqm02jz55JN44okntPaj0WiQlpYGZ2dnpKenY9iwYRgxYoTUprS0FC4uLlXuDxER1W3M5soxm8mccWBHJvH888/j888/h52dHby9vWFjo/2/oqOjo9bnoqIitGvXDuvWrauwLXd390fqg4ODQ5XXKSoqAgB8//33Wr+0gbJ7E6rL8ePHER0djRkzZiAiIgIuLi74+uuvMW/evCr3dcWKFRXCzNrautr6SkREdQOz2TBmM5k7DuzIJBwdHeHn52d0+7Zt22LDhg1o1KhRhTNj5by8vJCYmIguXboAKDv7lZSUhLZt2+psHxISAo1Gg4MHDyI8PLxCfflZSbVaLZUFBwdDqVQiKytL79nEoKAg6WbzcidOnKj8IP/i2LFj8PX1xfvvvy+V/fbbbxXaZWVl4erVq/D29pb2Y2VlhcDAQHh4eMDb2xuXL19GdHR0lfZPRETyw2w2jNlM5o4PTyGLEB0djYYNGyIqKgqHDx9GRkYGDhw4gHfffRdXrlwBAIwZMwZz5szB1q1bceHCBYwaNcrge26aNGmCmJgYvP7669i6dau0zY0bNwIAfH19oVAosGPHDly/fh1FRUVwdnbGhAkTMG7cOKxZswbp6ek4ffo0lixZIt30/Oabb+LixYuYOHEi0tLSsH79eqxevbpKx+vv74+srCx8/fXXSE9Px+LFi3XebG5vb4+YmBicPXsWhw8fxrvvvosBAwbA09MTADBjxgzMnj0bixcvxq+//opffvkFq1atwvz586vUHyIioocxm5nNZGZMfZMfyc9fb9CuSn1OTo4YMmSIaNiwoVAqlaJZs2ZixIgR4vbt20KIshuyx4wZI1QqlXB1dRXjx48XQ4YM0XuDthBC/PHHH2LcuHHCy8tL2NnZCT8/P7Fy5UqpfubMmcLT01MoFAoRExMjhCi7qXzhwoUiMDBQ2NraCnd3dxERESEOHjworbd9+3bh5+cnlEql6Ny5s1i5cmWVb9CeOHGiaNCggXBychKvvPKKWLBggXBxcZHqp0+fLlq3bi2WLl0qvL29hb29vfjHP/4h8vPztba7bt060aZNG2FnZyfc3NxEly5dxJYtW4QQvEGbiIjKMJt1YzaTJVEIoefuVSIiIiIiIrIInIpJRERERERk4TiwIyIiIiIisnAc2BEREREREVk4DuyIiIiIiIgsHAd2REREREREFo4DOyIiIiIiIgvHgR0REREREZGF48COiIiIiIjIwnFgR0REREREZOE4sCMiIiIiIrJwHNgRERERERFZuP8HGno91SjzL5MAAAAASUVORK5CYII=",
|
||
"text/plain": [
|
||
"<Figure size 1200x1000 with 16 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.metrics import ConfusionMatrixDisplay\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"\n",
|
||
"_, ax = plt.subplots(int(len(class_models) / 2), 2, figsize=(12, 10), sharex=False, sharey=False)\n",
|
||
"for index, key in enumerate(class_models.keys()):\n",
|
||
" c_matrix = class_models[key][\"Confusion_matrix\"]\n",
|
||
" disp = ConfusionMatrixDisplay(\n",
|
||
" confusion_matrix=c_matrix, display_labels=[\"hazardous\", \"safe\"]\n",
|
||
" ).plot(ax=ax.flat[index])\n",
|
||
" disp.ax_.set_title(key)\n",
|
||
"\n",
|
||
"plt.subplots_adjust(top=1, bottom=0, hspace=0.4, wspace=0.1)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"16400 - количество истинных положительных диагнозов (True Positives), где модель правильно определила объекты как \"hazardous\".\n",
|
||
"\n",
|
||
"1768 в некоторых моделях - количество ложных отрицательных диагнозов (False Negatives), где модель неправильно определила объекты, которые на самом деле принадлежат к классу \"hazardous\", но были отнесены к классу \"safe\". \n",
|
||
"\n",
|
||
"Исходя из значений True Positives и False Negatives, можно сказать, что модель имеет высокую точность при предсказании класса \"hazardous\". В принципе, уровень ложных отрицательных результатов в некоторых моделях (1768) говорит нам о том, что существует некотрое небольшое количество примеров, которые модель пропускает.\n",
|
||
"\n",
|
||
"Точность, полнота, верность (аккуратность), F-мера"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 24,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style type=\"text/css\">\n",
|
||
"#T_371be_row0_col0, #T_371be_row0_col1, #T_371be_row0_col2, #T_371be_row0_col3, #T_371be_row1_col0, #T_371be_row1_col1, #T_371be_row1_col2, #T_371be_row1_col3, #T_371be_row2_col0, #T_371be_row2_col1, #T_371be_row2_col2, #T_371be_row2_col3, #T_371be_row3_col0, #T_371be_row3_col1, #T_371be_row3_col2, #T_371be_row3_col3, #T_371be_row7_col2, #T_371be_row7_col3 {\n",
|
||
" background-color: #a8db34;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_371be_row0_col4, #T_371be_row0_col5, #T_371be_row0_col6, #T_371be_row0_col7, #T_371be_row1_col4, #T_371be_row1_col5, #T_371be_row1_col6, #T_371be_row1_col7, #T_371be_row2_col4, #T_371be_row2_col5, #T_371be_row2_col6, #T_371be_row2_col7, #T_371be_row3_col4, #T_371be_row3_col5, #T_371be_row3_col6, #T_371be_row3_col7 {\n",
|
||
" background-color: #da5a6a;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_371be_row4_col0 {\n",
|
||
" background-color: #86d549;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_371be_row4_col1 {\n",
|
||
" background-color: #77d153;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_371be_row4_col2 {\n",
|
||
" background-color: #63cb5f;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_371be_row4_col3 {\n",
|
||
" background-color: #4ac16d;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_371be_row4_col4 {\n",
|
||
" background-color: #c03a83;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_371be_row4_col5 {\n",
|
||
" background-color: #b32c8e;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_371be_row4_col6 {\n",
|
||
" background-color: #c7427c;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_371be_row4_col7 {\n",
|
||
" background-color: #bd3786;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_371be_row5_col0, #T_371be_row5_col1, #T_371be_row5_col2, #T_371be_row5_col3, #T_371be_row6_col0, #T_371be_row6_col1, #T_371be_row6_col2, #T_371be_row6_col3 {\n",
|
||
" background-color: #26818e;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_371be_row5_col4, #T_371be_row6_col4 {\n",
|
||
" background-color: #8004a8;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_371be_row5_col5, #T_371be_row6_col5 {\n",
|
||
" background-color: #7d03a8;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_371be_row5_col6, #T_371be_row5_col7, #T_371be_row6_col6, #T_371be_row6_col7, #T_371be_row7_col4, #T_371be_row7_col5 {\n",
|
||
" background-color: #4e02a2;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_371be_row7_col0 {\n",
|
||
" background-color: #25ac82;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_371be_row7_col1 {\n",
|
||
" background-color: #26ad81;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_371be_row7_col6 {\n",
|
||
" background-color: #ac2694;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_371be_row7_col7 {\n",
|
||
" background-color: #ad2793;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"</style>\n",
|
||
"<table id=\"T_371be\">\n",
|
||
" <thead>\n",
|
||
" <tr>\n",
|
||
" <th class=\"blank level0\" > </th>\n",
|
||
" <th id=\"T_371be_level0_col0\" class=\"col_heading level0 col0\" >Precision_train</th>\n",
|
||
" <th id=\"T_371be_level0_col1\" class=\"col_heading level0 col1\" >Precision_test</th>\n",
|
||
" <th id=\"T_371be_level0_col2\" class=\"col_heading level0 col2\" >Recall_train</th>\n",
|
||
" <th id=\"T_371be_level0_col3\" class=\"col_heading level0 col3\" >Recall_test</th>\n",
|
||
" <th id=\"T_371be_level0_col4\" class=\"col_heading level0 col4\" >Accuracy_train</th>\n",
|
||
" <th id=\"T_371be_level0_col5\" class=\"col_heading level0 col5\" >Accuracy_test</th>\n",
|
||
" <th id=\"T_371be_level0_col6\" class=\"col_heading level0 col6\" >F1_train</th>\n",
|
||
" <th id=\"T_371be_level0_col7\" class=\"col_heading level0 col7\" >F1_test</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_371be_level0_row0\" class=\"row_heading level0 row0\" >logistic</th>\n",
|
||
" <td id=\"T_371be_row0_col0\" class=\"data row0 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row0_col1\" class=\"data row0 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row0_col2\" class=\"data row0 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row0_col3\" class=\"data row0 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row0_col4\" class=\"data row0 col4\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row0_col5\" class=\"data row0 col5\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row0_col6\" class=\"data row0 col6\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row0_col7\" class=\"data row0 col7\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_371be_level0_row1\" class=\"row_heading level0 row1\" >decision_tree</th>\n",
|
||
" <td id=\"T_371be_row1_col0\" class=\"data row1 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row1_col1\" class=\"data row1 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row1_col2\" class=\"data row1 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row1_col3\" class=\"data row1 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row1_col4\" class=\"data row1 col4\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row1_col5\" class=\"data row1 col5\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row1_col6\" class=\"data row1 col6\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row1_col7\" class=\"data row1 col7\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_371be_level0_row2\" class=\"row_heading level0 row2\" >random_forest</th>\n",
|
||
" <td id=\"T_371be_row2_col0\" class=\"data row2 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row2_col1\" class=\"data row2 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row2_col2\" class=\"data row2 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row2_col3\" class=\"data row2 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row2_col4\" class=\"data row2 col4\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row2_col5\" class=\"data row2 col5\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row2_col6\" class=\"data row2 col6\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row2_col7\" class=\"data row2 col7\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_371be_level0_row3\" class=\"row_heading level0 row3\" >gradient_boosting</th>\n",
|
||
" <td id=\"T_371be_row3_col0\" class=\"data row3 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row3_col1\" class=\"data row3 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row3_col2\" class=\"data row3 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row3_col3\" class=\"data row3 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row3_col4\" class=\"data row3 col4\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row3_col5\" class=\"data row3 col5\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row3_col6\" class=\"data row3 col6\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row3_col7\" class=\"data row3 col7\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_371be_level0_row4\" class=\"row_heading level0 row4\" >knn</th>\n",
|
||
" <td id=\"T_371be_row4_col0\" class=\"data row4 col0\" >0.884596</td>\n",
|
||
" <td id=\"T_371be_row4_col1\" class=\"data row4 col1\" >0.826374</td>\n",
|
||
" <td id=\"T_371be_row4_col2\" class=\"data row4 col2\" >0.744627</td>\n",
|
||
" <td id=\"T_371be_row4_col3\" class=\"data row4 col3\" >0.638009</td>\n",
|
||
" <td id=\"T_371be_row4_col4\" class=\"data row4 col4\" >0.965693</td>\n",
|
||
" <td id=\"T_371be_row4_col5\" class=\"data row4 col5\" >0.951728</td>\n",
|
||
" <td id=\"T_371be_row4_col6\" class=\"data row4 col6\" >0.808599</td>\n",
|
||
" <td id=\"T_371be_row4_col7\" class=\"data row4 col7\" >0.720077</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_371be_level0_row5\" class=\"row_heading level0 row5\" >naive_bayes</th>\n",
|
||
" <td id=\"T_371be_row5_col0\" class=\"data row5 col0\" >0.000000</td>\n",
|
||
" <td id=\"T_371be_row5_col1\" class=\"data row5 col1\" >0.000000</td>\n",
|
||
" <td id=\"T_371be_row5_col2\" class=\"data row5 col2\" >0.000000</td>\n",
|
||
" <td id=\"T_371be_row5_col3\" class=\"data row5 col3\" >0.000000</td>\n",
|
||
" <td id=\"T_371be_row5_col4\" class=\"data row5 col4\" >0.902681</td>\n",
|
||
" <td id=\"T_371be_row5_col5\" class=\"data row5 col5\" >0.902686</td>\n",
|
||
" <td id=\"T_371be_row5_col6\" class=\"data row5 col6\" >0.000000</td>\n",
|
||
" <td id=\"T_371be_row5_col7\" class=\"data row5 col7\" >0.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_371be_level0_row6\" class=\"row_heading level0 row6\" >mlp</th>\n",
|
||
" <td id=\"T_371be_row6_col0\" class=\"data row6 col0\" >0.000000</td>\n",
|
||
" <td id=\"T_371be_row6_col1\" class=\"data row6 col1\" >0.000000</td>\n",
|
||
" <td id=\"T_371be_row6_col2\" class=\"data row6 col2\" >0.000000</td>\n",
|
||
" <td id=\"T_371be_row6_col3\" class=\"data row6 col3\" >0.000000</td>\n",
|
||
" <td id=\"T_371be_row6_col4\" class=\"data row6 col4\" >0.902681</td>\n",
|
||
" <td id=\"T_371be_row6_col5\" class=\"data row6 col5\" >0.902686</td>\n",
|
||
" <td id=\"T_371be_row6_col6\" class=\"data row6 col6\" >0.000000</td>\n",
|
||
" <td id=\"T_371be_row6_col7\" class=\"data row6 col7\" >0.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_371be_level0_row7\" class=\"row_heading level0 row7\" >ridge</th>\n",
|
||
" <td id=\"T_371be_row7_col0\" class=\"data row7 col0\" >0.415780</td>\n",
|
||
" <td id=\"T_371be_row7_col1\" class=\"data row7 col1\" >0.421253</td>\n",
|
||
" <td id=\"T_371be_row7_col2\" class=\"data row7 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row7_col3\" class=\"data row7 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_371be_row7_col4\" class=\"data row7 col4\" >0.863255</td>\n",
|
||
" <td id=\"T_371be_row7_col5\" class=\"data row7 col5\" >0.866303</td>\n",
|
||
" <td id=\"T_371be_row7_col6\" class=\"data row7 col6\" >0.587351</td>\n",
|
||
" <td id=\"T_371be_row7_col7\" class=\"data row7 col7\" >0.592791</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n"
|
||
],
|
||
"text/plain": [
|
||
"<pandas.io.formats.style.Styler at 0x1dd731d3fe0>"
|
||
]
|
||
},
|
||
"execution_count": 24,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"class_metrics = pd.DataFrame.from_dict(class_models, \"index\")[\n",
|
||
" [\n",
|
||
" \"Precision_train\",\n",
|
||
" \"Precision_test\",\n",
|
||
" \"Recall_train\",\n",
|
||
" \"Recall_test\",\n",
|
||
" \"Accuracy_train\",\n",
|
||
" \"Accuracy_test\",\n",
|
||
" \"F1_train\",\n",
|
||
" \"F1_test\",\n",
|
||
" ]\n",
|
||
"]\n",
|
||
"class_metrics.sort_values(\n",
|
||
" by=\"Accuracy_test\", ascending=False\n",
|
||
").style.background_gradient(\n",
|
||
" cmap=\"plasma\",\n",
|
||
" low=0.3,\n",
|
||
" high=1,\n",
|
||
" subset=[\"Accuracy_train\", \"Accuracy_test\", \"F1_train\", \"F1_test\"],\n",
|
||
").background_gradient(\n",
|
||
" cmap=\"viridis\",\n",
|
||
" low=1,\n",
|
||
" high=0.3,\n",
|
||
" subset=[\n",
|
||
" \"Precision_train\",\n",
|
||
" \"Precision_test\",\n",
|
||
" \"Recall_train\",\n",
|
||
" \"Recall_test\",\n",
|
||
" ],\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Все модели в данной выборке, а именно логистическая регрессия, ридж-регрессия, дерево решений, KNN, наивный байесовский классификатор, градиентный бустинг, случайный лес и многослойный перцептрон (MLP) демонстрируют неплохие значения по всем метрикам на обучающих и тестовых наборах данных.\n",
|
||
"\n",
|
||
"Модели Naive Bayes и MLP не так эффективны по сравнению с другими, но в некоторых метриках показывают высокие результаты. \n",
|
||
"ROC-кривая, каппа Коэна, коэффициент корреляции Мэтьюса"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 25,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style type=\"text/css\">\n",
|
||
"#T_9ba87_row0_col0, #T_9ba87_row0_col1, #T_9ba87_row1_col0, #T_9ba87_row1_col1, #T_9ba87_row2_col0, #T_9ba87_row2_col1, #T_9ba87_row3_col0, #T_9ba87_row3_col1 {\n",
|
||
" background-color: #a8db34;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_9ba87_row0_col2, #T_9ba87_row0_col3, #T_9ba87_row0_col4, #T_9ba87_row1_col2, #T_9ba87_row1_col3, #T_9ba87_row1_col4, #T_9ba87_row2_col2, #T_9ba87_row2_col3, #T_9ba87_row2_col4, #T_9ba87_row3_col2, #T_9ba87_row3_col3, #T_9ba87_row3_col4 {\n",
|
||
" background-color: #da5a6a;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_9ba87_row4_col0, #T_9ba87_row6_col1, #T_9ba87_row7_col1 {\n",
|
||
" background-color: #26818e;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_9ba87_row4_col1 {\n",
|
||
" background-color: #40bd72;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_9ba87_row4_col2 {\n",
|
||
" background-color: #d9586a;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_9ba87_row4_col3, #T_9ba87_row6_col2 {\n",
|
||
" background-color: #a51f99;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_9ba87_row4_col4 {\n",
|
||
" background-color: #ae2892;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_9ba87_row5_col0 {\n",
|
||
" background-color: #4ac16d;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_9ba87_row5_col1 {\n",
|
||
" background-color: #5cc863;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_9ba87_row5_col2 {\n",
|
||
" background-color: #d14e72;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_9ba87_row5_col3 {\n",
|
||
" background-color: #ba3388;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_9ba87_row5_col4 {\n",
|
||
" background-color: #bb3488;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_9ba87_row6_col0, #T_9ba87_row7_col0 {\n",
|
||
" background-color: #1e9d89;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_9ba87_row6_col3, #T_9ba87_row6_col4, #T_9ba87_row7_col2, #T_9ba87_row7_col3, #T_9ba87_row7_col4 {\n",
|
||
" background-color: #4e02a2;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"</style>\n",
|
||
"<table id=\"T_9ba87\">\n",
|
||
" <thead>\n",
|
||
" <tr>\n",
|
||
" <th class=\"blank level0\" > </th>\n",
|
||
" <th id=\"T_9ba87_level0_col0\" class=\"col_heading level0 col0\" >Accuracy_test</th>\n",
|
||
" <th id=\"T_9ba87_level0_col1\" class=\"col_heading level0 col1\" >F1_test</th>\n",
|
||
" <th id=\"T_9ba87_level0_col2\" class=\"col_heading level0 col2\" >ROC_AUC_test</th>\n",
|
||
" <th id=\"T_9ba87_level0_col3\" class=\"col_heading level0 col3\" >Cohen_kappa_test</th>\n",
|
||
" <th id=\"T_9ba87_level0_col4\" class=\"col_heading level0 col4\" >MCC_test</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_9ba87_level0_row0\" class=\"row_heading level0 row0\" >logistic</th>\n",
|
||
" <td id=\"T_9ba87_row0_col0\" class=\"data row0 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_9ba87_row0_col1\" class=\"data row0 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_9ba87_row0_col2\" class=\"data row0 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_9ba87_row0_col3\" class=\"data row0 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_9ba87_row0_col4\" class=\"data row0 col4\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_9ba87_level0_row1\" class=\"row_heading level0 row1\" >decision_tree</th>\n",
|
||
" <td id=\"T_9ba87_row1_col0\" class=\"data row1 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_9ba87_row1_col1\" class=\"data row1 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_9ba87_row1_col2\" class=\"data row1 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_9ba87_row1_col3\" class=\"data row1 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_9ba87_row1_col4\" class=\"data row1 col4\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_9ba87_level0_row2\" class=\"row_heading level0 row2\" >random_forest</th>\n",
|
||
" <td id=\"T_9ba87_row2_col0\" class=\"data row2 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_9ba87_row2_col1\" class=\"data row2 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_9ba87_row2_col2\" class=\"data row2 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_9ba87_row2_col3\" class=\"data row2 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_9ba87_row2_col4\" class=\"data row2 col4\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_9ba87_level0_row3\" class=\"row_heading level0 row3\" >gradient_boosting</th>\n",
|
||
" <td id=\"T_9ba87_row3_col0\" class=\"data row3 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_9ba87_row3_col1\" class=\"data row3 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_9ba87_row3_col2\" class=\"data row3 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_9ba87_row3_col3\" class=\"data row3 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_9ba87_row3_col4\" class=\"data row3 col4\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_9ba87_level0_row4\" class=\"row_heading level0 row4\" >ridge</th>\n",
|
||
" <td id=\"T_9ba87_row4_col0\" class=\"data row4 col0\" >0.866303</td>\n",
|
||
" <td id=\"T_9ba87_row4_col1\" class=\"data row4 col1\" >0.592791</td>\n",
|
||
" <td id=\"T_9ba87_row4_col2\" class=\"data row4 col2\" >0.995675</td>\n",
|
||
" <td id=\"T_9ba87_row4_col3\" class=\"data row4 col3\" >0.528180</td>\n",
|
||
" <td id=\"T_9ba87_row4_col4\" class=\"data row4 col4\" >0.599051</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_9ba87_level0_row5\" class=\"row_heading level0 row5\" >knn</th>\n",
|
||
" <td id=\"T_9ba87_row5_col0\" class=\"data row5 col0\" >0.951728</td>\n",
|
||
" <td id=\"T_9ba87_row5_col1\" class=\"data row5 col1\" >0.720077</td>\n",
|
||
" <td id=\"T_9ba87_row5_col2\" class=\"data row5 col2\" >0.953405</td>\n",
|
||
" <td id=\"T_9ba87_row5_col3\" class=\"data row5 col3\" >0.694141</td>\n",
|
||
" <td id=\"T_9ba87_row5_col4\" class=\"data row5 col4\" >0.701100</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_9ba87_level0_row6\" class=\"row_heading level0 row6\" >naive_bayes</th>\n",
|
||
" <td id=\"T_9ba87_row6_col0\" class=\"data row6 col0\" >0.902686</td>\n",
|
||
" <td id=\"T_9ba87_row6_col1\" class=\"data row6 col1\" >0.000000</td>\n",
|
||
" <td id=\"T_9ba87_row6_col2\" class=\"data row6 col2\" >0.766341</td>\n",
|
||
" <td id=\"T_9ba87_row6_col3\" class=\"data row6 col3\" >0.000000</td>\n",
|
||
" <td id=\"T_9ba87_row6_col4\" class=\"data row6 col4\" >0.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_9ba87_level0_row7\" class=\"row_heading level0 row7\" >mlp</th>\n",
|
||
" <td id=\"T_9ba87_row7_col0\" class=\"data row7 col0\" >0.902686</td>\n",
|
||
" <td id=\"T_9ba87_row7_col1\" class=\"data row7 col1\" >0.000000</td>\n",
|
||
" <td id=\"T_9ba87_row7_col2\" class=\"data row7 col2\" >0.500000</td>\n",
|
||
" <td id=\"T_9ba87_row7_col3\" class=\"data row7 col3\" >0.000000</td>\n",
|
||
" <td id=\"T_9ba87_row7_col4\" class=\"data row7 col4\" >0.000000</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n"
|
||
],
|
||
"text/plain": [
|
||
"<pandas.io.formats.style.Styler at 0x1dd76e7ec00>"
|
||
]
|
||
},
|
||
"execution_count": 25,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"class_metrics = pd.DataFrame.from_dict(class_models, \"index\")[\n",
|
||
" [\n",
|
||
" \"Accuracy_test\",\n",
|
||
" \"F1_test\",\n",
|
||
" \"ROC_AUC_test\",\n",
|
||
" \"Cohen_kappa_test\",\n",
|
||
" \"MCC_test\",\n",
|
||
" ]\n",
|
||
"]\n",
|
||
"class_metrics.sort_values(by=\"ROC_AUC_test\", ascending=False).style.background_gradient(\n",
|
||
" cmap=\"plasma\",\n",
|
||
" low=0.3,\n",
|
||
" high=1,\n",
|
||
" subset=[\n",
|
||
" \"ROC_AUC_test\",\n",
|
||
" \"MCC_test\",\n",
|
||
" \"Cohen_kappa_test\",\n",
|
||
" ],\n",
|
||
").background_gradient(\n",
|
||
" cmap=\"viridis\",\n",
|
||
" low=1,\n",
|
||
" high=0.3,\n",
|
||
" subset=[\n",
|
||
" \"Accuracy_test\",\n",
|
||
" \"F1_test\",\n",
|
||
" ],\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Схожий вывод можно сделать и для следующих метрик: Accuracy, F1, ROC AUC, Cohen's Kappa и MCC. Все модели, кроме Naive Bayes и MLP, указывают на хорошо-развитую способность к выделению классов"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 26,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'logistic'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"best_model = str(class_metrics.sort_values(by=\"MCC_test\", ascending=False).iloc[0].name)\n",
|
||
"\n",
|
||
"display(best_model)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Вывод данных с ошибкой предсказания для оценки"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 28,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'Error items count: 0'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>id</th>\n",
|
||
" <th>Predicted</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",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
"Empty DataFrame\n",
|
||
"Columns: [id, Predicted, name, est_diameter_min, est_diameter_max, relative_velocity, miss_distance, orbiting_body, sentry_object, absolute_magnitude, hazardous]\n",
|
||
"Index: []"
|
||
]
|
||
},
|
||
"execution_count": 28,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"preprocessing_result = pipeline_end.transform(X_test)\n",
|
||
"preprocessed_df = pd.DataFrame(\n",
|
||
" preprocessing_result,\n",
|
||
" columns=pipeline_end.get_feature_names_out(),\n",
|
||
")\n",
|
||
"\n",
|
||
"y_pred = class_models[best_model][\"preds\"]\n",
|
||
"\n",
|
||
"error_index = y_test[y_test[\"hazardous\"] != y_pred].index.tolist()\n",
|
||
"display(f\"Error items count: {len(error_index)}\")\n",
|
||
"\n",
|
||
"error_predicted = pd.Series(y_pred, index=y_test.index).loc[error_index]\n",
|
||
"error_df = X_test.loc[error_index].copy()\n",
|
||
"error_df.insert(loc=1, column=\"Predicted\", value=error_predicted)\n",
|
||
"error_df.sort_index()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Пример использования обученной модели (конвейера) для предсказания\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 37,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>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>67305</th>\n",
|
||
" <td>3774018</td>\n",
|
||
" <td>(2017 HF1)</td>\n",
|
||
" <td>0.084053</td>\n",
|
||
" <td>0.187949</td>\n",
|
||
" <td>53291.016226</td>\n",
|
||
" <td>68625911.198806</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>22.5</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" id name est_diameter_min est_diameter_max \\\n",
|
||
"67305 3774018 (2017 HF1) 0.084053 0.187949 \n",
|
||
"\n",
|
||
" relative_velocity miss_distance orbiting_body sentry_object \\\n",
|
||
"67305 53291.016226 68625911.198806 Earth False \n",
|
||
"\n",
|
||
" absolute_magnitude hazardous \n",
|
||
"67305 22.5 False "
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>est_diameter_min</th>\n",
|
||
" <th>est_diameter_max</th>\n",
|
||
" <th>relative_velocity</th>\n",
|
||
" <th>miss_distance</th>\n",
|
||
" <th>sentry_object</th>\n",
|
||
" <th>absolute_magnitude</th>\n",
|
||
" <th>hazardous</th>\n",
|
||
" <th>id</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>67305</th>\n",
|
||
" <td>-0.140818</td>\n",
|
||
" <td>-0.140818</td>\n",
|
||
" <td>0.207258</td>\n",
|
||
" <td>1.410653</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>-0.353797</td>\n",
|
||
" <td>-0.328347</td>\n",
|
||
" <td>3774018.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" est_diameter_min est_diameter_max relative_velocity miss_distance \\\n",
|
||
"67305 -0.140818 -0.140818 0.207258 1.410653 \n",
|
||
"\n",
|
||
" sentry_object absolute_magnitude hazardous id \n",
|
||
"67305 0.0 -0.353797 -0.328347 3774018.0 "
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'predicted: False (proba: [9.99855425e-01 1.44575476e-04])'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'real: 0'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"model = class_models[best_model][\"pipeline\"]\n",
|
||
"\n",
|
||
"example_id = 67305\n",
|
||
"test = pd.DataFrame(X_test.loc[example_id, :]).T\n",
|
||
"test_preprocessed = pd.DataFrame(preprocessed_df.loc[example_id, :]).T\n",
|
||
"display(test)\n",
|
||
"display(test_preprocessed)\n",
|
||
"result_proba = model.predict_proba(test)[0]\n",
|
||
"result = model.predict(test)[0]\n",
|
||
"real = int(y_test.loc[example_id].values[0])\n",
|
||
"display(f\"predicted: {result} (proba: {result_proba})\")\n",
|
||
"display(f\"real: {real}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Подбор гиперпараметров методом поиска по сетке "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 38,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"c:\\Users\\Admin\\StudioProjects\\AIM-PIbd-31-Alekseev-I-S\\aimenv\\Lib\\site-packages\\numpy\\ma\\core.py:2881: RuntimeWarning: invalid value encountered in cast\n",
|
||
" _data = np.array(data, dtype=dtype, copy=copy,\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"{'model__criterion': 'gini',\n",
|
||
" 'model__max_depth': 5,\n",
|
||
" 'model__max_features': 'sqrt',\n",
|
||
" 'model__n_estimators': 50}"
|
||
]
|
||
},
|
||
"execution_count": 38,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.model_selection import GridSearchCV\n",
|
||
"\n",
|
||
"optimized_model_type = \"random_forest\"\n",
|
||
"\n",
|
||
"random_forest_model = class_models[optimized_model_type][\"pipeline\"]\n",
|
||
"\n",
|
||
"param_grid = {\n",
|
||
" \"model__n_estimators\": [10, 50, 100],\n",
|
||
" \"model__max_features\": [\"sqrt\", \"log2\"],\n",
|
||
" \"model__max_depth\": [5, 7, 10],\n",
|
||
" \"model__criterion\": [\"gini\", \"entropy\"],\n",
|
||
"}\n",
|
||
"\n",
|
||
"gs_optomizer = GridSearchCV(\n",
|
||
" estimator=random_forest_model, param_grid=param_grid, n_jobs=-1\n",
|
||
")\n",
|
||
"gs_optomizer.fit(X_train, y_train.values.ravel())\n",
|
||
"gs_optomizer.best_params_"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Обучение модели с новыми гиперпараметрами"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 48,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from sklearn.pipeline import Pipeline\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"from sklearn.compose import ColumnTransformer\n",
|
||
"from sklearn.ensemble import RandomForestClassifier\n",
|
||
"import numpy as np\n",
|
||
"from sklearn import metrics\n",
|
||
"import pandas as pd\n",
|
||
"\n",
|
||
"\n",
|
||
"# Определяем числовые признаки\n",
|
||
"numeric_features = X_train.select_dtypes(include=['float64', 'int64']).columns.tolist()\n",
|
||
"\n",
|
||
"# Установка random_state\n",
|
||
"random_state = 42\n",
|
||
"\n",
|
||
"# Определение трансформера\n",
|
||
"pipeline_end = ColumnTransformer([\n",
|
||
" ('numeric', StandardScaler(), numeric_features),\n",
|
||
" # Добавьте другие трансформеры, если требуется\n",
|
||
"])\n",
|
||
"\n",
|
||
"# Объявление модели\n",
|
||
"optimized_model = RandomForestClassifier(\n",
|
||
" random_state=random_state,\n",
|
||
" criterion=\"gini\",\n",
|
||
" max_depth=5,\n",
|
||
" max_features=\"sqrt\",\n",
|
||
" n_estimators=50,\n",
|
||
")\n",
|
||
"\n",
|
||
"# Создание пайплайна с корректными шагами\n",
|
||
"result = {}\n",
|
||
"\n",
|
||
"# Обучение модели\n",
|
||
"result[\"pipeline\"] = Pipeline([\n",
|
||
" (\"pipeline\", pipeline_end),\n",
|
||
" (\"model\", optimized_model)\n",
|
||
"]).fit(X_train, y_train.values.ravel())\n",
|
||
"\n",
|
||
"# Прогнозирование и расчет метрик\n",
|
||
"result[\"train_preds\"] = result[\"pipeline\"].predict(X_train)\n",
|
||
"result[\"probs\"] = result[\"pipeline\"].predict_proba(X_test)[:, 1]\n",
|
||
"result[\"preds\"] = np.where(result[\"probs\"] > 0.5, 1, 0)\n",
|
||
"\n",
|
||
"# Метрики для оценки модели\n",
|
||
"result[\"Precision_train\"] = metrics.precision_score(y_train, result[\"train_preds\"])\n",
|
||
"result[\"Precision_test\"] = metrics.precision_score(y_test, result[\"preds\"])\n",
|
||
"result[\"Recall_train\"] = metrics.recall_score(y_train, result[\"train_preds\"])\n",
|
||
"result[\"Recall_test\"] = metrics.recall_score(y_test, result[\"preds\"])\n",
|
||
"result[\"Accuracy_train\"] = metrics.accuracy_score(y_train, result[\"train_preds\"])\n",
|
||
"result[\"Accuracy_test\"] = metrics.accuracy_score(y_test, result[\"preds\"])\n",
|
||
"result[\"ROC_AUC_test\"] = metrics.roc_auc_score(y_test, result[\"probs\"])\n",
|
||
"result[\"F1_train\"] = metrics.f1_score(y_train, result[\"train_preds\"])\n",
|
||
"result[\"F1_test\"] = metrics.f1_score(y_test, result[\"preds\"])\n",
|
||
"result[\"MCC_test\"] = metrics.matthews_corrcoef(y_test, result[\"preds\"])\n",
|
||
"result[\"Cohen_kappa_test\"] = metrics.cohen_kappa_score(y_test, result[\"preds\"])\n",
|
||
"result[\"Confusion_matrix\"] = metrics.confusion_matrix(y_test, result[\"preds\"])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Формирование данных для оценки старой и новой версии модели"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 49,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"optimized_metrics = pd.DataFrame(columns=list(result.keys()))\n",
|
||
"optimized_metrics.loc[len(optimized_metrics)] = pd.Series(\n",
|
||
" data=class_models[optimized_model_type]\n",
|
||
")\n",
|
||
"optimized_metrics.loc[len(optimized_metrics)] = pd.Series(\n",
|
||
" data=result\n",
|
||
")\n",
|
||
"optimized_metrics.insert(loc=0, column=\"Name\", value=[\"Old\", \"New\"])\n",
|
||
"optimized_metrics = optimized_metrics.set_index(\"Name\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Оценка параметров старой и новой модели"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 50,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style type=\"text/css\">\n",
|
||
"#T_103c9_row0_col0, #T_103c9_row0_col1, #T_103c9_row0_col2, #T_103c9_row0_col3 {\n",
|
||
" background-color: #a8db34;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_103c9_row0_col4, #T_103c9_row0_col5, #T_103c9_row0_col6, #T_103c9_row0_col7 {\n",
|
||
" background-color: #da5a6a;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_103c9_row1_col0, #T_103c9_row1_col1, #T_103c9_row1_col2, #T_103c9_row1_col3 {\n",
|
||
" background-color: #26818e;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_103c9_row1_col4, #T_103c9_row1_col5, #T_103c9_row1_col6, #T_103c9_row1_col7 {\n",
|
||
" background-color: #4e02a2;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"</style>\n",
|
||
"<table id=\"T_103c9\">\n",
|
||
" <thead>\n",
|
||
" <tr>\n",
|
||
" <th class=\"blank level0\" > </th>\n",
|
||
" <th id=\"T_103c9_level0_col0\" class=\"col_heading level0 col0\" >Precision_train</th>\n",
|
||
" <th id=\"T_103c9_level0_col1\" class=\"col_heading level0 col1\" >Precision_test</th>\n",
|
||
" <th id=\"T_103c9_level0_col2\" class=\"col_heading level0 col2\" >Recall_train</th>\n",
|
||
" <th id=\"T_103c9_level0_col3\" class=\"col_heading level0 col3\" >Recall_test</th>\n",
|
||
" <th id=\"T_103c9_level0_col4\" class=\"col_heading level0 col4\" >Accuracy_train</th>\n",
|
||
" <th id=\"T_103c9_level0_col5\" class=\"col_heading level0 col5\" >Accuracy_test</th>\n",
|
||
" <th id=\"T_103c9_level0_col6\" class=\"col_heading level0 col6\" >F1_train</th>\n",
|
||
" <th id=\"T_103c9_level0_col7\" class=\"col_heading level0 col7\" >F1_test</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th class=\"index_name level0\" >Name</th>\n",
|
||
" <th class=\"blank col0\" > </th>\n",
|
||
" <th class=\"blank col1\" > </th>\n",
|
||
" <th class=\"blank col2\" > </th>\n",
|
||
" <th class=\"blank col3\" > </th>\n",
|
||
" <th class=\"blank col4\" > </th>\n",
|
||
" <th class=\"blank col5\" > </th>\n",
|
||
" <th class=\"blank col6\" > </th>\n",
|
||
" <th class=\"blank col7\" > </th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_103c9_level0_row0\" class=\"row_heading level0 row0\" >Old</th>\n",
|
||
" <td id=\"T_103c9_row0_col0\" class=\"data row0 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_103c9_row0_col1\" class=\"data row0 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_103c9_row0_col2\" class=\"data row0 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_103c9_row0_col3\" class=\"data row0 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_103c9_row0_col4\" class=\"data row0 col4\" >1.000000</td>\n",
|
||
" <td id=\"T_103c9_row0_col5\" class=\"data row0 col5\" >1.000000</td>\n",
|
||
" <td id=\"T_103c9_row0_col6\" class=\"data row0 col6\" >1.000000</td>\n",
|
||
" <td id=\"T_103c9_row0_col7\" class=\"data row0 col7\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_103c9_level0_row1\" class=\"row_heading level0 row1\" >New</th>\n",
|
||
" <td id=\"T_103c9_row1_col0\" class=\"data row1 col0\" >0.833191</td>\n",
|
||
" <td id=\"T_103c9_row1_col1\" class=\"data row1 col1\" >0.862500</td>\n",
|
||
" <td id=\"T_103c9_row1_col2\" class=\"data row1 col2\" >0.138433</td>\n",
|
||
" <td id=\"T_103c9_row1_col3\" class=\"data row1 col3\" >0.156109</td>\n",
|
||
" <td id=\"T_103c9_row1_col4\" class=\"data row1 col4\" >0.913456</td>\n",
|
||
" <td id=\"T_103c9_row1_col5\" class=\"data row1 col5\" >0.915456</td>\n",
|
||
" <td id=\"T_103c9_row1_col6\" class=\"data row1 col6\" >0.237420</td>\n",
|
||
" <td id=\"T_103c9_row1_col7\" class=\"data row1 col7\" >0.264368</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n"
|
||
],
|
||
"text/plain": [
|
||
"<pandas.io.formats.style.Styler at 0x1dd76b55010>"
|
||
]
|
||
},
|
||
"execution_count": 50,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"optimized_metrics[\n",
|
||
" [\n",
|
||
" \"Precision_train\",\n",
|
||
" \"Precision_test\",\n",
|
||
" \"Recall_train\",\n",
|
||
" \"Recall_test\",\n",
|
||
" \"Accuracy_train\",\n",
|
||
" \"Accuracy_test\",\n",
|
||
" \"F1_train\",\n",
|
||
" \"F1_test\",\n",
|
||
" ]\n",
|
||
"].style.background_gradient(\n",
|
||
" cmap=\"plasma\",\n",
|
||
" low=0.3,\n",
|
||
" high=1,\n",
|
||
" subset=[\"Accuracy_train\", \"Accuracy_test\", \"F1_train\", \"F1_test\"],\n",
|
||
").background_gradient(\n",
|
||
" cmap=\"viridis\",\n",
|
||
" low=1,\n",
|
||
" high=0.3,\n",
|
||
" subset=[\n",
|
||
" \"Precision_train\",\n",
|
||
" \"Precision_test\",\n",
|
||
" \"Recall_train\",\n",
|
||
" \"Recall_test\",\n",
|
||
" ],\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 51,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style type=\"text/css\">\n",
|
||
"#T_6af3a_row0_col0, #T_6af3a_row0_col1 {\n",
|
||
" background-color: #a8db34;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_6af3a_row0_col2, #T_6af3a_row0_col3, #T_6af3a_row0_col4 {\n",
|
||
" background-color: #da5a6a;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_6af3a_row1_col0, #T_6af3a_row1_col1 {\n",
|
||
" background-color: #26818e;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_6af3a_row1_col2, #T_6af3a_row1_col3, #T_6af3a_row1_col4 {\n",
|
||
" background-color: #4e02a2;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"</style>\n",
|
||
"<table id=\"T_6af3a\">\n",
|
||
" <thead>\n",
|
||
" <tr>\n",
|
||
" <th class=\"blank level0\" > </th>\n",
|
||
" <th id=\"T_6af3a_level0_col0\" class=\"col_heading level0 col0\" >Accuracy_test</th>\n",
|
||
" <th id=\"T_6af3a_level0_col1\" class=\"col_heading level0 col1\" >F1_test</th>\n",
|
||
" <th id=\"T_6af3a_level0_col2\" class=\"col_heading level0 col2\" >ROC_AUC_test</th>\n",
|
||
" <th id=\"T_6af3a_level0_col3\" class=\"col_heading level0 col3\" >Cohen_kappa_test</th>\n",
|
||
" <th id=\"T_6af3a_level0_col4\" class=\"col_heading level0 col4\" >MCC_test</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th class=\"index_name level0\" >Name</th>\n",
|
||
" <th class=\"blank col0\" > </th>\n",
|
||
" <th class=\"blank col1\" > </th>\n",
|
||
" <th class=\"blank col2\" > </th>\n",
|
||
" <th class=\"blank col3\" > </th>\n",
|
||
" <th class=\"blank col4\" > </th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_6af3a_level0_row0\" class=\"row_heading level0 row0\" >Old</th>\n",
|
||
" <td id=\"T_6af3a_row0_col0\" class=\"data row0 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_6af3a_row0_col1\" class=\"data row0 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_6af3a_row0_col2\" class=\"data row0 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_6af3a_row0_col3\" class=\"data row0 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_6af3a_row0_col4\" class=\"data row0 col4\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_6af3a_level0_row1\" class=\"row_heading level0 row1\" >New</th>\n",
|
||
" <td id=\"T_6af3a_row1_col0\" class=\"data row1 col0\" >0.915456</td>\n",
|
||
" <td id=\"T_6af3a_row1_col1\" class=\"data row1 col1\" >0.264368</td>\n",
|
||
" <td id=\"T_6af3a_row1_col2\" class=\"data row1 col2\" >0.927493</td>\n",
|
||
" <td id=\"T_6af3a_row1_col3\" class=\"data row1 col3\" >0.241751</td>\n",
|
||
" <td id=\"T_6af3a_row1_col4\" class=\"data row1 col4\" >0.345694</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n"
|
||
],
|
||
"text/plain": [
|
||
"<pandas.io.formats.style.Styler at 0x1dd76b54c50>"
|
||
]
|
||
},
|
||
"execution_count": 51,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"optimized_metrics[\n",
|
||
" [\n",
|
||
" \"Accuracy_test\",\n",
|
||
" \"F1_test\",\n",
|
||
" \"ROC_AUC_test\",\n",
|
||
" \"Cohen_kappa_test\",\n",
|
||
" \"MCC_test\",\n",
|
||
" ]\n",
|
||
"].style.background_gradient(\n",
|
||
" cmap=\"plasma\",\n",
|
||
" low=0.3,\n",
|
||
" high=1,\n",
|
||
" subset=[\n",
|
||
" \"ROC_AUC_test\",\n",
|
||
" \"MCC_test\",\n",
|
||
" \"Cohen_kappa_test\",\n",
|
||
" ],\n",
|
||
").background_gradient(\n",
|
||
" cmap=\"viridis\",\n",
|
||
" low=1,\n",
|
||
" high=0.3,\n",
|
||
" subset=[\n",
|
||
" \"Accuracy_test\",\n",
|
||
" \"F1_test\",\n",
|
||
" ],\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 53,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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",
|
||
"text/plain": [
|
||
"<Figure size 1000x400 with 4 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"_, ax = plt.subplots(1, 2, figsize=(10, 4), sharex=False, sharey=False\n",
|
||
")\n",
|
||
"\n",
|
||
"for index in range(0, len(optimized_metrics)):\n",
|
||
" c_matrix = optimized_metrics.iloc[index][\"Confusion_matrix\"]\n",
|
||
" disp = ConfusionMatrixDisplay(\n",
|
||
" confusion_matrix=c_matrix, display_labels=[\"hazardous\", \"safe\"]\n",
|
||
" ).plot(ax=ax.flat[index])\n",
|
||
"\n",
|
||
"plt.subplots_adjust(top=1, bottom=0, hspace=0.4, wspace=0.3)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"В желтых квадрате мы наблюдаем значение 16400, что обозначает количество правильно классифицированных объектов, отнесенных к классу \"hazardsous\". Это свидетельствует о том, что модель успешно идентифицирует объекты этого класса, минимизируя количество ложных положительных срабатываний.\n",
|
||
"\n",
|
||
"В фиолетвом квадрате значение 276 указывает на количество правильно классифицированных объектов, отнесенных к классу \"More\". Это является показателем не такой высокой точности модели в определении объектов данного класса."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Определение достижимого уровня качества модели для второй задачи (задача регрессии)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"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",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>90831</th>\n",
|
||
" <td>3763337</td>\n",
|
||
" <td>(2016 VX1)</td>\n",
|
||
" <td>0.026580</td>\n",
|
||
" <td>0.059435</td>\n",
|
||
" <td>52078.886692</td>\n",
|
||
" <td>1.230039e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>25.00</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>90832</th>\n",
|
||
" <td>3837603</td>\n",
|
||
" <td>(2019 AD3)</td>\n",
|
||
" <td>0.016771</td>\n",
|
||
" <td>0.037501</td>\n",
|
||
" <td>46114.605073</td>\n",
|
||
" <td>5.432121e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>26.00</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>90833</th>\n",
|
||
" <td>54017201</td>\n",
|
||
" <td>(2020 JP3)</td>\n",
|
||
" <td>0.031956</td>\n",
|
||
" <td>0.071456</td>\n",
|
||
" <td>7566.807732</td>\n",
|
||
" <td>2.840077e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>24.60</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>90834</th>\n",
|
||
" <td>54115824</td>\n",
|
||
" <td>(2021 CN5)</td>\n",
|
||
" <td>0.007321</td>\n",
|
||
" <td>0.016370</td>\n",
|
||
" <td>69199.154484</td>\n",
|
||
" <td>6.869206e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>27.80</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>90835</th>\n",
|
||
" <td>54205447</td>\n",
|
||
" <td>(2021 TW7)</td>\n",
|
||
" <td>0.039862</td>\n",
|
||
" <td>0.089133</td>\n",
|
||
" <td>27024.455553</td>\n",
|
||
" <td>5.977213e+07</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>24.12</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>90836 rows × 10 columns</p>\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",
|
||
"90831 3763337 (2016 VX1) 0.026580 0.059435 \n",
|
||
"90832 3837603 (2019 AD3) 0.016771 0.037501 \n",
|
||
"90833 54017201 (2020 JP3) 0.031956 0.071456 \n",
|
||
"90834 54115824 (2021 CN5) 0.007321 0.016370 \n",
|
||
"90835 54205447 (2021 TW7) 0.039862 0.089133 \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",
|
||
"90831 52078.886692 1.230039e+07 Earth False \n",
|
||
"90832 46114.605073 5.432121e+07 Earth False \n",
|
||
"90833 7566.807732 2.840077e+07 Earth False \n",
|
||
"90834 69199.154484 6.869206e+07 Earth False \n",
|
||
"90835 27024.455553 5.977213e+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 \n",
|
||
"... ... ... \n",
|
||
"90831 25.00 False \n",
|
||
"90832 26.00 False \n",
|
||
"90833 24.60 False \n",
|
||
"90834 27.80 False \n",
|
||
"90835 24.12 False \n",
|
||
"\n",
|
||
"[90836 rows x 10 columns]"
|
||
]
|
||
},
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import seaborn as sns\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn import set_config\n",
|
||
"\n",
|
||
"random_state=42\n",
|
||
"set_config(transform_output=\"pandas\")\n",
|
||
"df = pd.read_csv(\".//static//csv//neo.csv\")\n",
|
||
"print(df.columns)\n",
|
||
"df"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Разделение набора данных на обучающую и тестовые выборки (80/20) для задачи регрессии "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'X_train'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>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>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>35538</th>\n",
|
||
" <td>3826685</td>\n",
|
||
" <td>(2018 PR10)</td>\n",
|
||
" <td>0.038420</td>\n",
|
||
" <td>0.085909</td>\n",
|
||
" <td>91103.489666</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>24.20</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>40393</th>\n",
|
||
" <td>2277830</td>\n",
|
||
" <td>277830 (2006 HR29)</td>\n",
|
||
" <td>0.192555</td>\n",
|
||
" <td>0.430566</td>\n",
|
||
" <td>28359.611312</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>20.70</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>58540</th>\n",
|
||
" <td>3638201</td>\n",
|
||
" <td>(2013 HT25)</td>\n",
|
||
" <td>0.004619</td>\n",
|
||
" <td>0.010329</td>\n",
|
||
" <td>107351.426865</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>28.80</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>61670</th>\n",
|
||
" <td>3836282</td>\n",
|
||
" <td>(2018 WR)</td>\n",
|
||
" <td>0.015295</td>\n",
|
||
" <td>0.034201</td>\n",
|
||
" <td>21423.536884</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>26.20</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>11435</th>\n",
|
||
" <td>3802002</td>\n",
|
||
" <td>(2018 FU1)</td>\n",
|
||
" <td>0.011603</td>\n",
|
||
" <td>0.025944</td>\n",
|
||
" <td>69856.053840</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>26.80</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6265</th>\n",
|
||
" <td>2530151</td>\n",
|
||
" <td>530151 (2011 AW55)</td>\n",
|
||
" <td>0.211132</td>\n",
|
||
" <td>0.472106</td>\n",
|
||
" <td>88209.754856</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>20.50</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>54886</th>\n",
|
||
" <td>3831736</td>\n",
|
||
" <td>(2018 TD5)</td>\n",
|
||
" <td>0.035039</td>\n",
|
||
" <td>0.078350</td>\n",
|
||
" <td>58758.452153</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>24.40</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>76820</th>\n",
|
||
" <td>2512234</td>\n",
|
||
" <td>512234 (2015 VO66)</td>\n",
|
||
" <td>0.211132</td>\n",
|
||
" <td>0.472106</td>\n",
|
||
" <td>52355.509176</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>20.50</td>\n",
|
||
" <td>True</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>860</th>\n",
|
||
" <td>54054466</td>\n",
|
||
" <td>(2020 SG1)</td>\n",
|
||
" <td>0.282199</td>\n",
|
||
" <td>0.631015</td>\n",
|
||
" <td>50527.379563</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>19.87</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>15795</th>\n",
|
||
" <td>3773929</td>\n",
|
||
" <td>(2017 GL7)</td>\n",
|
||
" <td>0.075258</td>\n",
|
||
" <td>0.168283</td>\n",
|
||
" <td>22527.647871</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>22.74</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>72668 rows × 9 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" id name est_diameter_min est_diameter_max \\\n",
|
||
"35538 3826685 (2018 PR10) 0.038420 0.085909 \n",
|
||
"40393 2277830 277830 (2006 HR29) 0.192555 0.430566 \n",
|
||
"58540 3638201 (2013 HT25) 0.004619 0.010329 \n",
|
||
"61670 3836282 (2018 WR) 0.015295 0.034201 \n",
|
||
"11435 3802002 (2018 FU1) 0.011603 0.025944 \n",
|
||
"... ... ... ... ... \n",
|
||
"6265 2530151 530151 (2011 AW55) 0.211132 0.472106 \n",
|
||
"54886 3831736 (2018 TD5) 0.035039 0.078350 \n",
|
||
"76820 2512234 512234 (2015 VO66) 0.211132 0.472106 \n",
|
||
"860 54054466 (2020 SG1) 0.282199 0.631015 \n",
|
||
"15795 3773929 (2017 GL7) 0.075258 0.168283 \n",
|
||
"\n",
|
||
" relative_velocity orbiting_body sentry_object absolute_magnitude \\\n",
|
||
"35538 91103.489666 Earth False 24.20 \n",
|
||
"40393 28359.611312 Earth False 20.70 \n",
|
||
"58540 107351.426865 Earth False 28.80 \n",
|
||
"61670 21423.536884 Earth False 26.20 \n",
|
||
"11435 69856.053840 Earth False 26.80 \n",
|
||
"... ... ... ... ... \n",
|
||
"6265 88209.754856 Earth False 20.50 \n",
|
||
"54886 58758.452153 Earth False 24.40 \n",
|
||
"76820 52355.509176 Earth False 20.50 \n",
|
||
"860 50527.379563 Earth False 19.87 \n",
|
||
"15795 22527.647871 Earth False 22.74 \n",
|
||
"\n",
|
||
" hazardous \n",
|
||
"35538 False \n",
|
||
"40393 False \n",
|
||
"58540 False \n",
|
||
"61670 False \n",
|
||
"11435 False \n",
|
||
"... ... \n",
|
||
"6265 False \n",
|
||
"54886 False \n",
|
||
"76820 True \n",
|
||
"860 False \n",
|
||
"15795 False \n",
|
||
"\n",
|
||
"[72668 rows x 9 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'y_train'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>miss_distance</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>35538</th>\n",
|
||
" <td>6.350550e+07</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>40393</th>\n",
|
||
" <td>2.868167e+07</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>58540</th>\n",
|
||
" <td>5.388098e+04</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>61670</th>\n",
|
||
" <td>5.103884e+07</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>11435</th>\n",
|
||
" <td>7.360836e+07</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6265</th>\n",
|
||
" <td>4.034289e+07</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>54886</th>\n",
|
||
" <td>4.389994e+06</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>76820</th>\n",
|
||
" <td>4.380532e+07</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>860</th>\n",
|
||
" <td>5.837007e+07</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>15795</th>\n",
|
||
" <td>2.281469e+07</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>72668 rows × 1 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" miss_distance\n",
|
||
"35538 6.350550e+07\n",
|
||
"40393 2.868167e+07\n",
|
||
"58540 5.388098e+04\n",
|
||
"61670 5.103884e+07\n",
|
||
"11435 7.360836e+07\n",
|
||
"... ...\n",
|
||
"6265 4.034289e+07\n",
|
||
"54886 4.389994e+06\n",
|
||
"76820 4.380532e+07\n",
|
||
"860 5.837007e+07\n",
|
||
"15795 2.281469e+07\n",
|
||
"\n",
|
||
"[72668 rows x 1 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'X_test'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>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>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>20406</th>\n",
|
||
" <td>3943344</td>\n",
|
||
" <td>(2019 YT1)</td>\n",
|
||
" <td>0.024241</td>\n",
|
||
" <td>0.054205</td>\n",
|
||
" <td>22148.962596</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>25.20</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>74443</th>\n",
|
||
" <td>3879239</td>\n",
|
||
" <td>(2019 US)</td>\n",
|
||
" <td>0.012722</td>\n",
|
||
" <td>0.028447</td>\n",
|
||
" <td>26477.211836</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>26.60</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>74306</th>\n",
|
||
" <td>3879244</td>\n",
|
||
" <td>(2019 UU)</td>\n",
|
||
" <td>0.013322</td>\n",
|
||
" <td>0.029788</td>\n",
|
||
" <td>33770.201397</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>26.50</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>45943</th>\n",
|
||
" <td>2481965</td>\n",
|
||
" <td>481965 (2009 EB1)</td>\n",
|
||
" <td>0.193444</td>\n",
|
||
" <td>0.432554</td>\n",
|
||
" <td>43599.575296</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>20.69</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>62859</th>\n",
|
||
" <td>3789471</td>\n",
|
||
" <td>(2017 WJ1)</td>\n",
|
||
" <td>0.044112</td>\n",
|
||
" <td>0.098637</td>\n",
|
||
" <td>36398.080883</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>23.90</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>51634</th>\n",
|
||
" <td>3694131</td>\n",
|
||
" <td>(2014 UF56)</td>\n",
|
||
" <td>0.008801</td>\n",
|
||
" <td>0.019681</td>\n",
|
||
" <td>57414.305699</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>27.40</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>85083</th>\n",
|
||
" <td>54235475</td>\n",
|
||
" <td>(2022 AG1)</td>\n",
|
||
" <td>0.024920</td>\n",
|
||
" <td>0.055724</td>\n",
|
||
" <td>50882.935767</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>25.14</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>38905</th>\n",
|
||
" <td>3775176</td>\n",
|
||
" <td>(2017 LD)</td>\n",
|
||
" <td>0.008405</td>\n",
|
||
" <td>0.018795</td>\n",
|
||
" <td>24954.754212</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>27.50</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>16144</th>\n",
|
||
" <td>2434734</td>\n",
|
||
" <td>434734 (2006 FX)</td>\n",
|
||
" <td>0.265800</td>\n",
|
||
" <td>0.594347</td>\n",
|
||
" <td>57455.404666</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>20.00</td>\n",
|
||
" <td>True</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>54508</th>\n",
|
||
" <td>3170208</td>\n",
|
||
" <td>(2003 YG136)</td>\n",
|
||
" <td>0.023150</td>\n",
|
||
" <td>0.051765</td>\n",
|
||
" <td>72602.093427</td>\n",
|
||
" <td>Earth</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>25.30</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>18168 rows × 9 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" id name est_diameter_min est_diameter_max \\\n",
|
||
"20406 3943344 (2019 YT1) 0.024241 0.054205 \n",
|
||
"74443 3879239 (2019 US) 0.012722 0.028447 \n",
|
||
"74306 3879244 (2019 UU) 0.013322 0.029788 \n",
|
||
"45943 2481965 481965 (2009 EB1) 0.193444 0.432554 \n",
|
||
"62859 3789471 (2017 WJ1) 0.044112 0.098637 \n",
|
||
"... ... ... ... ... \n",
|
||
"51634 3694131 (2014 UF56) 0.008801 0.019681 \n",
|
||
"85083 54235475 (2022 AG1) 0.024920 0.055724 \n",
|
||
"38905 3775176 (2017 LD) 0.008405 0.018795 \n",
|
||
"16144 2434734 434734 (2006 FX) 0.265800 0.594347 \n",
|
||
"54508 3170208 (2003 YG136) 0.023150 0.051765 \n",
|
||
"\n",
|
||
" relative_velocity orbiting_body sentry_object absolute_magnitude \\\n",
|
||
"20406 22148.962596 Earth False 25.20 \n",
|
||
"74443 26477.211836 Earth False 26.60 \n",
|
||
"74306 33770.201397 Earth False 26.50 \n",
|
||
"45943 43599.575296 Earth False 20.69 \n",
|
||
"62859 36398.080883 Earth False 23.90 \n",
|
||
"... ... ... ... ... \n",
|
||
"51634 57414.305699 Earth False 27.40 \n",
|
||
"85083 50882.935767 Earth False 25.14 \n",
|
||
"38905 24954.754212 Earth False 27.50 \n",
|
||
"16144 57455.404666 Earth False 20.00 \n",
|
||
"54508 72602.093427 Earth False 25.30 \n",
|
||
"\n",
|
||
" hazardous \n",
|
||
"20406 False \n",
|
||
"74443 False \n",
|
||
"74306 False \n",
|
||
"45943 False \n",
|
||
"62859 False \n",
|
||
"... ... \n",
|
||
"51634 False \n",
|
||
"85083 False \n",
|
||
"38905 False \n",
|
||
"16144 True \n",
|
||
"54508 False \n",
|
||
"\n",
|
||
"[18168 rows x 9 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'y_test'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>miss_distance</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>20406</th>\n",
|
||
" <td>5.028574e+07</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>74443</th>\n",
|
||
" <td>1.683201e+06</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>74306</th>\n",
|
||
" <td>3.943220e+06</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>45943</th>\n",
|
||
" <td>7.346837e+07</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>62859</th>\n",
|
||
" <td>6.352916e+07</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>51634</th>\n",
|
||
" <td>1.987273e+07</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>85083</th>\n",
|
||
" <td>3.119646e+07</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>38905</th>\n",
|
||
" <td>1.111942e+07</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>16144</th>\n",
|
||
" <td>8.501684e+06</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>54508</th>\n",
|
||
" <td>4.624727e+07</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>18168 rows × 1 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" miss_distance\n",
|
||
"20406 5.028574e+07\n",
|
||
"74443 1.683201e+06\n",
|
||
"74306 3.943220e+06\n",
|
||
"45943 7.346837e+07\n",
|
||
"62859 6.352916e+07\n",
|
||
"... ...\n",
|
||
"51634 1.987273e+07\n",
|
||
"85083 3.119646e+07\n",
|
||
"38905 1.111942e+07\n",
|
||
"16144 8.501684e+06\n",
|
||
"54508 4.624727e+07\n",
|
||
"\n",
|
||
"[18168 rows x 1 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from typing import Tuple\n",
|
||
"import pandas as pd\n",
|
||
"from pandas import DataFrame\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"\n",
|
||
"def split_into_train_test(\n",
|
||
" df_input: DataFrame,\n",
|
||
" target_colname: str = \"miss_distance\",\n",
|
||
" frac_train: float = 0.8,\n",
|
||
" random_state: int = None,\n",
|
||
") -> Tuple[DataFrame, DataFrame, DataFrame, DataFrame]:\n",
|
||
" \n",
|
||
" if not (0 < frac_train < 1):\n",
|
||
" raise ValueError(\"Fraction must be between 0 and 1.\")\n",
|
||
" \n",
|
||
" # Проверка наличия целевого признака\n",
|
||
" if target_colname not in df_input.columns:\n",
|
||
" raise ValueError(f\"{target_colname} is not a column in the DataFrame.\")\n",
|
||
" \n",
|
||
" # Разделяем данные на признаки и целевую переменную\n",
|
||
" X = df_input.drop(columns=[target_colname]) # Признаки\n",
|
||
" y = df_input[[target_colname]] # Целевая переменная\n",
|
||
"\n",
|
||
" # Разделяем данные на обучающую и тестовую выборки\n",
|
||
" X_train, X_test, y_train, y_test = train_test_split(\n",
|
||
" X, y,\n",
|
||
" test_size=(1.0 - frac_train),\n",
|
||
" random_state=random_state\n",
|
||
" )\n",
|
||
" \n",
|
||
" return X_train, X_test, y_train, y_test\n",
|
||
"\n",
|
||
"# Применение функции для разделения данных\n",
|
||
"X_train, X_test, y_train, y_test = split_into_train_test(\n",
|
||
" df, \n",
|
||
" target_colname=\"miss_distance\", \n",
|
||
" frac_train=0.8, \n",
|
||
" random_state=42\n",
|
||
")\n",
|
||
"\n",
|
||
"# Для отображения результатов\n",
|
||
"display(\"X_train\", X_train)\n",
|
||
"display(\"y_train\", y_train)\n",
|
||
"\n",
|
||
"display(\"X_test\", X_test)\n",
|
||
"display(\"y_test\", y_test)\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Формирование конвейера для решения задачи регрессии"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"from sklearn.base import BaseEstimator, TransformerMixin\n",
|
||
"from sklearn.compose import ColumnTransformer\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"from sklearn.impute import SimpleImputer\n",
|
||
"from sklearn.pipeline import Pipeline\n",
|
||
"from sklearn.preprocessing import OneHotEncoder\n",
|
||
"from sklearn.ensemble import RandomForestRegressor # Пример регрессионной модели\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.pipeline import make_pipeline\n",
|
||
"\n",
|
||
"class EarthObjectsFeatures(BaseEstimator, TransformerMixin):\n",
|
||
" def __init__(self):\n",
|
||
" pass\n",
|
||
" \n",
|
||
" def fit(self, X, y=None):\n",
|
||
" return self\n",
|
||
"\n",
|
||
" def transform(self, X, y=None):\n",
|
||
" X[\"Length_to_Width_Ratio\"] = X[\"x\"] / X[\"y\"]\n",
|
||
" return X\n",
|
||
"\n",
|
||
" def get_feature_names_out(self, features_in):\n",
|
||
" return np.append(features_in, [\"Length_to_Width_Ratio\"], axis=0)\n",
|
||
"\n",
|
||
"# Указываем столбцы, которые нужно удалить и обрабатывать\n",
|
||
"columns_to_drop = [\"name\", \"orbiting_body\"]\n",
|
||
"num_columns = [\"est_diameter_min\", \"est_diameter_max\",\n",
|
||
" \"relative_velocity\", \"sentry_object\",\n",
|
||
" \"absolute_magnitude\", \"hazardous\"]\n",
|
||
"cat_columns = [] \n",
|
||
"\n",
|
||
"# Определяем предобработку для численных данных\n",
|
||
"num_imputer = SimpleImputer(strategy=\"median\")\n",
|
||
"num_scaler = StandardScaler()\n",
|
||
"preprocessing_num = Pipeline(\n",
|
||
" [\n",
|
||
" (\"imputer\", num_imputer),\n",
|
||
" (\"scaler\", num_scaler),\n",
|
||
" ]\n",
|
||
")\n",
|
||
"\n",
|
||
"# Определяем предобработку для категориальных данных\n",
|
||
"cat_imputer = SimpleImputer(strategy=\"constant\", fill_value=\"unknown\")\n",
|
||
"cat_encoder = OneHotEncoder(handle_unknown=\"ignore\", sparse_output=False, drop=\"first\")\n",
|
||
"preprocessing_cat = Pipeline(\n",
|
||
" [\n",
|
||
" (\"imputer\", cat_imputer),\n",
|
||
" (\"encoder\", cat_encoder),\n",
|
||
" ]\n",
|
||
")\n",
|
||
"\n",
|
||
"# Подготовка признаков с использованием ColumnTransformer\n",
|
||
"features_preprocessing = ColumnTransformer(\n",
|
||
" verbose_feature_names_out=False,\n",
|
||
" transformers=[\n",
|
||
" (\"preprocessing_num\", preprocessing_num, num_columns),\n",
|
||
" (\"preprocessing_cat\", preprocessing_cat, cat_columns),\n",
|
||
" ],\n",
|
||
" remainder=\"passthrough\"\n",
|
||
")\n",
|
||
"\n",
|
||
"# Удаление нежелательных столбцов\n",
|
||
"drop_columns = ColumnTransformer(\n",
|
||
" verbose_feature_names_out=False,\n",
|
||
" transformers=[\n",
|
||
" (\"drop_columns\", \"drop\", columns_to_drop),\n",
|
||
" ],\n",
|
||
" remainder=\"passthrough\",\n",
|
||
")\n",
|
||
"\n",
|
||
"# Постобработка признаков\n",
|
||
"features_postprocessing = ColumnTransformer(\n",
|
||
" verbose_feature_names_out=False,\n",
|
||
" transformers=[\n",
|
||
" (\"preprocessing_cat\", preprocessing_cat, [\"Cabin_type\"]), \n",
|
||
" ],\n",
|
||
" remainder=\"passthrough\",\n",
|
||
")\n",
|
||
"\n",
|
||
"# Создание окончательного конвейера\n",
|
||
"pipeline = Pipeline(\n",
|
||
" [\n",
|
||
" (\"features_preprocessing\", features_preprocessing),\n",
|
||
" (\"drop_columns\", drop_columns),\n",
|
||
" (\"model\", RandomForestRegressor()) # Выбор модели для обучения\n",
|
||
" ]\n",
|
||
")\n",
|
||
"\n",
|
||
"# Использование конвейера\n",
|
||
"def train_pipeline(X, y):\n",
|
||
" pipeline.fit(X, y)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Формирование набора моделей для регрессии"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from sklearn.pipeline import make_pipeline\n",
|
||
"from sklearn.preprocessing import PolynomialFeatures\n",
|
||
"from sklearn import linear_model, tree, neighbors, ensemble, neural_network\n",
|
||
"\n",
|
||
"random_state = 9\n",
|
||
"\n",
|
||
"models = {\n",
|
||
" \"linear\": {\"model\": linear_model.LinearRegression(n_jobs=-1)},\n",
|
||
" \"linear_poly\": {\n",
|
||
" \"model\": make_pipeline(\n",
|
||
" PolynomialFeatures(degree=2),\n",
|
||
" linear_model.LinearRegression(fit_intercept=False, n_jobs=-1),\n",
|
||
" )\n",
|
||
" },\n",
|
||
" \"linear_interact\": {\n",
|
||
" \"model\": make_pipeline(\n",
|
||
" PolynomialFeatures(interaction_only=True),\n",
|
||
" linear_model.LinearRegression(fit_intercept=False, n_jobs=-1),\n",
|
||
" )\n",
|
||
" },\n",
|
||
" \"ridge\": {\"model\": linear_model.RidgeCV()},\n",
|
||
" \"decision_tree\": {\n",
|
||
" \"model\": tree.DecisionTreeRegressor(max_depth=7, random_state=random_state)\n",
|
||
" },\n",
|
||
" \"knn\": {\"model\": neighbors.KNeighborsRegressor(n_neighbors=7, n_jobs=-1)},\n",
|
||
" \"random_forest\": {\n",
|
||
" \"model\": ensemble.RandomForestRegressor(\n",
|
||
" max_depth=7, random_state=random_state, n_jobs=-1\n",
|
||
" )\n",
|
||
" },\n",
|
||
" \"mlp\": {\n",
|
||
" \"model\": neural_network.MLPRegressor(\n",
|
||
" activation=\"tanh\",\n",
|
||
" hidden_layer_sizes=(3,),\n",
|
||
" max_iter=500,\n",
|
||
" early_stopping=True,\n",
|
||
" random_state=random_state,\n",
|
||
" )\n",
|
||
" },\n",
|
||
"}"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Model: linear\n"
|
||
]
|
||
},
|
||
{
|
||
"ename": "ValueError",
|
||
"evalue": "could not convert string to float: '(2018 PR10)'",
|
||
"output_type": "error",
|
||
"traceback": [
|
||
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
|
||
"\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)",
|
||
"Cell \u001b[1;32mIn[9], line 8\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m model_name \u001b[38;5;129;01min\u001b[39;00m models\u001b[38;5;241m.\u001b[39mkeys():\n\u001b[0;32m 6\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mModel: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmodel_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m----> 8\u001b[0m fitted_model \u001b[38;5;241m=\u001b[39m \u001b[43mmodels\u001b[49m\u001b[43m[\u001b[49m\u001b[43mmodel_name\u001b[49m\u001b[43m]\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmodel\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 9\u001b[0m \u001b[43m \u001b[49m\u001b[43mX_train\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalues\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my_train\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalues\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mravel\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 10\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 11\u001b[0m y_train_pred \u001b[38;5;241m=\u001b[39m fitted_model\u001b[38;5;241m.\u001b[39mpredict(X_train\u001b[38;5;241m.\u001b[39mvalues)\n\u001b[0;32m 12\u001b[0m y_test_pred \u001b[38;5;241m=\u001b[39m fitted_model\u001b[38;5;241m.\u001b[39mpredict(X_test\u001b[38;5;241m.\u001b[39mvalues)\n",
|
||
"File \u001b[1;32mc:\\Users\\Admin\\StudioProjects\\AIM-PIbd-31-Alekseev-I-S\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473\u001b[0m, in \u001b[0;36m_fit_context.<locals>.decorator.<locals>.wrapper\u001b[1;34m(estimator, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1466\u001b[0m estimator\u001b[38;5;241m.\u001b[39m_validate_params()\n\u001b[0;32m 1468\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m config_context(\n\u001b[0;32m 1469\u001b[0m skip_parameter_validation\u001b[38;5;241m=\u001b[39m(\n\u001b[0;32m 1470\u001b[0m prefer_skip_nested_validation \u001b[38;5;129;01mor\u001b[39;00m global_skip_validation\n\u001b[0;32m 1471\u001b[0m )\n\u001b[0;32m 1472\u001b[0m ):\n\u001b[1;32m-> 1473\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfit_method\u001b[49m\u001b[43m(\u001b[49m\u001b[43mestimator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
|
||
"File \u001b[1;32mc:\\Users\\Admin\\StudioProjects\\AIM-PIbd-31-Alekseev-I-S\\aimenv\\Lib\\site-packages\\sklearn\\linear_model\\_base.py:609\u001b[0m, in \u001b[0;36mLinearRegression.fit\u001b[1;34m(self, X, y, sample_weight)\u001b[0m\n\u001b[0;32m 605\u001b[0m n_jobs_ \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mn_jobs\n\u001b[0;32m 607\u001b[0m accept_sparse \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpositive \u001b[38;5;28;01melse\u001b[39;00m [\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcsr\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcsc\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcoo\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m--> 609\u001b[0m X, y \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_validate_data\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 610\u001b[0m \u001b[43m \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 611\u001b[0m \u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 612\u001b[0m \u001b[43m \u001b[49m\u001b[43maccept_sparse\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maccept_sparse\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 613\u001b[0m \u001b[43m \u001b[49m\u001b[43my_numeric\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[0;32m 614\u001b[0m \u001b[43m \u001b[49m\u001b[43mmulti_output\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[0;32m 615\u001b[0m \u001b[43m \u001b[49m\u001b[43mforce_writeable\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[0;32m 616\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 618\u001b[0m has_sw \u001b[38;5;241m=\u001b[39m sample_weight \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 619\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m has_sw:\n",
|
||
"File \u001b[1;32mc:\\Users\\Admin\\StudioProjects\\AIM-PIbd-31-Alekseev-I-S\\aimenv\\Lib\\site-packages\\sklearn\\base.py:650\u001b[0m, in \u001b[0;36mBaseEstimator._validate_data\u001b[1;34m(self, X, y, reset, validate_separately, cast_to_ndarray, **check_params)\u001b[0m\n\u001b[0;32m 648\u001b[0m y \u001b[38;5;241m=\u001b[39m check_array(y, input_name\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mcheck_y_params)\n\u001b[0;32m 649\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 650\u001b[0m X, y \u001b[38;5;241m=\u001b[39m \u001b[43mcheck_X_y\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcheck_params\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 651\u001b[0m out \u001b[38;5;241m=\u001b[39m X, y\n\u001b[0;32m 653\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m no_val_X \u001b[38;5;129;01mand\u001b[39;00m check_params\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mensure_2d\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mTrue\u001b[39;00m):\n",
|
||
"File \u001b[1;32mc:\\Users\\Admin\\StudioProjects\\AIM-PIbd-31-Alekseev-I-S\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1301\u001b[0m, in \u001b[0;36mcheck_X_y\u001b[1;34m(X, y, accept_sparse, accept_large_sparse, dtype, order, copy, force_writeable, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, estimator)\u001b[0m\n\u001b[0;32m 1296\u001b[0m estimator_name \u001b[38;5;241m=\u001b[39m _check_estimator_name(estimator)\n\u001b[0;32m 1297\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[0;32m 1298\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mestimator_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m requires y to be passed, but the target y is None\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 1299\u001b[0m )\n\u001b[1;32m-> 1301\u001b[0m X \u001b[38;5;241m=\u001b[39m \u001b[43mcheck_array\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1302\u001b[0m \u001b[43m \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1303\u001b[0m \u001b[43m \u001b[49m\u001b[43maccept_sparse\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maccept_sparse\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1304\u001b[0m \u001b[43m \u001b[49m\u001b[43maccept_large_sparse\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maccept_large_sparse\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1305\u001b[0m \u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1306\u001b[0m \u001b[43m \u001b[49m\u001b[43morder\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1307\u001b[0m \u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1308\u001b[0m \u001b[43m \u001b[49m\u001b[43mforce_writeable\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mforce_writeable\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1309\u001b[0m \u001b[43m \u001b[49m\u001b[43mforce_all_finite\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mforce_all_finite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1310\u001b[0m \u001b[43m \u001b[49m\u001b[43mensure_2d\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mensure_2d\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1311\u001b[0m \u001b[43m \u001b[49m\u001b[43mallow_nd\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mallow_nd\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1312\u001b[0m \u001b[43m \u001b[49m\u001b[43mensure_min_samples\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mensure_min_samples\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1313\u001b[0m \u001b[43m \u001b[49m\u001b[43mensure_min_features\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mensure_min_features\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1314\u001b[0m \u001b[43m \u001b[49m\u001b[43mestimator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mestimator\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1315\u001b[0m \u001b[43m \u001b[49m\u001b[43minput_name\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mX\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1316\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1318\u001b[0m y \u001b[38;5;241m=\u001b[39m _check_y(y, multi_output\u001b[38;5;241m=\u001b[39mmulti_output, y_numeric\u001b[38;5;241m=\u001b[39my_numeric, estimator\u001b[38;5;241m=\u001b[39mestimator)\n\u001b[0;32m 1320\u001b[0m check_consistent_length(X, y)\n",
|
||
"File \u001b[1;32mc:\\Users\\Admin\\StudioProjects\\AIM-PIbd-31-Alekseev-I-S\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1012\u001b[0m, in \u001b[0;36mcheck_array\u001b[1;34m(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_writeable, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator, input_name)\u001b[0m\n\u001b[0;32m 1010\u001b[0m array \u001b[38;5;241m=\u001b[39m xp\u001b[38;5;241m.\u001b[39mastype(array, dtype, copy\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[0;32m 1011\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1012\u001b[0m array \u001b[38;5;241m=\u001b[39m \u001b[43m_asarray_with_order\u001b[49m\u001b[43m(\u001b[49m\u001b[43marray\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43morder\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mxp\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mxp\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1013\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ComplexWarning \u001b[38;5;28;01mas\u001b[39;00m complex_warning:\n\u001b[0;32m 1014\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[0;32m 1015\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mComplex data not supported\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(array)\n\u001b[0;32m 1016\u001b[0m ) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mcomplex_warning\u001b[39;00m\n",
|
||
"File \u001b[1;32mc:\\Users\\Admin\\StudioProjects\\AIM-PIbd-31-Alekseev-I-S\\aimenv\\Lib\\site-packages\\sklearn\\utils\\_array_api.py:745\u001b[0m, in \u001b[0;36m_asarray_with_order\u001b[1;34m(array, dtype, order, copy, xp, device)\u001b[0m\n\u001b[0;32m 743\u001b[0m array \u001b[38;5;241m=\u001b[39m numpy\u001b[38;5;241m.\u001b[39marray(array, order\u001b[38;5;241m=\u001b[39morder, dtype\u001b[38;5;241m=\u001b[39mdtype)\n\u001b[0;32m 744\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 745\u001b[0m array \u001b[38;5;241m=\u001b[39m \u001b[43mnumpy\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43masarray\u001b[49m\u001b[43m(\u001b[49m\u001b[43marray\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43morder\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdtype\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 747\u001b[0m \u001b[38;5;66;03m# At this point array is a NumPy ndarray. We convert it to an array\u001b[39;00m\n\u001b[0;32m 748\u001b[0m \u001b[38;5;66;03m# container that is consistent with the input's namespace.\u001b[39;00m\n\u001b[0;32m 749\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m xp\u001b[38;5;241m.\u001b[39masarray(array)\n",
|
||
"\u001b[1;31mValueError\u001b[0m: could not convert string to float: '(2018 PR10)'"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import math\n",
|
||
"from pandas import DataFrame\n",
|
||
"from sklearn import metrics\n",
|
||
"\n",
|
||
"for model_name in models.keys():\n",
|
||
" print(f\"Model: {model_name}\")\n",
|
||
"\n",
|
||
" fitted_model = models[model_name][\"model\"].fit(\n",
|
||
" X_train.values, y_train.values.ravel()\n",
|
||
" )\n",
|
||
" y_train_pred = fitted_model.predict(X_train.values)\n",
|
||
" y_test_pred = fitted_model.predict(X_test.values)\n",
|
||
" models[model_name][\"fitted\"] = fitted_model\n",
|
||
" models[model_name][\"train_preds\"] = y_train_pred\n",
|
||
" models[model_name][\"preds\"] = y_test_pred\n",
|
||
" models[model_name][\"RMSE_train\"] = math.sqrt(\n",
|
||
" metrics.mean_squared_error(y_train, y_train_pred)\n",
|
||
" )\n",
|
||
" models[model_name][\"RMSE_test\"] = math.sqrt(\n",
|
||
" metrics.mean_squared_error(y_test, y_test_pred)\n",
|
||
" )\n",
|
||
" models[model_name][\"RMAE_test\"] = math.sqrt(\n",
|
||
" metrics.mean_absolute_error(y_test, y_test_pred)\n",
|
||
" )\n",
|
||
" models[model_name][\"R2_test\"] = metrics.r2_score(y_test, y_test_pred)"
|
||
]
|
||
}
|
||
],
|
||
"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
|
||
}
|