2937 lines
239 KiB
Plaintext
2937 lines
239 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Лабораторная работа 4\n",
|
||
"\n",
|
||
"Датасет - **Цены на бриллианты**\thttps://www.kaggle.com/datasets/nancyalaswad90/diamonds-prices\n",
|
||
"\n",
|
||
"1. **carat**: Вес бриллианта в каратах\n",
|
||
"2. **cut**: Качество огранки.\n",
|
||
"3. **color**: Цвет бриллианта\n",
|
||
"4. **clarity**: Чистота бриллианта\n",
|
||
"5. **depth**: Процент глубины бриллианта\n",
|
||
"6. **table**: Процент ширины бриллианта\n",
|
||
"7. **price**: Цена бриллианта в долларах США\n",
|
||
"8. **x**: Длина бриллианта в миллиметрах\n",
|
||
"9. **y**: Ширина бриллианта в миллиметрах\n",
|
||
"10. **z**: Глубина бриллианта в миллиметрах"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**Бизнес-цели**: \n",
|
||
"1. Прогнозирование цены бриллиантов на основании характеристик.\n",
|
||
"2. Анализ частотности и сочетания характеристик бриллиантов, которые пользуются наибольшим спросом, чтобы лучше планировать запасы. "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Загрузка набора данных"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 190,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Среднее значение поля 'карат': 0.7979346717831785\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>carat</th>\n",
|
||
" <th>cut</th>\n",
|
||
" <th>color</th>\n",
|
||
" <th>clarity</th>\n",
|
||
" <th>depth</th>\n",
|
||
" <th>table</th>\n",
|
||
" <th>price</th>\n",
|
||
" <th>x</th>\n",
|
||
" <th>y</th>\n",
|
||
" <th>z</th>\n",
|
||
" <th>above_average_carat</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>id</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>0.23</td>\n",
|
||
" <td>Ideal</td>\n",
|
||
" <td>E</td>\n",
|
||
" <td>SI2</td>\n",
|
||
" <td>61.5</td>\n",
|
||
" <td>55.0</td>\n",
|
||
" <td>326</td>\n",
|
||
" <td>3.95</td>\n",
|
||
" <td>3.98</td>\n",
|
||
" <td>2.43</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>0.21</td>\n",
|
||
" <td>Premium</td>\n",
|
||
" <td>E</td>\n",
|
||
" <td>SI1</td>\n",
|
||
" <td>59.8</td>\n",
|
||
" <td>61.0</td>\n",
|
||
" <td>326</td>\n",
|
||
" <td>3.89</td>\n",
|
||
" <td>3.84</td>\n",
|
||
" <td>2.31</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>0.23</td>\n",
|
||
" <td>Good</td>\n",
|
||
" <td>E</td>\n",
|
||
" <td>VS1</td>\n",
|
||
" <td>56.9</td>\n",
|
||
" <td>65.0</td>\n",
|
||
" <td>327</td>\n",
|
||
" <td>4.05</td>\n",
|
||
" <td>4.07</td>\n",
|
||
" <td>2.31</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>0.29</td>\n",
|
||
" <td>Premium</td>\n",
|
||
" <td>I</td>\n",
|
||
" <td>VS2</td>\n",
|
||
" <td>62.4</td>\n",
|
||
" <td>58.0</td>\n",
|
||
" <td>334</td>\n",
|
||
" <td>4.20</td>\n",
|
||
" <td>4.23</td>\n",
|
||
" <td>2.63</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5</th>\n",
|
||
" <td>0.31</td>\n",
|
||
" <td>Good</td>\n",
|
||
" <td>J</td>\n",
|
||
" <td>SI2</td>\n",
|
||
" <td>63.3</td>\n",
|
||
" <td>58.0</td>\n",
|
||
" <td>335</td>\n",
|
||
" <td>4.34</td>\n",
|
||
" <td>4.35</td>\n",
|
||
" <td>2.75</td>\n",
|
||
" <td>0</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",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>53939</th>\n",
|
||
" <td>0.86</td>\n",
|
||
" <td>Premium</td>\n",
|
||
" <td>H</td>\n",
|
||
" <td>SI2</td>\n",
|
||
" <td>61.0</td>\n",
|
||
" <td>58.0</td>\n",
|
||
" <td>2757</td>\n",
|
||
" <td>6.15</td>\n",
|
||
" <td>6.12</td>\n",
|
||
" <td>3.74</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>53940</th>\n",
|
||
" <td>0.75</td>\n",
|
||
" <td>Ideal</td>\n",
|
||
" <td>D</td>\n",
|
||
" <td>SI2</td>\n",
|
||
" <td>62.2</td>\n",
|
||
" <td>55.0</td>\n",
|
||
" <td>2757</td>\n",
|
||
" <td>5.83</td>\n",
|
||
" <td>5.87</td>\n",
|
||
" <td>3.64</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>53941</th>\n",
|
||
" <td>0.71</td>\n",
|
||
" <td>Premium</td>\n",
|
||
" <td>E</td>\n",
|
||
" <td>SI1</td>\n",
|
||
" <td>60.5</td>\n",
|
||
" <td>55.0</td>\n",
|
||
" <td>2756</td>\n",
|
||
" <td>5.79</td>\n",
|
||
" <td>5.74</td>\n",
|
||
" <td>3.49</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>53942</th>\n",
|
||
" <td>0.71</td>\n",
|
||
" <td>Premium</td>\n",
|
||
" <td>F</td>\n",
|
||
" <td>SI1</td>\n",
|
||
" <td>59.8</td>\n",
|
||
" <td>62.0</td>\n",
|
||
" <td>2756</td>\n",
|
||
" <td>5.74</td>\n",
|
||
" <td>5.73</td>\n",
|
||
" <td>3.43</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>53943</th>\n",
|
||
" <td>0.70</td>\n",
|
||
" <td>Very Good</td>\n",
|
||
" <td>E</td>\n",
|
||
" <td>VS2</td>\n",
|
||
" <td>60.5</td>\n",
|
||
" <td>59.0</td>\n",
|
||
" <td>2757</td>\n",
|
||
" <td>5.71</td>\n",
|
||
" <td>5.76</td>\n",
|
||
" <td>3.47</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>53943 rows × 11 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" carat cut color clarity depth table price x y z \\\n",
|
||
"id \n",
|
||
"1 0.23 Ideal E SI2 61.5 55.0 326 3.95 3.98 2.43 \n",
|
||
"2 0.21 Premium E SI1 59.8 61.0 326 3.89 3.84 2.31 \n",
|
||
"3 0.23 Good E VS1 56.9 65.0 327 4.05 4.07 2.31 \n",
|
||
"4 0.29 Premium I VS2 62.4 58.0 334 4.20 4.23 2.63 \n",
|
||
"5 0.31 Good J SI2 63.3 58.0 335 4.34 4.35 2.75 \n",
|
||
"... ... ... ... ... ... ... ... ... ... ... \n",
|
||
"53939 0.86 Premium H SI2 61.0 58.0 2757 6.15 6.12 3.74 \n",
|
||
"53940 0.75 Ideal D SI2 62.2 55.0 2757 5.83 5.87 3.64 \n",
|
||
"53941 0.71 Premium E SI1 60.5 55.0 2756 5.79 5.74 3.49 \n",
|
||
"53942 0.71 Premium F SI1 59.8 62.0 2756 5.74 5.73 3.43 \n",
|
||
"53943 0.70 Very Good E VS2 60.5 59.0 2757 5.71 5.76 3.47 \n",
|
||
"\n",
|
||
" above_average_carat \n",
|
||
"id \n",
|
||
"1 0 \n",
|
||
"2 0 \n",
|
||
"3 0 \n",
|
||
"4 0 \n",
|
||
"5 0 \n",
|
||
"... ... \n",
|
||
"53939 1 \n",
|
||
"53940 0 \n",
|
||
"53941 0 \n",
|
||
"53942 0 \n",
|
||
"53943 0 \n",
|
||
"\n",
|
||
"[53943 rows x 11 columns]"
|
||
]
|
||
},
|
||
"execution_count": 190,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"\n",
|
||
"from sklearn import set_config\n",
|
||
"\n",
|
||
"set_config(transform_output=\"pandas\")\n",
|
||
"\n",
|
||
"df = pd.read_csv(\"data/Diamonds.csv\", index_col=\"id\")\n",
|
||
"\n",
|
||
"random_state=42\n",
|
||
"\n",
|
||
"average_carat = df['carat'].mean()\n",
|
||
"\n",
|
||
"print(f\"Среднее значение поля 'карат': {average_carat}\")\n",
|
||
"\n",
|
||
"average_carat = df['carat'].mean()\n",
|
||
"df['above_average_carat'] = (df['carat'] > average_carat).astype(int)\n",
|
||
"\n",
|
||
"df"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Разделение набора данных на обучающую и тестовые выборки (80/20) для задачи классификации\n",
|
||
"\n",
|
||
"Целевой признак -- Cut"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 191,
|
||
"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>carat</th>\n",
|
||
" <th>cut</th>\n",
|
||
" <th>color</th>\n",
|
||
" <th>clarity</th>\n",
|
||
" <th>depth</th>\n",
|
||
" <th>table</th>\n",
|
||
" <th>price</th>\n",
|
||
" <th>x</th>\n",
|
||
" <th>y</th>\n",
|
||
" <th>z</th>\n",
|
||
" <th>above_average_carat</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>id</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>38836</th>\n",
|
||
" <td>0.40</td>\n",
|
||
" <td>Very Good</td>\n",
|
||
" <td>F</td>\n",
|
||
" <td>VVS2</td>\n",
|
||
" <td>62.0</td>\n",
|
||
" <td>56.0</td>\n",
|
||
" <td>1049</td>\n",
|
||
" <td>4.71</td>\n",
|
||
" <td>4.74</td>\n",
|
||
" <td>2.93</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>30260</th>\n",
|
||
" <td>0.40</td>\n",
|
||
" <td>Very Good</td>\n",
|
||
" <td>E</td>\n",
|
||
" <td>SI1</td>\n",
|
||
" <td>63.0</td>\n",
|
||
" <td>57.0</td>\n",
|
||
" <td>725</td>\n",
|
||
" <td>4.68</td>\n",
|
||
" <td>4.71</td>\n",
|
||
" <td>2.96</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>33169</th>\n",
|
||
" <td>0.36</td>\n",
|
||
" <td>Ideal</td>\n",
|
||
" <td>E</td>\n",
|
||
" <td>VS1</td>\n",
|
||
" <td>61.8</td>\n",
|
||
" <td>56.0</td>\n",
|
||
" <td>817</td>\n",
|
||
" <td>4.55</td>\n",
|
||
" <td>4.58</td>\n",
|
||
" <td>2.82</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1029</th>\n",
|
||
" <td>0.70</td>\n",
|
||
" <td>Very Good</td>\n",
|
||
" <td>E</td>\n",
|
||
" <td>VS1</td>\n",
|
||
" <td>58.4</td>\n",
|
||
" <td>59.0</td>\n",
|
||
" <td>2904</td>\n",
|
||
" <td>5.83</td>\n",
|
||
" <td>5.91</td>\n",
|
||
" <td>3.43</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>53809</th>\n",
|
||
" <td>0.81</td>\n",
|
||
" <td>Very Good</td>\n",
|
||
" <td>G</td>\n",
|
||
" <td>SI1</td>\n",
|
||
" <td>60.7</td>\n",
|
||
" <td>56.0</td>\n",
|
||
" <td>2733</td>\n",
|
||
" <td>6.06</td>\n",
|
||
" <td>6.09</td>\n",
|
||
" <td>3.69</td>\n",
|
||
" <td>1</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",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2937</th>\n",
|
||
" <td>0.77</td>\n",
|
||
" <td>Good</td>\n",
|
||
" <td>E</td>\n",
|
||
" <td>VS2</td>\n",
|
||
" <td>63.4</td>\n",
|
||
" <td>57.0</td>\n",
|
||
" <td>3291</td>\n",
|
||
" <td>5.80</td>\n",
|
||
" <td>5.84</td>\n",
|
||
" <td>3.69</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>7514</th>\n",
|
||
" <td>0.90</td>\n",
|
||
" <td>Good</td>\n",
|
||
" <td>F</td>\n",
|
||
" <td>SI1</td>\n",
|
||
" <td>61.8</td>\n",
|
||
" <td>63.0</td>\n",
|
||
" <td>4241</td>\n",
|
||
" <td>6.21</td>\n",
|
||
" <td>6.18</td>\n",
|
||
" <td>3.83</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>48344</th>\n",
|
||
" <td>0.56</td>\n",
|
||
" <td>Ideal</td>\n",
|
||
" <td>H</td>\n",
|
||
" <td>VVS1</td>\n",
|
||
" <td>62.1</td>\n",
|
||
" <td>53.8</td>\n",
|
||
" <td>1961</td>\n",
|
||
" <td>5.27</td>\n",
|
||
" <td>5.33</td>\n",
|
||
" <td>3.29</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3212</th>\n",
|
||
" <td>0.70</td>\n",
|
||
" <td>Premium</td>\n",
|
||
" <td>F</td>\n",
|
||
" <td>VVS1</td>\n",
|
||
" <td>61.8</td>\n",
|
||
" <td>60.0</td>\n",
|
||
" <td>3348</td>\n",
|
||
" <td>5.67</td>\n",
|
||
" <td>5.63</td>\n",
|
||
" <td>3.49</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>35654</th>\n",
|
||
" <td>0.31</td>\n",
|
||
" <td>Very Good</td>\n",
|
||
" <td>G</td>\n",
|
||
" <td>VVS2</td>\n",
|
||
" <td>63.1</td>\n",
|
||
" <td>57.0</td>\n",
|
||
" <td>907</td>\n",
|
||
" <td>4.32</td>\n",
|
||
" <td>4.30</td>\n",
|
||
" <td>2.72</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>43154 rows × 11 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" carat cut color clarity depth table price x y z \\\n",
|
||
"id \n",
|
||
"38836 0.40 Very Good F VVS2 62.0 56.0 1049 4.71 4.74 2.93 \n",
|
||
"30260 0.40 Very Good E SI1 63.0 57.0 725 4.68 4.71 2.96 \n",
|
||
"33169 0.36 Ideal E VS1 61.8 56.0 817 4.55 4.58 2.82 \n",
|
||
"1029 0.70 Very Good E VS1 58.4 59.0 2904 5.83 5.91 3.43 \n",
|
||
"53809 0.81 Very Good G SI1 60.7 56.0 2733 6.06 6.09 3.69 \n",
|
||
"... ... ... ... ... ... ... ... ... ... ... \n",
|
||
"2937 0.77 Good E VS2 63.4 57.0 3291 5.80 5.84 3.69 \n",
|
||
"7514 0.90 Good F SI1 61.8 63.0 4241 6.21 6.18 3.83 \n",
|
||
"48344 0.56 Ideal H VVS1 62.1 53.8 1961 5.27 5.33 3.29 \n",
|
||
"3212 0.70 Premium F VVS1 61.8 60.0 3348 5.67 5.63 3.49 \n",
|
||
"35654 0.31 Very Good G VVS2 63.1 57.0 907 4.32 4.30 2.72 \n",
|
||
"\n",
|
||
" above_average_carat \n",
|
||
"id \n",
|
||
"38836 0 \n",
|
||
"30260 0 \n",
|
||
"33169 0 \n",
|
||
"1029 0 \n",
|
||
"53809 1 \n",
|
||
"... ... \n",
|
||
"2937 0 \n",
|
||
"7514 1 \n",
|
||
"48344 0 \n",
|
||
"3212 0 \n",
|
||
"35654 0 \n",
|
||
"\n",
|
||
"[43154 rows x 11 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>above_average_carat</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>id</th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>38836</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>30260</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>33169</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1029</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>53809</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2937</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>7514</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>48344</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3212</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>35654</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>43154 rows × 1 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" above_average_carat\n",
|
||
"id \n",
|
||
"38836 0\n",
|
||
"30260 0\n",
|
||
"33169 0\n",
|
||
"1029 0\n",
|
||
"53809 1\n",
|
||
"... ...\n",
|
||
"2937 0\n",
|
||
"7514 1\n",
|
||
"48344 0\n",
|
||
"3212 0\n",
|
||
"35654 0\n",
|
||
"\n",
|
||
"[43154 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>carat</th>\n",
|
||
" <th>cut</th>\n",
|
||
" <th>color</th>\n",
|
||
" <th>clarity</th>\n",
|
||
" <th>depth</th>\n",
|
||
" <th>table</th>\n",
|
||
" <th>price</th>\n",
|
||
" <th>x</th>\n",
|
||
" <th>y</th>\n",
|
||
" <th>z</th>\n",
|
||
" <th>above_average_carat</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>id</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>32452</th>\n",
|
||
" <td>0.39</td>\n",
|
||
" <td>Very Good</td>\n",
|
||
" <td>E</td>\n",
|
||
" <td>VS2</td>\n",
|
||
" <td>60.9</td>\n",
|
||
" <td>58.0</td>\n",
|
||
" <td>793</td>\n",
|
||
" <td>4.72</td>\n",
|
||
" <td>4.77</td>\n",
|
||
" <td>2.89</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2432</th>\n",
|
||
" <td>0.72</td>\n",
|
||
" <td>Very Good</td>\n",
|
||
" <td>E</td>\n",
|
||
" <td>SI1</td>\n",
|
||
" <td>63.3</td>\n",
|
||
" <td>56.0</td>\n",
|
||
" <td>3183</td>\n",
|
||
" <td>5.67</td>\n",
|
||
" <td>5.71</td>\n",
|
||
" <td>3.60</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>16456</th>\n",
|
||
" <td>1.21</td>\n",
|
||
" <td>Ideal</td>\n",
|
||
" <td>H</td>\n",
|
||
" <td>SI1</td>\n",
|
||
" <td>62.1</td>\n",
|
||
" <td>59.0</td>\n",
|
||
" <td>6573</td>\n",
|
||
" <td>6.81</td>\n",
|
||
" <td>6.75</td>\n",
|
||
" <td>4.21</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>46045</th>\n",
|
||
" <td>0.56</td>\n",
|
||
" <td>Ideal</td>\n",
|
||
" <td>D</td>\n",
|
||
" <td>SI1</td>\n",
|
||
" <td>62.5</td>\n",
|
||
" <td>56.0</td>\n",
|
||
" <td>1729</td>\n",
|
||
" <td>5.28</td>\n",
|
||
" <td>5.24</td>\n",
|
||
" <td>3.29</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>11115</th>\n",
|
||
" <td>1.00</td>\n",
|
||
" <td>Good</td>\n",
|
||
" <td>E</td>\n",
|
||
" <td>SI1</td>\n",
|
||
" <td>62.4</td>\n",
|
||
" <td>59.0</td>\n",
|
||
" <td>4936</td>\n",
|
||
" <td>6.35</td>\n",
|
||
" <td>6.40</td>\n",
|
||
" <td>3.98</td>\n",
|
||
" <td>1</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",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>40250</th>\n",
|
||
" <td>0.50</td>\n",
|
||
" <td>Premium</td>\n",
|
||
" <td>F</td>\n",
|
||
" <td>SI1</td>\n",
|
||
" <td>59.6</td>\n",
|
||
" <td>61.0</td>\n",
|
||
" <td>1125</td>\n",
|
||
" <td>5.15</td>\n",
|
||
" <td>5.12</td>\n",
|
||
" <td>3.06</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3308</th>\n",
|
||
" <td>0.73</td>\n",
|
||
" <td>Ideal</td>\n",
|
||
" <td>E</td>\n",
|
||
" <td>VS1</td>\n",
|
||
" <td>62.3</td>\n",
|
||
" <td>56.0</td>\n",
|
||
" <td>3370</td>\n",
|
||
" <td>5.75</td>\n",
|
||
" <td>5.80</td>\n",
|
||
" <td>3.60</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>7894</th>\n",
|
||
" <td>1.12</td>\n",
|
||
" <td>Very Good</td>\n",
|
||
" <td>I</td>\n",
|
||
" <td>SI1</td>\n",
|
||
" <td>60.6</td>\n",
|
||
" <td>60.0</td>\n",
|
||
" <td>4312</td>\n",
|
||
" <td>6.73</td>\n",
|
||
" <td>6.77</td>\n",
|
||
" <td>4.09</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>21368</th>\n",
|
||
" <td>0.36</td>\n",
|
||
" <td>Ideal</td>\n",
|
||
" <td>D</td>\n",
|
||
" <td>SI1</td>\n",
|
||
" <td>62.2</td>\n",
|
||
" <td>53.0</td>\n",
|
||
" <td>626</td>\n",
|
||
" <td>4.57</td>\n",
|
||
" <td>4.59</td>\n",
|
||
" <td>2.85</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>46144</th>\n",
|
||
" <td>0.50</td>\n",
|
||
" <td>Premium</td>\n",
|
||
" <td>E</td>\n",
|
||
" <td>VS2</td>\n",
|
||
" <td>61.3</td>\n",
|
||
" <td>59.0</td>\n",
|
||
" <td>1746</td>\n",
|
||
" <td>5.10</td>\n",
|
||
" <td>5.05</td>\n",
|
||
" <td>3.11</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>10789 rows × 11 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" carat cut color clarity depth table price x y z \\\n",
|
||
"id \n",
|
||
"32452 0.39 Very Good E VS2 60.9 58.0 793 4.72 4.77 2.89 \n",
|
||
"2432 0.72 Very Good E SI1 63.3 56.0 3183 5.67 5.71 3.60 \n",
|
||
"16456 1.21 Ideal H SI1 62.1 59.0 6573 6.81 6.75 4.21 \n",
|
||
"46045 0.56 Ideal D SI1 62.5 56.0 1729 5.28 5.24 3.29 \n",
|
||
"11115 1.00 Good E SI1 62.4 59.0 4936 6.35 6.40 3.98 \n",
|
||
"... ... ... ... ... ... ... ... ... ... ... \n",
|
||
"40250 0.50 Premium F SI1 59.6 61.0 1125 5.15 5.12 3.06 \n",
|
||
"3308 0.73 Ideal E VS1 62.3 56.0 3370 5.75 5.80 3.60 \n",
|
||
"7894 1.12 Very Good I SI1 60.6 60.0 4312 6.73 6.77 4.09 \n",
|
||
"21368 0.36 Ideal D SI1 62.2 53.0 626 4.57 4.59 2.85 \n",
|
||
"46144 0.50 Premium E VS2 61.3 59.0 1746 5.10 5.05 3.11 \n",
|
||
"\n",
|
||
" above_average_carat \n",
|
||
"id \n",
|
||
"32452 0 \n",
|
||
"2432 0 \n",
|
||
"16456 1 \n",
|
||
"46045 0 \n",
|
||
"11115 1 \n",
|
||
"... ... \n",
|
||
"40250 0 \n",
|
||
"3308 0 \n",
|
||
"7894 1 \n",
|
||
"21368 0 \n",
|
||
"46144 0 \n",
|
||
"\n",
|
||
"[10789 rows x 11 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>above_average_carat</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>id</th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>32452</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2432</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>16456</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>46045</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>11115</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>40250</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3308</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>7894</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>21368</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>46144</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>10789 rows × 1 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" above_average_carat\n",
|
||
"id \n",
|
||
"32452 0\n",
|
||
"2432 0\n",
|
||
"16456 1\n",
|
||
"46045 0\n",
|
||
"11115 1\n",
|
||
"... ...\n",
|
||
"40250 0\n",
|
||
"3308 0\n",
|
||
"7894 1\n",
|
||
"21368 0\n",
|
||
"46144 0\n",
|
||
"\n",
|
||
"[10789 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_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",
|
||
" Splits a Pandas dataframe into three subsets (train, val, and test)\n",
|
||
" following fractional ratios provided by the user, where each subset is\n",
|
||
" stratified by the values in a specific column (that is, each subset has\n",
|
||
" the same relative frequency of the values in the column). It performs this\n",
|
||
" splitting by running train_test_split() twice.\n",
|
||
" Parameters\n",
|
||
" ----------\n",
|
||
" df_input : Pandas dataframe\n",
|
||
" Input dataframe to be split.\n",
|
||
" stratify_colname : str\n",
|
||
" The name of the column that will be used for stratification. Usually\n",
|
||
" this column would be for the label.\n",
|
||
" frac_train : float\n",
|
||
" frac_val : float\n",
|
||
" frac_test : float\n",
|
||
" The ratios with which the dataframe will be split into train, val, and\n",
|
||
" test data. The values should be expressed as float fractions and should\n",
|
||
" sum to 1.0.\n",
|
||
" random_state : int, None, or RandomStateInstance\n",
|
||
" Value to be passed to train_test_split().\n",
|
||
" Returns\n",
|
||
" -------\n",
|
||
" df_train, df_val, df_test :\n",
|
||
" Dataframes containing the three splits.\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=\"above_average_carat\", 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",
|
||
"\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": 192,
|
||
"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 DaimondFeatures(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 = []\n",
|
||
"num_columns = [\"carat\", \"depth\", \"table\", \"x\", \"y\", \"z\", \"above_average_carat\"]\n",
|
||
"cat_columns = [\"cut\", \"color\", \"clarity\"]\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",
|
||
"features_engineering = ColumnTransformer(\n",
|
||
" verbose_feature_names_out=False,\n",
|
||
" transformers=[\n",
|
||
" (\"add_features\", DaimondFeatures(), [\"x\", \"y\"]),\n",
|
||
" ],\n",
|
||
" remainder=\"passthrough\",\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",
|
||
" (\"features_engineering\", features_engineering),\n",
|
||
" (\"drop_columns\", drop_columns),\n",
|
||
" ]\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Демонстрация работы конвейера для предобработки данных при классификации"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 193,
|
||
"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>x</th>\n",
|
||
" <th>y</th>\n",
|
||
" <th>Length_to_Width_Ratio</th>\n",
|
||
" <th>carat</th>\n",
|
||
" <th>depth</th>\n",
|
||
" <th>table</th>\n",
|
||
" <th>z</th>\n",
|
||
" <th>above_average_carat</th>\n",
|
||
" <th>cut_Good</th>\n",
|
||
" <th>cut_Ideal</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>color_I</th>\n",
|
||
" <th>color_J</th>\n",
|
||
" <th>clarity_IF</th>\n",
|
||
" <th>clarity_SI1</th>\n",
|
||
" <th>clarity_SI2</th>\n",
|
||
" <th>clarity_VS1</th>\n",
|
||
" <th>clarity_VS2</th>\n",
|
||
" <th>clarity_VVS1</th>\n",
|
||
" <th>clarity_VVS2</th>\n",
|
||
" <th>price</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>id</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>38836</th>\n",
|
||
" <td>-0.907744</td>\n",
|
||
" <td>-0.863476</td>\n",
|
||
" <td>1.051267</td>\n",
|
||
" <td>-0.837490</td>\n",
|
||
" <td>0.176170</td>\n",
|
||
" <td>-0.648004</td>\n",
|
||
" <td>-0.857040</td>\n",
|
||
" <td>-0.856046</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1049</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>30260</th>\n",
|
||
" <td>-0.934483</td>\n",
|
||
" <td>-0.889579</td>\n",
|
||
" <td>1.050478</td>\n",
|
||
" <td>-0.837490</td>\n",
|
||
" <td>0.876071</td>\n",
|
||
" <td>-0.201125</td>\n",
|
||
" <td>-0.814688</td>\n",
|
||
" <td>-0.856046</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>725</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>33169</th>\n",
|
||
" <td>-1.050350</td>\n",
|
||
" <td>-1.002691</td>\n",
|
||
" <td>1.047532</td>\n",
|
||
" <td>-0.921885</td>\n",
|
||
" <td>0.036190</td>\n",
|
||
" <td>-0.648004</td>\n",
|
||
" <td>-1.012333</td>\n",
|
||
" <td>-0.856046</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>817</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1029</th>\n",
|
||
" <td>0.090496</td>\n",
|
||
" <td>0.154530</td>\n",
|
||
" <td>0.585622</td>\n",
|
||
" <td>-0.204531</td>\n",
|
||
" <td>-2.343471</td>\n",
|
||
" <td>0.692631</td>\n",
|
||
" <td>-0.151165</td>\n",
|
||
" <td>-0.856046</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>2904</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>53809</th>\n",
|
||
" <td>0.295492</td>\n",
|
||
" <td>0.311147</td>\n",
|
||
" <td>0.949688</td>\n",
|
||
" <td>0.027554</td>\n",
|
||
" <td>-0.733700</td>\n",
|
||
" <td>-0.648004</td>\n",
|
||
" <td>0.215890</td>\n",
|
||
" <td>1.168162</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>2733</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",
|
||
" <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",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2937</th>\n",
|
||
" <td>0.063758</td>\n",
|
||
" <td>0.093624</td>\n",
|
||
" <td>0.680999</td>\n",
|
||
" <td>-0.056841</td>\n",
|
||
" <td>1.156031</td>\n",
|
||
" <td>-0.201125</td>\n",
|
||
" <td>0.215890</td>\n",
|
||
" <td>-0.856046</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>3291</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>7514</th>\n",
|
||
" <td>0.429185</td>\n",
|
||
" <td>0.389455</td>\n",
|
||
" <td>1.102015</td>\n",
|
||
" <td>0.217442</td>\n",
|
||
" <td>0.036190</td>\n",
|
||
" <td>2.480145</td>\n",
|
||
" <td>0.413535</td>\n",
|
||
" <td>1.168162</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>4241</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>48344</th>\n",
|
||
" <td>-0.408624</td>\n",
|
||
" <td>-0.350123</td>\n",
|
||
" <td>1.167088</td>\n",
|
||
" <td>-0.499912</td>\n",
|
||
" <td>0.246160</td>\n",
|
||
" <td>-1.631136</td>\n",
|
||
" <td>-0.348810</td>\n",
|
||
" <td>-0.856046</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1961</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3212</th>\n",
|
||
" <td>-0.052109</td>\n",
|
||
" <td>-0.089095</td>\n",
|
||
" <td>0.584874</td>\n",
|
||
" <td>-0.204531</td>\n",
|
||
" <td>0.036190</td>\n",
|
||
" <td>1.139510</td>\n",
|
||
" <td>-0.066460</td>\n",
|
||
" <td>-0.856046</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>3348</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>35654</th>\n",
|
||
" <td>-1.255346</td>\n",
|
||
" <td>-1.246316</td>\n",
|
||
" <td>1.007245</td>\n",
|
||
" <td>-1.027378</td>\n",
|
||
" <td>0.946061</td>\n",
|
||
" <td>-0.201125</td>\n",
|
||
" <td>-1.153508</td>\n",
|
||
" <td>-0.856046</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>907</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>43154 rows × 26 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" x y Length_to_Width_Ratio carat depth \\\n",
|
||
"id \n",
|
||
"38836 -0.907744 -0.863476 1.051267 -0.837490 0.176170 \n",
|
||
"30260 -0.934483 -0.889579 1.050478 -0.837490 0.876071 \n",
|
||
"33169 -1.050350 -1.002691 1.047532 -0.921885 0.036190 \n",
|
||
"1029 0.090496 0.154530 0.585622 -0.204531 -2.343471 \n",
|
||
"53809 0.295492 0.311147 0.949688 0.027554 -0.733700 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"2937 0.063758 0.093624 0.680999 -0.056841 1.156031 \n",
|
||
"7514 0.429185 0.389455 1.102015 0.217442 0.036190 \n",
|
||
"48344 -0.408624 -0.350123 1.167088 -0.499912 0.246160 \n",
|
||
"3212 -0.052109 -0.089095 0.584874 -0.204531 0.036190 \n",
|
||
"35654 -1.255346 -1.246316 1.007245 -1.027378 0.946061 \n",
|
||
"\n",
|
||
" table z above_average_carat cut_Good cut_Ideal ... \\\n",
|
||
"id ... \n",
|
||
"38836 -0.648004 -0.857040 -0.856046 0.0 0.0 ... \n",
|
||
"30260 -0.201125 -0.814688 -0.856046 0.0 0.0 ... \n",
|
||
"33169 -0.648004 -1.012333 -0.856046 0.0 1.0 ... \n",
|
||
"1029 0.692631 -0.151165 -0.856046 0.0 0.0 ... \n",
|
||
"53809 -0.648004 0.215890 1.168162 0.0 0.0 ... \n",
|
||
"... ... ... ... ... ... ... \n",
|
||
"2937 -0.201125 0.215890 -0.856046 1.0 0.0 ... \n",
|
||
"7514 2.480145 0.413535 1.168162 1.0 0.0 ... \n",
|
||
"48344 -1.631136 -0.348810 -0.856046 0.0 1.0 ... \n",
|
||
"3212 1.139510 -0.066460 -0.856046 0.0 0.0 ... \n",
|
||
"35654 -0.201125 -1.153508 -0.856046 0.0 0.0 ... \n",
|
||
"\n",
|
||
" color_I color_J clarity_IF clarity_SI1 clarity_SI2 clarity_VS1 \\\n",
|
||
"id \n",
|
||
"38836 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"30260 0.0 0.0 0.0 1.0 0.0 0.0 \n",
|
||
"33169 0.0 0.0 0.0 0.0 0.0 1.0 \n",
|
||
"1029 0.0 0.0 0.0 0.0 0.0 1.0 \n",
|
||
"53809 0.0 0.0 0.0 1.0 0.0 0.0 \n",
|
||
"... ... ... ... ... ... ... \n",
|
||
"2937 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"7514 0.0 0.0 0.0 1.0 0.0 0.0 \n",
|
||
"48344 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"3212 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"35654 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"\n",
|
||
" clarity_VS2 clarity_VVS1 clarity_VVS2 price \n",
|
||
"id \n",
|
||
"38836 0.0 0.0 1.0 1049 \n",
|
||
"30260 0.0 0.0 0.0 725 \n",
|
||
"33169 0.0 0.0 0.0 817 \n",
|
||
"1029 0.0 0.0 0.0 2904 \n",
|
||
"53809 0.0 0.0 0.0 2733 \n",
|
||
"... ... ... ... ... \n",
|
||
"2937 1.0 0.0 0.0 3291 \n",
|
||
"7514 0.0 0.0 0.0 4241 \n",
|
||
"48344 0.0 1.0 0.0 1961 \n",
|
||
"3212 0.0 1.0 0.0 3348 \n",
|
||
"35654 0.0 0.0 1.0 907 \n",
|
||
"\n",
|
||
"[43154 rows x 26 columns]"
|
||
]
|
||
},
|
||
"execution_count": 193,
|
||
"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",
|
||
"\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": 194,
|
||
"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": 195,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Model: logistic\n",
|
||
"Model: ridge\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"c:\\Python312\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:469: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
|
||
"STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
|
||
"\n",
|
||
"Increase the number of iterations (max_iter) or scale the data as shown in:\n",
|
||
" https://scikit-learn.org/stable/modules/preprocessing.html\n",
|
||
"Please also refer to the documentation for alternative solver options:\n",
|
||
" https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
|
||
" n_iter_i = _check_optimize_result(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Model: decision_tree\n",
|
||
"Model: knn\n",
|
||
"Model: naive_bayes\n",
|
||
"Model: gradient_boosting\n",
|
||
"Model: random_forest\n",
|
||
"Model: mlp\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": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Матрица неточностей"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 197,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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t956C2lpaViyZAl8fHxw/fr1Iq3j9ddfR8+ePTF//nxERETINyXINWrUKGzatAkvvfQSoqKi0KhRI9y/fx9//PEH1q9fjwsXLpidhleYgIAATJs2DRcuXED16tWxdu1aHD9+HIsXL5afcP3SSy9hw4YNePnll9G+fXskJCRg4cKFCAkJQVpaWp51tm/fHuXLl8e3336Ldu3awcfHx6y9V69eWLduHQYOHIhdu3YhNDQURqMRp0+fxrp16/DTTz+hcePGmDRpEvbu3Yv27dsjKCgIN2/exPz581GxYkU0a9asyNtIRETKmTBhArZv347Q0FAMGjQIRqMR8+bNQ+3atXH8+PFC39++fXvMnDkTbdu2Rffu3XHz5k188cUXCA4Oxu+//y4vV79+fXTr1g3z589HSkoKnnvuOezcubNIIw8GgwELFixAr1690LBhQ7zxxhvw9vbGpUuXsGXLFoSGhpo9b7AonJ2dERISgrVr16J69erw8vJC7dq1Ubt27SKvw8vLC82aNUOfPn2QmJiI2bNnIzg4WL5pgaOjI6ZNm4Y+ffqgZcuW6Natm3wr78qVK2P48OHyuj777DO0a9cOTZs2Rb9+/eRbebu7u8vPX7p37x4qVqyIV199FfXq1YOrqyt+/vlnHD58GDNmzJDX1ahRI6xduxYjRozA008/DVdXV3To0KFY38+/de7cGc888wzee+89xMfHo2bNmti0aZN8oLQkRquohCl7szwqabm38v73baX/fTvQTZs2ibp16wonJydRuXJlMW3aNLFs2TKzZYTIeyvvXKmpqcLZ2VkAEF9//XW+fbl3754YO3asCA4OFjqdTlSoUEE899xz4j//+Y98++2iaNmypXjqqafEkSNHRNOmTYWTk5MICgoS8+bNM1vOZDKJKVOmiKCgIKHX60WDBg3E5s2bRWRkZL638hRCiLffflsAEKtXr863PTMzU0ybNk089dRTQq/XC09PT9GoUSMxceJEkZKSIoQQYufOnaJTp04iICBA6HQ6ERAQILp165bnNuZERGTbdu7cKRo0aCB0Op2oVq2aWLp0qXjvvfeEk5OTvAyAAm8h/eWXX4onn3xS6PV6UbNmTRETEyPn8j89fPhQDB06VJQvX164uLiIDh06iMuXLxd6K+9cu3btEhEREcLd3V04OTmJatWqiaioKHHkyBF5mcjISOHi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HY25c+fizJkz+OOPPxATE4OZM2cWqz9ERET/xmxmNlMpUvqiJyo5/7zoszjt169fF7179xYVKlQQer1eVK1aVfTv31+kpKQIIXIu8hw2bJgwGAzCw8NDjBgxQvTu3bvAiz6FEOLhw4di+PDhwt/fX+h0OhEcHCyWLVsmt0+aNEn4+fkJSZJEZGSkECLnQtXZs2eLGjVqCEdHR+Ht7S0iIiLEnj175Pf98MMPIjg4WOj1etG8eXOxbNmyYl/0OWrUKFG+fHnh6uoqXn/9dTFr1izh7u4ut48fP17Uq1dPzJ8/XwQEBAgnJyfx6quviqSkJLP1rlq1StSvX1/odDrh6ekpWrRoITZs2CCE4EWfRESUg9mcP2Yz2QpJiAKu1CMiIiIiIlIRnlZHREREREQEFkdEREREREQAWBwREREREREBYHFEREREREQEgMURERERERERABZHREREREREAFgcERERERERAWBxREREREREBIDFEREREREREQAWR0RERERERABYHBEREREREQFgcURERERERASAxREREREREREAFkdEREREREQAWBzRY5IkCRMmTFC6GwX66quvULNmTTg6OsLDw0Pp7hAREdmVCxcuQJIkLF++XOmuEFkFiyOyW6dPn0ZUVBSqVauGJUuWYPHixUp3KY9r165hwoQJOH78uNJdISIiIlI9B6U7QFRSdu/eDZPJhDlz5iA4OFjp7uTr2rVrmDhxIipXroz69esr3R0iIiIiVePIkZ25f/++0l2wGTdv3gQAq55O9+DBA6uti4iIiIhsC4ujMmzChAmQJAl//fUXunfvDk9PTzRr1gy///47oqKiULVqVTg5OcHPzw99+/bFnTt38n1/fHw8oqKi4OHhAXd3d/Tp0ydPEZCRkYHhw4fD29sbbm5u6NixI65cuZJvv3777Te0a9cOBoMBrq6uaN26NX799VezZZYvXw5JkrB//34MHToU3t7e8PDwwFtvvYXMzEwkJyejd+/e8PT0hKenJ0aPHg0hRJG/m8qVK2P8+PEAAG9v7zzXRs2fPx9PPfUU9Ho9AgICMHjwYCQnJ5ut4/nnn0ft2rVx9OhRtGjRAuXKlcMHH3wgfx/jx49HcHAw9Ho9AgMDMXr0aGRkZJitY8eOHWjWrBk8PDzg6uqKGjVqyOvYvXs3nn76aQBAnz59IEkSz9smIqJSl/v3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kOy1t4va24iIiEh5Ws5mFkdEpC5ZAJI2j04RERF5JQ1ns5/aAyAijROi6tzlWhf3d8ArV67EfffdB6PRiIceegj/+te/PDBwIiIiH+WBbG4sWBwRkaqE3V7n4o533nkH06ZNw9y5c3H8+HF06dIFFosF169f99AnICIi8i1KZ3NjwuKIiFQlZFHn4o5XX30VTz31FMaMGYP4+HisWrUKQUFBWLdunYc+ARERkW9ROpsbE15zVA/iP1OHlbC5vHEHeY6txKr2EDSr+rsXHppCrxQVLm8JWgkbAKCoqMhpvcFggMFgcFpntVpx7NgxzJkzx7HOz88P/fr1w+HDhxUcNRGpjdmsPmazerwlm30Ri6N6uH37NgDgID5SeSQalqT2AOj27dswm82K9afX6xEVFYWD1+r+uwoJCUFMTIzTurlz52LevHlO677//nvY7XZERkY6rY+MjMSZM2fuecxE5D2YzV6A2aw6NbM5KioKer1esff2FiyO6iE6OhqXL19GaGgoJElSezhuKyoqQkxMDC5fvgyTyaT2cDSnsX//Qgjcvn0b0dHRivZrNBpx4cIFWK11H3kUQtT42/v5rBERaQuzme5FY//+vSGb9Xo9jEajou/vDVgc1YOfnx9atWql9jDumclkapQ7AF/RmL9/JY9K/ZTRaFR0x9qsWTPodDrk5+c7rc/Pz0dUVJRi70NE6mM2kxIa8/ffWLK5seENGYjIZ+j1enTv3h179uxxrJNlGXv27EFiYqKKIyMiIqLGgDNHRORTpk2bhpSUFPTo0QMPPvggli9fjpKSEowZM0btoREREZGXY3GkAQaDAXPnzuU1Girh99+wfve73+HGjRt46aWXcO3aNXTt2hW7du2qcZMGIiI1MRvUxe+faiMJT90DkIiIiIiIqBHhNUdERERERERgcURERERERASAxREREREREREAFkdEREREREQAWBw1OqmpqRg8eLDaw9Cc1NRUSJKECRMm1GhLS0uDJElITU1t+IEREZHqmM3qYDaTJ7A4IqqnmJgYbN26FWVlZY515eXl2LJlC1q3bn3X/QohUFlZqcQQiYiINIXZTEpjceRDvvzySwwcOBAhISGIjIzEqFGj8P333zvat2/fjk6dOiEwMBBNmzZFv379UFJSAgDIysrCgw8+iODgYDRp0gQ9e/bEpUuX1PooXikhIQExMTHY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He/j5+eH9u3bIzIyEtHR0Th//jxGjBjh1vsTEZH2MJtdYzaTmnhDBnIyYsQINGvWDIMGDcKBAwdw4cIFZGVlYfLkyfj2228BAFOmTMHixYvx/vvv48yZM/jDH/7g8jkI9913H1JSUjB27Fi8//77jj63bdsGAIiNjYUkSdi5cydu3LiB4uJihIaGYvr06UhPT8fGjRtx7tw5HD9+HK+//rrjQsoJEybgm2++wYwZM5Cbm4stW7Zgw4YNbn3eX/ziF8jLy8PWrVtx7tw5rFix4o4XsBqNRqSkpODUqVM4cOAAJk+ejGHDhiEqKgoAMH/+fGRkZGDFihX4+uuv8cUXX2D9+vV49dVX3RoPERHRzzGbmc3UgNS+6Ik856cXfbrTfvXqVTF69GjRrFkzYTAYRNu2bcVTTz0lCgsLhRBVF3lOmTJFmEwm0aRJEzFt2jQxevToWi/6FEKIsrIykZ6eLlq0aCH0er2Ii4sT69atc7QvWLBAREVFCUmSREpKihCi6kLV5cuXi/bt24uAgADRvHlzYbFYxP79+x2v+/DDD0VcXJwwGAzikUceEevWrXP7os8ZM2aIpk2bipCQEPG73/1OLFu2TJjNZkf73LlzRZcuXcQbb7whoqOjhdFoFEOHDhW3bt1y6nfz5s2ia9euQq/Xi7CwMNG7d2+xY8cOIQQv+iQioirM5jtjNpO3kISo5Uo9IiIiIiIiDeFpdURERERERGBxREREREREBIDFEREREREREQAWR0RERERERABYHBEREREREQFgcURERERERASAxREREREREREAFkdEREREREQAWBwREREREREBYHFEREREREQEgMURERERERERAOD/A0vqCVO4jtOSAAAAAElFTkSuQmCC",
|
||
"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=[\"Less\", \"More\"]\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": [
|
||
"Точность, полнота, верность (аккуратность), F-мера"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 198,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style type=\"text/css\">\n",
|
||
"#T_809a5_row0_col0, #T_809a5_row0_col1, #T_809a5_row0_col2, #T_809a5_row0_col3, #T_809a5_row1_col0, #T_809a5_row1_col1, #T_809a5_row1_col2, #T_809a5_row1_col3, #T_809a5_row2_col0, #T_809a5_row2_col1, #T_809a5_row2_col2, #T_809a5_row2_col3, #T_809a5_row3_col1, #T_809a5_row3_col2, #T_809a5_row3_col3, #T_809a5_row4_col0, #T_809a5_row4_col1, #T_809a5_row4_col2, #T_809a5_row4_col3, #T_809a5_row5_col0, #T_809a5_row5_col1, #T_809a5_row5_col2, #T_809a5_row5_col3 {\n",
|
||
" background-color: #a8db34;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_809a5_row0_col4, #T_809a5_row0_col5, #T_809a5_row0_col6, #T_809a5_row0_col7, #T_809a5_row1_col4, #T_809a5_row1_col5, #T_809a5_row1_col6, #T_809a5_row1_col7, #T_809a5_row2_col4, #T_809a5_row2_col5, #T_809a5_row2_col6, #T_809a5_row2_col7, #T_809a5_row3_col4, #T_809a5_row3_col5, #T_809a5_row3_col6, #T_809a5_row3_col7, #T_809a5_row4_col4, #T_809a5_row4_col5, #T_809a5_row4_col6, #T_809a5_row4_col7, #T_809a5_row5_col4, #T_809a5_row5_col5, #T_809a5_row5_col6, #T_809a5_row5_col7 {\n",
|
||
" background-color: #da5a6a;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_809a5_row3_col0, #T_809a5_row6_col2 {\n",
|
||
" background-color: #a5db36;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_809a5_row6_col0 {\n",
|
||
" background-color: #a0da39;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_809a5_row6_col1, #T_809a5_row6_col3 {\n",
|
||
" background-color: #a2da37;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_809a5_row6_col4, #T_809a5_row6_col5, #T_809a5_row6_col6, #T_809a5_row6_col7 {\n",
|
||
" background-color: #d8576b;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_809a5_row7_col0, #T_809a5_row7_col1, #T_809a5_row7_col2, #T_809a5_row7_col3 {\n",
|
||
" background-color: #26818e;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_809a5_row7_col4, #T_809a5_row7_col5, #T_809a5_row7_col6, #T_809a5_row7_col7 {\n",
|
||
" background-color: #4e02a2;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"</style>\n",
|
||
"<table id=\"T_809a5\">\n",
|
||
" <thead>\n",
|
||
" <tr>\n",
|
||
" <th class=\"blank level0\" > </th>\n",
|
||
" <th id=\"T_809a5_level0_col0\" class=\"col_heading level0 col0\" >Precision_train</th>\n",
|
||
" <th id=\"T_809a5_level0_col1\" class=\"col_heading level0 col1\" >Precision_test</th>\n",
|
||
" <th id=\"T_809a5_level0_col2\" class=\"col_heading level0 col2\" >Recall_train</th>\n",
|
||
" <th id=\"T_809a5_level0_col3\" class=\"col_heading level0 col3\" >Recall_test</th>\n",
|
||
" <th id=\"T_809a5_level0_col4\" class=\"col_heading level0 col4\" >Accuracy_train</th>\n",
|
||
" <th id=\"T_809a5_level0_col5\" class=\"col_heading level0 col5\" >Accuracy_test</th>\n",
|
||
" <th id=\"T_809a5_level0_col6\" class=\"col_heading level0 col6\" >F1_train</th>\n",
|
||
" <th id=\"T_809a5_level0_col7\" class=\"col_heading level0 col7\" >F1_test</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_809a5_level0_row0\" class=\"row_heading level0 row0\" >logistic</th>\n",
|
||
" <td id=\"T_809a5_row0_col0\" class=\"data row0 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row0_col1\" class=\"data row0 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row0_col2\" class=\"data row0 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row0_col3\" class=\"data row0 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row0_col4\" class=\"data row0 col4\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row0_col5\" class=\"data row0 col5\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row0_col6\" class=\"data row0 col6\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row0_col7\" class=\"data row0 col7\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_809a5_level0_row1\" class=\"row_heading level0 row1\" >ridge</th>\n",
|
||
" <td id=\"T_809a5_row1_col0\" class=\"data row1 col0\" >0.999945</td>\n",
|
||
" <td id=\"T_809a5_row1_col1\" class=\"data row1 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row1_col2\" class=\"data row1 col2\" >0.999945</td>\n",
|
||
" <td id=\"T_809a5_row1_col3\" class=\"data row1 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row1_col4\" class=\"data row1 col4\" >0.999954</td>\n",
|
||
" <td id=\"T_809a5_row1_col5\" class=\"data row1 col5\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row1_col6\" class=\"data row1 col6\" >0.999945</td>\n",
|
||
" <td id=\"T_809a5_row1_col7\" class=\"data row1 col7\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_809a5_level0_row2\" class=\"row_heading level0 row2\" >decision_tree</th>\n",
|
||
" <td id=\"T_809a5_row2_col0\" class=\"data row2 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row2_col1\" class=\"data row2 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row2_col2\" class=\"data row2 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row2_col3\" class=\"data row2 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row2_col4\" class=\"data row2 col4\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row2_col5\" class=\"data row2 col5\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row2_col6\" class=\"data row2 col6\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row2_col7\" class=\"data row2 col7\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_809a5_level0_row3\" class=\"row_heading level0 row3\" >naive_bayes</th>\n",
|
||
" <td id=\"T_809a5_row3_col0\" class=\"data row3 col0\" >0.999890</td>\n",
|
||
" <td id=\"T_809a5_row3_col1\" class=\"data row3 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row3_col2\" class=\"data row3 col2\" >0.999890</td>\n",
|
||
" <td id=\"T_809a5_row3_col3\" class=\"data row3 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row3_col4\" class=\"data row3 col4\" >0.999907</td>\n",
|
||
" <td id=\"T_809a5_row3_col5\" class=\"data row3 col5\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row3_col6\" class=\"data row3 col6\" >0.999890</td>\n",
|
||
" <td id=\"T_809a5_row3_col7\" class=\"data row3 col7\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_809a5_level0_row4\" class=\"row_heading level0 row4\" >random_forest</th>\n",
|
||
" <td id=\"T_809a5_row4_col0\" class=\"data row4 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row4_col1\" class=\"data row4 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row4_col2\" class=\"data row4 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row4_col3\" class=\"data row4 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row4_col4\" class=\"data row4 col4\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row4_col5\" class=\"data row4 col5\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row4_col6\" class=\"data row4 col6\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row4_col7\" class=\"data row4 col7\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_809a5_level0_row5\" class=\"row_heading level0 row5\" >gradient_boosting</th>\n",
|
||
" <td id=\"T_809a5_row5_col0\" class=\"data row5 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row5_col1\" class=\"data row5 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row5_col2\" class=\"data row5 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row5_col3\" class=\"data row5 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row5_col4\" class=\"data row5 col4\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row5_col5\" class=\"data row5 col5\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row5_col6\" class=\"data row5 col6\" >1.000000</td>\n",
|
||
" <td id=\"T_809a5_row5_col7\" class=\"data row5 col7\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_809a5_level0_row6\" class=\"row_heading level0 row6\" >mlp</th>\n",
|
||
" <td id=\"T_809a5_row6_col0\" class=\"data row6 col0\" >0.999507</td>\n",
|
||
" <td id=\"T_809a5_row6_col1\" class=\"data row6 col1\" >0.999562</td>\n",
|
||
" <td id=\"T_809a5_row6_col2\" class=\"data row6 col2\" >0.999836</td>\n",
|
||
" <td id=\"T_809a5_row6_col3\" class=\"data row6 col3\" >0.999562</td>\n",
|
||
" <td id=\"T_809a5_row6_col4\" class=\"data row6 col4\" >0.999722</td>\n",
|
||
" <td id=\"T_809a5_row6_col5\" class=\"data row6 col5\" >0.999629</td>\n",
|
||
" <td id=\"T_809a5_row6_col6\" class=\"data row6 col6\" >0.999671</td>\n",
|
||
" <td id=\"T_809a5_row6_col7\" class=\"data row6 col7\" >0.999562</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_809a5_level0_row7\" class=\"row_heading level0 row7\" >knn</th>\n",
|
||
" <td id=\"T_809a5_row7_col0\" class=\"data row7 col0\" >0.983970</td>\n",
|
||
" <td id=\"T_809a5_row7_col1\" class=\"data row7 col1\" >0.979300</td>\n",
|
||
" <td id=\"T_809a5_row7_col2\" class=\"data row7 col2\" >0.978740</td>\n",
|
||
" <td id=\"T_809a5_row7_col3\" class=\"data row7 col3\" >0.974578</td>\n",
|
||
" <td id=\"T_809a5_row7_col4\" class=\"data row7 col4\" >0.984266</td>\n",
|
||
" <td id=\"T_809a5_row7_col5\" class=\"data row7 col5\" >0.980536</td>\n",
|
||
" <td id=\"T_809a5_row7_col6\" class=\"data row7 col6\" >0.981348</td>\n",
|
||
" <td id=\"T_809a5_row7_col7\" class=\"data row7 col7\" >0.976933</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n"
|
||
],
|
||
"text/plain": [
|
||
"<pandas.io.formats.style.Styler at 0x21f4db75340>"
|
||
]
|
||
},
|
||
"execution_count": 198,
|
||
"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": [
|
||
"ROC-кривая, каппа Коэна, коэффициент корреляции Мэтьюса"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 199,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style type=\"text/css\">\n",
|
||
"#T_b558d_row0_col0, #T_b558d_row0_col1, #T_b558d_row1_col0, #T_b558d_row1_col1, #T_b558d_row2_col0, #T_b558d_row2_col1, #T_b558d_row3_col0, #T_b558d_row3_col1, #T_b558d_row4_col0, #T_b558d_row4_col1, #T_b558d_row5_col0, #T_b558d_row5_col1 {\n",
|
||
" background-color: #a8db34;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_b558d_row0_col2, #T_b558d_row0_col3, #T_b558d_row0_col4, #T_b558d_row1_col2, #T_b558d_row1_col3, #T_b558d_row1_col4, #T_b558d_row2_col2, #T_b558d_row2_col3, #T_b558d_row2_col4, #T_b558d_row3_col2, #T_b558d_row3_col3, #T_b558d_row3_col4, #T_b558d_row4_col2, #T_b558d_row4_col3, #T_b558d_row4_col4, #T_b558d_row5_col2, #T_b558d_row5_col3, #T_b558d_row5_col4 {\n",
|
||
" background-color: #da5a6a;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_b558d_row6_col0, #T_b558d_row6_col1 {\n",
|
||
" background-color: #a2da37;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_b558d_row6_col2 {\n",
|
||
" background-color: #d45270;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_b558d_row6_col3, #T_b558d_row6_col4 {\n",
|
||
" background-color: #d8576b;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_b558d_row7_col0, #T_b558d_row7_col1 {\n",
|
||
" background-color: #26818e;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_b558d_row7_col2, #T_b558d_row7_col3, #T_b558d_row7_col4 {\n",
|
||
" background-color: #4e02a2;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"</style>\n",
|
||
"<table id=\"T_b558d\">\n",
|
||
" <thead>\n",
|
||
" <tr>\n",
|
||
" <th class=\"blank level0\" > </th>\n",
|
||
" <th id=\"T_b558d_level0_col0\" class=\"col_heading level0 col0\" >Accuracy_test</th>\n",
|
||
" <th id=\"T_b558d_level0_col1\" class=\"col_heading level0 col1\" >F1_test</th>\n",
|
||
" <th id=\"T_b558d_level0_col2\" class=\"col_heading level0 col2\" >ROC_AUC_test</th>\n",
|
||
" <th id=\"T_b558d_level0_col3\" class=\"col_heading level0 col3\" >Cohen_kappa_test</th>\n",
|
||
" <th id=\"T_b558d_level0_col4\" class=\"col_heading level0 col4\" >MCC_test</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_b558d_level0_row0\" class=\"row_heading level0 row0\" >logistic</th>\n",
|
||
" <td id=\"T_b558d_row0_col0\" class=\"data row0 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row0_col1\" class=\"data row0 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row0_col2\" class=\"data row0 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row0_col3\" class=\"data row0 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row0_col4\" class=\"data row0 col4\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_b558d_level0_row1\" class=\"row_heading level0 row1\" >ridge</th>\n",
|
||
" <td id=\"T_b558d_row1_col0\" class=\"data row1 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row1_col1\" class=\"data row1 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row1_col2\" class=\"data row1 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row1_col3\" class=\"data row1 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row1_col4\" class=\"data row1 col4\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_b558d_level0_row2\" class=\"row_heading level0 row2\" >decision_tree</th>\n",
|
||
" <td id=\"T_b558d_row2_col0\" class=\"data row2 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row2_col1\" class=\"data row2 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row2_col2\" class=\"data row2 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row2_col3\" class=\"data row2 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row2_col4\" class=\"data row2 col4\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_b558d_level0_row3\" class=\"row_heading level0 row3\" >naive_bayes</th>\n",
|
||
" <td id=\"T_b558d_row3_col0\" class=\"data row3 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row3_col1\" class=\"data row3 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row3_col2\" class=\"data row3 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row3_col3\" class=\"data row3 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row3_col4\" class=\"data row3 col4\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_b558d_level0_row4\" class=\"row_heading level0 row4\" >random_forest</th>\n",
|
||
" <td id=\"T_b558d_row4_col0\" class=\"data row4 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row4_col1\" class=\"data row4 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row4_col2\" class=\"data row4 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row4_col3\" class=\"data row4 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row4_col4\" class=\"data row4 col4\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_b558d_level0_row5\" class=\"row_heading level0 row5\" >gradient_boosting</th>\n",
|
||
" <td id=\"T_b558d_row5_col0\" class=\"data row5 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row5_col1\" class=\"data row5 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row5_col2\" class=\"data row5 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row5_col3\" class=\"data row5 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_b558d_row5_col4\" class=\"data row5 col4\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_b558d_level0_row6\" class=\"row_heading level0 row6\" >mlp</th>\n",
|
||
" <td id=\"T_b558d_row6_col0\" class=\"data row6 col0\" >0.999629</td>\n",
|
||
" <td id=\"T_b558d_row6_col1\" class=\"data row6 col1\" >0.999562</td>\n",
|
||
" <td id=\"T_b558d_row6_col2\" class=\"data row6 col2\" >0.999754</td>\n",
|
||
" <td id=\"T_b558d_row6_col3\" class=\"data row6 col3\" >0.999240</td>\n",
|
||
" <td id=\"T_b558d_row6_col4\" class=\"data row6 col4\" >0.999240</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_b558d_level0_row7\" class=\"row_heading level0 row7\" >knn</th>\n",
|
||
" <td id=\"T_b558d_row7_col0\" class=\"data row7 col0\" >0.980536</td>\n",
|
||
" <td id=\"T_b558d_row7_col1\" class=\"data row7 col1\" >0.976933</td>\n",
|
||
" <td id=\"T_b558d_row7_col2\" class=\"data row7 col2\" >0.995960</td>\n",
|
||
" <td id=\"T_b558d_row7_col3\" class=\"data row7 col3\" >0.960098</td>\n",
|
||
" <td id=\"T_b558d_row7_col4\" class=\"data row7 col4\" >0.960107</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n"
|
||
],
|
||
"text/plain": [
|
||
"<pandas.io.formats.style.Styler at 0x21f49b924b0>"
|
||
]
|
||
},
|
||
"execution_count": 199,
|
||
"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": "code",
|
||
"execution_count": 200,
|
||
"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": 206,
|
||
"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>carat</th>\n",
|
||
" <th>Predicted</th>\n",
|
||
" <th>cut</th>\n",
|
||
" <th>color</th>\n",
|
||
" <th>clarity</th>\n",
|
||
" <th>depth</th>\n",
|
||
" <th>table</th>\n",
|
||
" <th>price</th>\n",
|
||
" <th>x</th>\n",
|
||
" <th>y</th>\n",
|
||
" <th>z</th>\n",
|
||
" <th>above_average_carat</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>id</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
"Empty DataFrame\n",
|
||
"Columns: [carat, Predicted, cut, color, clarity, depth, table, price, x, y, z, above_average_carat]\n",
|
||
"Index: []"
|
||
]
|
||
},
|
||
"execution_count": 206,
|
||
"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[\"above_average_carat\"] != 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": [
|
||
"#### Пример использования обученной модели (конвейера) для предсказания"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 208,
|
||
"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>carat</th>\n",
|
||
" <th>cut</th>\n",
|
||
" <th>color</th>\n",
|
||
" <th>clarity</th>\n",
|
||
" <th>depth</th>\n",
|
||
" <th>table</th>\n",
|
||
" <th>price</th>\n",
|
||
" <th>x</th>\n",
|
||
" <th>y</th>\n",
|
||
" <th>z</th>\n",
|
||
" <th>above_average_carat</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>4500</th>\n",
|
||
" <td>0.9</td>\n",
|
||
" <td>Premium</td>\n",
|
||
" <td>H</td>\n",
|
||
" <td>SI1</td>\n",
|
||
" <td>61.9</td>\n",
|
||
" <td>58.0</td>\n",
|
||
" <td>3629</td>\n",
|
||
" <td>6.2</td>\n",
|
||
" <td>6.15</td>\n",
|
||
" <td>3.82</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" carat cut color clarity depth table price x y z \\\n",
|
||
"4500 0.9 Premium H SI1 61.9 58.0 3629 6.2 6.15 3.82 \n",
|
||
"\n",
|
||
" above_average_carat \n",
|
||
"4500 1 "
|
||
]
|
||
},
|
||
"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>x</th>\n",
|
||
" <th>y</th>\n",
|
||
" <th>Length_to_Width_Ratio</th>\n",
|
||
" <th>carat</th>\n",
|
||
" <th>depth</th>\n",
|
||
" <th>table</th>\n",
|
||
" <th>z</th>\n",
|
||
" <th>above_average_carat</th>\n",
|
||
" <th>cut_Good</th>\n",
|
||
" <th>cut_Ideal</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>color_I</th>\n",
|
||
" <th>color_J</th>\n",
|
||
" <th>clarity_IF</th>\n",
|
||
" <th>clarity_SI1</th>\n",
|
||
" <th>clarity_SI2</th>\n",
|
||
" <th>clarity_VS1</th>\n",
|
||
" <th>clarity_VS2</th>\n",
|
||
" <th>clarity_VVS1</th>\n",
|
||
" <th>clarity_VVS2</th>\n",
|
||
" <th>price</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>4500</th>\n",
|
||
" <td>0.420272</td>\n",
|
||
" <td>0.363352</td>\n",
|
||
" <td>1.156653</td>\n",
|
||
" <td>0.217442</td>\n",
|
||
" <td>0.10618</td>\n",
|
||
" <td>0.245753</td>\n",
|
||
" <td>0.399417</td>\n",
|
||
" <td>1.168162</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>3629.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>1 rows × 26 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" x y Length_to_Width_Ratio carat depth table \\\n",
|
||
"4500 0.420272 0.363352 1.156653 0.217442 0.10618 0.245753 \n",
|
||
"\n",
|
||
" z above_average_carat cut_Good cut_Ideal ... color_I \\\n",
|
||
"4500 0.399417 1.168162 0.0 0.0 ... 0.0 \n",
|
||
"\n",
|
||
" color_J clarity_IF clarity_SI1 clarity_SI2 clarity_VS1 clarity_VS2 \\\n",
|
||
"4500 0.0 0.0 1.0 0.0 0.0 0.0 \n",
|
||
"\n",
|
||
" clarity_VVS1 clarity_VVS2 price \n",
|
||
"4500 0.0 0.0 3629.0 \n",
|
||
"\n",
|
||
"[1 rows x 26 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'predicted: 1 (proba: [4.76016150e-04 9.99523984e-01])'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'real: 1'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"model = class_models[best_model][\"pipeline\"]\n",
|
||
"\n",
|
||
"example_id = 4500\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": 209,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"{'model__criterion': 'gini',\n",
|
||
" 'model__max_depth': 2,\n",
|
||
" 'model__max_features': 'sqrt',\n",
|
||
" 'model__n_estimators': 20}"
|
||
]
|
||
},
|
||
"execution_count": 209,
|
||
"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, 20, 30, 40, 50, 100, 150, 200, 250, 500],\n",
|
||
" \"model__max_features\": [\"sqrt\", \"log2\", 2],\n",
|
||
" \"model__max_depth\": [2, 3, 4, 5, 6, 7, 8, 9 ,10],\n",
|
||
" \"model__criterion\": [\"gini\", \"entropy\", \"log_loss\"],\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": 210,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"optimized_model = ensemble.RandomForestClassifier(\n",
|
||
" random_state=random_state,\n",
|
||
" criterion=\"gini\",\n",
|
||
" max_depth=7,\n",
|
||
" max_features=\"sqrt\",\n",
|
||
" n_estimators=30,\n",
|
||
")\n",
|
||
"\n",
|
||
"result = {}\n",
|
||
"\n",
|
||
"result[\"pipeline\"] = Pipeline([(\"pipeline\", pipeline_end), (\"model\", optimized_model)]).fit(X_train, y_train.values.ravel())\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",
|
||
"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": 211,
|
||
"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": 212,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style type=\"text/css\">\n",
|
||
"#T_703b0_row0_col0, #T_703b0_row0_col1, #T_703b0_row0_col2, #T_703b0_row0_col3, #T_703b0_row1_col0, #T_703b0_row1_col1, #T_703b0_row1_col2, #T_703b0_row1_col3 {\n",
|
||
" background-color: #440154;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_703b0_row0_col4, #T_703b0_row0_col5, #T_703b0_row0_col6, #T_703b0_row0_col7, #T_703b0_row1_col4, #T_703b0_row1_col5, #T_703b0_row1_col6, #T_703b0_row1_col7 {\n",
|
||
" background-color: #0d0887;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"</style>\n",
|
||
"<table id=\"T_703b0\">\n",
|
||
" <thead>\n",
|
||
" <tr>\n",
|
||
" <th class=\"blank level0\" > </th>\n",
|
||
" <th id=\"T_703b0_level0_col0\" class=\"col_heading level0 col0\" >Precision_train</th>\n",
|
||
" <th id=\"T_703b0_level0_col1\" class=\"col_heading level0 col1\" >Precision_test</th>\n",
|
||
" <th id=\"T_703b0_level0_col2\" class=\"col_heading level0 col2\" >Recall_train</th>\n",
|
||
" <th id=\"T_703b0_level0_col3\" class=\"col_heading level0 col3\" >Recall_test</th>\n",
|
||
" <th id=\"T_703b0_level0_col4\" class=\"col_heading level0 col4\" >Accuracy_train</th>\n",
|
||
" <th id=\"T_703b0_level0_col5\" class=\"col_heading level0 col5\" >Accuracy_test</th>\n",
|
||
" <th id=\"T_703b0_level0_col6\" class=\"col_heading level0 col6\" >F1_train</th>\n",
|
||
" <th id=\"T_703b0_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_703b0_level0_row0\" class=\"row_heading level0 row0\" >Old</th>\n",
|
||
" <td id=\"T_703b0_row0_col0\" class=\"data row0 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_703b0_row0_col1\" class=\"data row0 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_703b0_row0_col2\" class=\"data row0 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_703b0_row0_col3\" class=\"data row0 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_703b0_row0_col4\" class=\"data row0 col4\" >1.000000</td>\n",
|
||
" <td id=\"T_703b0_row0_col5\" class=\"data row0 col5\" >1.000000</td>\n",
|
||
" <td id=\"T_703b0_row0_col6\" class=\"data row0 col6\" >1.000000</td>\n",
|
||
" <td id=\"T_703b0_row0_col7\" class=\"data row0 col7\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_703b0_level0_row1\" class=\"row_heading level0 row1\" >New</th>\n",
|
||
" <td id=\"T_703b0_row1_col0\" class=\"data row1 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_703b0_row1_col1\" class=\"data row1 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_703b0_row1_col2\" class=\"data row1 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_703b0_row1_col3\" class=\"data row1 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_703b0_row1_col4\" class=\"data row1 col4\" >1.000000</td>\n",
|
||
" <td id=\"T_703b0_row1_col5\" class=\"data row1 col5\" >1.000000</td>\n",
|
||
" <td id=\"T_703b0_row1_col6\" class=\"data row1 col6\" >1.000000</td>\n",
|
||
" <td id=\"T_703b0_row1_col7\" class=\"data row1 col7\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n"
|
||
],
|
||
"text/plain": [
|
||
"<pandas.io.formats.style.Styler at 0x21f4cb4fe90>"
|
||
]
|
||
},
|
||
"execution_count": 212,
|
||
"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": 213,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style type=\"text/css\">\n",
|
||
"#T_0ba78_row0_col0, #T_0ba78_row0_col1, #T_0ba78_row1_col0, #T_0ba78_row1_col1 {\n",
|
||
" background-color: #440154;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_0ba78_row0_col2, #T_0ba78_row0_col3, #T_0ba78_row0_col4, #T_0ba78_row1_col2, #T_0ba78_row1_col3, #T_0ba78_row1_col4 {\n",
|
||
" background-color: #0d0887;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"</style>\n",
|
||
"<table id=\"T_0ba78\">\n",
|
||
" <thead>\n",
|
||
" <tr>\n",
|
||
" <th class=\"blank level0\" > </th>\n",
|
||
" <th id=\"T_0ba78_level0_col0\" class=\"col_heading level0 col0\" >Accuracy_test</th>\n",
|
||
" <th id=\"T_0ba78_level0_col1\" class=\"col_heading level0 col1\" >F1_test</th>\n",
|
||
" <th id=\"T_0ba78_level0_col2\" class=\"col_heading level0 col2\" >ROC_AUC_test</th>\n",
|
||
" <th id=\"T_0ba78_level0_col3\" class=\"col_heading level0 col3\" >Cohen_kappa_test</th>\n",
|
||
" <th id=\"T_0ba78_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_0ba78_level0_row0\" class=\"row_heading level0 row0\" >Old</th>\n",
|
||
" <td id=\"T_0ba78_row0_col0\" class=\"data row0 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_0ba78_row0_col1\" class=\"data row0 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_0ba78_row0_col2\" class=\"data row0 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_0ba78_row0_col3\" class=\"data row0 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_0ba78_row0_col4\" class=\"data row0 col4\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_0ba78_level0_row1\" class=\"row_heading level0 row1\" >New</th>\n",
|
||
" <td id=\"T_0ba78_row1_col0\" class=\"data row1 col0\" >1.000000</td>\n",
|
||
" <td id=\"T_0ba78_row1_col1\" class=\"data row1 col1\" >1.000000</td>\n",
|
||
" <td id=\"T_0ba78_row1_col2\" class=\"data row1 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_0ba78_row1_col3\" class=\"data row1 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_0ba78_row1_col4\" class=\"data row1 col4\" >1.000000</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n"
|
||
],
|
||
"text/plain": [
|
||
"<pandas.io.formats.style.Styler at 0x21f4cb4ef30>"
|
||
]
|
||
},
|
||
"execution_count": 213,
|
||
"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": 215,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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AAAAAGAhzKQBgJU5XTJlSYfTt684AgBqCHLNEGbSAAAAAMBCKNLg8wYOHKhevXq5v77uuus0cuTIah/H2rVrZbPZlJube942NptNb731luE+J0+erNatW1dqXF9//bVsNpu2b99eqX5QRVxO8zYAPoFcuzByzeLINUMo0uAVAwcOlM1mk81mk91uV2JioqZOnarS0tIq/+w33nhDjzzyiKG2RgIIqFLlN1ibsQGoMuQaYBC5Zgj3pMFrunfvrgULFqioqEjvvPOO0tPTVatWLU2YMOGstsXFxbLb7aZ8bmRkpCn9AADwa+QaALMwkwavCQwMVExMjOLj4zV8+HClpKTo7bfflvTLUo7HHntMsbGxatq0qSTp0KFDuv322xUREaHIyEjdcsst+vrrr919lpWVafTo0YqIiFDdunU1btw4uc640nLmspCioiKNHz9ecXFxCgwMVGJiol5++WV9/fXX6tq1qySpTp06stlsGjhwoCTJ6XRq+vTpSkhIUHBwsFq1aqXXXnvN43PeeecdNWnSRMHBweratavHOI0aP368mjRpotq1a6tx48Z6+OGHVVJScla7F154QXFxcapdu7Zuv/125eXleRyfN2+emjdvrqCgIDVr1kzPP/98hccCL3G6zNsAVCly7beRayDXjGEmDZYRHBysH3/80f31mjVr5HA4tHr1aklSSUmJ0tLSlJycrA8//FABAQF69NFH1b17d33++eey2+2aOXOmMjIyNH/+fDVv3lwzZ87Um2++qeuvv/68n3vXXXcpMzNTs2fPVqtWrXTw4EH98MMPiouL0+uvv64+ffpoz549cjgcCg4OliRNnz5d//nPfzR37lxdeeWVWr9+vfr166f69eurS5cuOnTokHr37q309HQNHTpUW7du1QMPPFDhn0lYWJgyMjIUGxurHTt2aMiQIQoLC9O4cePcbfbt26elS5dq2bJlys/P1+DBg/W3v/1Nr7zyiiTplVde0cSJE/Xss8+qTZs2+vTTTzVkyBCFhIRowIABFR4TqhnvkwFqLHLtbOQayDVjKNLgdS6XS2vWrNGqVat07733uveHhIRo3rx57uUg//nPf+R0OjVv3jzZbDZJ0oIFCxQREaG1a9cqNTVVTz31lCZMmKDevXtLkubOnatVq1ad97O/+uorLV26VKtXr1ZKSookqXHjxu7j5UtIoqKi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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=[\"Less\", \"More\"]\n",
|
||
" ).plot(ax=ax.flat[index])\n",
|
||
"\n",
|
||
"plt.subplots_adjust(top=1, bottom=0, hspace=0.4, wspace=0.3)\n",
|
||
"plt.show()"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3",
|
||
"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.5"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|