3951 lines
411 KiB
Plaintext
3951 lines
411 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Датасет: Цены на акции\n",
|
||
"https://www.kaggle.com/datasets/nancyalaswad90/yamana-gold-inc-stock-Volume\n",
|
||
"##### О наборе данных: \n",
|
||
"Yamana Gold Inc. — это канадская компания, которая занимается разработкой и управлением золотыми, серебряными и медными рудниками, расположенными в Канаде, Чили, Бразилии и Аргентине. Головной офис компании находится в Торонто.\n",
|
||
"\n",
|
||
"Yamana Gold была основана в 1994 году и уже через год была зарегистрирована на фондовой бирже Торонто. В 2007 году она стала участником Нью-Йоркской фондовой биржи, а в 2020 году — Лондонской.\n",
|
||
"В 2003 году компания претерпела значительные изменения: была проведена реструктуризация, в результате которой Питер Марроне занял пост главного исполнительного директора. Кроме того, Yamana объединилась с бразильской компанией Santa Elina Mines Corporation. Благодаря этому слиянию Yamana получила доступ к капиталу, накопленному Santa Elina, что позволило ей начать разработку и эксплуатацию рудника Чапада. Затем компания объединилась с другими организациями, зарегистрированными на бирже TSX: RNC Gold, Desert Sun Mining, Viceroy Exploration, Northern Orion Resources, Meridian Gold, Osisko Mining и Extorre Gold Mines. Каждая из них внесла свой вклад в разработку месторождения или проект, который в итоге был успешно запущен.\n",
|
||
"##### Таким образом:\n",
|
||
"* Объект наблюдения - цены и объемы акций компании\n",
|
||
"* Атрибуты: 'Date', 'Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume'\n",
|
||
"\n",
|
||
"##### Бизнес цели:\n",
|
||
"* Прогнозирование будущей цены акций.(Цены закрытия)\n",
|
||
" Использование данных для создания модели, которая будет предсказывать цену акций компании в будущем. Целевая переменная: Цена закрытия (Close)\n",
|
||
"* Определение волатильности акций.\n",
|
||
" Определение, колебаний цен акций, что поможет инвесторам понять риски. Прогнозировать волатильность акций на основе изменений в ценах открытий, максимума, минимума и объема торгов. Целевая переменная: Разница между высокой и низкой ценой (High - Low). (среднее значение)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 89,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Количество колонок: 7\n",
|
||
"Колонки: Date, Open, High, Low, Close, Adj Close, Volume\n",
|
||
"\n",
|
||
"<class 'pandas.core.frame.DataFrame'>\n",
|
||
"RangeIndex: 5251 entries, 0 to 5250\n",
|
||
"Data columns (total 7 columns):\n",
|
||
" # Column Non-Null Count Dtype \n",
|
||
"--- ------ -------------- ----- \n",
|
||
" 0 Date 5251 non-null datetime64[ns]\n",
|
||
" 1 Open 5251 non-null float64 \n",
|
||
" 2 High 5251 non-null float64 \n",
|
||
" 3 Low 5251 non-null float64 \n",
|
||
" 4 Close 5251 non-null float64 \n",
|
||
" 5 Adj Close 5251 non-null float64 \n",
|
||
" 6 Volume 5251 non-null int64 \n",
|
||
"dtypes: datetime64[ns](1), float64(5), int64(1)\n",
|
||
"memory usage: 287.3 KB\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>Date</th>\n",
|
||
" <th>Open</th>\n",
|
||
" <th>High</th>\n",
|
||
" <th>Low</th>\n",
|
||
" <th>Close</th>\n",
|
||
" <th>Adj Close</th>\n",
|
||
" <th>Volume</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>5246</th>\n",
|
||
" <td>2022-04-29</td>\n",
|
||
" <td>5.66</td>\n",
|
||
" <td>5.69</td>\n",
|
||
" <td>5.50</td>\n",
|
||
" <td>5.51</td>\n",
|
||
" <td>5.51</td>\n",
|
||
" <td>16613300</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5247</th>\n",
|
||
" <td>2022-05-02</td>\n",
|
||
" <td>5.33</td>\n",
|
||
" <td>5.39</td>\n",
|
||
" <td>5.18</td>\n",
|
||
" <td>5.30</td>\n",
|
||
" <td>5.30</td>\n",
|
||
" <td>27106700</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5248</th>\n",
|
||
" <td>2022-05-03</td>\n",
|
||
" <td>5.32</td>\n",
|
||
" <td>5.53</td>\n",
|
||
" <td>5.32</td>\n",
|
||
" <td>5.47</td>\n",
|
||
" <td>5.47</td>\n",
|
||
" <td>18914200</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5249</th>\n",
|
||
" <td>2022-05-04</td>\n",
|
||
" <td>5.47</td>\n",
|
||
" <td>5.61</td>\n",
|
||
" <td>5.37</td>\n",
|
||
" <td>5.60</td>\n",
|
||
" <td>5.60</td>\n",
|
||
" <td>20530700</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5250</th>\n",
|
||
" <td>2022-05-05</td>\n",
|
||
" <td>5.63</td>\n",
|
||
" <td>5.66</td>\n",
|
||
" <td>5.34</td>\n",
|
||
" <td>5.44</td>\n",
|
||
" <td>5.44</td>\n",
|
||
" <td>19879200</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Date Open High Low Close Adj Close Volume\n",
|
||
"5246 2022-04-29 5.66 5.69 5.50 5.51 5.51 16613300\n",
|
||
"5247 2022-05-02 5.33 5.39 5.18 5.30 5.30 27106700\n",
|
||
"5248 2022-05-03 5.32 5.53 5.32 5.47 5.47 18914200\n",
|
||
"5249 2022-05-04 5.47 5.61 5.37 5.60 5.60 20530700\n",
|
||
"5250 2022-05-05 5.63 5.66 5.34 5.44 5.44 19879200"
|
||
]
|
||
},
|
||
"execution_count": 89,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import seaborn as sns\n",
|
||
"from sklearn.metrics import mean_squared_error, r2_score\n",
|
||
"from sklearn.discriminant_analysis import StandardScaler\n",
|
||
"\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.pipeline import Pipeline, FeatureUnion\n",
|
||
"from sklearn.compose import ColumnTransformer\n",
|
||
"from sklearn.impute import SimpleImputer\n",
|
||
"from sklearn.preprocessing import StandardScaler, OneHotEncoder\n",
|
||
"from sklearn.base import BaseEstimator, TransformerMixin\n",
|
||
"\n",
|
||
"from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor\n",
|
||
"from sklearn.neural_network import MLPRegressor\n",
|
||
"\n",
|
||
"df = pd.read_csv(\".//static//csv//Stocks.csv\", sep=\",\")\n",
|
||
"print('Количество колонок: ' + str(df.columns.size)) \n",
|
||
"print('Колонки: ' + ', '.join(df.columns)+'\\n')\n",
|
||
"df['Date'] = pd.to_datetime(df['Date'], errors='coerce')\n",
|
||
"\n",
|
||
"\n",
|
||
"df.info()\n",
|
||
"df.tail()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Подготовка данных:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### 1. Получение сведений о пропущенных данных\n",
|
||
"Типы пропущенных данных:\n",
|
||
"\n",
|
||
"- None - представление пустых данных в Python\n",
|
||
"- NaN - представление пустых данных в Pandas\n",
|
||
"- '' - пустая строка"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 90,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Date 0\n",
|
||
"Open 0\n",
|
||
"High 0\n",
|
||
"Low 0\n",
|
||
"Close 0\n",
|
||
"Adj Close 0\n",
|
||
"Volume 0\n",
|
||
"dtype: int64\n",
|
||
"\n",
|
||
"Date False\n",
|
||
"Open False\n",
|
||
"High False\n",
|
||
"Low False\n",
|
||
"Close False\n",
|
||
"Adj Close False\n",
|
||
"Volume False\n",
|
||
"dtype: bool\n",
|
||
"\n",
|
||
"Количество бесконечных значений в каждом столбце:\n",
|
||
"Date 0\n",
|
||
"Open 0\n",
|
||
"High 0\n",
|
||
"Low 0\n",
|
||
"Close 0\n",
|
||
"Adj Close 0\n",
|
||
"Volume 0\n",
|
||
"dtype: int64\n",
|
||
"Date процент пустых значений: %0.00\n",
|
||
"Open процент пустых значений: %0.00\n",
|
||
"High процент пустых значений: %0.00\n",
|
||
"Low процент пустых значений: %0.00\n",
|
||
"Close процент пустых значений: %0.00\n",
|
||
"Adj Close процент пустых значений: %0.00\n",
|
||
"Volume процент пустых значений: %0.00\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# Количество пустых значений признаков\n",
|
||
"print(df.isnull().sum())\n",
|
||
"print()\n",
|
||
"\n",
|
||
"# Есть ли пустые значения признаков\n",
|
||
"print(df.isnull().any())\n",
|
||
"print()\n",
|
||
"\n",
|
||
"# Проверка на бесконечные значения\n",
|
||
"print(\"Количество бесконечных значений в каждом столбце:\")\n",
|
||
"print(np.isinf(df).sum())\n",
|
||
"\n",
|
||
"# Процент пустых значений признаков\n",
|
||
"for i in df.columns:\n",
|
||
" null_rate = df[i].isnull().sum() / len(df) * 100\n",
|
||
" print(f\"{i} процент пустых значений: %{null_rate:.2f}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Таким образом, пропущенных значений не найдено."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### 2. Проверка выбросов данных и устранение их при наличии:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 91,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"До устранения выбросов:\n",
|
||
"Колонка Open:\n",
|
||
" Есть выбросы: Нет\n",
|
||
" Количество выбросов: 0\n",
|
||
" Минимальное значение: 1.142857\n",
|
||
" Максимальное значение: 20.42\n",
|
||
" 1-й квартиль (Q1): 2.857143\n",
|
||
" 3-й квартиль (Q3): 10.65\n",
|
||
"\n",
|
||
"После устранения выбросов:\n",
|
||
"Колонка Open:\n",
|
||
" Есть выбросы: Нет\n",
|
||
" Количество выбросов: 0\n",
|
||
" Минимальное значение: 1.142857\n",
|
||
" Максимальное значение: 20.42\n",
|
||
" 1-й квартиль (Q1): 2.857143\n",
|
||
" 3-й квартиль (Q3): 10.65\n",
|
||
"\n",
|
||
"До устранения выбросов:\n",
|
||
"Колонка High:\n",
|
||
" Есть выбросы: Нет\n",
|
||
" Количество выбросов: 0\n",
|
||
" Минимальное значение: 1.142857\n",
|
||
" Максимальное значение: 20.59\n",
|
||
" 1-й квартиль (Q1): 2.88\n",
|
||
" 3-й квартиль (Q3): 10.86\n",
|
||
"\n",
|
||
"После устранения выбросов:\n",
|
||
"Колонка High:\n",
|
||
" Есть выбросы: Нет\n",
|
||
" Количество выбросов: 0\n",
|
||
" Минимальное значение: 1.142857\n",
|
||
" Максимальное значение: 20.59\n",
|
||
" 1-й квартиль (Q1): 2.88\n",
|
||
" 3-й квартиль (Q3): 10.86\n",
|
||
"\n",
|
||
"До устранения выбросов:\n",
|
||
"Колонка Low:\n",
|
||
" Есть выбросы: Нет\n",
|
||
" Количество выбросов: 0\n",
|
||
" Минимальное значение: 1.142857\n",
|
||
" Максимальное значение: 20.09\n",
|
||
" 1-й квартиль (Q1): 2.81\n",
|
||
" 3-й квартиль (Q3): 10.425\n",
|
||
"\n",
|
||
"После устранения выбросов:\n",
|
||
"Колонка Low:\n",
|
||
" Есть выбросы: Нет\n",
|
||
" Количество выбросов: 0\n",
|
||
" Минимальное значение: 1.142857\n",
|
||
" Максимальное значение: 20.09\n",
|
||
" 1-й квартиль (Q1): 2.81\n",
|
||
" 3-й квартиль (Q3): 10.425\n",
|
||
"\n",
|
||
"До устранения выбросов:\n",
|
||
"Колонка Close:\n",
|
||
" Есть выбросы: Нет\n",
|
||
" Количество выбросов: 0\n",
|
||
" Минимальное значение: 1.142857\n",
|
||
" Максимальное значение: 20.389999\n",
|
||
" 1-й квартиль (Q1): 2.857143\n",
|
||
" 3-й квартиль (Q3): 10.64\n",
|
||
"\n",
|
||
"После устранения выбросов:\n",
|
||
"Колонка Close:\n",
|
||
" Есть выбросы: Нет\n",
|
||
" Количество выбросов: 0\n",
|
||
" Минимальное значение: 1.142857\n",
|
||
" Максимальное значение: 20.389999\n",
|
||
" 1-й квартиль (Q1): 2.857143\n",
|
||
" 3-й квартиль (Q3): 10.64\n",
|
||
"\n",
|
||
"До устранения выбросов:\n",
|
||
"Колонка Adj Close:\n",
|
||
" Есть выбросы: Нет\n",
|
||
" Количество выбросов: 0\n",
|
||
" Минимальное значение: 0.935334\n",
|
||
" Максимальное значение: 17.543156\n",
|
||
" 1-й квартиль (Q1): 2.537094\n",
|
||
" 3-й квартиль (Q3): 8.951944999999998\n",
|
||
"\n",
|
||
"После устранения выбросов:\n",
|
||
"Колонка Adj Close:\n",
|
||
" Есть выбросы: Нет\n",
|
||
" Количество выбросов: 0\n",
|
||
" Минимальное значение: 0.935334\n",
|
||
" Максимальное значение: 17.543156\n",
|
||
" 1-й квартиль (Q1): 2.537094\n",
|
||
" 3-й квартиль (Q3): 8.951944999999998\n",
|
||
"\n",
|
||
"До устранения выбросов:\n",
|
||
"Колонка Volume:\n",
|
||
" Есть выбросы: Да\n",
|
||
" Количество выбросов: 95\n",
|
||
" Минимальное значение: 0\n",
|
||
" Максимальное значение: 76714000\n",
|
||
" 1-й квартиль (Q1): 2845900.0\n",
|
||
" 3-й квартиль (Q3): 13272450.0\n",
|
||
"\n",
|
||
"После устранения выбросов:\n",
|
||
"Колонка Volume:\n",
|
||
" Есть выбросы: Нет\n",
|
||
" Количество выбросов: 0\n",
|
||
" Минимальное значение: 0.0\n",
|
||
" Максимальное значение: 28912275.0\n",
|
||
" 1-й квартиль (Q1): 2845900.0\n",
|
||
" 3-й квартиль (Q3): 13272450.0\n",
|
||
"\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"numeric_columns = ['Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume']\n",
|
||
"\n",
|
||
"for column in numeric_columns:\n",
|
||
" if pd.api.types.is_numeric_dtype(df[column]): # Проверяем, является ли колонка числовой\n",
|
||
" q1 = df[column].quantile(0.25) # Находим 1-й квартиль (Q1)\n",
|
||
" q3 = df[column].quantile(0.75) # Находим 3-й квартиль (Q3)\n",
|
||
" iqr = q3 - q1 # Вычисляем межквартильный размах (IQR)\n",
|
||
"\n",
|
||
" # Определяем границы для выбросов\n",
|
||
" lower_bound = q1 - 1.5 * iqr # Нижняя граница\n",
|
||
" upper_bound = q3 + 1.5 * iqr # Верхняя граница\n",
|
||
"\n",
|
||
" # Подсчитываем количество выбросов\n",
|
||
" outliers = df[(df[column] < lower_bound) | (df[column] > upper_bound)]\n",
|
||
" outlier_count = outliers.shape[0]\n",
|
||
"\n",
|
||
" print(\"До устранения выбросов:\")\n",
|
||
" print(f\"Колонка {column}:\")\n",
|
||
" print(f\" Есть выбросы: {'Да' if outlier_count > 0 else 'Нет'}\")\n",
|
||
" print(f\" Количество выбросов: {outlier_count}\")\n",
|
||
" print(f\" Минимальное значение: {df[column].min()}\")\n",
|
||
" print(f\" Максимальное значение: {df[column].max()}\")\n",
|
||
" print(f\" 1-й квартиль (Q1): {q1}\")\n",
|
||
" print(f\" 3-й квартиль (Q3): {q3}\\n\")\n",
|
||
"\n",
|
||
" # Устраняем выбросы: заменяем значения ниже нижней границы на саму нижнюю границу, а выше верхней — на верхнюю\n",
|
||
" if outlier_count != 0:\n",
|
||
" df[column] = df[column].apply(lambda x: lower_bound if x < lower_bound else upper_bound if x > upper_bound else x)\n",
|
||
" \n",
|
||
" # Подсчитываем количество выбросов\n",
|
||
" outliers = df[(df[column] < lower_bound) | (df[column] > upper_bound)]\n",
|
||
" outlier_count = outliers.shape[0]\n",
|
||
"\n",
|
||
" print(\"После устранения выбросов:\")\n",
|
||
" print(f\"Колонка {column}:\")\n",
|
||
" print(f\" Есть выбросы: {'Да' if outlier_count > 0 else 'Нет'}\")\n",
|
||
" print(f\" Количество выбросов: {outlier_count}\")\n",
|
||
" print(f\" Минимальное значение: {df[column].min()}\")\n",
|
||
" print(f\" Максимальное значение: {df[column].max()}\")\n",
|
||
" print(f\" 1-й квартиль (Q1): {q1}\")\n",
|
||
" print(f\" 3-й квартиль (Q3): {q3}\\n\")\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Выбросы присутствовали, но мы их устранили."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Разбиение на выборки:\n",
|
||
"\n",
|
||
"Разобьем наш набор на обучающую, контрольную и тестовую выборки для устранения проблемы просачивания данных.\n",
|
||
"Разделим на два варианта - набор для первой бизнес цели - его будем применять для решения задаи регрессии. И набор для второй бизнес цели - его используем для решения задач классификации."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 92,
|
||
"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>Open</th>\n",
|
||
" <th>High</th>\n",
|
||
" <th>Low</th>\n",
|
||
" <th>Close</th>\n",
|
||
" <th>Volume</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>4789</th>\n",
|
||
" <td>5.66</td>\n",
|
||
" <td>5.73</td>\n",
|
||
" <td>5.47</td>\n",
|
||
" <td>5.560000</td>\n",
|
||
" <td>23355100.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3469</th>\n",
|
||
" <td>3.86</td>\n",
|
||
" <td>3.93</td>\n",
|
||
" <td>3.81</td>\n",
|
||
" <td>3.880000</td>\n",
|
||
" <td>7605300.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2503</th>\n",
|
||
" <td>12.19</td>\n",
|
||
" <td>12.28</td>\n",
|
||
" <td>11.95</td>\n",
|
||
" <td>12.020000</td>\n",
|
||
" <td>7243200.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1580</th>\n",
|
||
" <td>11.77</td>\n",
|
||
" <td>11.84</td>\n",
|
||
" <td>11.53</td>\n",
|
||
" <td>11.570000</td>\n",
|
||
" <td>3025900.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2759</th>\n",
|
||
" <td>15.77</td>\n",
|
||
" <td>16.17</td>\n",
|
||
" <td>15.76</td>\n",
|
||
" <td>16.120001</td>\n",
|
||
" <td>6113400.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",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3092</th>\n",
|
||
" <td>9.57</td>\n",
|
||
" <td>9.87</td>\n",
|
||
" <td>9.30</td>\n",
|
||
" <td>9.750000</td>\n",
|
||
" <td>7283100.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3772</th>\n",
|
||
" <td>4.76</td>\n",
|
||
" <td>4.97</td>\n",
|
||
" <td>4.67</td>\n",
|
||
" <td>4.930000</td>\n",
|
||
" <td>12920800.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5191</th>\n",
|
||
" <td>4.18</td>\n",
|
||
" <td>4.29</td>\n",
|
||
" <td>4.17</td>\n",
|
||
" <td>4.200000</td>\n",
|
||
" <td>11192400.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5226</th>\n",
|
||
" <td>5.58</td>\n",
|
||
" <td>5.68</td>\n",
|
||
" <td>5.55</td>\n",
|
||
" <td>5.580000</td>\n",
|
||
" <td>12692800.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>860</th>\n",
|
||
" <td>3.18</td>\n",
|
||
" <td>3.19</td>\n",
|
||
" <td>3.13</td>\n",
|
||
" <td>3.180000</td>\n",
|
||
" <td>99100.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>4200 rows × 5 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Open High Low Close Volume\n",
|
||
"4789 5.66 5.73 5.47 5.560000 23355100.0\n",
|
||
"3469 3.86 3.93 3.81 3.880000 7605300.0\n",
|
||
"2503 12.19 12.28 11.95 12.020000 7243200.0\n",
|
||
"1580 11.77 11.84 11.53 11.570000 3025900.0\n",
|
||
"2759 15.77 16.17 15.76 16.120001 6113400.0\n",
|
||
"... ... ... ... ... ...\n",
|
||
"3092 9.57 9.87 9.30 9.750000 7283100.0\n",
|
||
"3772 4.76 4.97 4.67 4.930000 12920800.0\n",
|
||
"5191 4.18 4.29 4.17 4.200000 11192400.0\n",
|
||
"5226 5.58 5.68 5.55 5.580000 12692800.0\n",
|
||
"860 3.18 3.19 3.13 3.180000 99100.0\n",
|
||
"\n",
|
||
"[4200 rows x 5 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>Volatility</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>4789</th>\n",
|
||
" <td>0.046763</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3469</th>\n",
|
||
" <td>0.030928</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2503</th>\n",
|
||
" <td>0.027454</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1580</th>\n",
|
||
" <td>0.026793</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2759</th>\n",
|
||
" <td>0.025434</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3092</th>\n",
|
||
" <td>0.058462</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3772</th>\n",
|
||
" <td>0.060852</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5191</th>\n",
|
||
" <td>0.028571</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5226</th>\n",
|
||
" <td>0.023297</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>860</th>\n",
|
||
" <td>0.018868</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>4200 rows × 1 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Volatility\n",
|
||
"4789 0.046763\n",
|
||
"3469 0.030928\n",
|
||
"2503 0.027454\n",
|
||
"1580 0.026793\n",
|
||
"2759 0.025434\n",
|
||
"... ...\n",
|
||
"3092 0.058462\n",
|
||
"3772 0.060852\n",
|
||
"5191 0.028571\n",
|
||
"5226 0.023297\n",
|
||
"860 0.018868\n",
|
||
"\n",
|
||
"[4200 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>Open</th>\n",
|
||
" <th>High</th>\n",
|
||
" <th>Low</th>\n",
|
||
" <th>Close</th>\n",
|
||
" <th>Volume</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>1437</th>\n",
|
||
" <td>13.710000</td>\n",
|
||
" <td>14.000000</td>\n",
|
||
" <td>13.670000</td>\n",
|
||
" <td>13.940000</td>\n",
|
||
" <td>7623200.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2700</th>\n",
|
||
" <td>15.520000</td>\n",
|
||
" <td>15.720000</td>\n",
|
||
" <td>15.300000</td>\n",
|
||
" <td>15.320000</td>\n",
|
||
" <td>6098800.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3647</th>\n",
|
||
" <td>1.870000</td>\n",
|
||
" <td>1.930000</td>\n",
|
||
" <td>1.830000</td>\n",
|
||
" <td>1.830000</td>\n",
|
||
" <td>10980000.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2512</th>\n",
|
||
" <td>11.260000</td>\n",
|
||
" <td>11.470000</td>\n",
|
||
" <td>11.260000</td>\n",
|
||
" <td>11.320000</td>\n",
|
||
" <td>5029300.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2902</th>\n",
|
||
" <td>16.379999</td>\n",
|
||
" <td>16.580000</td>\n",
|
||
" <td>16.250000</td>\n",
|
||
" <td>16.549999</td>\n",
|
||
" <td>5485800.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",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3095</th>\n",
|
||
" <td>9.290000</td>\n",
|
||
" <td>9.350000</td>\n",
|
||
" <td>9.070000</td>\n",
|
||
" <td>9.130000</td>\n",
|
||
" <td>5861400.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>859</th>\n",
|
||
" <td>3.090000</td>\n",
|
||
" <td>3.160000</td>\n",
|
||
" <td>3.040000</td>\n",
|
||
" <td>3.100000</td>\n",
|
||
" <td>211300.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3134</th>\n",
|
||
" <td>8.550000</td>\n",
|
||
" <td>8.770000</td>\n",
|
||
" <td>8.550000</td>\n",
|
||
" <td>8.770000</td>\n",
|
||
" <td>5335400.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2577</th>\n",
|
||
" <td>16.709999</td>\n",
|
||
" <td>17.070000</td>\n",
|
||
" <td>16.379999</td>\n",
|
||
" <td>16.400000</td>\n",
|
||
" <td>14524400.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>378</th>\n",
|
||
" <td>2.571429</td>\n",
|
||
" <td>2.571429</td>\n",
|
||
" <td>2.571429</td>\n",
|
||
" <td>2.571429</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>1051 rows × 5 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Open High Low Close Volume\n",
|
||
"1437 13.710000 14.000000 13.670000 13.940000 7623200.0\n",
|
||
"2700 15.520000 15.720000 15.300000 15.320000 6098800.0\n",
|
||
"3647 1.870000 1.930000 1.830000 1.830000 10980000.0\n",
|
||
"2512 11.260000 11.470000 11.260000 11.320000 5029300.0\n",
|
||
"2902 16.379999 16.580000 16.250000 16.549999 5485800.0\n",
|
||
"... ... ... ... ... ...\n",
|
||
"3095 9.290000 9.350000 9.070000 9.130000 5861400.0\n",
|
||
"859 3.090000 3.160000 3.040000 3.100000 211300.0\n",
|
||
"3134 8.550000 8.770000 8.550000 8.770000 5335400.0\n",
|
||
"2577 16.709999 17.070000 16.379999 16.400000 14524400.0\n",
|
||
"378 2.571429 2.571429 2.571429 2.571429 0.0\n",
|
||
"\n",
|
||
"[1051 rows x 5 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>Volatility</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>1437</th>\n",
|
||
" <td>0.023673</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2700</th>\n",
|
||
" <td>0.027415</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3647</th>\n",
|
||
" <td>0.054645</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2512</th>\n",
|
||
" <td>0.018551</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2902</th>\n",
|
||
" <td>0.019940</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3095</th>\n",
|
||
" <td>0.030668</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>859</th>\n",
|
||
" <td>0.038710</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3134</th>\n",
|
||
" <td>0.025086</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2577</th>\n",
|
||
" <td>0.042073</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>378</th>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>1051 rows × 1 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Volatility\n",
|
||
"1437 0.023673\n",
|
||
"2700 0.027415\n",
|
||
"3647 0.054645\n",
|
||
"2512 0.018551\n",
|
||
"2902 0.019940\n",
|
||
"... ...\n",
|
||
"3095 0.030668\n",
|
||
"859 0.038710\n",
|
||
"3134 0.025086\n",
|
||
"2577 0.042073\n",
|
||
"378 0.000000\n",
|
||
"\n",
|
||
"[1051 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",
|
||
"df['Volatility'] = (df['High'] - df['Low']) / df['Close']\n",
|
||
"\n",
|
||
"def split_into_train_test(\n",
|
||
" df_input: DataFrame,\n",
|
||
" target_colname: str = \"Volatility\",\n",
|
||
" frac_train: float = 0.8,\n",
|
||
" random_state: int = None,\n",
|
||
") -> Tuple[DataFrame, DataFrame, DataFrame, DataFrame]:\n",
|
||
" \n",
|
||
" if not (0 < frac_train < 1):\n",
|
||
" raise ValueError(\"Fraction must be between 0 and 1.\")\n",
|
||
" \n",
|
||
" # Проверка наличия целевого признака\n",
|
||
" if target_colname not in df_input.columns:\n",
|
||
" raise ValueError(f\"{target_colname} is not a column in the DataFrame.\")\n",
|
||
" \n",
|
||
" # Разделяем данные на признаки и целевую переменную\n",
|
||
" X = df_input.drop(columns=[target_colname]) # Признаки\n",
|
||
" y = df_input[[target_colname]] # Целевая переменная\n",
|
||
"\n",
|
||
" # Удаляем указанные столбцы из X\n",
|
||
" columns_to_remove = [\"Date\", \"Adj Close\", \"Volatility\"]\n",
|
||
" X = X.drop(columns=columns_to_remove, errors='ignore') # Игнорировать ошибку, если столбцы не найдены\n",
|
||
"\n",
|
||
" # Разделяем данные на обучающую и тестовую выборки\n",
|
||
" X_train, X_test, y_train, y_test = train_test_split(\n",
|
||
" X, y,\n",
|
||
" test_size=(1.0 - frac_train),\n",
|
||
" random_state=random_state\n",
|
||
" )\n",
|
||
" \n",
|
||
" return X_train, X_test, y_train, y_test\n",
|
||
"\n",
|
||
"# Применение функции для разделения данных\n",
|
||
"X_train, X_test, y_train, y_test = split_into_train_test(\n",
|
||
" df, \n",
|
||
" target_colname=\"Volatility\", \n",
|
||
" frac_train=0.8, \n",
|
||
" random_state=42\n",
|
||
")\n",
|
||
"\n",
|
||
"# Для отображения результатов\n",
|
||
"display(\"X_train\", X_train)\n",
|
||
"display(\"y_train\", y_train)\n",
|
||
"\n",
|
||
"display(\"X_test\", X_test)\n",
|
||
"display(\"y_test\", y_test)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 93,
|
||
"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>Open</th>\n",
|
||
" <th>High</th>\n",
|
||
" <th>Low</th>\n",
|
||
" <th>Volume</th>\n",
|
||
" <th>Volatility</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>4789</th>\n",
|
||
" <td>5.66</td>\n",
|
||
" <td>5.73</td>\n",
|
||
" <td>5.47</td>\n",
|
||
" <td>23355100.0</td>\n",
|
||
" <td>0.046763</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3469</th>\n",
|
||
" <td>3.86</td>\n",
|
||
" <td>3.93</td>\n",
|
||
" <td>3.81</td>\n",
|
||
" <td>7605300.0</td>\n",
|
||
" <td>0.030928</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2503</th>\n",
|
||
" <td>12.19</td>\n",
|
||
" <td>12.28</td>\n",
|
||
" <td>11.95</td>\n",
|
||
" <td>7243200.0</td>\n",
|
||
" <td>0.027454</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1580</th>\n",
|
||
" <td>11.77</td>\n",
|
||
" <td>11.84</td>\n",
|
||
" <td>11.53</td>\n",
|
||
" <td>3025900.0</td>\n",
|
||
" <td>0.026793</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2759</th>\n",
|
||
" <td>15.77</td>\n",
|
||
" <td>16.17</td>\n",
|
||
" <td>15.76</td>\n",
|
||
" <td>6113400.0</td>\n",
|
||
" <td>0.025434</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3092</th>\n",
|
||
" <td>9.57</td>\n",
|
||
" <td>9.87</td>\n",
|
||
" <td>9.30</td>\n",
|
||
" <td>7283100.0</td>\n",
|
||
" <td>0.058462</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3772</th>\n",
|
||
" <td>4.76</td>\n",
|
||
" <td>4.97</td>\n",
|
||
" <td>4.67</td>\n",
|
||
" <td>12920800.0</td>\n",
|
||
" <td>0.060852</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5191</th>\n",
|
||
" <td>4.18</td>\n",
|
||
" <td>4.29</td>\n",
|
||
" <td>4.17</td>\n",
|
||
" <td>11192400.0</td>\n",
|
||
" <td>0.028571</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5226</th>\n",
|
||
" <td>5.58</td>\n",
|
||
" <td>5.68</td>\n",
|
||
" <td>5.55</td>\n",
|
||
" <td>12692800.0</td>\n",
|
||
" <td>0.023297</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>860</th>\n",
|
||
" <td>3.18</td>\n",
|
||
" <td>3.19</td>\n",
|
||
" <td>3.13</td>\n",
|
||
" <td>99100.0</td>\n",
|
||
" <td>0.018868</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>4200 rows × 5 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Open High Low Volume Volatility\n",
|
||
"4789 5.66 5.73 5.47 23355100.0 0.046763\n",
|
||
"3469 3.86 3.93 3.81 7605300.0 0.030928\n",
|
||
"2503 12.19 12.28 11.95 7243200.0 0.027454\n",
|
||
"1580 11.77 11.84 11.53 3025900.0 0.026793\n",
|
||
"2759 15.77 16.17 15.76 6113400.0 0.025434\n",
|
||
"... ... ... ... ... ...\n",
|
||
"3092 9.57 9.87 9.30 7283100.0 0.058462\n",
|
||
"3772 4.76 4.97 4.67 12920800.0 0.060852\n",
|
||
"5191 4.18 4.29 4.17 11192400.0 0.028571\n",
|
||
"5226 5.58 5.68 5.55 12692800.0 0.023297\n",
|
||
"860 3.18 3.19 3.13 99100.0 0.018868\n",
|
||
"\n",
|
||
"[4200 rows x 5 columns]"
|
||
]
|
||
},
|
||
"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>Close</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4195</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4196</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4197</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4198</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4199</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>4200 rows × 1 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Close\n",
|
||
"0 1\n",
|
||
"1 1\n",
|
||
"2 0\n",
|
||
"3 0\n",
|
||
"4 0\n",
|
||
"... ...\n",
|
||
"4195 1\n",
|
||
"4196 1\n",
|
||
"4197 1\n",
|
||
"4198 1\n",
|
||
"4199 1\n",
|
||
"\n",
|
||
"[4200 rows x 1 columns]"
|
||
]
|
||
},
|
||
"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>Open</th>\n",
|
||
" <th>High</th>\n",
|
||
" <th>Low</th>\n",
|
||
" <th>Volume</th>\n",
|
||
" <th>Volatility</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>1437</th>\n",
|
||
" <td>13.710000</td>\n",
|
||
" <td>14.000000</td>\n",
|
||
" <td>13.670000</td>\n",
|
||
" <td>7623200.0</td>\n",
|
||
" <td>0.023673</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2700</th>\n",
|
||
" <td>15.520000</td>\n",
|
||
" <td>15.720000</td>\n",
|
||
" <td>15.300000</td>\n",
|
||
" <td>6098800.0</td>\n",
|
||
" <td>0.027415</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3647</th>\n",
|
||
" <td>1.870000</td>\n",
|
||
" <td>1.930000</td>\n",
|
||
" <td>1.830000</td>\n",
|
||
" <td>10980000.0</td>\n",
|
||
" <td>0.054645</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2512</th>\n",
|
||
" <td>11.260000</td>\n",
|
||
" <td>11.470000</td>\n",
|
||
" <td>11.260000</td>\n",
|
||
" <td>5029300.0</td>\n",
|
||
" <td>0.018551</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2902</th>\n",
|
||
" <td>16.379999</td>\n",
|
||
" <td>16.580000</td>\n",
|
||
" <td>16.250000</td>\n",
|
||
" <td>5485800.0</td>\n",
|
||
" <td>0.019940</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3095</th>\n",
|
||
" <td>9.290000</td>\n",
|
||
" <td>9.350000</td>\n",
|
||
" <td>9.070000</td>\n",
|
||
" <td>5861400.0</td>\n",
|
||
" <td>0.030668</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>859</th>\n",
|
||
" <td>3.090000</td>\n",
|
||
" <td>3.160000</td>\n",
|
||
" <td>3.040000</td>\n",
|
||
" <td>211300.0</td>\n",
|
||
" <td>0.038710</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3134</th>\n",
|
||
" <td>8.550000</td>\n",
|
||
" <td>8.770000</td>\n",
|
||
" <td>8.550000</td>\n",
|
||
" <td>5335400.0</td>\n",
|
||
" <td>0.025086</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2577</th>\n",
|
||
" <td>16.709999</td>\n",
|
||
" <td>17.070000</td>\n",
|
||
" <td>16.379999</td>\n",
|
||
" <td>14524400.0</td>\n",
|
||
" <td>0.042073</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>378</th>\n",
|
||
" <td>2.571429</td>\n",
|
||
" <td>2.571429</td>\n",
|
||
" <td>2.571429</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>1051 rows × 5 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Open High Low Volume Volatility\n",
|
||
"1437 13.710000 14.000000 13.670000 7623200.0 0.023673\n",
|
||
"2700 15.520000 15.720000 15.300000 6098800.0 0.027415\n",
|
||
"3647 1.870000 1.930000 1.830000 10980000.0 0.054645\n",
|
||
"2512 11.260000 11.470000 11.260000 5029300.0 0.018551\n",
|
||
"2902 16.379999 16.580000 16.250000 5485800.0 0.019940\n",
|
||
"... ... ... ... ... ...\n",
|
||
"3095 9.290000 9.350000 9.070000 5861400.0 0.030668\n",
|
||
"859 3.090000 3.160000 3.040000 211300.0 0.038710\n",
|
||
"3134 8.550000 8.770000 8.550000 5335400.0 0.025086\n",
|
||
"2577 16.709999 17.070000 16.379999 14524400.0 0.042073\n",
|
||
"378 2.571429 2.571429 2.571429 0.0 0.000000\n",
|
||
"\n",
|
||
"[1051 rows x 5 columns]"
|
||
]
|
||
},
|
||
"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>Close</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1046</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1047</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1048</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1049</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1050</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>1051 rows × 1 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Close\n",
|
||
"0 0\n",
|
||
"1 0\n",
|
||
"2 1\n",
|
||
"3 0\n",
|
||
"4 0\n",
|
||
"... ...\n",
|
||
"1046 1\n",
|
||
"1047 1\n",
|
||
"1048 1\n",
|
||
"1049 0\n",
|
||
"1050 1\n",
|
||
"\n",
|
||
"[1051 rows x 1 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"import numpy as np\n",
|
||
"from IPython.display import display\n",
|
||
"from sklearn.preprocessing import LabelEncoder\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from typing import Tuple\n",
|
||
"from pandas import DataFrame\n",
|
||
"\n",
|
||
"def split_into_train_close_test(\n",
|
||
" df_input: DataFrame,\n",
|
||
" target_colname: str = \"Close\",\n",
|
||
" frac_train: float = 0.8,\n",
|
||
" random_state: int = None,\n",
|
||
") -> Tuple[DataFrame, DataFrame, DataFrame, DataFrame]:\n",
|
||
" \n",
|
||
" if not (0 < frac_train < 1):\n",
|
||
" raise ValueError(\"Fraction must be between 0 and 1.\")\n",
|
||
" \n",
|
||
" # Проверка наличия целевого признака\n",
|
||
" if target_colname not in df_input.columns:\n",
|
||
" raise ValueError(f\"{target_colname} is not a column in the DataFrame.\")\n",
|
||
" \n",
|
||
" # Разделяем данные на признаки и целевую переменную\n",
|
||
" X = df_input.drop(columns=[target_colname]) # Признаки\n",
|
||
" \n",
|
||
" # Преобразование целевой переменной в категориальную\n",
|
||
" bins = [-np.inf, 10, np.inf]\n",
|
||
" labels = ['low', 'high']\n",
|
||
" y = pd.cut(df_input[target_colname], bins=bins, labels=labels) # Целевая переменная\n",
|
||
" \n",
|
||
" # Преобразование целевой переменной в числовые значения\n",
|
||
" label_encoder = LabelEncoder()\n",
|
||
" y_encoded = label_encoder.fit_transform(y) # Интеграция, чтобы вернуть числовые метки\n",
|
||
" \n",
|
||
" # Удаляем указанные столбцы из X\n",
|
||
" columns_to_remove = [\"Date\", \"Adj Close\", \"Close\"]\n",
|
||
" X = X.drop(columns=columns_to_remove, errors='ignore') # Игнорировать ошибку, если столбцы не найдены\n",
|
||
"\n",
|
||
" # Разделяем данные на обучающую и тестовую выборки\n",
|
||
" X_train_close, X_test_close, y_train_close, y_test_close = train_test_split(\n",
|
||
" X, y_encoded,\n",
|
||
" test_size=(1.0 - frac_train),\n",
|
||
" random_state=random_state\n",
|
||
" )\n",
|
||
" \n",
|
||
" # Конвертируем y_train_close и y_test_close в DataFrame\n",
|
||
" y_train_close = pd.DataFrame(y_train_close, columns=[target_colname])\n",
|
||
" y_test_close = pd.DataFrame(y_test_close, columns=[target_colname])\n",
|
||
"\n",
|
||
" return X_train_close, X_test_close, y_train_close, y_test_close\n",
|
||
"\n",
|
||
"# Применение функции для разделения данных\n",
|
||
"X_train_close, X_test_close, y_train_close, y_test_close = split_into_train_close_test(\n",
|
||
" df, \n",
|
||
" target_colname=\"Close\", \n",
|
||
" frac_train=0.8, \n",
|
||
" random_state=42\n",
|
||
")\n",
|
||
"\n",
|
||
"# Для отображения результатов\n",
|
||
"display(X_train_close)\n",
|
||
"display(y_train_close)\n",
|
||
"display(X_test_close)\n",
|
||
"display(y_test_close)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"##### Определение достижимого уровня качества модели"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 94,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Baseline Volatility MSE: 0.0002712979238081643\n",
|
||
"Baseline Volatility R^2: 0.6636185388238924\n",
|
||
"Baseline Close MSE: 0.04753452157168089\n",
|
||
"Baseline Close R^2: 0.764076420247305\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# Оценка базовых моделей (можно использовать, например, линейную регрессию как базу)\n",
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"\n",
|
||
"\n",
|
||
"baseline_model = LinearRegression()\n",
|
||
"baseline_model.fit(X_train, y_train)\n",
|
||
"baseline = baseline_model.predict(X_test)\n",
|
||
"\n",
|
||
"# Оценка качества\n",
|
||
"print(f'Baseline Volatility MSE: {mean_squared_error(y_test, baseline)}')\n",
|
||
"print(f'Baseline Volatility R^2: {r2_score(y_test, baseline)}')\n",
|
||
"\n",
|
||
"baseline_model_close = LinearRegression()\n",
|
||
"baseline_model_close.fit(X_train_close, y_train_close)\n",
|
||
"baseline_close = baseline_model_close.predict(X_test_close)\n",
|
||
"\n",
|
||
"print(f'Baseline Close MSE: {mean_squared_error(y_test_close, baseline_close)}')\n",
|
||
"print(f'Baseline Close R^2: {r2_score(y_test_close, baseline_close)}')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**Цена:**\n",
|
||
"- MSE: 0.0475— Этот показатель говорит о том, что в среднем модель делает небольшую ошибку в предсказании цен.\n",
|
||
"- R²: 0.6636 — Это значение указывает на то, что модель объясняет только около 66% вариации волатильности.\n",
|
||
"\n",
|
||
"**Волатильность:**\n",
|
||
"- MSE: 0.00027183 — Как и в случае с ценами, это значение может показаться малым, однако из-за низкого значения волатильности в финансовых данных даже небольшие ошибки могут иметь значение.\n",
|
||
"- R²: 0.6629 — Это значение указывает на то, что модель объясняет только около 66% вариации волатильности."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### **Создадим конвейер:**\n",
|
||
"##### Конвейеры позволяют автоматизировать следующие процессы:\n",
|
||
"1. Предобработка данных.\n",
|
||
"2. Конструирование признаков.\n",
|
||
"3. Понижение размерности признакового пространства.\n",
|
||
"4. Обучение модели.\n",
|
||
"\n",
|
||
"\n",
|
||
"##### Используемые конвейеры:\n",
|
||
"1. preprocessing_num -- конвейер для обработки числовых данных: заполнение пропущенных значений и стандартизация\n",
|
||
"\n",
|
||
"2. preprocessing_cat -- конвейер для обработки категориальных данных: заполнение пропущенных данных и унитарное кодирование\n",
|
||
"\n",
|
||
"3. features_preprocessing -- трансформер для предобработки признаков\n",
|
||
"\n",
|
||
"4. features_engineering -- трансформер для конструирования признаков\n",
|
||
"\n",
|
||
"5. drop_columns -- трансформер для удаления колонок\n",
|
||
"\n",
|
||
"6. pipeline_end -- основной конвейер предобработки данных и конструирования признаков"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 95,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"from sklearn.base import BaseEstimator, TransformerMixin\n",
|
||
"from sklearn.compose import ColumnTransformer\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"from sklearn.impute import SimpleImputer\n",
|
||
"from sklearn.pipeline import Pipeline\n",
|
||
"from sklearn.preprocessing import OneHotEncoder\n",
|
||
"from sklearn.ensemble import RandomForestRegressor # Пример регрессионной модели\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.pipeline import make_pipeline\n",
|
||
"\n",
|
||
"class StocksFeatures(BaseEstimator, TransformerMixin):\n",
|
||
" def __init__(self):\n",
|
||
" pass\n",
|
||
" \n",
|
||
" def fit(self, X, y=None):\n",
|
||
" return self\n",
|
||
"\n",
|
||
" def transform(self, X, y=None):\n",
|
||
" X[\"Range\"] = X[\"High\"] - X[\"Low\"]\n",
|
||
" return X\n",
|
||
"\n",
|
||
" def get_feature_names_out(self, features_in):\n",
|
||
" return np.append(features_in, [\"Range\"], axis=0)\n",
|
||
"\n",
|
||
"num_columns = [\"Open\", \"High\", \"Low\", \"Close\", \"Volume\"]\n",
|
||
"\n",
|
||
"# Определяем предобработку для численных данных\n",
|
||
"num_imputer = SimpleImputer(strategy=\"median\")\n",
|
||
"num_scaler = StandardScaler()\n",
|
||
"preprocessing_num = Pipeline(\n",
|
||
" [\n",
|
||
" (\"imputer\", num_imputer),\n",
|
||
" (\"scaler\", num_scaler),\n",
|
||
" ]\n",
|
||
")\n",
|
||
"\n",
|
||
"# У категориальных данных нет, оставляем пустым\n",
|
||
"cat_columns = []\n",
|
||
"\n",
|
||
"# Подготовка признаков с использованием ColumnTransformer\n",
|
||
"features_preprocessing = ColumnTransformer(\n",
|
||
" verbose_feature_names_out=False,\n",
|
||
" transformers=[\n",
|
||
" (\"preprocessing_num\", preprocessing_num, num_columns),\n",
|
||
" ],\n",
|
||
" remainder=\"passthrough\"\n",
|
||
")\n",
|
||
"\n",
|
||
"# Выделим целевую переменную\n",
|
||
"y_train = y_train.values.reshape(-1, 1) # Убедимся, что y_train - это 2D массив\n",
|
||
"\n",
|
||
"# Создание окончательного конвейера\n",
|
||
"pipeline = Pipeline(steps=[\n",
|
||
" ('feature_engineering', StocksFeatures()),\n",
|
||
" ('imputer', SimpleImputer(strategy='median')),\n",
|
||
" ('scaler', StandardScaler())\n",
|
||
"]\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Применим конвейер\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 96,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" Open High Low Close Volume Range\n",
|
||
"0 -0.264188 -0.270892 -0.278887 -0.282602 1.986714 -0.037298\n",
|
||
"1 -0.642218 -0.642866 -0.634425 -0.636104 -0.197546 -0.634720\n",
|
||
"2 1.107219 1.082683 1.108998 1.076697 -0.247763 0.261413\n",
|
||
"3 1.019012 0.991756 1.019043 0.982009 -0.832639 0.176067\n",
|
||
"4 1.859078 1.886561 1.925023 1.939410 -0.404450 0.602796\n",
|
||
"... ... ... ... ... ... ...\n",
|
||
"4195 0.556976 0.584650 0.541422 0.599049 -0.242230 1.285564\n",
|
||
"4196 -0.453203 -0.427948 -0.450230 -0.415165 0.539634 0.133394\n",
|
||
"4197 -0.575013 -0.568471 -0.557320 -0.568770 0.299931 -0.634720\n",
|
||
"4198 -0.280990 -0.281224 -0.261752 -0.278393 0.508014 -0.592047\n",
|
||
"4199 -0.785029 -0.795789 -0.780067 -0.783396 -1.238542 -0.890757\n",
|
||
"\n",
|
||
"[4200 rows x 6 columns]\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# Применяем конвейер к X_train\n",
|
||
"preprocessing_result = pipeline.fit_transform(X_train)\n",
|
||
"\n",
|
||
"# Формируем новый датафрейм с обработанными данными\n",
|
||
"preprocessed_df = pd.DataFrame(\n",
|
||
" preprocessing_result, \n",
|
||
" columns=pipeline.get_feature_names_out(input_features=num_columns),\n",
|
||
")\n",
|
||
"\n",
|
||
"# Выводим обработанный датафрейм\n",
|
||
"print(preprocessed_df)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### **Для начала разберемся с задачей регрессии:**\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Обучение сводится к минимизации средней ошибки отклонения полученного\n",
|
||
"целевого признака от реального значения целевого признака для всей выборки.\n",
|
||
"\n",
|
||
"Регрессия (аппроксимация).\n",
|
||
"Получение значения из области значений целевого признака."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Выберем регрессонные модели, а именно:\n",
|
||
"1. Рандомный лес\n",
|
||
"2. Гребневая регрессия\n",
|
||
"3. Градиентный бустинг\n",
|
||
"\n",
|
||
"Настроим гиперпараметры для каждой модели."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 97,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\model_selection\\_validation.py:540: FitFailedWarning: \n",
|
||
"27 fits failed out of a total of 54.\n",
|
||
"The score on these train-test partitions for these parameters will be set to nan.\n",
|
||
"If these failures are not expected, you can try to debug them by setting error_score='raise'.\n",
|
||
"\n",
|
||
"Below are more details about the failures:\n",
|
||
"--------------------------------------------------------------------------------\n",
|
||
"27 fits failed with the following error:\n",
|
||
"Traceback (most recent call last):\n",
|
||
" File \"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\model_selection\\_validation.py\", line 888, in _fit_and_score\n",
|
||
" estimator.fit(X_train, y_train, **fit_params)\n",
|
||
" File \"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py\", line 1466, in wrapper\n",
|
||
" estimator._validate_params()\n",
|
||
" File \"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py\", line 666, in _validate_params\n",
|
||
" validate_parameter_constraints(\n",
|
||
" File \"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\_param_validation.py\", line 95, in validate_parameter_constraints\n",
|
||
" raise InvalidParameterError(\n",
|
||
"sklearn.utils._param_validation.InvalidParameterError: The 'max_features' parameter of RandomForestRegressor must be an int in the range [1, inf), a float in the range (0.0, 1.0], a str among {'sqrt', 'log2'} or None. Got 'auto' instead.\n",
|
||
"\n",
|
||
" warnings.warn(some_fits_failed_message, FitFailedWarning)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\numpy\\ma\\core.py:2881: RuntimeWarning: invalid value encountered in cast\n",
|
||
" _data = np.array(data, dtype=dtype, copy=copy,\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\model_selection\\_search.py:1103: UserWarning: One or more of the test scores are non-finite: [ nan nan nan -3.60510202e-05\n",
|
||
" -3.51521700e-05 -3.55224330e-05 nan nan\n",
|
||
" nan -5.23951976e-05 -5.06082610e-05 -5.35685939e-05\n",
|
||
" nan nan nan -3.75406904e-05\n",
|
||
" -3.50578578e-05 -3.44782270e-05]\n",
|
||
" warnings.warn(\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.model_selection import GridSearchCV\n",
|
||
"from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor\n",
|
||
"from sklearn.linear_model import Ridge\n",
|
||
"from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score\n",
|
||
"from sklearn.pipeline import Pipeline\n",
|
||
"import pandas as pd\n",
|
||
"\n",
|
||
"# 1. Настройка гиперпараметров для каждой модели\n",
|
||
"# Random Forest hyperparameters\n",
|
||
"rf_params = {\n",
|
||
" 'n_estimators': [50, 100, 200],\n",
|
||
" 'max_features': ['auto', 'sqrt'],\n",
|
||
" 'max_depth': [None, 10, 20],\n",
|
||
"}\n",
|
||
"\n",
|
||
"# Ridge hyperparameters\n",
|
||
"ridge_params = {\n",
|
||
" 'alpha': [0.1, 1.0, 10.0],\n",
|
||
"}\n",
|
||
"\n",
|
||
"# Gradient Boosting hyperparameters\n",
|
||
"gb_params = {\n",
|
||
" 'n_estimators': [50, 100],\n",
|
||
" 'learning_rate': [0.01, 0.1],\n",
|
||
" 'max_depth': [3, 5],\n",
|
||
"}\n",
|
||
"\n",
|
||
"# Curate a function for model training and evaluation\n",
|
||
"def train_and_evaluate_model(model, param_grid, X_train, y_train):\n",
|
||
" grid_search = GridSearchCV(model, param_grid, scoring='neg_mean_squared_error', cv=3)\n",
|
||
" grid_search.fit(X_train, y_train)\n",
|
||
" return grid_search.best_estimator_, grid_search.best_params_\n",
|
||
"\n",
|
||
"# Исходные данные после преобразования (Pipeline применения)\n",
|
||
"X_train_transformed = pipeline.fit_transform(X_train)\n",
|
||
"\n",
|
||
"# Обучение моделей с подбором гиперпараметров\n",
|
||
"rf_model, rf_params = train_and_evaluate_model(RandomForestRegressor(), rf_params, X_train_transformed, y_train)\n",
|
||
"ridge_model, ridge_params = train_and_evaluate_model(Ridge(), ridge_params, X_train_transformed, y_train)\n",
|
||
"gb_model, gb_params = train_and_evaluate_model(GradientBoostingRegressor(), gb_params, X_train_transformed, y_train)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Обучим модели на преобразованных данных:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 98,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:668: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True) # TODO: Is this still required?\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style>#sk-container-id-5 {\n",
|
||
" /* Definition of color scheme common for light and dark mode */\n",
|
||
" --sklearn-color-text: black;\n",
|
||
" --sklearn-color-line: gray;\n",
|
||
" /* Definition of color scheme for unfitted estimators */\n",
|
||
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
|
||
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
|
||
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
|
||
" --sklearn-color-unfitted-level-3: chocolate;\n",
|
||
" /* Definition of color scheme for fitted estimators */\n",
|
||
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
|
||
" --sklearn-color-fitted-level-1: #d4ebff;\n",
|
||
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
|
||
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
|
||
"\n",
|
||
" /* Specific color for light theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-icon: #696969;\n",
|
||
"\n",
|
||
" @media (prefers-color-scheme: dark) {\n",
|
||
" /* Redefinition of color scheme for dark theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-icon: #878787;\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 pre {\n",
|
||
" padding: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 input.sk-hidden--visually {\n",
|
||
" border: 0;\n",
|
||
" clip: rect(1px 1px 1px 1px);\n",
|
||
" clip: rect(1px, 1px, 1px, 1px);\n",
|
||
" height: 1px;\n",
|
||
" margin: -1px;\n",
|
||
" overflow: hidden;\n",
|
||
" padding: 0;\n",
|
||
" position: absolute;\n",
|
||
" width: 1px;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-dashed-wrapped {\n",
|
||
" border: 1px dashed var(--sklearn-color-line);\n",
|
||
" margin: 0 0.4em 0.5em 0.4em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" padding-bottom: 0.4em;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-container {\n",
|
||
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
|
||
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
|
||
" so we also need the `!important` here to be able to override the\n",
|
||
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
|
||
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
|
||
" display: inline-block !important;\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-text-repr-fallback {\n",
|
||
" display: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-parallel-item,\n",
|
||
"div.sk-serial,\n",
|
||
"div.sk-item {\n",
|
||
" /* draw centered vertical line to link estimators */\n",
|
||
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
|
||
" background-size: 2px 100%;\n",
|
||
" background-repeat: no-repeat;\n",
|
||
" background-position: center center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Parallel-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-parallel-item::after {\n",
|
||
" content: \"\";\n",
|
||
" width: 100%;\n",
|
||
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
|
||
" flex-grow: 1;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-parallel {\n",
|
||
" display: flex;\n",
|
||
" align-items: stretch;\n",
|
||
" justify-content: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-parallel-item {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-parallel-item:first-child::after {\n",
|
||
" align-self: flex-end;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-parallel-item:last-child::after {\n",
|
||
" align-self: flex-start;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-parallel-item:only-child::after {\n",
|
||
" width: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Serial-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-serial {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
" align-items: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" padding-right: 1em;\n",
|
||
" padding-left: 1em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
|
||
"clickable and can be expanded/collapsed.\n",
|
||
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
|
||
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
|
||
"*/\n",
|
||
"\n",
|
||
"/* Pipeline and ColumnTransformer style (default) */\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-toggleable {\n",
|
||
" /* Default theme specific background. It is overwritten whether we have a\n",
|
||
" specific estimator or a Pipeline/ColumnTransformer */\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable label */\n",
|
||
"#sk-container-id-5 label.sk-toggleable__label {\n",
|
||
" cursor: pointer;\n",
|
||
" display: block;\n",
|
||
" width: 100%;\n",
|
||
" margin-bottom: 0;\n",
|
||
" padding: 0.5em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 label.sk-toggleable__label-arrow:before {\n",
|
||
" /* Arrow on the left of the label */\n",
|
||
" content: \"▸\";\n",
|
||
" float: left;\n",
|
||
" margin-right: 0.25em;\n",
|
||
" color: var(--sklearn-color-icon);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 label.sk-toggleable__label-arrow:hover:before {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable content - dropdown */\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-toggleable__content {\n",
|
||
" max-height: 0;\n",
|
||
" max-width: 0;\n",
|
||
" overflow: hidden;\n",
|
||
" text-align: left;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-toggleable__content.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-toggleable__content pre {\n",
|
||
" margin: 0.2em;\n",
|
||
" border-radius: 0.25em;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-toggleable__content.fitted pre {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
|
||
" /* Expand drop-down */\n",
|
||
" max-height: 200px;\n",
|
||
" max-width: 100%;\n",
|
||
" overflow: auto;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
|
||
" content: \"▾\";\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Pipeline/ColumnTransformer-specific style */\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific style */\n",
|
||
"\n",
|
||
"/* Colorize estimator box */\n",
|
||
"#sk-container-id-5 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-label label.sk-toggleable__label,\n",
|
||
"#sk-container-id-5 div.sk-label label {\n",
|
||
" /* The background is the default theme color */\n",
|
||
" color: var(--sklearn-color-text-on-default-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover, darken the color of the background */\n",
|
||
"#sk-container-id-5 div.sk-label:hover label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Label box, darken color on hover, fitted */\n",
|
||
"#sk-container-id-5 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator label */\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-label label {\n",
|
||
" font-family: monospace;\n",
|
||
" font-weight: bold;\n",
|
||
" display: inline-block;\n",
|
||
" line-height: 1.2em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-label-container {\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific */\n",
|
||
"#sk-container-id-5 div.sk-estimator {\n",
|
||
" font-family: monospace;\n",
|
||
" border: 1px dotted var(--sklearn-color-border-box);\n",
|
||
" border-radius: 0.25em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" margin-bottom: 0.5em;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-estimator.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* on hover */\n",
|
||
"#sk-container-id-5 div.sk-estimator:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-estimator.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
|
||
"\n",
|
||
"/* Common style for \"i\" and \"?\" */\n",
|
||
"\n",
|
||
".sk-estimator-doc-link,\n",
|
||
"a:link.sk-estimator-doc-link,\n",
|
||
"a:visited.sk-estimator-doc-link {\n",
|
||
" float: right;\n",
|
||
" font-size: smaller;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1em;\n",
|
||
" height: 1em;\n",
|
||
" width: 1em;\n",
|
||
" text-decoration: none !important;\n",
|
||
" margin-left: 1ex;\n",
|
||
" /* unfitted */\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted,\n",
|
||
"a:link.sk-estimator-doc-link.fitted,\n",
|
||
"a:visited.sk-estimator-doc-link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Span, style for the box shown on hovering the info icon */\n",
|
||
".sk-estimator-doc-link span {\n",
|
||
" display: none;\n",
|
||
" z-index: 9999;\n",
|
||
" position: relative;\n",
|
||
" font-weight: normal;\n",
|
||
" right: .2ex;\n",
|
||
" padding: .5ex;\n",
|
||
" margin: .5ex;\n",
|
||
" width: min-content;\n",
|
||
" min-width: 20ex;\n",
|
||
" max-width: 50ex;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" box-shadow: 2pt 2pt 4pt #999;\n",
|
||
" /* unfitted */\n",
|
||
" background: var(--sklearn-color-unfitted-level-0);\n",
|
||
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted span {\n",
|
||
" /* fitted */\n",
|
||
" background: var(--sklearn-color-fitted-level-0);\n",
|
||
" border: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link:hover span {\n",
|
||
" display: block;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
|
||
"\n",
|
||
"#sk-container-id-5 a.estimator_doc_link {\n",
|
||
" float: right;\n",
|
||
" font-size: 1rem;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1rem;\n",
|
||
" height: 1rem;\n",
|
||
" width: 1rem;\n",
|
||
" text-decoration: none;\n",
|
||
" /* unfitted */\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 a.estimator_doc_link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"#sk-container-id-5 a.estimator_doc_link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 a.estimator_doc_link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"</style><div id=\"sk-container-id-5\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GradientBoostingRegressor(max_depth=5)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-5\" type=\"checkbox\" checked><label for=\"sk-estimator-id-5\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> GradientBoostingRegressor<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html\">?<span>Documentation for GradientBoostingRegressor</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GradientBoostingRegressor(max_depth=5)</pre></div> </div></div></div></div>"
|
||
],
|
||
"text/plain": [
|
||
"GradientBoostingRegressor(max_depth=5)"
|
||
]
|
||
},
|
||
"execution_count": 98,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Обучение с использованием лучших моделей\n",
|
||
"rf_model.fit(X_train_transformed, y_train)\n",
|
||
"ridge_model.fit(X_train_transformed, y_train)\n",
|
||
"gb_model.fit(X_train_transformed, y_train)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Оценка моделей:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 99,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" Model MAE MSE R2\n",
|
||
"0 Random Forest 0.001764 0.000026 0.967882\n",
|
||
"1 Ridge 0.010975 0.000271 0.663739\n",
|
||
"2 Gradient Boosting 0.000987 0.000004 0.995060\n",
|
||
"Лучшая модель: Gradient Boosting\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# Оценка качества и получение предсказаний для тестового набора\n",
|
||
"X_test_transformed = pipeline.transform(X_test)\n",
|
||
"\n",
|
||
"models = [rf_model, ridge_model, gb_model]\n",
|
||
"model_names = ['Random Forest', 'Ridge', 'Gradient Boosting']\n",
|
||
"\n",
|
||
"results = []\n",
|
||
"for model, name in zip(models, model_names):\n",
|
||
" predictions = model.predict(X_test_transformed)\n",
|
||
" mae = mean_absolute_error(y_test, predictions)\n",
|
||
" mse = mean_squared_error(y_test, predictions)\n",
|
||
" r2 = r2_score(y_test, predictions)\n",
|
||
" \n",
|
||
" results.append({\n",
|
||
" 'Model': name,\n",
|
||
" 'MAE': mae,\n",
|
||
" 'MSE': mse,\n",
|
||
" 'R2': r2\n",
|
||
" })\n",
|
||
"\n",
|
||
"results_df = pd.DataFrame(results)\n",
|
||
"print(results_df)\n",
|
||
"\n",
|
||
"# Определение наилучшей модели по метрике R²\n",
|
||
"best_model_info = results_df.loc[results_df['R2'].idxmax()]\n",
|
||
"best_model_name = best_model_info['Model']\n",
|
||
"best_model = models[results_df['R2'].idxmax()]\n",
|
||
"\n",
|
||
"print(f'Лучшая модель: {best_model_name}')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Оценим смещение и дисперсию для модели с лучшей оценкой:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 100,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Bias: 0.0014630506389881025, Variance: 0.0006564383445844139\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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FocPH8bMmTPve+79nofFfb0rFi9e7HR74cKFACC/qe7VqxeUSiWio6NzvEYkScrxJnPDhg2oW7cu6tWrd8/77d27N27cuIFFixblOHb3/XTo0AEAEBgYiFmzZmHNmjXYtm2bfFypVEIQBKffkxcvXsxXJbm7n7+F6as48TVdtl/TRABHrojuqVatWvj666/Rt29f1K9fHwMGDECjRo1gsViwe/dufPPNN06jR4Djk8GuXbs6lWIHHL+0sz355JNYvXo1DAYDGjRogJiYGPz222+oUKFCrnF89913qFixojwt8K+//sKIESNcfjwKhQLLli1D9+7d0bBhQwwePBjVqlXD1atXsWPHDvj4+OSYWphfV65cgUajued0Fh8fHyxZsgQvv/wyWrRogX79+qFSpUq4dOkStmzZgnbt2uX6Juxu27Ztw1dffSUvqM7NggUL0L59e7Ro0QJDhw5FSEgILl68iC1btuDgwYMuP74DBw6gYsWKGDNmjMvXFpWDBw/Cy8sLNpsNsbGxWLVqFZ5++ulcp3GdOHECkydPxqBBg/DUU08BcOzl0qxZM7z11ltYv359nvezdOlS/Pnnn2jRogV8fHxw/PhxLF26FFWrVsWjjz7qctxPPvkkNm3ahGeffRY9evTAhQsX8Omnn6JBgwa5Jvn38/LLL2P9+vV44403sGPHDrRr1w52ux0nT57E+vXrsXXr1vuOqORl27ZteO211/K11jA/z8PivN4VFy5cQM+ePdGtWzfExMRgzZo1eOGFF+Ty3bVq1cIHH3yA8ePH4+LFi3jmmWfg7e2NCxcu4Ntvv8XQoUPx3nvv4fz585g9ezb27duHXr16Yc2aNfJ97N+/H4CjcE2NGjUQGhqKAQMGYNWqVRg1ahT27duHDh06ICMjA7/99hveeustPP3007nGO3ToUHz99dd44403cPToUej1evTo0QMfffQRunXrhhdeeAGJiYlYvHgxwsLCcPjwYfna/Dx/89tXceNr2qG8vKaJACZXRPfVs2dPHD58GHPmzMH333+PJUuWQKvVokmTJvi///u/HHPRH374YbRp0wbR0dG4dOkSGjRogBUrVqBJkybyOR9//DGUSiW++uorZGVloV27dvjtt9/QtWvXXGMYOXIkAECj0aBGjRqIjIzEhAkTCvR4OnXqhJiYGEybNg2LFi1Ceno6qlSpgoiICLz++usF6jPbm2++ed81GC+88AICAwPx4YcfYs6cOTCbzahWrRo6dOiAwYMH5+t+mjVrhv79+9/znKZNm2LPnj2YPHkylixZgqysLAQHB6NPnz75fTg5TJw40aWiG0Vt+vTpABxr06pVq4Y333zTKWnPZrfbMXDgQFSsWBHz58+X22vXro2ZM2fi3Xffxfr16/P8WdStWxerV6/Gjz/+iMzMTFStWhX9+vXDhAkTXK6eCTg2Q42Pj8dnn32GrVu3okGDBlizZg2++eabHBvO5odCocB3332HefPmYdWqVfj222+h1+sRGhqKd999N1/T2vLi4eFx32mf2fLzPCzO612xbt06REZGYty4cVCpVHj77bcxZ84cp3PGjRuHOnXqYN68efLzKigoCI8//jh69uwJAPjzzz/x2WefAXBUGNy0aVOO+5oxYwZq166N0NBQKJVK/PTTT5g+fTq+/vprbNy4ERUqVED79u3RuHHjPOMVBAFLly5F06ZNMWnSJHz00Ufo3LkzvvjiC3z44YcYMWIEQkJCMGvWLFy8eNEpIcrP8ze/fRU3vqYdystrmggABKmgc2SIKAdBEDBs2LB8jb4QERW3KVOmIDo6GklJSU5rJwtqxYoVmDJlilzQIjedOnXCoEGDcozqExE9CLjmioiIiIiIqAgwuSIiIqJ8qVWrFp599tl7nvPYY4/JlUGJiB40XHNFRERE+dKhQwe5ql9eJk6cWELREBGVPlxzRUREREREVAQ4LZCIiIiIiKgIMLkiIiIiIiIqAlxzlQtRFHHt2jV4e3vnuUs6ERERERGVf5IkIS0tDYGBgVAo7j02xeQqF9euXUNQUJC7wyAiIiIiolLi8uXLqF69+j3PYXKVi+zdyi9fvgwfHx83R0NERERERO5iNBoRFBQk5wj3wuQqF9lTAX18fJhcERERERFRvpYLsaAFERERERFREWByRUREREREVASYXBERERERERUBrrkqIEmSYLPZYLfb3R0KlUNKpRIqlYpbARARERGVIUyuCsBiseD69eswmUzuDoXKMb1ej6pVq0Kj0bg7FCIiIiLKByZXLhJFERcuXIBSqURgYCA0Gg1HF6hISZIEi8WCpKQkXLhwAbVr177vhnVERERE5H5MrlxksVggiiKCgoKg1+vdHQ6VUx4eHlCr1YiLi4PFYoFOp3N3SERERER0H/w4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7VpMmzYNp06dkttnzpyJIUOG8P2tG7h15Eqj0SA8PBzbt2+X20RRxPbt29GmTZt89yOKIsxmMwAgJCQEVapUcerTaDRi7969LvVJRERERFQa2Ww2rF69Gg0aNMBLL73klFh16NABK1euhEajcWOEDy63jlwBwKhRozBw4EC0bNkSrVu3xvz585GRkYHBgwcDAAYMGIBq1aph5syZAByZeMuWLVGrVi2YzWb89NNPWL16NZYsWQIAEAQBI0aMwAcffIDatWsjJCQEkydPRmBgIJ555hl3PUwiIiIiokKx2Wz46quv8MEHH+Ds2bNOxzp27IgpU6agU6dOnPrnRm5Prvr27YukpCRERkYiPj4ezZo1wy+//CIXpLh06ZLTztAZGRl46623cOXKFXh4eKBevXpYs2YN+vbtK58zZswYZGRkYOjQoUhJSUH79u3xyy+/QKfTlfjjIyIiIiIqComJiXj99dflGVsA0KlTJ0RFRaFTp07uC4xkbt/nqjTiPldEREREVBoNHz4cixYtQufOnREVFSVvR0TFp8zsc0VERERERM4sFguWLVuGiIgIpKenOx0bP348/vzzT2zfvp2JVSnE5IqIiIiIqBSwWCz4/PPPUadOHbz22mvYt2+fXFcgW2BgIDp06OCmCOl+3L7mioiIiIjoQWaxWLB8+XLMmDEDly5dcjp2+PBhN0VFBcGRKyIiIiIiNzCbzViyZAnCwsLwxhtvOCVW3bp1Q0xMDFavXu3GCMlVHLkiIiIiIiphMTEx6NOnD65cueLU/sQTTyAyMhIRERFuiowKg8kVEREREVEJCwsLQ3Jysny7R48eiIyMROvWrd0YFRUWpwUSERERERWjzMxM7N2716mtUqVKePvtt/HUU09h//79+PHHH5lYlQPc5yoX3OeKiIiIiAorMzMTn332GWbNmoXMzExcvHgRvr6+8nFRFKFQcKyjtOM+V0REREREbmIymTBv3jyEhoZi5MiRiI+PR2pqKj7++GOn85hYlT9cc0VEREREVAQyMjLw6aefYs6cOUhISHA61qtXLzzzzDPuCYxKDJMrIiIiIqJCyMjIwJIlSzBnzhwkJiY6HXvuuecwefJkNGnSxE3RUUlickVEREREVAgLFy7E+PHj5duCIMhJVePGjd0YGZU0TvQkIiIiIiqEN954AwaDAYIgoG/fvjhy5AjWr1/PxOoBxJErIiIiIqJ8SEtLw6JFiyBJEiZMmCC3+/r64ssvv0S9evXQoEEDN0ZI7sZS7LlgKXYiIiIiymY0GrFw4UJ89NFHSE5Ohl6vx4ULFxAQEODu0KgEsBQ7EREREVEhpaamYtq0aahZsyYmTZqE5ORkAEBWVha2b9/u5uioNOK0QCIiIiKiO6SkpODjjz/G/PnzkZKSIrcrFAq8+OKLmDRpEurUqeO+AKnUYnJFRERERHTbxx9/jKioKKSmpsptSqUSL730EiZOnIjatWu7MToq7ZhcERERERHdZrVa5cRKqVRiwIABmDBhAsLCwtwcGZUFLGiRCxa0ICIiIir/kpOTIYoiKlasKLdlZGSgTp066N69OyZMmIDQ0FA3RkilAQtaEBERERHl4ebNm5g4cSJq1qyJqKgop2Oenp44c+YMli1bxsSKXMaRq1xw5IqIiIio/Llx4wY++ugjLFy4EOnp6QAAjUaDc+fOoXr16m6OjkorV3IDrrkiIiIionItKSkJ//d//4dFixYhIyNDbler1Rg8eDBUKr4lpqLBZxIRERERlUuJiYmYO3cuFi9eDJPJJLdrNBq8+uqrGDduHGrUqOHGCKm8YXJFREREROWOJEno2LEjTp06JbdpNBoMGTIE48aNQ1BQkBujo/KKBS2IiIiIqNwRBAHvvPMOAECr1eLtt9/GuXPnsHjxYiZWVGw4ckVEREREZdr169cxe/ZsDBs2zGk/qldffRVXr17FsGHDEBgY6MYI6UHB5IqIiIiIyqRr165h1qxZ+Pzzz5GVlYWUlBQsX75cPq7VajF9+nQ3RkgPGk4LJCIiIqIy5erVqxg+fDhCQ0OxYMECZGVlAQA2btyI1NRUN0dHDzImV0RERERUJly5cgVvv/02QkNDsWjRIpjNZgCAh4cHRo8ejTNnzsBgMLg5SnqQcVogEREREZVqRqMR48ePx7Jly2CxWOR2vV6PYcOG4b333kNAQIAbIyRyYHJFRERERKWaXq/H1q1b5cTK09NTTqoqVark5uiI/sNpgURERERUqty8edPptkqlwsSJE+Hl5YVx48bh4sWLmDVrFhMrKnWYXBERERFRqXDx4kUMHToUgYGBOHr0qNOxl156CRcuXMDMmTNRsWJFN0VIdG9MroiIiIjIrc6fP48hQ4agdu3aWLp0KSwWC6ZNm+Z0jlqtZlJFpR7XXBERERGRW5w/fx7Tp0/HypUrYbfb5XYfHx/Ur18fkiRBEAQ3RkjkGiZXRERERFSizp49i+nTp2P16tVOSZXBYMC7776LESNGwM/Pz40REhUMkysiIiIiKjH79+9HmzZtnJIqX19fjBgxAu+++y58fX3dFxxRITG5IiIiIqISEx4ejnr16uHYsWPw9fXFqFGj8M4773DzXyoXmFwRERERUbE4efIktmzZgtGjR8ttCoUCM2bMwOHDhzF8+HAmVVSuCJIkSe4OorQxGo0wGAxITU2Fj4+Pu8MhIiIiKlNOnDiBadOmYe3atZAkCfv370fLli3dHRZRgbiSG7AUOxEREREViePHj6N///5o2LAh/ve//yH7M/x58+a5OTKiksFpgURERERUKEePHsW0adPwzTff4M5JURUrVsR7772HYcOGuTE6opLD5IqIiIiICuTEiROIjIzEhg0bnNorVaqE999/H2+++Sa8vLzcFB1RySsV0wIXL16MmjVrQqfTISIiAvv27cvz3KVLl6JDhw7w8/ODn58funTpkuP8QYMGQRAEp69u3boV98MgIiIieqCcP3/eKbEKCAjA3LlzceHCBbz//vtMrOiB4/bkat26dRg1ahSioqJw4MABNG3aFF27dkViYmKu5+/cuRP9+/fHjh07EBMTg6CgIDz++OO4evWq03ndunXD9evX5a///e9/JfFwiIiIiMots9nsdPuJJ55Ay5YtUblyZXz00Ue4cOECRo8eDU9PTzdFSORebq8WGBERgVatWmHRokUAAFEUERQUhOHDh2PcuHH3vd5ut8PPzw+LFi3CgAEDADhGrlJSUvDdd98VKCZWCyQiIiL6z7///ovo6Gikp6fjt99+czp27tw5VK1aFXq93k3RERWvMlMt0GKxIDY2Fl26dJHbFAoFunTpgpiYmHz1YTKZYLVa4e/v79S+c+dOBAQEoG7dunjzzTdx8+bNPPswm80wGo1OX0REREQPutjYWPTs2RMtWrTA999/j+3bt+Ovv/5yOqdWrVpMrIhuc2tydePGDdjtdlSuXNmpvXLlyoiPj89XH2PHjkVgYKBTgtatWzesWrUK27dvx6xZs/DHH3+ge/fusNvtufYxc+ZMGAwG+SsoKKjgD4qIiIiojPvnn3/w1FNPoWXLlti8ebPcHhgYiOTkZDdGRg8CUZRwMt6Ivedv4mS8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9+45ZggRkXsV68gVEREREbnuwoUL6N+/P0RRlNsiIiIwZcoUdO3alUkVUTlQoE2E7/XiT05OLlRAREREROVRrVq18MILL2DNmjVo06YNoqKi8PjjjzOpIipHXE6usisCSpKEN998E1OnTkVAQEBRx0VERERUJtntdqxduxYrV67Ejz/+CI1GIx+bMmUKBgwYgC5dujCpIiqHCrXmytvbG4cOHUJoaGhRxuR2XHNFRERErrLZbPjf//6HDz74AKdPnwYAfPbZZxg6dKibIyOiwnAlN2ApGiIiIqJCsNlsWLlyJRo0aIABAwbIiRUA/PXXX26MjIhKWqGTKw5pExER0YPIZrNhxYoVqFevHgYNGoQzZ87Ixzp16oQdO3Zg9erVboyQiEqay2uuevXqJX+flZWFN954A56ennLbpk2biiYyIiIiolJq9+7dePnll3H+/Hmn9s6dOyMqKgodO3Z0U2RE5E4uJ1cGg0H+/qWXXirSYIiIiIjKgurVq+Py5cvy7UcffRRRUVHo0KGDG6MiInfjJsK5YEELIiIiymaxWHD69Gk0atTIqf2NN97A+fPnERUVhXbt2rkpOiIqbsW+ibDNZsPOnTtx7tw5vPDCC/D29sa1a9fg4+MDLy+vAgVNREREVJpYLBYsX74cM2bMgNlsxvnz56HX6+XjCxcuhFqtdmOERFTauJxcxcXFoVu3brh06RLMZjMee+wxeHt7Y9asWTCbzfj000+LI04iIiKiEmE2m/Hll19i5syZTlP/Pv/8c4wYMUK+zcSKiO7mcrXAd999Fy1btsStW7fg4eEhtz/77LPYvn17kQZHREREVFKysrKwePFihIWF4a233nJKrLp374727du7MToiKgtcHrn666+/sHv3bqfdxgGgZs2auHr1apEFRkRERFQSsrKysHTpUsyaNSvHe5kePXogMjISrVu3dlN0RFSWuJxciaIIu92eo/3KlSvw9vYukqCIiIiISsr06dPxwQcfOLU99dRTiIyMRMuWLd0UFRGVRS5PC3z88ccxf/58+bYgCEhPT0dUVBSeeOKJooyNiIiIqNgNGzYMOp0OAPD0008jNjYWP/zwAxMrInKZy6XYr1y5gq5du0KSJJw5cwYtW7bEmTNnULFiRfz5558ICAgorlhLDEuxExERlT8mkwmfffYZNBoNhg0b5nRs5cqVaNKkCZo3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",
|
||
"text/plain": [
|
||
"<Figure size 1000x500 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"\n",
|
||
"# Функция для оценки смещения и дисперсии\n",
|
||
"def plot_bias_variance(model, X_train, y_train, X_test, y_test):\n",
|
||
" # Предсказания на обучающей и тестовой выборках\n",
|
||
" train_preds = model.predict(X_train)\n",
|
||
" test_preds = model.predict(X_test)\n",
|
||
"\n",
|
||
" # Оценка смещения\n",
|
||
" bias = np.mean((test_preds - y_test.to_numpy()) ** 2)\n",
|
||
" variance = np.var(test_preds)\n",
|
||
"\n",
|
||
" print(f'Bias: {bias}, Variance: {variance}')\n",
|
||
"\n",
|
||
" # Визуализация предсказаний\n",
|
||
" plt.figure(figsize=(10, 5))\n",
|
||
" plt.scatter(y_test.to_numpy(), test_preds, label='Предсказания', alpha=0.7)\n",
|
||
" plt.xlabel('Истинные значения')\n",
|
||
" plt.ylabel('Предсказанные значения')\n",
|
||
" plt.title('Сравнение истинных значений и предсказанных значений')\n",
|
||
" plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2)\n",
|
||
" plt.legend()\n",
|
||
" plt.show()\n",
|
||
"\n",
|
||
"# Пример использования\n",
|
||
"plot_bias_variance(rf_model, X_train_transformed, y_train, X_test_transformed, y_test)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### **Таким образом в задачах регрессии в качестве оценок используются следующие метрики:**\n",
|
||
"1. **Средняя квадратичная ошибка (англ. Mean Squared Error, MSE)**\n",
|
||
"MSE применяется в ситуациях, когда нам надо подчеркнуть большие ошибки и выбрать модель, которая дает меньше больших ошибок прогноза. Грубые ошибки становятся заметнее за счет того, что ошибку прогноза мы возводим в квадрат. И модель, которая дает нам меньшее значение среднеквадратической ошибки, можно сказать, что что у этой модели меньше грубых ошибок.\n",
|
||
"\n",
|
||
"2. **Cредняя абсолютная ошибка (англ. Mean Absolute Error, MAE)**\n",
|
||
"Среднеквадратичный функционал сильнее штрафует за большие отклонения по сравнению со среднеабсолютным, и поэтому более чувствителен к выбросам. При использовании любого из этих двух функционалов может быть полезно проанализировать, какие объекты вносят наибольший вклад в общую ошибку — не исключено, что на этих объектах была допущена ошибка при вычислении признаков или целевой величины.\n",
|
||
"Среднеквадратичная ошибка подходит для сравнения двух моделей или для контроля качества во время обучения, но не позволяет сделать выводов о том, на сколько хорошо данная модель решает задачу. Например, MSE = 10 является очень плохим показателем, если целевая переменная принимает значения от 0 до 1, и очень хорошим, если целевая переменная лежит в интервале (10000, 100000). В таких ситуациях вместо среднеквадратичной ошибки полезно использовать коэффициент детерминации — R2\n",
|
||
"\n",
|
||
"3. **Коэффициент детерминации**\n",
|
||
"Коэффициент детерминации измеряет долю дисперсии, объясненную моделью, в общей дисперсии целевой переменной. Фактически, данная мера качества — это нормированная среднеквадратичная ошибка. Если она близка к единице, то модель хорошо объясняет данные, если же она близка к нулю, то прогнозы сопоставимы по качеству с константным предсказанием.\n",
|
||
"\n",
|
||
"#### **Анализ Метрик:**\n",
|
||
"1. Random Forest:\n",
|
||
"* MAE: 0.001779\n",
|
||
"* MSE: 0.000027\n",
|
||
"* R²: 0.966258\n",
|
||
"\n",
|
||
"Random Forest демонстрирует хорошую производительность с высоким R², что указывает на то, что модель способна объяснить примерно 96.6% изменчивости в данных. Низкие значения MAE и MSE свидетельствуют о том, что предсказания модели близки к истинным значениям.\n",
|
||
"\n",
|
||
"2. Ridge:\n",
|
||
"* MAE: 0.010975\n",
|
||
"* MSE: 0.000271\n",
|
||
"* R²: 0.663739\n",
|
||
"\n",
|
||
"Модель Ridge имеет более высокие значения MAE и MSE, чем Random Forest, что указывает на худшую точность предсказаний. Ее R² значительно ниже, всего 66.4%, что означает, что она объясняет лишь часть изменчивости данных. Это может значить то, что модель не улавливает все зависимости в данных о волатильности акций.\n",
|
||
"\n",
|
||
"3. Gradient Boosting:\n",
|
||
"* MAE: 0.000988\n",
|
||
"* MSE: 0.000004\n",
|
||
"* R²: 0.995023\n",
|
||
"\n",
|
||
"Gradient Boosting показывает наилучшие результаты среди трех моделей. С наименьшими значениями MAE и MSE, эта модель обеспечивает точные предсказания. Высокий R² (99.5%) указывает на то, что она способна объяснить почти всю изменчивость в данных. Это критично в контексте бизнес-целей, связанных с финансовыми рынками, где точность предсказаний может существенно повлиять на принятие инвестиционных решений.\n",
|
||
"\n",
|
||
"#### **Вывод:**\n",
|
||
"На основе представленных метрик Gradient Boosting является лучшей моделью для предсказания цен закрытия акций. Она имеет:\n",
|
||
"\n",
|
||
"* Наименьшее значение MAE, что говорит о меньшем среднем отклонении предсказанных значений от действительных.\n",
|
||
"* Наименьшее значение MSE, что указывает на то, что крупные ошибки, которые могут иметь значительное влияние на торговые решения, минимизированы.\n",
|
||
"* Наивысшее значение R², что подтверждает высокую степень объясняемости модели.\n",
|
||
"\n",
|
||
"* Bias (Смещение)\n",
|
||
"Смещение измеряет, насколько предсказания модели отклоняются от истинных значений. Чем ниже смещение, тем лучше модель справляется с захватом истинной зависимости в данных.\n",
|
||
"Низкое значение смещения(0.0014589819156387081) говорит о том, что модель хорошо предсказывает результаты для тестовых данных. Это означает, что ошибка, возникающая из-за того, что модель не может уловить истинные параметры данных, минимальна.\n",
|
||
"* Variance (Дисперсия)\n",
|
||
"Дисперсия измеряет, насколько предсказания модели изменяются при использовании различных обучающих наборов данных. Высокая дисперсия может указывать на переобучение модели, когда она слишком точно подстраивается под обучающие данные и теряет способность обобщать.\n",
|
||
"Низкое значение дисперсии(0.0006523355896833815) также говорит о том, что модель делает стабильные предсказания, которые не сильно колеблются между разными выборками данных. Это свидетельствует о том, что модель, скорее всего, не переобучается.\n",
|
||
"\n",
|
||
"* К тому же, если мы посмотрим на график, то сможем сделать несколько выводов:\n",
|
||
" 1. Высокая точность предсказаний\n",
|
||
" Предсказанные значения близки к истинным значениям. Это указывает на то, что модель хорошо прогнозирует целевую переменную.\n",
|
||
" 2. Небольшие отклонения\n",
|
||
" Несмотря на хорошую схожесть между предсказанными и истинными значениями, видны некоторые небольшие отклонения. Это может указывать на определенные ошибки предсказания, но они незначительны.\n",
|
||
" 3. Отсутствие сильного переобучения:\n",
|
||
" Поскольку наблюдается равномерное распределение точек, нет признаков значительного переобучения, которое могло бы проявляться в виде разбросанных точек вдали от линии.\n",
|
||
" 4. Поведение на высоких значениях:\n",
|
||
" В то же время может быть интересно обратить внимание на точки, расположенные на уровнях около 0.25-0.30. Они несколько отклоняются от линии, это может свидетельствовать о том, что модель не идеально справляется с предсказанием на больших значениях.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### **Теперь разберемся с задачей классификации:**\n",
|
||
"Классификация.\n",
|
||
"Получение метки класса (выбор из конечного множества значений)."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Выберем классификационные модели, а именно:\n",
|
||
"1. Логистическая регрессия\n",
|
||
"2. Наивный байесовский классификатор\n",
|
||
"3. Дерево решений\n",
|
||
"4. Метод K ближайших соседей\n",
|
||
"\n",
|
||
"Настроим гиперпараметры для каждой модели."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### **Создадим конвейер:**\n",
|
||
"##### Конвейеры позволяют автоматизировать следующие процессы:\n",
|
||
"1. Предобработка данных.\n",
|
||
"2. Конструирование признаков.\n",
|
||
"3. Понижение размерности признакового пространства.\n",
|
||
"4. Обучение модели.\n",
|
||
"\n",
|
||
"\n",
|
||
"##### Используемые конвейеры:\n",
|
||
"1. preprocessing_num -- конвейер для обработки числовых данных: заполнение пропущенных значений и стандартизация\n",
|
||
"\n",
|
||
"2. preprocessing_cat -- конвейер для обработки категориальных данных: заполнение пропущенных данных и унитарное кодирование\n",
|
||
"\n",
|
||
"3. features_preprocessing -- трансформер для предобработки признаков\n",
|
||
"\n",
|
||
"4. features_engineering -- трансформер для конструирования признаков\n",
|
||
"\n",
|
||
"5. drop_columns -- трансформер для удаления колонок\n",
|
||
"\n",
|
||
"6. pipeline_end -- основной конвейер предобработки данных и конструирования признаков"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 101,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"from sklearn.base import BaseEstimator, TransformerMixin\n",
|
||
"from sklearn.compose import ColumnTransformer\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"from sklearn.impute import SimpleImputer\n",
|
||
"from sklearn.pipeline import Pipeline\n",
|
||
"from sklearn.preprocessing import OneHotEncoder\n",
|
||
"from sklearn.ensemble import RandomForestRegressor # Пример регрессионной модели\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.pipeline import make_pipeline\n",
|
||
"\n",
|
||
"class StocksFeatures(BaseEstimator, TransformerMixin):\n",
|
||
" def __init__(self):\n",
|
||
" pass\n",
|
||
" \n",
|
||
" def fit(self, X, y=None):\n",
|
||
" return self\n",
|
||
"\n",
|
||
" def transform(self, X, y=None):\n",
|
||
" X[\"Range\"] = X[\"High\"] - X[\"Low\"]\n",
|
||
" return X\n",
|
||
"\n",
|
||
" def get_feature_names_out(self, features_in):\n",
|
||
" return np.append(features_in, [\"Range\"], axis=0)\n",
|
||
" \n",
|
||
"\n",
|
||
"num_columns = [\"Open\", \"High\", \"Low\", \"Volume\", \"Volatility\"]\n",
|
||
"\n",
|
||
"# Определяем предобработку для численных данных\n",
|
||
"num_imputer = SimpleImputer(strategy=\"median\")\n",
|
||
"num_scaler = StandardScaler()\n",
|
||
"preprocessing_num = Pipeline(\n",
|
||
" [\n",
|
||
" (\"imputer\", num_imputer),\n",
|
||
" (\"scaler\", num_scaler),\n",
|
||
" ]\n",
|
||
")\n",
|
||
"\n",
|
||
"# У категориальных данных нет, оставляем пустым\n",
|
||
"cat_columns = []\n",
|
||
"\n",
|
||
"# Подготовка признаков с использованием ColumnTransformer\n",
|
||
"features_preprocessing = ColumnTransformer(\n",
|
||
" verbose_feature_names_out=False,\n",
|
||
" transformers=[\n",
|
||
" (\"preprocessing_num\", preprocessing_num, num_columns),\n",
|
||
" ],\n",
|
||
" remainder=\"passthrough\"\n",
|
||
")\n",
|
||
"\n",
|
||
"# Выделим целевую переменную\n",
|
||
"#y_train_close = y_train_close.values.reshape(-1, 1) # Убедимся, что y_train - это 2D массив\n",
|
||
"\n",
|
||
"# Создание окончательного конвейера\n",
|
||
"pipeline = Pipeline(steps=[\n",
|
||
" ('feature_engineering', StocksFeatures()),\n",
|
||
" ('imputer', SimpleImputer(strategy='median')),\n",
|
||
" ('scaler', StandardScaler())\n",
|
||
"]\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Применим конвейер\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 102,
|
||
"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>Open</th>\n",
|
||
" <th>High</th>\n",
|
||
" <th>Low</th>\n",
|
||
" <th>Volume</th>\n",
|
||
" <th>Volatility</th>\n",
|
||
" <th>Range</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>-0.264188</td>\n",
|
||
" <td>-0.270892</td>\n",
|
||
" <td>-0.278887</td>\n",
|
||
" <td>1.986714</td>\n",
|
||
" <td>0.288393</td>\n",
|
||
" <td>-0.037298</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>-0.642218</td>\n",
|
||
" <td>-0.642866</td>\n",
|
||
" <td>-0.634425</td>\n",
|
||
" <td>-0.197546</td>\n",
|
||
" <td>-0.295086</td>\n",
|
||
" <td>-0.634720</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>1.107219</td>\n",
|
||
" <td>1.082683</td>\n",
|
||
" <td>1.108998</td>\n",
|
||
" <td>-0.247763</td>\n",
|
||
" <td>-0.423081</td>\n",
|
||
" <td>0.261413</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>1.019012</td>\n",
|
||
" <td>0.991756</td>\n",
|
||
" <td>1.019043</td>\n",
|
||
" <td>-0.832639</td>\n",
|
||
" <td>-0.447430</td>\n",
|
||
" <td>0.176067</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>1.859078</td>\n",
|
||
" <td>1.886561</td>\n",
|
||
" <td>1.925023</td>\n",
|
||
" <td>-0.404450</td>\n",
|
||
" <td>-0.497514</td>\n",
|
||
" <td>0.602796</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",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4195</th>\n",
|
||
" <td>0.556976</td>\n",
|
||
" <td>0.584650</td>\n",
|
||
" <td>0.541422</td>\n",
|
||
" <td>-0.242230</td>\n",
|
||
" <td>0.719476</td>\n",
|
||
" <td>1.285564</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4196</th>\n",
|
||
" <td>-0.453203</td>\n",
|
||
" <td>-0.427948</td>\n",
|
||
" <td>-0.450230</td>\n",
|
||
" <td>0.539634</td>\n",
|
||
" <td>0.807557</td>\n",
|
||
" <td>0.133394</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4197</th>\n",
|
||
" <td>-0.575013</td>\n",
|
||
" <td>-0.568471</td>\n",
|
||
" <td>-0.557320</td>\n",
|
||
" <td>0.299931</td>\n",
|
||
" <td>-0.381914</td>\n",
|
||
" <td>-0.634720</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4198</th>\n",
|
||
" <td>-0.280990</td>\n",
|
||
" <td>-0.281224</td>\n",
|
||
" <td>-0.261752</td>\n",
|
||
" <td>0.508014</td>\n",
|
||
" <td>-0.576248</td>\n",
|
||
" <td>-0.592047</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4199</th>\n",
|
||
" <td>-0.785029</td>\n",
|
||
" <td>-0.795789</td>\n",
|
||
" <td>-0.780067</td>\n",
|
||
" <td>-1.238542</td>\n",
|
||
" <td>-0.739469</td>\n",
|
||
" <td>-0.890757</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>4200 rows × 6 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Open High Low Volume Volatility Range\n",
|
||
"0 -0.264188 -0.270892 -0.278887 1.986714 0.288393 -0.037298\n",
|
||
"1 -0.642218 -0.642866 -0.634425 -0.197546 -0.295086 -0.634720\n",
|
||
"2 1.107219 1.082683 1.108998 -0.247763 -0.423081 0.261413\n",
|
||
"3 1.019012 0.991756 1.019043 -0.832639 -0.447430 0.176067\n",
|
||
"4 1.859078 1.886561 1.925023 -0.404450 -0.497514 0.602796\n",
|
||
"... ... ... ... ... ... ...\n",
|
||
"4195 0.556976 0.584650 0.541422 -0.242230 0.719476 1.285564\n",
|
||
"4196 -0.453203 -0.427948 -0.450230 0.539634 0.807557 0.133394\n",
|
||
"4197 -0.575013 -0.568471 -0.557320 0.299931 -0.381914 -0.634720\n",
|
||
"4198 -0.280990 -0.281224 -0.261752 0.508014 -0.576248 -0.592047\n",
|
||
"4199 -0.785029 -0.795789 -0.780067 -1.238542 -0.739469 -0.890757\n",
|
||
"\n",
|
||
"[4200 rows x 6 columns]"
|
||
]
|
||
},
|
||
"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>Open</th>\n",
|
||
" <th>High</th>\n",
|
||
" <th>Low</th>\n",
|
||
" <th>Volume</th>\n",
|
||
" <th>Volatility</th>\n",
|
||
" <th>Range</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>1.498241</td>\n",
|
||
" <td>1.508336</td>\n",
|
||
" <td>1.545213</td>\n",
|
||
" <td>-0.154202</td>\n",
|
||
" <td>-0.496725</td>\n",
|
||
" <td>0.326979</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1.882169</td>\n",
|
||
" <td>1.867024</td>\n",
|
||
" <td>1.897223</td>\n",
|
||
" <td>-0.360102</td>\n",
|
||
" <td>-0.364952</td>\n",
|
||
" <td>0.705871</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>-1.013194</td>\n",
|
||
" <td>-1.008735</td>\n",
|
||
" <td>-1.011718</td>\n",
|
||
" <td>0.299199</td>\n",
|
||
" <td>0.593864</td>\n",
|
||
" <td>-0.641300</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>0.978561</td>\n",
|
||
" <td>0.980731</td>\n",
|
||
" <td>1.024756</td>\n",
|
||
" <td>-0.504559</td>\n",
|
||
" <td>-0.677069</td>\n",
|
||
" <td>-0.178210</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>2.064587</td>\n",
|
||
" <td>2.046367</td>\n",
|
||
" <td>2.102382</td>\n",
|
||
" <td>-0.442899</td>\n",
|
||
" <td>-0.628183</td>\n",
|
||
" <td>0.326979</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",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1046</th>\n",
|
||
" <td>0.560695</td>\n",
|
||
" <td>0.538627</td>\n",
|
||
" <td>0.551811</td>\n",
|
||
" <td>-0.392167</td>\n",
|
||
" <td>-0.250407</td>\n",
|
||
" <td>0.116483</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1047</th>\n",
|
||
" <td>-0.754415</td>\n",
|
||
" <td>-0.752231</td>\n",
|
||
" <td>-0.750410</td>\n",
|
||
" <td>-1.155323</td>\n",
|
||
" <td>0.032753</td>\n",
|
||
" <td>-0.557102</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1048</th>\n",
|
||
" <td>0.403731</td>\n",
|
||
" <td>0.417675</td>\n",
|
||
" <td>0.439513</td>\n",
|
||
" <td>-0.463214</td>\n",
|
||
" <td>-0.446983</td>\n",
|
||
" <td>-0.136111</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1049</th>\n",
|
||
" <td>2.134585</td>\n",
|
||
" <td>2.148552</td>\n",
|
||
" <td>2.130456</td>\n",
|
||
" <td>0.777940</td>\n",
|
||
" <td>0.151191</td>\n",
|
||
" <td>1.842550</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1050</th>\n",
|
||
" <td>-0.864411</td>\n",
|
||
" <td>-0.874972</td>\n",
|
||
" <td>-0.851601</td>\n",
|
||
" <td>-1.183864</td>\n",
|
||
" <td>-1.330298</td>\n",
|
||
" <td>-1.062291</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>1051 rows × 6 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Open High Low Volume Volatility Range\n",
|
||
"0 1.498241 1.508336 1.545213 -0.154202 -0.496725 0.326979\n",
|
||
"1 1.882169 1.867024 1.897223 -0.360102 -0.364952 0.705871\n",
|
||
"2 -1.013194 -1.008735 -1.011718 0.299199 0.593864 -0.641300\n",
|
||
"3 0.978561 0.980731 1.024756 -0.504559 -0.677069 -0.178210\n",
|
||
"4 2.064587 2.046367 2.102382 -0.442899 -0.628183 0.326979\n",
|
||
"... ... ... ... ... ... ...\n",
|
||
"1046 0.560695 0.538627 0.551811 -0.392167 -0.250407 0.116483\n",
|
||
"1047 -0.754415 -0.752231 -0.750410 -1.155323 0.032753 -0.557102\n",
|
||
"1048 0.403731 0.417675 0.439513 -0.463214 -0.446983 -0.136111\n",
|
||
"1049 2.134585 2.148552 2.130456 0.777940 0.151191 1.842550\n",
|
||
"1050 -0.864411 -0.874972 -0.851601 -1.183864 -1.330298 -1.062291\n",
|
||
"\n",
|
||
"[1051 rows x 6 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Применяем конвейер к X_train_close\n",
|
||
"preprocessing_result = pipeline.fit_transform(X_train_close)\n",
|
||
"\n",
|
||
"# Формируем новый датафрейм с обработанными данными\n",
|
||
"preprocessed_df = pd.DataFrame(\n",
|
||
" preprocessing_result, \n",
|
||
" columns=pipeline.get_feature_names_out(input_features=num_columns),\n",
|
||
")\n",
|
||
"\n",
|
||
"# Выводим обработанный датафрейм\n",
|
||
"display(preprocessed_df)\n",
|
||
"# Применяем конвейер к X_train_close\n",
|
||
"preprocessing_result = pipeline.fit_transform(X_test_close)\n",
|
||
"\n",
|
||
"# Формируем новый датафрейм с обработанными данными\n",
|
||
"preprocessed_df = pd.DataFrame(\n",
|
||
" preprocessing_result, \n",
|
||
" columns=pipeline.get_feature_names_out(input_features=num_columns),\n",
|
||
")\n",
|
||
"\n",
|
||
"# Выводим обработанный датафрейм\n",
|
||
"display(preprocessed_df)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Настроим гиперпараметры для каждой модели."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 103,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from sklearn.model_selection import GridSearchCV\n",
|
||
"\n",
|
||
"# Определяем модели\n",
|
||
"from sklearn.linear_model import LogisticRegression\n",
|
||
"from sklearn.naive_bayes import GaussianNB\n",
|
||
"from sklearn.tree import DecisionTreeClassifier\n",
|
||
"from sklearn.neighbors import KNeighborsClassifier\n",
|
||
"\n",
|
||
"# Определяем параметры для каждой модели\n",
|
||
"param_grid = {\n",
|
||
" 'LogisticRegression': {\n",
|
||
" 'model': LogisticRegression(),\n",
|
||
" 'params': {\n",
|
||
" 'C': [0.01, 0.1, 1, 10],\n",
|
||
" 'solver': ['liblinear']\n",
|
||
" }\n",
|
||
" },\n",
|
||
" 'NaiveBayes': {\n",
|
||
" 'model': GaussianNB(),\n",
|
||
" 'params': {}\n",
|
||
" },\n",
|
||
" 'DecisionTree': {\n",
|
||
" 'model': DecisionTreeClassifier(),\n",
|
||
" 'params': {\n",
|
||
" 'max_depth': [None, 5, 10, 20],\n",
|
||
" 'min_samples_split': [2, 5, 10],\n",
|
||
" }\n",
|
||
" },\n",
|
||
" 'KNeighbors': {\n",
|
||
" 'model': KNeighborsClassifier(),\n",
|
||
" 'params': {\n",
|
||
" 'n_neighbors': [3, 5, 7, 10]\n",
|
||
" }\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"best_estimators = {}"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Обучим модели и оценим:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Обучим модели при помощи кросс-валидации:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 104,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
|
||
" y = column_or_1d(y, warn=True)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
|
||
" _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
|
||
" _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
|
||
" _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
|
||
" _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
|
||
" _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
|
||
" _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n",
|
||
"c:\\Users\\K\\source\\repos\\AIM-PIbd-31-Ievlewa-M-D\\aimenv\\Lib\\site-packages\\sklearn\\neighbors\\_classification.py:238: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return self._fit(X, y)\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.metrics import classification_report, cohen_kappa_score, confusion_matrix, matthews_corrcoef, roc_auc_score\n",
|
||
"\n",
|
||
"for model_name, mp in param_grid.items():\n",
|
||
" grid_search = GridSearchCV(mp['model'], mp['params'], cv=5, return_train_score=False)\n",
|
||
" grid_search.fit(X_train_close, y_train_close)\n",
|
||
"\n",
|
||
" best_estimators[model_name] = grid_search.best_estimator_\n",
|
||
" y_pred_train = best_estimators[model_name].predict(X_train_close)\n",
|
||
" y_pred_test = best_estimators[model_name].predict(X_test_close)\n",
|
||
"\n",
|
||
" # Сбор метрик\n",
|
||
" report_train = classification_report(y_train_close, y_pred_train, output_dict=True)\n",
|
||
" report_test = classification_report(y_test_close, y_pred_test, output_dict=True)\n",
|
||
"\n",
|
||
" roc_auc_test = roc_auc_score(y_test_close, best_estimators[model_name].predict_proba(X_test_close)[:, 1])\n",
|
||
" cohen_kappa_test = cohen_kappa_score(y_test_close, y_pred_test)\n",
|
||
" mcc_test = matthews_corrcoef(y_test_close, y_pred_test)\n",
|
||
"\n",
|
||
" # Сохранение результатов\n",
|
||
" param_grid[model_name] = {\n",
|
||
" \"Confusion_matrix\": confusion_matrix(y_test_close, y_pred_test),\n",
|
||
" \"Precision_train\": report_train['1']['precision'],\n",
|
||
" \"Recall_train\": report_train['1']['recall'],\n",
|
||
" \"Accuracy_train\": report_train['accuracy'],\n",
|
||
" \"F1_train\": report_train['1']['f1-score'],\n",
|
||
" \"Precision_test\": report_test['1']['precision'],\n",
|
||
" \"Recall_test\": report_test['1']['recall'],\n",
|
||
" \"Accuracy_test\": report_test['accuracy'],\n",
|
||
" \"F1_test\": report_test['1']['f1-score'],\n",
|
||
" \"ROC_AUC_test\": roc_auc_test,\n",
|
||
" \"Cohen_kappa_test\": cohen_kappa_test,\n",
|
||
" \"MCC_test\": mcc_test,\n",
|
||
" }"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Используем матрицу неточностей:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 105,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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BotfIiIiIpIMFr9EREREJBksfomIiIhIMlj8EhEREZFksPglIiIiIslg8UtEREREksHil4iIiIgkg8UvEREREUkGi18iIiIikgwWv0REREQkGSx+iYiIiEgyWPwSERERkWSw+CUiIiIiyWDxS0RERESSweKXiIiIiCSDxS8RERERSQaLXyIiIiKSDBa/RERERCQZLH6JiIiISDJY/BIRERGRZLD4JSIiIiLJYPFLRERERJLB4peIiIiIJIPFLxERERFJBotfIiIiIpIMFr9EREREJBksfomIiIhIMlj8EhEREZFksPglIiIiIslg8UtEREREksHil4iIiIgkg8UvEREREUkGi18iIiIikgwWv0REREQkGSx+iYiIiEgyWPwSERERkWSw+CUiIiIiyWDxS0RERESSweKXiIiIiCSDxS8RERERSQaLXyIiIiKSDBa/RERERCQZLH6JiIiISDJY/FKF9c8//0Amk2HlypU6vS8wMBCBgYF66RMRUUVUmtwLDAzEq6+++sJ2+/fvh0wmw8aNG0v0OUQVBYtfeq6VK1dCJpOJm4WFBVxdXREcHIwFCxbg4cOH5d3Fl6qgINdm++eff8q7u0T0EhTk5PHjxzX2p6en44033oCFhQViYmIwZcoUyGQyODs74/Hjx4XOU6tWLXTs2PFldZtIskzKuwNkGKZOnQoPDw/k5uZCqVRi//79GDFiBL755hts3boVjRo1KvPPdHd3x5MnT2BqaqrT+3bt2lXmfSlQrVo1/PTTTxr75s6dixs3bmDevHmF2hKRNGVkZKB9+/b43//+h82bN+Ott97CkSNHAAB37tzBkiVL8Mknn5TZ5+kz94gqGxa/pJWQkBD4+fmJrydMmIC9e/eiY8eOePvtt5GYmAhLS8sy/cyCkWZdmZmZlWk/nmZtbY1evXpp7Fu/fj0ePHhQaP/TBEFAVlZWmf+MiKjiefjwIYKDg3Hq1Cls2rQJISEhGsd9fHzw9ddf46OPPiqzTNBn7r1sjx49grW1dXl3gyoxTnugEmvTpg0+//xzXLt2DWvWrBH3//3333j33Xfh4OAACwsL+Pn5YevWrYXen5aWhpEjR6JWrVowNzdHjRo10KdPH9y7dw9A0XN+lUol+vXrhxo1asDc3BwuLi7o3LmzxhSDoua+3blzBwMGDICzszMsLCzQuHFjrFq1SqNNwefNmTMH33//PerUqQNzc3O8/vrrOHbsmE4/m4LLlzt37oSfnx8sLS2xbNky8XuPGDECbm5uMDc3R926dTFr1iyo1WqNc6jVasyfPx+vvPIKLCws4OzsjMGDB+PBgwc69YWIXp7MzEy89dZb+Ouvv/Dbb78hNDS0UJtJkyYhJSUFS5YseeH5tM2BonLv2rVrePvtt2FtbQ0nJyeMHDkSO3fuhEwmw/79+wt91vnz59G6dWtYWVmhevXqmD17dpF9UqlU+PTTT6FQKGBtbY23334b169fL9Ruw4YN8PX1haWlJapWrYpevXrh5s2bGm369u0LGxsbXL58GR06dICtrS3Cw8MBABcvXkRYWBgUCgUsLCxQo0YN9OjRA+np6S/8uRE9D0d+qVR69+6NTz/9FLt27cLAgQNx7tw5NG/eHNWrV8f48eNhbW2NX3/9FV26dMFvv/2Gd955B0D+PxAtW7ZEYmIi+vfvj9deew337t3D1q1bcePGDVStWrXIzwsLC8O5c+cwbNgw1KpVC3fu3EFsbCySk5NRq1atIt/z5MkTBAYG4tKlSxg6dCg8PDywYcMG9O3bF2lpaRg+fLhG+3Xr1uHhw4cYPHgwZDIZZs+eja5du+LKlSs6TcFISkpCz549MXjwYAwcOBANGjTA48ePERAQgJs3b2Lw4MGoWbMm4uPjMWHCBNy+fRvz588X3z948GCsXLkS/fr1w8cff4yrV6/iu+++w8mTJ3H48GGdp4MQkX49evQIISEhOHbsGDZu3Fjs/N2WLVuiTZs2mD17NoYMGfLc0d+S5sCjR4/Qpk0b3L59G8OHD4dCocC6deuwb9++Its/ePAAb731Frp27Yru3btj48aNGDduHLy9vQuNXE+fPh0ymQzjxo3DnTt3MH/+fAQFBeHUqVPidyno8+uvv46ZM2ciJSUF3377LQ4fPoyTJ0/C3t5ePF9eXh6Cg4PRokULzJkzB1ZWVsjJyUFwcDCys7MxbNgwKBQK3Lx5E9HR0UhLS4Odnd3z/iiInk8geo6oqCgBgHDs2LFi29jZ2QlNmjQRBEEQ2rZtK3h7ewtZWVnicbVaLbz55ptCvXr1xH2TJk0SAAibNm0qdD61Wi0IgiBcvXpVACBERUUJgiAIDx48EAAIX3/99XP7HBAQIAQEBIiv58+fLwAQ1qxZI+7LyckR/P39BRsbGyEjI0Pj8xwdHYXU1FSx7e+//y4AELZt21bk54WGhgru7u4a+9zd3QUAQkxMjMb+adOmCdbW1sKFCxc09o8fP14wNjYWkpOTBUEQhIMHDwoAhLVr12q0i4mJKXI/EZWfgpx0d3cXTE1NhS1bthTZbvLkyQIA4e7du0JcXJwAQPjmm2/E4+7u7kJoaKj4WpcceDb35s6dKwDQ6MuTJ08ET09PAYCwb98+jfcCEFavXi3uy87OFhQKhRAWFibu27dvnwBAqF69upibgiAIv/76qwBA+PbbbwVByM9XJycn4dVXXxWePHkitouOjhYACJMmTRL3RURECACE8ePHa3zHkydPCgCEDRs2FPmzJCoNTnugUrOxscHDhw+RmpqKvXv3onv37nj48CHu3buHe/fu4f79+wgODsbFixfFS16//fYbGjduLI4EP00mkxX5OZaWljAzM8P+/ft1uvS/fft2KBQK9OzZU9xnamqKjz/+GJmZmYiLi9No/95776FKlSri65YtWwIArly5ovVnAoCHhweCg4M19m3YsAEtW7ZElSpVxJ/PvXv3EBQUBJVKhQMHDojt7Ozs0K5dO412vr6+sLGxKXb0hojKT0pKCiwsLODm5vbCtq1atULr1q0xe/ZsPHnypMg2pcmBmJgYVK9eHW+//ba4z8LCAgMHDiyyvY2NjcZ9C2ZmZnjjjTeKzL0+ffrA1tZWfP3uu+/CxcUF27dvBwAcP34cd+7cwUcffaRx30ZoaCg8PT3xxx9/FDrnkCFDNF4XjOzu3LmzyJUxiEqDxS+VWmZmJmxtbXHp0iUIgoDPP/8c1apV09gmT54MIH/uLQBcvnxZq3Uln2Zubo5Zs2Zhx44dcHZ2RqtWrTB79mwolcrnvu/atWuoV68ejIw0/3dv2LChePxpNWvW1HhdUAjrOtfWw8Oj0L6LFy8iJiam0M8nKCgIwH8/n4sXLyI9PR1OTk6F2mZmZortiKjiWLZsGczMzPDWW28hKSnphe2nTJkCpVKJpUuXFnm8NDlw7do11KlTp9BgQt26dYtsX6NGjUJtq1SpUmTu1atXT+O1TCZD3bp1xXsvCjK1QYMGhd7r6elZKHNNTExQo0YNjX0eHh4YNWoUfvjhB1StWhXBwcFYtGgR5/tSmeCcXyqVGzduID09HXXr1hVv2Bo9enShEc8CxQWvtkaMGIFOnTphy5Yt2LlzJz7//HPMnDkTe/fuRZMmTUp17gLGxsZF7hcEQafzFDWPT61Wo127dhg7dmyR76lfv77YzsnJCWvXri2yHZdRI6p4vLy8sH37drRt2xbt2rXD4cOHnzsK3KpVKwQGBmL27Nn48MMPCx1/mTlQVrlXEubm5oUGJ4D8ZST79u2L33//Hbt27cLHH3+MmTNn4siRI4WKZSJdsPilUilY8zY4OBi1a9cGkD+loGAkszh16tTB2bNnS/SZderUwSeffIJPPvkEFy9ehI+PD+bOnaux4sTT3N3d8b///Q9qtVojYP/++2/x+MtSp04dZGZmavXz2b17N5o3b87l0YgMyBtvvIEtW7YgNDQU7dq1w8GDB59bpE6ZMgWBgYHiajBPK00OuLu74/z58xAEQWNE99KlSzqdpygXL17UeC0IAi5duiSu916QqUlJSWjTpo1G26SkJJ0y19vbG97e3pg4cSLi4+PRvHlzLF26FF9++WUpvwVJGac9UInt3bsX06ZNg4eHB8LDw+Hk5CSG+O3btwu1v3v3rvjfYWFhOH36NDZv3lyoXXEjDY8fP0ZWVpbGvjp16sDW1hbZ2dnF9rNDhw5QKpX45ZdfxH15eXlYuHAhbGxsEBAQ8MLvWla6d++OhIQE7Ny5s9CxtLQ05OXlie1UKhWmTZtWqF1eXh7S0tL03VUiKqG2bdvi559/xqVLl/DWW28hIyOj2LYBAQEIDAzErFmzCuVbaXIgODgYN2/e1FhmMisrC8uXL9f9Cz1j9erVGk/33LhxI27fvi2uCuHn5wcnJycsXbpUI5t37NiBxMTEIpd/e1ZGRoaYhwW8vb1hZGT03Lwn0gZHfkkrO3bswN9//428vDykpKRg7969iI2Nhbu7O7Zu3Sre1LBo0SK0aNEC3t7eGDhwIGrXro2UlBQkJCTgxo0bOH36NABgzJgx2LhxI7p164b+/fvD19cXqamp2Lp1K5YuXYrGjRsX6sOFCxfQtm1bdO/eHV5eXjAxMcHmzZuRkpKCHj16FNv3QYMGYdmyZejbty9OnDiBWrVqYePGjTh8+DDmz5+vceOGvo0ZMwZbt25Fx44d0bdvX/j6+uLRo0c4c+YMNm7ciH/++QdVq1ZFQEAABg8ejJkzZ+LUqVNo3749TE1NcfHiRWzYsAHffvst3n333ZfWbyLSzTvvvIPly5ejf//+ePvttxETE1Ns28mTJ6N169aF9pcmBwYPHozvvvsOPXv2xPDhw+Hi4oK1a9eKWV3cjcXacHBwQIsWLdCvXz+kpKRg/vz5qFu3rngznampKWbNmoV+/fohICAAPXv2FJc6q1WrFkaOHPnCz9i7dy+GDh2Kbt26oX79+sjLy8NPP/0EY2NjhIWFlbjvRACLX9LSpEmTAOTfAezg4ABvb2/Mnz8f/fr10ygevby8cPz4cXzxxRdYuXIl7t+/DycnJzRp0kQ8B5B/Z/HBgwcxefJkbN68GatWrYKTkxPatm1b7FwuNzc39OzZE3v27MFPP/0EExMTeHp64tdff31uGFpaWmL//v0YP348Vq1ahYyMDDRo0ABRUVHo27dv2fyAtGRlZYW4uDjMmDEDGzZswOrVqyGXy1G/fn188cUXGmtXLl26FL6+vli2bBk+/fRTmJiYoFatWujVqxeaN2/+UvtNRLrr168fUlNTMXr0aHTr1q3IX+qB/AdUBAQEFFp5Bih5DtjY2GDv3r0YNmwYvv32W9jY2KBPnz548803ERYWVqKnZxb49NNP8b///Q8zZ87Ew4cP0bZtWyxevBhWVlZim759+8LKygpfffUVxo0bB2tra7zzzjuYNWuWxhq/xWncuDGCg4Oxbds23Lx5E1ZWVmjcuDF27NiBZs2albjvRAAgE17GbHYiogooKysLOTk5Or3HzMysVIUDUXmaP38+Ro4ciRs3bqB69erl3R2qYKSSiSx+iUiSsrKy4OFuA+UdlU7vUygUuHr1qsGFPUnPkydPNG6Uy8rKQpMmTaBSqXDhwoVy7BlVRFLKRE57ICJJysnJgfKOCldPuENuq929vxkP1fDwvYacnByDCnqSpq5du6JmzZrw8fFBeno61qxZg7///rvYpdNI2qSUiVztgYgkzdpGt43IUAQHB+Pw4cMYM2YMvvjiC5ibm2P9+vV4//33y7trVIHpMxNv3ryJXr16wdHREZaWlvD29sbx48fF44IgYNKkSXBxcYGlpSWCgoIKLa2XmpqK8PBwyOVy2NvbY8CAAcjMzNSpHyx+iUjS1BB02ogMxYgRI3D27FlkZmbiyZMnOHHiBN57773y7hZVcPrKxAcPHqB58+YwNTXFjh07cP78ecydO1d8iioAzJ49GwsWLMDSpUtx9OhRWFtbIzg4WGMZwPDwcJw7dw6xsbGIjo7GgQMHMGjQIJ2+I+f8EpEkZWRkwM7ODreSauh0ic+1Qf5TDeVyuZ57SET08ug7E8ePH4/Dhw/j4MGDRR4XBAGurq745JNPMHr0aABAeno6nJ2dsXLlSvTo0QOJiYnw8vLCsWPH4OfnBwCIiYlBhw4dcOPGDbi6umrVb478EpGk5QpqnTYiosqsJJmYkZGhsRX1IJKtW7fCz88P3bp1E5dAffqhK1evXoVSqdR4AqqdnR2aNm2KhIQEAEBCQgLs7e3FwhcAgoKCYGRkhKNHj2r9HXnDWxHUajVu3boFW1vbUi0ETkT6JwgCHj58CFdXV43HV2tLDQEqLS/dSXHaA/OQyHCUNg+BkmWim5ubxv7JkydjypQpGvuuXLmCJUuWYNSoUfj0009x7NgxfPzxxzAzM0NERASUSiUAwNnZWeN9zs7O4jGlUgknJyeN4yYmJnBwcBDbaIPFbxFu3bpV6A+SiCq269evF/uAlOfRZd6aFItf5iGR4SlpHgIly8Tr169rTHswNzcv3Fathp+fH2bMmAEAaNKkCc6ePYulS5ciIiKiRH0tKRa/RSh4YlndwZNgbG44S3fQi7ks0P6yCBmGPOTiELaX+DHVKkGASstbH7RtV5kU/FwDqvaBiZFZOfeGypLqzt3y7gKVsdLmIVCyTJTL5S+c8+vi4gIvLy+NfQ0bNsRvv/0GIH+9YABISUmBi4uL2CYlJQU+Pj5imzt37micIy8vD6mpqeL7tcHitwgFl/aMzS1Y/FYyJjLT8u4ClbV/M7qkl+TV/27atpWagp+riZEZi99KRsY8rHxKmYeA/jKxefPmSEpK0th34cIFuLu7AwA8PDygUCiwZ88esdjNyMjA0aNHMWTIEACAv78/0tLScOLECfj6+gIA9u7dC7VajaZNm2rdFxa/RCRpKh3mt2nbjojIUOkrE0eOHIk333wTM2bMQPfu3fHnn3/i+++/x/fffw8gv2AfMWIEvvzyS9SrVw8eHh74/PPP4erqii5dugDIHyl+6623MHDgQCxduhS5ubkYOnQoevToofVKDwCLXyKSOJWQv2nbloioMtNXJr7++uvYvHkzJkyYgKlTp8LDwwPz589HeHi42Gbs2LF49OgRBg0ahLS0NLRo0QIxMTEaT49bu3Ythg4dirZt28LIyAhhYWFYsGCB9h0Bi18ikjhOeyAi+o8+M7Fjx47o2LFjscdlMhmmTp2KqVOnFtvGwcEB69at0/GTNbH4JSJJU0MGFbSbH6fWsh0RkaGSQiay+CUiSVML+Zu2bYmIKjMpZCKf8EZEkqb6d5RD200XtWrVgkwmK7RFRkYCALKyshAZGQlHR0fY2NggLCwMKSkpGudITk5GaGgorKys4OTkhDFjxiAvL6/Mvj8R0dP0mYkVBUd+iUjSdAlwXYP+2LFjUKlU4uuzZ8+iXbt26NatG4D8u5//+OMPbNiwAXZ2dhg6dCi6du2Kw4cP53+eSoXQ0FAoFArEx8fj9u3b6NOnD0xNTcWF4omIypI+M7GiYPFLRJKmFmRQC1rOb/u3XUZGhsZ+c3PzIp9oVK1aNY3XX331FerUqYOAgACkp6djxYoVWLduHdq0aQMAiIqKQsOGDXHkyBE0a9YMu3btwvnz57F79244OzvDx8cH06ZNw7hx4zBlyhSYmXHdXSIqWyXJREPDaQ9EJGklucTn5uYGOzs7cZs5c+YLPycnJwdr1qxB//79IZPJcOLECeTm5iIoKEhs4+npiZo1ayIhIQEAkJCQAG9vb41n3QcHByMjIwPnzp0r458EERGnPRARVXoqGEGl5ThAwQQGbZ5j/6wtW7YgLS0Nffv2BQAolUqYmZnB3t5eo52zszOUSqXY5unCt+B4wTEiorJWkkw0NCx+iUjSBB0u8Qn/ttPmOfbPWrFiBUJCQnR6ChER0ctWkkw0NJz2QESS9jIu8V27dg27d+/GBx98IO5TKBTIyclBWlqaRtuUlBQoFAqxzbOrPxS8LmhDRFSWpDDtgcUvEUmaSjDSaSuJqKgoODk5ITQ0VNzn6+sLU1NT7NmzR9yXlJSE5ORk+Pv7AwD8/f1x5swZ3LlzR2wTGxsLuVwOLy+vEn5jIqLivYxMLG+c9kBEkqaGDGotxwHU0H1Fd7VajaioKERERMDE5L/ItbOzw4ABAzBq1Cg4ODhALpdj2LBh8Pf3R7NmzQAA7du3h5eXF3r37o3Zs2dDqVRi4sSJiIyM1GqeMRGRrvSdiRUBi18ikjR9r2m5e/duJCcno3///oWOzZs3D0ZGRggLC0N2djaCg4OxePFi8bixsTGio6MxZMgQ+Pv7w9raGhEREc997j0RUWlwnV8iokpOl0t3KkH3UY727dtDKOZ9FhYWWLRoERYtWlTs+93d3bF9+3adP5eIqCT0nYkVAYtfIpK0/Et8Wi7obqCjHERE2pJCJrL4JSJJU+uwpqWhzm8jItKWFDKRxS8RSZoULvEREWlLCpnI4peIJE0No0p/ZzMRkbakkIksfolI0lSCDCotn1KkbTsiIkMlhUxk8UtEkqbbc+wNc5SDiEhbUshEFr9EJGlqwQhqLee3qQ10fhsRkbakkIksfolI0qQwykFEpC0pZCKLXyKSNDW0n7em1m9XiIjKnRQykcUvEUmabnc2a9eOiMhQSSETWfwSkaTptqalYQY9EZG2pJCJLH6JSNKk8ChPIiJtSSETWfwSkaRJYZSDiEhbUshEFr9EJGm63dlsmEFPRKQtKWQii18ikjS1IINa2zubDfRpRkRE2pJCJrL4JSJJU+swymGodzYTEWlLCpnI4peIJE23pxkZZtATEWlLCpnI4peIJE0FGVRa3rGsbTsiIkMlhUxk8UtEkiaFUQ4iIm1JIRNZ/BKRpKmg/eiFSr9dISIqd1LIRBa/RCRpUhjlICLSlhQykcUvEUlanmCMXMFYy7ZqPfeGiKh8SSETDbNkJyIqIwVPM9J209XNmzfRq1cvODo6wtLSEt7e3jh+/Lh4XBAETJo0CS4uLrC0tERQUBAuXryocY7U1FSEh4dDLpfD3t4eAwYMQGZmZqm/OxHRs/SdiRWBYfaaiKiMFCzoru2miwcPHqB58+YwNTXFjh07cP78ecydOxdVqlQR28yePRsLFizA0qVLcfToUVhbWyM4OBhZWVlim/DwcJw7dw6xsbGIjo7GgQMHMGjQoDL7GRARFdBnJlYUnPZARJJWkkd5ZmRkaOw3NzeHubl5ofazZs2Cm5sboqKixH0eHh7ifwuCgPnz52PixIno3LkzAGD16tVwdnbGli1b0KNHDyQmJiImJgbHjh2Dn58fAGDhwoXo0KED5syZA1dXV92+MBHRc0jh8caG2WsiojJSklEONzc32NnZidvMmTOLPPfWrVvh5+eHbt26wcnJCU2aNMHy5cvF41evXoVSqURQUJC4z87ODk2bNkVCQgIAICEhAfb29mLhCwBBQUEwMjLC0aNH9fEjISIJ48gvEVElp4aR1o/oLGh3/fp1yOVycX9Ro74AcOXKFSxZsgSjRo3Cp59+imPHjuHjjz+GmZkZIiIioFQqAQDOzs4a73N2dhaPKZVKODk5aRw3MTGBg4OD2IaIqKyUJBMNDYtfIpI0lSCDSsvRi4J2crlco/gtjlqthp+fH2bMmAEAaNKkCc6ePYulS5ciIiKi5J0mItKTkmSioTHMkp2IqIzo8xKfi4sL/t/enYdFVfb/A38P+zrDojCgSJoLkiKGpmMuaCq5pY88WaaJZvrL0Mcl16/mmtlji2ahmZloYZbmSqaSCWqgKYqPKZJruACaCAjKMDDn9wcxOgJ6BhiGmfN+Xde5ruace87co/nmw33uc5/AwEC9fS1btkR6ejoAQKlUAgCysrL02mRlZemOKZVK3Lx5U+94cXExsrOzdW2IiGqKMTNx/vz5kMlkeltAQIDueGFhISIjI+Hp6QkXFxeEh4eXy8f09HT069cPTk5O8PLywrRp01BcXGxQP1j8EpGkCf8s6C5mEwxc1uf5559HWlqa3r4///wT/v7+AEpvflMqldi/f7/ueF5eHo4ePQqVSgUAUKlUyMnJQXJysq7Nr7/+Cq1Wiw4dOlT1axMRVciYmQgAzzzzDDIyMnTb4cOHdccmT56MXbt2YfPmzUhISMCNGzcwePBg3fGSkhL069cPRUVFSExMxPr16xEdHY25c+ca1AdOeyAiSSuBzIBHeRo2yjF58mR06tQJ77//PoYMGYLff/8dX375Jb788ksAgEwmw6RJk/Dee++hWbNmaNy4Md599134+vpi0KBBAEpHil988UWMGTMGX3zxBTQaDcaPH49XX32VKz0QUY0zZiYCpfcsVHTVKjc3F2vXrsXGjRvRo0cPAMC6devQsmVLHDlyBB07dsS+fftw9uxZ/PLLL/D29kZwcDAWLVqEGTNmYP78+bCzsxPVB478EpGkaQVDLvMZdu727dtj27Zt+O6779CqVSssWrQIy5cvx7Bhw3Rtpk+fjgkTJmDs2LFo37498vPzsWfPHjg4OOjaxMTEICAgAC+88AL69u2Lzp076wpoIqKaVJVMzMvL09vUanWl5z9//jx8fX3RpEkTDBs2TDcNLDk5GRqNRm/1m4CAADRq1Ehv9ZvWrVvr3SQcFhaGvLw8nDlzRvR35MgvEUmasZ9j379/f/Tv37/S4zKZDAsXLsTChQsrbePh4YGNGzca/NlERIaqSib6+fnp7Z83bx7mz59frn2HDh0QHR2NFi1aICMjAwsWLECXLl3wxx9/IDMzE3Z2dnBzc9N7z6Or31S0Ok7ZMbFY/BKRpGkhg1bkpTux7YiIzFVVMlHs8o99+vTR/XdQUBA6dOgAf39//PDDD3B0dKxGrw3D4tfCjG5/Aj2bXUJjjxwUFlvj1A0llh3qiCt3HjxOtaEiF1O7JaGtbwbsrEvw25VGWHKgM27fc9K1WTFwNwLq34aH033kFdrjSHpDLDvUEbcKnE3xtUikVh3y8fLbt9Cs9T14Kosx/42nkLRHYepu1WlSWNZH6lo9ewfhI66gaWAePOsXYdHkNkiK11872a9xPkZNPI/Wz+bA2kaL9EsuWDw1CLcyHeEi12D4uIt4tuNt1FcWIveOHZLi6+OblU/jXr6tib4VPSnvhr+TidCBOajvq4GmSIYLpx2x7gMl0k6W/hzzbliE1yZnIfj5fLjX1+B2li1+3eqO7z71QrFGurNCjbn846Pc3NzQvHlzXLhwAb169UJRURFycnL0Rn8fXf3m999/1ztH2WoQhqx+Uyf/dkNDQzFp0iRTd8MstfO7gU0prTDsu8EYu2UAbKy0WB0eC0cbDQDA0UaDL8NjIQjAm1tewojv/wVb6xJ8NuhnyPBgQuOxqw0w9adeGLBuKCbvCoOfWy4+GbDXVF+LRHJw0uLSGQd8/n8NTd0VsyH2rmZDLgXWNGZi9Tg4luDyn65YuaRlhceVDe/hw6+P49plZ8wYE4K3h6jw3ZrGKFJbAwA866vhWV+Nr5Y1x7iXVVg27xm063Qbk+adrc2vQY94Ut5dv2SPqNkN8P96NMc7g5oi86odlnx3CQqP0mWx/JoWwspKwKczGmJs9xZYPd8X/V6/jVGzpP3wmNrMxPz8fFy8eBE+Pj4ICQmBra2t3uo3aWlpSE9P11v95vTp03rLP8bFxUEul5dbVvJxOPJrYcZt1Z9bOGdvDxwcF41A71tIvu6L4AaZ8JXfxcvfvoyCotK7Imfv6YHfIr9Gh0bXcSS9NES+OdFGd46Mu65Y+3tbfDpwD2ysSlCsta69L0QGOX5AjuMHDP/tW8q0EL9WJac9mKfjv9XD8d/qVXo8YvwFHD9cD19/2ly3L/Pagythf110weKpbfSOrf+8KaYtPg0ray20JXVyHMniPSnvDmxz13v95Xxf9HktG40D7yPlsCuOx8txPP7B+zPT7bHlaTX6j7iNNQulu5KKMTNx6tSpGDBgAPz9/XHjxg3MmzcP1tbWGDp0KBQKBUaPHo0pU6bAw8MDcrkcEyZMgEqlQseOHQEAvXv3RmBgIF5//XUsXboUmZmZmDNnDiIjIyudalERFr8WzsW+CACQW1j6P4WddQkEAEUlDwpYdYkNtIIMbRtk6Irfh8kdCtGv5Xmk3FCy8CWLIxgwv01g8WtxZDIB7Tv/jR/XP4VFUSfwdEAesq474oevG5ebGvEwZ1cN7hXYsPA1Eza2WvQdfhv5uVa4dLbyuaXOriW4myPtn3PGzMRr165h6NChuH37NurXr4/OnTvjyJEjqF+/PgBg2bJlsLKyQnh4ONRqNcLCwrBy5Urd+62trREbG4tx48ZBpVLB2dkZERERj71huCJ1/l/tnTt3MGLECLi7u8PJyQl9+vTB+fPnAQCCIKB+/frYsmWLrn1wcDB8fHx0rw8fPgx7e3vcu3ev1vtuajIImBH6G05cV+LCbU8AwP8yvHFfY4vJXZLgYKOBo40GU7smwsZKQH1n/T+jyV2ScHTCGvz29jr4uObjPzv6VPQxRGbNmE8zMgZmYs1y8yiCk3MJXh51GcmJnpgzLgSJB7ww++NTaBWSXeF75G5FGDrmMn7+kdOL6roOPfOw/fxp7Lp8Gv8acwuzXn0aedkVj/v5PqXGwDf+xu5vPGu5l3WLMTNx06ZNuHHjBtRqNa5du4ZNmzbh6aef1h13cHBAVFQUsrOzUVBQgK1bt5aby+vv74/du3fj3r17uHXrFj766CPY2Bg2llvni9+RI0fi+PHj2LlzJ5KSkiAIAvr27QuNRgOZTIauXbsiPj4eQOkPhdTUVNy/fx/nzp0DACQkJKB9+/ZwcnKq9DPUanW5NeoswewXDqKpZzam/9RLt+/OfUe8E9sboU3+wtEJXyFx/Fq42hfhbFa9cmuYrjsWjCHfvIyxW/qjRJDh/Rf3AzBwoVOiOs4c5vw+zNiZaKl5WBmZVWmmHYn3wvYYf1z60xWb1zXG74fqoe+/r5Vr7+hcjAUrTiL9kjNiVjep7e6SgVJ+c8bbvZpj8ktNcTxejtmr/4LCU1OunadSg8Uxl3Aw1g0/b5R68WtemVgVdbrX58+fx86dO/HVV1+hS5cuaNOmDWJiYnD9+nVs374dQOmNIGVBf/DgQbRt21ZvX3x8PLp16/bYz1myZAkUCoVue3S9OnP0fz0OoVuTvzB680vIynfRO5b0lx/6fj0M3VaNRNdVo/B/e16Al0sBruXqz53KKXTEXzluSEr3w/SfeqFrk3S08dF/xjaRuTOnkd/ayERLzMPHybtjh2KNDOmX9FeyuXrJBV7KQr19jk7FWBR1Avfu2WDRlDYoKa7TP0IJgPq+NW5csce5E85Y9o4fSoqBF4fqj+h7eGuwdPMFnD3ujE+ncTTfnDKxqur0v9zU1FTY2NjoPb/e09MTLVq0QGpqKgCgW7duOHv2LG7duoWEhASEhobqgl6j0SAxMRGhoaGP/ZxZs2YhNzdXt129etWYX8vIBPxfj0Po0fQyRm9+CdfzKr8ZIKfQEXfV9njO7xo8nO4j/uJTlbaVyUpHR2ytS2q6w0QmVbampdjNlGojEy0rD5+suNgKf56Vo6G//jSQBv4FuJnxYG6oo3Mx3lt1AsUaKyycFAxNkbTnhZormRVga//gCqanUoMPt1zA+dNO+HiyHwQzLeZqkjllYlWZ/Q1vrVu3hoeHBxISEpCQkIDFixdDqVTiv//9L44dOwaNRoNOnTo99hz29vYG3SVYl83ucQh9A85j4s4+KCiyg6dTaaDnF9lBXVz61z3omXO4lO2G7HuOCPbNwozQw/gmuY1uLeDWyiy0Ut7Eies+yCu0h59bLsZ3Oob0HDlOZYhfR49qn4NTCXwbF+leK/2K0OSZ+7ibY41b18U981xqDBm9MIdRjupmoiXlYRkHx2L4+t3XvfZucB9Nmt/F3Twb3Mp0xI/rn8LM//4Pp0+44X/HPRDS6W906Po3ZowJAVBa+C5eeQL2DiX4cHYrODkXw8m5dLms3Dt20Grr/v8XluhxeZeXbY3XJt5E0j45srNsIfcoxkuj/kY9pQaHdrkBeFD43rxuhzULfaHwLNad684t6a7fbGmZWJE6Xfy2bNkSxcXFOHr0qC6sb9++jbS0NN16bjKZDF26dMGOHTtw5swZdO7cGU5OTlCr1Vi9ejXatWsHZ2fpPJjh1eDSZ1uvG7JDb/+cPd2x42wAAOAp9xxM7HwECgc1rue5Ys3REGw4EaRrW1hsgxeaXsLbqmNwtC3GrQIn/HbFD1/+1AuaEo521GXN29zHhz9e1L1+a8ENAMC+793x8eRGpupWnWZOQc9MrJpmgXn471fJutdjp/4JAIjb6YNl81oh6YAXPl/cEkPeuIy3pqfh2l9OWDwtCGdTSgcEmgbkISAoFwDw9a7f9M49sm9nvRFiqj2Py7sVMxuiYVM13n35CuQeJbh7xxp/nnLCO/9qir/+dAAAPNv1Lho0KUKDJkXYeEJ/zeYw3zaQKnPKxKqq08Vvs2bNMHDgQIwZMwarV6+Gq6srZs6ciQYNGmDgwIG6dqGhoXjnnXfQrl07uLiUzm/t2rUrYmJiMG3aNFN13yRafzLuiW2WH+6I5Yc7Vnr8/N+eeHPLwEqPU931vyQXSYd2VZhT0DMTq+Z0sgf6tu312DZxOxogbkeDKr+fat+T8m7Rm0899v1xP3gg7gePGu6V+TOnTKyqOj3nFwDWrVuHkJAQ9O/fHyqVCoIgYPfu3bC1fXBJolu3bigpKdGbxxYaGlpuHxHRo8zt5g5mIhEZk7llYlXUyZHfsruSAcDd3R0bNmx4bPvg4GAIgv4SXJMmTeLjQInoiQSIf0qRqRb6YyYSUW0xh0ysrjpZ/BIR1RYpXOIjIhJLCpnI4peIJE0KQU9EJJYUMpHFLxFJmhSCnohILClkIotfIpI0KQQ9EZFYUshEFr9EJGmCIBP9VCc+/YmILJ0UMpHFLxFJmiGP6DTXR3kSEYklhUxk8UtEkiaFS3xERGJJIRNZ/BKRpEnhEh8RkVhSyMQ6/4Q3IiJjMubTjObPnw+ZTKa3BQQE6I4XFhYiMjISnp6ecHFxQXh4OLKysvTOkZ6ejn79+sHJyQleXl6YNm0aiouLa+S7ExE9ik94IyKycMYe5XjmmWfwyy+/6F7b2DyI3cmTJ+Onn37C5s2boVAoMH78eAwePBi//fYbAKCkpAT9+vWDUqlEYmIiMjIyMGLECNja2uL99983uC9ERE8ihZFfFr9EJGmCAaMXVQl6GxsbKJXKcvtzc3Oxdu1abNy4ET169AAArFu3Di1btsSRI0fQsWNH7Nu3D2fPnsUvv/wCb29vBAcHY9GiRZgxYwbmz58POzs7g/tDRPQ4xs7EuoDTHohI0gQAgiBy++c9eXl5eptara70/OfPn4evry+aNGmCYcOGIT09HQCQnJwMjUaDnj176toGBASgUaNGSEpKAgAkJSWhdevW8Pb21rUJCwtDXl4ezpw5U+N/FkREVclEc8Pil4gkrWxZH7EbAPj5+UGhUOi2JUuWVHjuDh06IDo6Gnv27MGqVatw+fJldOnSBXfv3kVmZibs7Ozg5uam9x5vb29kZmYCADIzM/UK37LjZceIiGpaVTLR3HDaAxFJWlXmt129ehVyuVy3397evsL2ffr00f13UFAQOnToAH9/f/zwww9wdHSsRq+JiIxDCnN+OfJLRJJWlTub5XK53lZZ8fsoNzc3NG/eHBcuXIBSqURRURFycnL02mRlZenmCCuVynKrP5S9rmgeMRFRdUlhtQcWv0QkaVqtzKCtOvLz83Hx4kX4+PggJCQEtra22L9/v+54Wloa0tPToVKpAAAqlQqnT5/GzZs3dW3i4uIgl8sRGBhYrb4QEVWkNjPRVDjtgYgkzZiX+KZOnYoBAwbA398fN27cwLx582BtbY2hQ4dCoVBg9OjRmDJlCjw8PCCXyzFhwgSoVCp07NgRANC7d28EBgbi9ddfx9KlS5GZmYk5c+YgMjJS9GgzEZEhpDDtgcUvEUmaVpBBZqRHeV67dg1Dhw7F7du3Ub9+fXTu3BlHjhxB/fr1AQDLli2DlZUVwsPDoVarERYWhpUrV+reb21tjdjYWIwbNw4qlQrOzs6IiIjAwoULDeoHEZFYxszEuoLFLxFJWtmSPWLbGmLTpk2PPe7g4ICoqChERUVV2sbf3x+7d+827IOJiKrImJlYV7D4JSJJKw16sZf4jNwZIiITk0Imiip+d+7cKfqEL730UpU7Q0RU26oyv2337t1wcnIS9R5mIhGZE875/cegQYNEnUwmk6GkpKQ6/SEiqlUCxD+lqKzd0KFDIZM9OfSZiURkbqqSieZGVPGr1WqN3Q8iIpOoyihHbm6u3kMuiIgshRRGfqu1zm9hYWFN9YOIyDQEA7fHYCYSkdmrwUysqwwufktKSrBo0SI0aNAALi4uuHTpEgDg3Xffxdq1a2u8g0RERvXPKIeYDRWMcjATiciiVDMTzYHBxe/ixYsRHR2NpUuXws7OTre/VatW+Oqrr2q0c0RExla2rI/Y7VHMRCKyJNXNRHNgcPG7YcMGfPnllxg2bBisra11+9u0aYNz587VaOeIiIxN7AhHZfPgmIlEZEmqm4nmwOB1fq9fv46mTZuW26/VaqHRaGqkU0REtcaQS3cVtGMmEpFFqWYmmgODR34DAwNx6NChcvu3bNmCtm3b1kiniIhqS3Uv8TETiciSSGHag8Ejv3PnzkVERASuX78OrVaLrVu3Ii0tDRs2bEBsbKwx+khEZDzVXNSSmUhEFkUCC/0aPPI7cOBA7Nq1C7/88gucnZ0xd+5cpKamYteuXejVq5cx+khEZDTVnd/GTCQiS8I5v5Xo0qUL4uLiarovRESmUc3RC2YiEVkUMx3RFatKxS8AHD9+HKmpqQBK57yFhITUWKeIiGpLTT3NiJlIRJaAT3irwLVr19ClSxc899xzmDhxIiZOnIj27dujc+fOuHbtmjH6SERkPNV8mhEzkYgsSi094e2DDz6ATCbDpEmTdPsKCwsRGRkJT09PuLi4IDw8HFlZWXrvS09PR79+/eDk5AQvLy9MmzYNxcXFBn22wcXvm2++CY1Gg9TUVGRnZyM7OxupqanQarV48803DT0dEZGJyQzc9DETiciyVC8TxTh27BhWr16NoKAgvf2TJ0/Grl27sHnzZiQkJODGjRsYPHiw7nhJSQn69euHoqIiJCYmYv369YiOjsbcuXMN+nyDi9+EhASsWrUKLVq00O1r0aIFPvvsMxw8eNDQ0xERmVY1RzmYiURkUYw88pufn49hw4ZhzZo1cHd31+3Pzc3F2rVr8cknn6BHjx4ICQnBunXrkJiYiCNHjgAA9u3bh7Nnz+Lbb79FcHAw+vTpg0WLFiEqKgpFRUWi+2Bw8evn51fhwu0lJSXw9fU19HRERKZVzaBnJhKRRalCJubl5eltarW60tNHRkaiX79+6Nmzp97+5ORkaDQavf0BAQFo1KgRkpKSAABJSUlo3bo1vL29dW3CwsKQl5eHM2fOiP6KBhe/H374ISZMmIDjx4/r9h0/fhwTJ07ERx99ZOjpiIhMq+xpRmK3RzATiciiVCET/fz8oFAodNuSJUsqPPWmTZtw4sSJCo9nZmbCzs4Obm5uevu9vb2RmZmpa/Nw4Vt2vOyYWKJWe3B3d4dM9iD0CwoK0KFDB9jYlL69uLgYNjY2eOONNzBo0CDRH05EZGqGPKWorF2jRo1gZfVg7ICZSESWoiqZePXqVcjlct1+e3v7cm2vXr2KiRMnIi4uDg4ODjXR1SoTVfwuX77cyN0gIjKRKjzN6IMPPoCjo6OxekREZDpVyES5XK5X/FYkOTkZN2/exLPPPqvbV1JSgoMHD+Lzzz/H3r17UVRUhJycHL3R36ysLCiVSgCAUqnE77//rnfestUgytqIIar4jYiIEH1CIiKzUsl0hkrbAnjttdeeGPRERGapCpkoxgsvvIDTp0/r7Rs1ahQCAgIwY8YM+Pn5wdbWFvv370d4eDgAIC0tDenp6VCpVAAAlUqFxYsX4+bNm/Dy8gIAxMXFQS6XIzAwUHRfDJ7z+7DCwsJyk5yJiMyJTDBse5zHZaIp17QkIhKrJjPxYa6urmjVqpXe5uzsDE9PT7Rq1QoKhQKjR4/GlClTcODAASQnJ2PUqFFQqVTo2LEjAKB3794IDAzE66+/jlOnTmHv3r2YM2cOIiMjK5xqURmDi9+CggKMHz8eXl5ecHZ2hru7u95GRGRWqrnag5hMNPWalkREotXSQy4qsmzZMvTv3x/h4eHo2rUrlEoltm7dqjtubW2N2NhYWFtbQ6VSYfjw4RgxYgQWLlxo0OcYXPxOnz4dv/76K1atWgV7e3t89dVXWLBgAXx9fbFhwwZDT0dEZFrVXO3hSZlYF9a0JCISrZqZaIj4+Hi9+8ocHBwQFRWF7OxsFBQUYOvWreXm8vr7+2P37t24d+8ebt26hY8++kh3s7FYBhe/u3btwsqVKxEeHg4bGxt06dIFc+bMwfvvv4+YmBhDT0dEZFrVXNNyx44dWL58eaWZWBfWtCQiEs2EI7+1xeDiNzs7G02aNAFQendfdnY2AKBz5858mhERmZ8qBP3Da1pev34dP//8M4Dymfjrr7/WiTUtiYhEY/FbXpMmTXD58mUApaMUP/zwA4DSEeFHQ5yIqM6rQtBfvXoVubm5yM3NRWBgIPr27QtAPxM3bNgAjUaDmJgYk69pSUQkGovf8kaNGoVTp04BAGbOnImoqCg4ODhg8uTJmDZtWo13kIjIqKowv61sTUu5XI4333wTqampAPQzccGCBdBqtXj22WdhY2MDGxsbJCQkYMWKFbCxsYG3t7duTcuHPbqm5aOrP1RlTUsiItFqcc6vqRg2QxildyeX6dmzJ86dO4fk5GQ0bdq03J3MRER1nSHL9VTUrrJM9PHxgaurq15bU61pSUQkVnUz0RwYXPw+yt/fH/7+/jXRFyKi2mfIpTsR7R6XiQ+vaQlAt6alh4cH5HI5JkyYUOmalkuXLkVmZmaV1rQkIhKthjOxLhJV/K5YsUL0Cf/zn/9UuTNERObgiy++ED2P93GZuGzZMlhZWSE8PBxqtRphYWFYuXKl7njZmpbjxo2DSqWCs7MzIiIiDF7TkoiIHpAJgvDEur1x48biTiaT4dKlS9XulKnl5eVBoVAgFANhI7M1dXeoBu29kWLqLlANy7urhXvzS8jNzTXokcNl/879//serEQWstrCQvw1Yw4aNWoEK6sn3zJhCZlY9ufUw2EIbGR2pu4O1aCfLx0xdReohlU1D4HqZWJVPs+URI38lq3uQERkcarwHPvTp0+bVdATEYlWhUw0N9We80tEZNYkML+NiEg0CWQii18ikjYJBD0RkWgSyEQWv0QkaVJY1oeISCwpZCKLXyKSNgmMchARiSaBTGTxS0SSJtOWbmLbEhFZMilkosGPNwaAQ4cOYfjw4VCpVLh+/ToA4JtvvsHhw4drtHNEREZXA4/yZCYSkcWQwOONDS5+f/zxR4SFhcHR0REnT56EWq0GAOTm5uL999+v8Q4SERmVYOD2CGYiEVmUamaiOTC4+H3vvffwxRdfYM2aNbC1ffAAiOeffx4nTpyo0c4RERlb2c0dYrdHMROJyJJUNxPNgcFzftPS0tC1a9dy+xUKBXJycmqiT0REtaeaN3cwE4nIokjghjeDR36VSiUuXLhQbv/hw4fRpEmTGukUEVGtMWSEo4KgZyYSkUWpZiaaA4OL3zFjxmDixIk4evQoZDIZbty4gZiYGEydOhXjxo0zRh+JiIynmvPbmIlEZFEkMOfX4GkPM2fOhFarxQsvvIB79+6ha9eusLe3x9SpUzFhwgRj9JGIyHiqeYmPmUhEFkUC0x4MLn5lMhlmz56NadOm4cKFC8jPz0dgYCBcXFyM0T8iIqOq7tOMmIlEZEn4hLfHsLOzQ2BgYE32hYjIbDETiYjMg8HFb/fu3SGTVb6o8a+//lqtDhER1apqXuJjJhKRReG0h/KCg4P1Xms0GqSkpOCPP/5ARERETfWLiKhWVPcSHzORiCwJpz1UYNmyZRXunz9/PvLz86vdISKiWleNAGcmEpHFMdOiViyDlzqrzPDhw/H111/X1OmIiGqHkZb1YSYSkVniUmfiJSUlwcHBoaZOR0RUK4x1iY+ZSETmiNMeKjB48GC914IgICMjA8ePH8e7775bYx0jIqoV1by5g5lIRBaFN7yVp1Ao9F5bWVmhRYsWWLhwIXr37l1jHSMiqg3VHeVgJhKRJeHI7yNKSkowatQotG7dGu7u7sbqExFR7anGKMeTMnHVqlVYtWoVrly5AgB45plnMHfuXPTp0wcAUFhYiHfeeQebNm2CWq1GWFgYVq5cCW9vb9050tPTMW7cOBw4cAAuLi6IiIjAkiVLYGNTY7PWiIgekMDIr0E3vFlbW6N3797IyckxUneIiGpZNW7ueFImNmzYEB988AGSk5Nx/Phx9OjRAwMHDsSZM2cAAJMnT8auXbuwefNmJCQk4MaNG3rTKEpKStCvXz8UFRUhMTER69evR3R0NObOnVujfwRERDoSuOHN4NUeWrVqhUuXLhmjL0REta7sEp/Y7VGPy8QBAwagb9++aNasGZo3b47FixfDxcUFR44cQW5uLtauXYtPPvkEPXr0QEhICNatW4fExEQcOXIEALBv3z6cPXsW3377LYKDg9GnTx8sWrQIUVFRKCoqMuYfCxFJVHUz0RwYXPy+9957mDp1KmJjY5GRkYG8vDy9jYjIrFRhlOPhzJs1axamTJnyxEwsKSnBpk2bUFBQAJVKheTkZGg0GvTs2VPXJiAgAI0aNUJSUhKA0hUjWrdurTcNIiwsDHl5ebrRYyKiGiWBkV/Rk8YWLlyId955B3379gUAvPTSS3qP9BQEATKZDCUlJTXfSyIiY6nC/DY/P79yhyrLxJSUFKhUKhQWFsLFxQXbtm1DYGAgUlJSYGdnBzc3N73zeHt7IzMzEwCQmZmpV/iWHS87RkRU4yQw51d08btgwQK89dZbOHDggDH7Q0RUq6pyZ/PVq1fRqFEjnD9/HmlpabC1tYWdnV2F72nRogVSUlKQm5uLLVu2ICIiAgkJCTXUeyKimsXVHh4iCKXfsFu3bkbrDBFRravCKIdcLgcAuLq66q6GPU7Tpk0BACEhITh27Bg+/fRTvPLKKygqKkJOTo7e6G9WVhaUSiUAQKlU4vfff9c7V1ZWlu4YEVGNk8DIr0Fzfh++pEdEZAmqc3NHVTJRq9VCrVYjJCQEtra22L9/v+5YWloa0tPToVKpAAAqlQqnT5/GzZs3dW3i4uIgl8sRGBhYtS9MRPQYUrjhzaCFIps3b/7EsM/Ozq5Wh4iIalU1RjmelIn379/H3r170ahRI9y9excbN25EfHw89u7dC4VCgdGjR2PKlCnw8PCAXC7HhAkToFKp0LFjRwBA7969ERgYiNdffx1Lly5FZmYm5syZg8jISNjb21ft+xIRPY4ERn4NKn4XLFhQ7mlGRERmrRpB/6RMXLt2LUaMGIGMjAwoFAoEBQVh79696NWrFwBg2bJlsLKyQnh4uN5DLspYW1sjNjYW48aNg0qlgrOzMyIiIrBw4UIDvyQRkUgsfvW9+uqr8PLyMlZfiIhqneyfTWzbhz0pEyMiIh57PgcHB0RFRSEqKqrSNv7+/ti9e7fIHhIRVU91MtFciJ7zy/m+RGSRqrimJTORiCySEdf5XbVqFYKCgiCXyyGXy6FSqfDzzz/rjhcWFiIyMhKenp5wcXFBeHi47ibfMunp6ejXrx+cnJzg5eWFadOmobi42KB+iC5+y1Z7ICKyJFW9uYOZSESWyJg3vNWVR76Lnvag1WoNOjERkVmo4vw2ZiIRWSQjzvkdMGCA3uvFixdj1apVOHLkCBo2bIi1a9di48aN6NGjBwBg3bp1aNmyJY4cOYKOHTvqHvn+yy+/wNvbG8HBwVi0aBFmzJiB+fPnV7re+qMMfrwxEZHFseDHeBIRGczATHz0se5qtfqJH2HKR76z+CUiSZPCmpZERGJVJRP9/PygUCh025IlSyo9/+nTp+Hi4gJ7e3u89dZbuke+Z2Zm1toj3w1a7YGIyOJIYFkfIiLRqpCJV69e1T35EsBj1yGvC498Z/FLRJImhefYExGJVZVMLFu9QQw7OzuTP/Kd0x6ISNqMuKwPEZHZqeVMNMUj3znyS0SSxpFfIqIHjJmJs2bNQp8+fUz+yHcWv0QkbZzzS0T0gBEz8ebNm3Xike8sfolI2lj8EhE9YMRMXLt27WOP19Yj31n8EpGkcdoDEdEDUshEFr9EJG0c+SUiekACmcjil4gkTSYIkAniElxsOyIicyWFTGTxS0SSJtOWbmLbEhFZMilkIotfIpI2CVziIyISTQKZyOKXiCRNCjd3EBGJJYVMZPFLRNImgVEOIiLRJJCJLH6JSNKkMMpBRCSWFDKRxS8RSZsERjmIiESTQCay+JWwASP/xr/H3YRH/WJcOuuIlXMaIC3FydTdokqMeC4QWdfsyu0fEHEL45dcx7Twpvhfkovesb6v/42J/70GANj3vQc+ntyownN//78/4FavuOY7bSbMdfSCxGnVPg//HpuBpq0K4OmtwcL/1wxJcR4Vth3/3mX0e+0mVi9qhO3rfHT7ow+ehHfDIr22Xy/1w+YvfI3ad6rc3xm2WLvYB8cOyKG+bwXfp9R4Z1k6mre5DwA4vFuBnzZ44vxpJ9y9Y4OV+9LwdKv7uvfn3bHGNx8pcSLBFTdv2EHhUYxOL+YiYnoGnOVmuoxBDbH0TDRp8RsaGorg4GAsX768wuMymQzbtm3DoEGDRJ0vPj4e3bt3x507d+Dm5lZj/bRE3V66g7HzbuCzmQ1x7oQT/jXmFhZvvITRXVog97atqbtHFVjxcxq0JTLd6yvnHDDr1aboMiBXt6/PsL8xYlqm7rW944MA7/bSHbTrnqd3zo8mNYJGbSXpwheCULqJbWtEzETjcHDS4lKqE/Ztro93vzhfabtOvbMREJyPvzMrzsANnzTEnk31da/vFVjXeF9JnLs51pgysBmCOt3Fe99egptnMa5fsoeLokTXpvCeFZ55rgBdB+Rg+bTyv/hnZ9nidpYtxsy9gUbNC3Hzmh1WzGyI21m2eHfNlVr8NnVMHcpEY7EydQceJyMjA3369DF1NyzS4LF/Y89GD+z73gPp5x2wYkZDqO/LEDY029Rdo0q4eZbAw6tYtx39RQGfp9QIUuXr2tg7CnptnF21lR6zshZw6jcXhA29bYqvU2eUzW8TuxliyZIlaN++PVxdXeHl5YVBgwYhLS1Nr01hYSEiIyPh6emJQ4cOITY2FllZWXpt0tPT0a9fPzg4OGDs2LGYNm0aiosl/AuLgY4nuGHDJ35I3FfxaC8AeHoXYdy8K1g6+WmUFMsqbHO/wAp3/rbTber7LH5N5YcoL9TzLcLU5VcR0PYelI2KEBJ6F75PPRid7/nvOxg+JQttu+ZXeI6nAgox96sr6Ng7D75PFSG4cz5GzsjA0Tg5SiT8z8uYmVhX1OniV6lUwt7e3tTdsDg2tlo0C7qHE4dcdfsEQYaTh1wRGHLPhD0jsTRFMvz6ozvCXr0N2UM/pw9sdcfLz7TC2O4t8PX7Pii8V/EPcQD4ZbMH7B0FdOmXY/wO12WCgZsBEhISEBkZiSNHjiAuLg4ajQa9e/dGQUGBrs3kyZOxa9cubN68GcHBwSgoKMDgwYN1x0tKStCvXz8UFRUhKSkJ69evR3R0NObOnVutr00PyGQCpn58EVvW+CL9fOVTv15+KwPfJyfj812nET7mBqyszfQnvwU4sk+B5m3u4b2xT2FI62fwdq/m2B1T+S83YhXkWcPJRQtrKU8KNWIm1hUmL361Wi2mT58ODw8PKJVKzJ8/X3dMJpNh+/btuteJiYkIDg6Gg4MD2rVrh+3bt0MmkyElJUXvnMnJyWjXrh2cnJzQqVOnciMtUif3KIG1DZBzS/9f952/beBeX8K/7pqRxD0K5OdZo/eQByP13f91B9M//wtLt1zAqxNuYv+P7lg6wb/Sc+z9zhPd/3UH9o5mml41pOxpRmI3Q+zZswcjR47EM888gzZt2iA6Ohrp6elITk4GAOTm5mLt2rX45JNP0KNHD7i6uuKFF15AYmIi5HI5lEolRowYgbNnz+Lbb79F27ZtoVarsWjRIkRFRSEhIYGZWANefusGtCXAjmjvStvsWK/EB/9pihnDWmL3d1545e0bGD0zvRZ7SQ/LSLdD7IZ68G2sxvsbL6F/xG2serch4n5wr/I5c29bY+NyJfoM/7sGe2p+jJmJdYXJf7dZv349pkyZgqNHjyIpKQkjR47E888/j169eum1y8vLw4ABA9C3b19s3LgRf/31FyZNmlThOWfPno2PP/4Y9evXx1tvvYU33ngDv/32W6V9UKvVUKvVep9FVJft/c4D7bvnwVP54JeVvsMfTF9o3LIQHl4azBjSFDeu2OldCgSAs8edkH7eAdM/+6vW+lxnVeHO5kczwt7eXtRVqtzc0vnZHh6lI1TJycnQaDTo2bOnrs2uXbugUCjw9ttvIyAgABEREWjSpAm8vR8UZmFhYRg3bhxeeuklvPTSSzWaiVLLw6atCjBwZBYmDGgFoPIrJdvWPrj57co5JxRrZJjw3hVEf+gHTZHJx5EkR9ACzYLu441ZGQCApq3v48o5B/z0TT30GnLH4PMV3LXCuyOaoFHzQrz+TuaT32DJJLDag8n/xQYFBWHevHlo1qwZRowYgXbt2mH//v3l2m3cuBEymQxr1qxBYGAg+vTpg2nTplV4zsWLF6Nbt24IDAzEzJkzkZiYiMLCwkr7sGTJEigUCt3m5+dXY9+vLsrLtkZJMeD2yCive71i3Lll8t+H6Amyrtni5CFXvPja4+fqBjxbOoXlxpXyRdmejZ54+pl7aBZ0v9wxqanK/DY/Pz+9zFiyZMkTP0er1WLSpEl4/vnn0apVKwBAZmYm7Ozs9G5GCwoKQvPmzVFSUoIRI0agfv360Gr1h1fKCmFBEGo8E6WWh63a58HNU4MNh08i9s+jiP3zKLwbFuHN/0tH9MGTlb7vXIoLbGwFeDVQV9qGjMfDqxj+zfX/H/ZrVoib1w2/YftevhVmv/Y0HJ21mLf2Mmwkfs+3FOb8mrzSCQoK0nvt4+ODmzdvlmuXlpaGoKAgODg46PY999xzTzynj0/pb+s3b95Eo0YVL/M0a9YsTJkyRfc6Ly/PogO/WGOF8/9zQtvOd5G0RwGgdM5bcOd87Iz2NHHv6En2bfKEW71idOj5+BG5i384AgA8vDR6++8XWOHgLjeM+mfERPKqcGfz1atXIZfLdbvFjPpGRkbijz/+wOHDhx/bLigoCMeOHdO9dnJyQlFRUYVtGzduXOOZKLU83L+tHk7+ptDb9170Ofy6vR72ba5fybuApwPvoaQEXB3HRALbF+DqRf1/d9cv2cOrgaaSd1Ss4G5p4WtrJ2BB9CXYOZhpNVeTJLDag8mLX1tb/eCQyWTlRjmqc07ZP3cDPe6cYi9ZWpKtX9bD1OVX8ecpJ6SdLF3qzMFJi32bqn/DABmPVlu6Xm/Pl7P1bsi4ccUOB7a547kX8uDqXoLLZx2wen4DtO6YjyaB+qMjCTvcUFIiwwvhhl8atERVeZqRXC7XK36fZPz48YiNjcXBgwfRsGFD3X6lUomioiLk5OToRn9tbW2RlZUFpVIJoDSfHp16ULYahJ1d+XWfK2JIJlpiHjo4lcDX/8G/A28/NZq0LMDdXBvcumGPuzn6P4dKimW4c8sW1y+X/gIZ0PYuAoLzcSpJjvsF1mj5bD7Gzv4LB7bXQ36eyX+MStLgsTcx+aXm+G6FF7oOyEHaSSfs/tYTkz68pmuTd8cat67b4XZW6d9RWbHs7qWBh1cxCu5a4f+GPg31fStM/+wy7uVb494/C0MoPIthLdHFPPiEtzqkRYsW+Pbbb6FWq3XB/PDoCBkmYac7FJ4lGDEtE+71i3HpjCNmD2uMnL85ilGXnTzoipvX7RD2qv6SdDa2Ak4ecsW2r+qj8J4V6vtq0LlvDoZOyip3jj3feeL5Pjl662FKmhHntwmCgAkTJmDbtm2Ij49H48aN9Y6HhITA1tYW+/fvR3h4OADgzp07SE9Ph0qlAlA6P/j8+fN6V8Ti4uLg4OCAy5cvMxNFaNa6AEu/S9W9/n9zSm9Ui9tSD59Mf/qJ79cUWaFb/9sYNvE6bO20yLpqj23rlHrzgKl2tQi+j7lrL2PdEh/ELFNC6VeEtxZeR4/BD36pP7JPofdgnyXjngIADJ+SidenZuLCaSecO+EMABjVKVDv/OuPnoXSr+IrLhZPAnN+zab4fe211zB79myMHTsWM2fORHp6Oj766CMAD0YyyDA719XDznX1TN0NMkBI6F3svZFSbr9XAw0+2npB1DmW76p8kX8pMuYoR2RkJDZu3IgdO3bA1dUVmZmlN9IoFAo4OjpCoVBg9OjRmDJlCjw8PHD37l3ExcVBpVKhY8eOAAAvLy8oFAq8/vrrAICTJ09i1apVePvttxEdHc1MFOH0UTn6NOkguv3Irm31Xl8844zJ4a1qultUTR175aFjr8qnf/V+JRu9X6l87fo2nfIrzFOpk8LIr8lveBNLLpdj165dSElJQXBwMGbPnq1b5/LhOW9ERAYpm98mdjPAqlWrkJubi9DQUPj4+Oi277//Xtdm2bJl6N+/P8LDw5GSkgInJyds3bpVd1wmk+GFF16A9T/XYJcvX44RI0bgv//9LzORiGqeETOxrjDpyG98fHy5fQ+v6ys88ofaqVMnnDp1Svc6JiYGtra2ups2QkNDy70nODi43D4iojLGHOUQkz0ODg6IiopCVFRUhccfzsRHMROJqKZJYeTXbKY9AMCGDRvQpEkTNGjQAKdOncKMGTMwZMgQODo6mrprRGSuzHh+GzORiGqcGWeiWGZV/GZmZmLu3LnIzMyEj48PXn75ZSxevNjU3SIiM2bOoxzMRCKqaeaciWKZVfE7ffp0TJ8+3dTdICJLohVKN7Ft6xBmIhHVODPORLHMqvglIqpxErjER0QkmgQykcUvEUmaDAZc4jNqT4iITE8Kmcjil4ikTQKP8iQiEk0Cmcjil4gkTQo3dxARiSWFTGTxS0TSJoH5bUREokkgE1n8EpGkyQQBMpGX7sS2IyIyV1LIRBa/RCRt2n82sW2JiCyZBDKRxS8RSZoURjmIiMSSQiay+CUiaZPA/DYiItEkkIksfolI2iSwrA8RkWgSyEQWv0QkaVJY1oeISCwpZCKLXyKSNgmMchARiSaBTGTxS0SSJtOWbmLbEhFZMilkIotfIpI2CYxyEBGJJoFMZPFLRNImgTubiYhEk0AmsvglIkmTwpqWRERiSSETWfwSkbRJ4BIfEZFoEshEK1N3gIjIpAQ8eJznkzbzzHkiIvGMlIlLlixB+/bt4erqCi8vLwwaNAhpaWl6bQoLCxEZGQlPT0+4uLggPDwcWVlZem3S09PRr18/ODk5wcvLC9OmTUNxcbFBX5HFLxFJWtklPrEbEZElM1YmJiQkIDIyEkeOHEFcXBw0Gg169+6NgoICXZvJkydj165d2Lx5MxISEnDjxg0MHjxYd7ykpAT9+vVDUVEREhMTsX79ekRHR2Pu3LkGfUcWv0QkbVoB0GpFboYVvwcPHsSAAQPg6+sLmUyG7du36x0XBAFz586Fj48PHB0d0bNnT5w/f16vTXZ2NoYNGwa5XA43NzeMHj0a+fn51f3WREQVq0Im5uXl6W1qtbrcaffs2YORI0fimWeeQZs2bRAdHY309HQkJycDAHJzc7F27Vp88skn6NGjB0JCQrBu3TokJibiyJEjAIB9+/bh7Nmz+PbbbxEcHIw+ffpg0aJFiIqKQlFRkeivyOKXiKRN7OW9ss0ABQUFaNOmDaKioio8vnTpUqxYsQJffPEFjh49CmdnZ4SFhaGwsFDXZtiwYThz5gzi4uIQGxuLgwcPYuzYsQZ/TSIiUaqQiX5+flAoFLptyZIlT/yY3NxcAICHhwcAIDk5GRqNBj179tS1CQgIQKNGjZCUlAQASEpKQuvWreHt7a1rExYWhry8PJw5c0b0V+QNb0Qkaca8s7lPnz7o06dPhccEQcDy5csxZ84cDBw4EACwYcMGeHt7Y/v27Xj11VeRmpqKPXv24NixY2jXrh0A4LPPPkPfvn3x0UcfwdfX16D+EBE9SVUy8erVq5DL5br99vb2j32fVqvFpEmT8Pzzz6NVq1YAgMzMTNjZ2cHNzU2vrbe3NzIzM3VtHi58y46XHROLI79EJG1ldzaL3SDuEt+TXL58GZmZmXqjHAqFAh06dNAb5XBzc9MVvgDQs2dPWFlZ4ejRo9X84kREFahCJsrlcr3tScVvZGQk/vjjD2zatKk2vlE5LH6JSNqqEPRVucT3qLJRiopGMR4e5fDy8tI7bmNjAw8PD4NGOYiIRKtCJhpi/PjxiI2NxYEDB9CwYUPdfqVSiaKiIuTk5Oi1z8rKglKp1LV5dPWHstdlbcRg8UtE0laFoL969Spyc3N126xZs0z8JYiIaoiRil9BEDB+/Hhs27YNv/76Kxo3bqx3PCQkBLa2tti/f79uX1paGtLT06FSqQAAKpUKp0+fxs2bN3Vt4uLiIJfLERgYKLovnPNLRNKmBSAzoC0eXOKrjrJRiqysLPj4+Oj2Z2VlITg4WNfm4ZAHgOLiYmRnZxs0ykFEJFoVMlGMyMhIbNy4ETt27ICrq6vu6pVCoYCjoyMUCgVGjx6NKVOmwMPDA3K5HBMmTIBKpULHjh0BAL1790ZgYCBef/11LF26FJmZmZgzZw4iIyOfONXiYRz5JSJJM9U6v40bN4ZSqdQb5cjLy8PRo0f1RjlycnJ0SwEBwK+//gqtVosOHTrUWF+IiMoYKxNXrVqF3NxchIaGwsfHR7d9//33ujbLli1D//79ER4ejq5du0KpVGLr1q2649bW1oiNjYW1tTVUKhWGDx+OESNGYOHChQZ9R478EpG0GXLpzsDiNz8/HxcuXNC9vnz5MlJSUuDh4YFGjRph0qRJeO+999CsWTM0btwY7777Lnx9fTFo0CAAQMuWLfHiiy9izJgx+OKLL6DRaDB+/Hi8+uqrXOmBiIzDSJkoiGjr4OCAqKioSpeHBAB/f3/s3r1b9OdWhMUvEUmbVgBkIgPcwIdcHD9+HN27d9e9njJlCgAgIiIC0dHRmD59OgoKCjB27Fjk5OSgc+fO2LNnDxwcHHTviYmJwfjx4/HCCy/AysoK4eHhWLFihUH9ICISzYiZWFew+CUiaTPiyG9oaOhjRztkMhkWLlz42Et2Hh4e2Lhxo0GfS0RUZUbMxLqCxS8RSZwhdyybZ9ATEYln+ZnI4peIpE0CoxxERKJJIBNZ/BKRtGkFiB69MNP5bUREokkgE1n8EpG0CdrSTWxbIiJLJoFMZPFLRNImgUt8RESiSSATWfwSkbRJ4BIfEZFoEshEFr9EJG0SGOUgIhJNApnI4peIpE2AAUFv1J4QEZmeBDKRxS8RSZsERjmIiESTQCay+CUiadNqAYi8Y1lrnnc2ExGJJoFMZPFLRNImgVEOIiLRJJCJLH6JSNokEPRERKJJIBNZ/BKRtElgWR8iItEkkIksfolI0gRBC0HkU4rEtiMiMldSyEQWv0QkbYIgfvTCTC/xERGJJoFMZPFLRNImGHCJz0yDnohINAlkIotfIpI2rRaQibx0Z6aX+IiIRJNAJrL4JSJpk8AoBxGRaBLIRBa/FRD++csshsZsH91HFcu7a56/pVLl8vJL/06FKoawoNVCEDnKYa43d1SHLg8FjYl7QjWNeWh5qpuHgDQykcVvBe7evQsAOIzdJu4J1TT35qbuARnL3bt3oVAoDH+jBEY5qqMsDw+qt5m4J1TTmIeWq8p5CEgiE1n8VsDX1xdXr16Fq6srZDKZqbtjVHl5efDz88PVq1chl8tN3R2qIVL6exUEAXfv3oWvr2/VTqAVAJllB311MA/J3Enp77XaeQhIIhNZ/FbAysoKDRs2NHU3apVcLrf4UJAiqfy9VnmEA/gnvMXe3GGeQV8dzEOyFFL5e61WHgKSyEQrU3eAiMiUBK1g0FYVUVFReOqpp+Dg4IAOHTrg999/r+FvQURUM2ojE02NxS8RSZugNWwz0Pfff48pU6Zg3rx5OHHiBNq0aYOwsDDcvHnTCF+GiKiajJyJdQGLX4mzt7fHvHnzYG9vb+quUA3i36t4xh7l+OSTTzBmzBiMGjUKgYGB+OKLL+Dk5ISvv/7aCN+GqoP/biwT/14NI4WRX5lQnfUwiIjMVF5eHhQKBTqjL2xgK+o9xdDgMHaXu3HG3t6+wh+sRUVFcHJywpYtWzBo0CDd/oiICOTk5GDHjh3V/h5ERDWhOpmYm5trVvOpecMbEUmSnZ0dlEolDmcatqShi4sL/Pz89PbNmzcP8+fPL9f277//RklJCby9vfX2e3t749y5cwb3mYjIWKqaiUqlEnZ2dkbqlXGw+CUiSXJwcMDly5dRVFRk0PsEQSi35BcvpxKRuatqJtrZ2cHBwcFIvTIOFr9EJFkODg5GDe169erB2toaWVlZevuzsrKgVCqN9rlERFVh7EysK3jDm4UKDQ3FpEmTTN0NqgFP+ruUyWTYvn276PPFx8dDJpMhJyen2n2jx7Ozs0NISAj279+v26fVarF//36oVCoT9kx6mImWg5lI1cWRXyIzl5GRAXd3d1N3gyoxZcoUREREoF27dnjuueewfPlyFBQUYNSoUabuGpFFYibSk7D4JTJzvHxet73yyiu4desW5s6di8zMTAQHB2PPnj3lboIjoprBTKQn4bQHCbhz5w5GjBgBd3d3ODk5oU+fPjh//jyA0pt36tevjy1btujaBwcHw8fHR/f68OHDsLe3x71792q971RKq9Vi+vTp8PDwgFKp1FtZ4NFLfImJiQgODoaDgwPatWuH7du3QyaTISUlRe+cycnJaNeuHZycnNCpUyekpaXVzpeRoPHjx+Ovv/6CWq3G0aNH0aFDB1N3SdKYieaPmUjVweJXAkaOHInjx49j586dSEpKgiAI6Nu3LzQaDWQyGbp27Yr4+HgApT8UUlNTcf/+fd1STAkJCWjfvj2cnJxM+C2kbf369XB2dsbRo0exdOlSLFy4EHFxceXa5eXlYcCAAWjdujVOnDiBRYsWYcaMGRWec/bs2fj4449x/Phx2NjY4I033jD21yCqE5iJ5o+ZSNXBaQ8W7vz589i5cyd+++03dOrUCQAQExMDPz8/bN++HS+//DJCQ0OxevVqAMDBgwfRtm1bKJVKxMfHIyAgAPHx8ejWrZspv4bkBQUFYd68eQCAZs2a4fPPP8f+/fvRq1cvvXYbN26ETCbDmjVr4ODggMDAQFy/fh1jxowpd87Fixfr/l5nzpyJfv36obCwUBJ3+pJ0MRMtAzORqoMjvxYuNTUVNjY2epdZPT090aJFC6SmpgIAunXrhrNnz+LWrVtISEhAaGgoQkNDER8fD41Gg8TERISGhproGxBQGvQP8/Hxwc2bN8u1S0tLQ1BQkF5YP/fcc088Z9kl3YrOSWRJmImWgZlI1cHil9C6dWt4eHggISFBL+gTEhJw7NgxaDQa3QgJmYatrf6jJmUyGbRabY2ds+yhDdU9J5ElYCbWfcxEqg4WvxauZcuWKC4uxtGjR3X7bt++jbS0NAQGBgIo/UfepUsX7NixA2fOnEHnzp0RFBQEtVqN1atXo127dnB2djbVVyADtGjRAqdPn4ZardbtO3bsmAl7RFS3MBOlhZlIFWHxa+GaNWuGgQMHYsyYMTh8+DBOnTqF4cOHo0GDBhg4cKCuXWhoKL777jsEBwfDxcUFVlZW6Nq1K2JiYji3zYy89tpr0Gq1GDt2LFJTU7F371589NFHAFDukbxEUsRMlBZmIlWExa8ErFu3DiEhIejfvz9UKhUEQcDu3bv1LvF069YNJSUlevPYQkNDy+2juk0ul2PXrl1ISUlBcHAwZs+ejblz5wIAb9og+gczUTqYiVQRmSAIgqk7QUTGExMTg1GjRiE3NxeOjo6m7g4RkUkxE4lLnRFZmA0bNqBJkyZo0KABTp06hRkzZmDIkCEMeSKSJGYiPYrFL5GFyczM1D1K18fHBy+//DIWL15s6m4REZkEM5EexWkPRERERCQZvOGNiIiIiCSDxS8RERERSQaLXyIiIiKSDBa/RERERCQZLH6JiIiISDJY/FKdMnLkSAwaNEj3OjQ0FJMmTar1fsTHx0MmkyEnJ6fSNjKZDNu3bxd9zvnz5yM4OLha/bpy5QpkMhlSUlKqdR4iMg/MxMdjJlJVsPilJxo5ciRkMhlkMhns7OzQtGlTLFy4EMXFxUb/7K1bt2LRokWi2ooJZyKi6mImEpk3PuSCRHnxxRexbt06qNVq7N69G5GRkbC1tcWsWbPKtS0qKoKdnV2NfK6Hh0eNnIeIqCYxE4nMF0d+SRR7e3solUr4+/tj3Lhx6NmzJ3bu3AngwWW5xYsXw9fXFy1atAAAXL16FUOGDIGbmxs8PDwwcOBAXLlyRXfOkpISTJkyBW5ubvD09MT06dPx6DNXHr3Ep1arMWPGDPj5+cHe3h5NmzbF2rVrceXKFXTv3h0A4O7uDplMhpEjRwIAtFotlixZgsaNG8PR0RFt2rTBli1b9D5n9+7daN68ORwdHdG9e3e9foo1Y8YMNG/eHE5OTmjSpAneffddaDSacu1Wr14NPz8/ODk5YciQIcjNzdU7/tVXX6Fly5ZwcHBAQEAAVq5caXBfiMi4mIlPxkykuorFL1WJo6MjioqKdK/379+PtLQ0xMXFITY2FhqNBmFhYXB1dcWhQ4fw22+/wcXFBS+++KLufR9//DGio6Px9ddf4/Dhw8jOzsa2bdse+7kjRozAd999hxUrViA1NRWrV6+Gi4sL/Pz88OOPPwIA0tLSkJGRgU8//RQAsGTJEmzYsAFffPEFzpw5g8mTJ2P48OFISEgAUPoDafDgwRgwYABSUlLw5ptvYubMmQb/mbi6uiI6Ohpnz57Fp59+ijVr1mDZsmV6bS5cuIAffvgBu3btwp49e3Dy5Em8/fbbuuMxMTGYO3cuFi9ejNTUVLz//vt49913sX79eoP7Q0S1h5lYHjOR6iyB6AkiIiKEgQMHCoIgCFqtVoiLixPs7e2FqVOn6o57e3sLarVa955vvvlGaNGihaDVanX71Gq14OjoKOzdu1cQBEHw8fERli5dqjuu0WiEhg0b6j5LEAShW7duwsSJEwVBEIS0tDQBgBAXF1dhPw8cOCAAEO7cuaPbV1hYKDg5OQmJiYl6bUePHi0MHTpUEARBmDVrlhAYGKh3fMaMGeXO9SgAwrZt2yo9/uGHHwohISG61/PmzROsra2Fa9eu6fb9/PPPgpWVlZCRkSEIgiA8/fTTwsaNG/XOs2jRIkGlUgmCIAiXL18WAAgnT56s9HOJyLiYiRVjJpK54JxfEiU2NhYuLi7QaDTQarV47bXXMH/+fN3x1q1b681pO3XqFC5cuABXV1e98xQWFuLixYvIzc1FRkYGOnTooDtmY2ODdu3albvMVyYlJQXW1tbo1q2b6H5fuHAB9+7dQ69evfT2FxUVoW3btgCA1NRUvX4AgEqlEv0ZZb7//nusWLECFy9eRH5+PoqLiyGXy/XaNGrUCA0aNND7HK1Wi7S0NLi6uuLixYsYPXo0xowZo2tTXFwMhUJhcH+IyHiYiU/GTKS6isUvidK9e3esWrUKdnZ28PX1hY2N/v86zs7Oeq/z8/MREhKCmJiYcueqX79+lfrg6Oho8Hvy8/MBAD/99JNewAKlc/ZqSlJSEoYNG4YFCxYgLCwMCoUCmzZtwscff2xwX9esWVPuB4+1tXWN9ZWIqo+Z+HjMRKrLWPySKM7OzmjatKno9s8++yy+//57eHl5lftNv4yPjw+OHj2Krl27Aij9bT45ORnPPvtshe1bt24NrVaLhIQE9OzZs9zxslGWkpIS3b7AwEDY29sjPT290tGRli1b6m5UKXPkyJEnf8mHJCYmwt/fH7Nnz9bt++uvv8q1S09Px40bN+Dr66v7HCsrK7Ro0QLe3t7w9fXFpUuXMGzYMIM+n4hqFzPx8ZiJVJfxhjcyimHDhqFevXoYOHAgDh06hMuXLyM+Ph7/+c9/cO3aNQDAxIkT8cEHH2D79u04d+4c3n777ceuR/nUU08hIiICb7zxBrZv36475w8//AAA8Pf3h0wmQ2xsLG7duoX8/Hy4urpi6tSpmDx5MtavX4+LFy/ixIkT+Oyzz3Q3TLz11ls4f/48pk2bhrS0NGzcuBHR0dEGfd9mzZohPT0dmzZtwsWLF7FixYoKb1RxcHBAREQETp06hUOHDuE///kPhgwZAqVSCQBYsGABlixZghUrVuDPP//E6dOnsW7dOnzyyScG9YeI6hZmIjOR6hBTTzqmuu/hmzsMOZ6RkSGMGDFCqFevnmBvby80adJEGDNmjJCbmysIQunNHBMnThTkcrng5uYmTJkyRRgxYkSlN3cIgiDcv39fmDx5suDj4yPY2dkJTZs2Fb7++mvd8YULFwpKpVKQyWRCRESEIAilN6QsX75caNGihWBrayvUr19fCAsLExISEnTv27Vrl9C0aVPB3t5e6NKli/D1118bfHPHtGnTBE9PT8HFxUV45ZVXhGXLlgkKhUJ3fN68eUKbNm2ElStXCr6+voKDg4Pw73//W8jOztY7b0xMjBAcHCzY2dkJ7u7uQteuXYWtW7cKgsCbO4jqAmZixZiJZC5kglDJTHoiIiIiIgvDaQ9EREREJBksfomIiIhIMlj8EhEREZFksPglIiIiIslg8UtEREREksHil4iIiIgkg8UvEREREUkGi18iIiIikgwWv0REREQkGSx+iYiIiEgyWPwSERERkWT8f0OdC8ZZZ1PHAAAAAElFTkSuQmCC",
|
||
"text/plain": [
|
||
"<Figure size 800x600 with 8 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.metrics import ConfusionMatrixDisplay\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"\n",
|
||
"# Визуализация матриц\n",
|
||
"_, ax = plt.subplots(int(len(best_estimators) / 2), 2, figsize=(8, 6), sharex=False, sharey=False)\n",
|
||
"for index, key in enumerate(best_estimators.keys()):\n",
|
||
" y_pred = best_estimators[key].predict(X_test_close)\n",
|
||
" c_matrix = confusion_matrix(y_test_close, y_pred)\n",
|
||
" disp = ConfusionMatrixDisplay(confusion_matrix=c_matrix, display_labels=[\"low\", \"high\"]).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": [
|
||
"#### **Сделаем выводы относительно матрицы неточностей:**\n",
|
||
"1. Logistic Regression\n",
|
||
"* True Positives (TP): 634 (правильные предсказания для high)\n",
|
||
"* True Negatives (TN): 0 (не было правильных предсказаний для low)\n",
|
||
"* False Positives (FP): 294 (high предсказано, но на самом деле low)\n",
|
||
"* False Negatives (FN): 123 (low предсказано, но на самом деле high)\n",
|
||
"\n",
|
||
"Вывод: Модель показывает высокую точность для прогноза high, но полностью игнорирует класс low. Это может вызвать серьезные проблемы, так как неверные прогнозы могут привести к значительным финансовым потерям.\n",
|
||
"\n",
|
||
"2. Naive Bayes\n",
|
||
"* TP: 757 (правильные предсказания для high)\n",
|
||
"* TN: 0\n",
|
||
"* FP: 294\n",
|
||
"* FN: 0\n",
|
||
"\n",
|
||
"Вывод: Модель предсказывает только high с высокой точностью, но также не распознает класс low. Это делает модель ненадежной в контексте предсказания как низких, так и высоких цен.\n",
|
||
"\n",
|
||
"3. Decision Tree\n",
|
||
"* TP: 757\n",
|
||
"* TN: 293\n",
|
||
"* FP: 1\n",
|
||
"* FN: 0\n",
|
||
"\n",
|
||
"Вывод: Модель хорошо справляется с предсказаниями для high, при этом включает небольшое количество неверных предсказаний для low (один FP). Справляется лучше в контексте выявления low цен, но все еще не идеально, так как не распознает FN.\n",
|
||
"\n",
|
||
"4. KNeighbors\n",
|
||
"* TP: 612\n",
|
||
"* TN: 145\n",
|
||
"* FP: 132\n",
|
||
"* FN: 162\n",
|
||
"\n",
|
||
"Вывод: Эта модель наиболее сбалансирована из всех представленных, показывая разумную точность для обоих классов. Она делает больше ошибок, но также учит и предсказывает low с некоторой эффективностью."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Точность, полнота, верность (аккуратность), F-мера:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 106,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style type=\"text/css\">\n",
|
||
"#T_be170_row0_col0, #T_be170_row0_col1, #T_be170_row0_col3, #T_be170_row2_col2, #T_be170_row2_col3 {\n",
|
||
" background-color: #a8db34;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_be170_row0_col2 {\n",
|
||
" background-color: #a5db36;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_be170_row0_col4, #T_be170_row0_col5, #T_be170_row0_col6, #T_be170_row0_col7 {\n",
|
||
" background-color: #da5a6a;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_be170_row1_col0 {\n",
|
||
" background-color: #2eb37c;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_be170_row1_col1 {\n",
|
||
" background-color: #28ae80;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_be170_row1_col2, #T_be170_row1_col3, #T_be170_row3_col0, #T_be170_row3_col1 {\n",
|
||
" background-color: #26818e;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_be170_row1_col4 {\n",
|
||
" background-color: #9613a1;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_be170_row1_col5 {\n",
|
||
" background-color: #8707a6;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_be170_row1_col6 {\n",
|
||
" background-color: #8b0aa5;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_be170_row1_col7, #T_be170_row2_col4 {\n",
|
||
" background-color: #7a02a8;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_be170_row2_col0 {\n",
|
||
" background-color: #228b8d;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_be170_row2_col1 {\n",
|
||
" background-color: #228d8d;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_be170_row2_col5, #T_be170_row2_col6 {\n",
|
||
" background-color: #8104a7;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_be170_row2_col7 {\n",
|
||
" background-color: #8808a6;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_be170_row3_col2 {\n",
|
||
" background-color: #25848e;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_be170_row3_col3 {\n",
|
||
" background-color: #21918c;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_be170_row3_col4, #T_be170_row3_col5, #T_be170_row3_col6, #T_be170_row3_col7 {\n",
|
||
" background-color: #4e02a2;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"</style>\n",
|
||
"<table id=\"T_be170\">\n",
|
||
" <thead>\n",
|
||
" <tr>\n",
|
||
" <th class=\"blank level0\" > </th>\n",
|
||
" <th id=\"T_be170_level0_col0\" class=\"col_heading level0 col0\" >Precision_train</th>\n",
|
||
" <th id=\"T_be170_level0_col1\" class=\"col_heading level0 col1\" >Precision_test</th>\n",
|
||
" <th id=\"T_be170_level0_col2\" class=\"col_heading level0 col2\" >Recall_train</th>\n",
|
||
" <th id=\"T_be170_level0_col3\" class=\"col_heading level0 col3\" >Recall_test</th>\n",
|
||
" <th id=\"T_be170_level0_col4\" class=\"col_heading level0 col4\" >Accuracy_train</th>\n",
|
||
" <th id=\"T_be170_level0_col5\" class=\"col_heading level0 col5\" >Accuracy_test</th>\n",
|
||
" <th id=\"T_be170_level0_col6\" class=\"col_heading level0 col6\" >F1_train</th>\n",
|
||
" <th id=\"T_be170_level0_col7\" class=\"col_heading level0 col7\" >F1_test</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_be170_level0_row0\" class=\"row_heading level0 row0\" >DecisionTree</th>\n",
|
||
" <td id=\"T_be170_row0_col0\" class=\"data row0 col0\" >0.998992</td>\n",
|
||
" <td id=\"T_be170_row0_col1\" class=\"data row0 col1\" >0.998681</td>\n",
|
||
" <td id=\"T_be170_row0_col2\" class=\"data row0 col2\" >0.998656</td>\n",
|
||
" <td id=\"T_be170_row0_col3\" class=\"data row0 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_be170_row0_col4\" class=\"data row0 col4\" >0.998333</td>\n",
|
||
" <td id=\"T_be170_row0_col5\" class=\"data row0 col5\" >0.999049</td>\n",
|
||
" <td id=\"T_be170_row0_col6\" class=\"data row0 col6\" >0.998824</td>\n",
|
||
" <td id=\"T_be170_row0_col7\" class=\"data row0 col7\" >0.999340</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_be170_level0_row1\" class=\"row_heading level0 row1\" >KNeighbors</th>\n",
|
||
" <td id=\"T_be170_row1_col0\" class=\"data row1 col0\" >0.833878</td>\n",
|
||
" <td id=\"T_be170_row1_col1\" class=\"data row1 col1\" >0.822581</td>\n",
|
||
" <td id=\"T_be170_row1_col2\" class=\"data row1 col2\" >0.856855</td>\n",
|
||
" <td id=\"T_be170_row1_col3\" class=\"data row1 col3\" >0.808454</td>\n",
|
||
" <td id=\"T_be170_row1_col4\" class=\"data row1 col4\" >0.777619</td>\n",
|
||
" <td id=\"T_be170_row1_col5\" class=\"data row1 col5\" >0.736441</td>\n",
|
||
" <td id=\"T_be170_row1_col6\" class=\"data row1 col6\" >0.845210</td>\n",
|
||
" <td id=\"T_be170_row1_col7\" class=\"data row1 col7\" >0.815456</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_be170_level0_row2\" class=\"row_heading level0 row2\" >NaiveBayes</th>\n",
|
||
" <td id=\"T_be170_row2_col0\" class=\"data row2 col0\" >0.708571</td>\n",
|
||
" <td id=\"T_be170_row2_col1\" class=\"data row2 col1\" >0.720266</td>\n",
|
||
" <td id=\"T_be170_row2_col2\" class=\"data row2 col2\" >1.000000</td>\n",
|
||
" <td id=\"T_be170_row2_col3\" class=\"data row2 col3\" >1.000000</td>\n",
|
||
" <td id=\"T_be170_row2_col4\" class=\"data row2 col4\" >0.708571</td>\n",
|
||
" <td id=\"T_be170_row2_col5\" class=\"data row2 col5\" >0.720266</td>\n",
|
||
" <td id=\"T_be170_row2_col6\" class=\"data row2 col6\" >0.829431</td>\n",
|
||
" <td id=\"T_be170_row2_col7\" class=\"data row2 col7\" >0.837389</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_be170_level0_row3\" class=\"row_heading level0 row3\" >LogisticRegression</th>\n",
|
||
" <td id=\"T_be170_row3_col0\" class=\"data row3 col0\" >0.677130</td>\n",
|
||
" <td id=\"T_be170_row3_col1\" class=\"data row3 col1\" >0.683190</td>\n",
|
||
" <td id=\"T_be170_row3_col2\" class=\"data row3 col2\" >0.862567</td>\n",
|
||
" <td id=\"T_be170_row3_col3\" class=\"data row3 col3\" >0.837517</td>\n",
|
||
" <td id=\"T_be170_row3_col4\" class=\"data row3 col4\" >0.611190</td>\n",
|
||
" <td id=\"T_be170_row3_col5\" class=\"data row3 col5\" >0.603235</td>\n",
|
||
" <td id=\"T_be170_row3_col6\" class=\"data row3 col6\" >0.758682</td>\n",
|
||
" <td id=\"T_be170_row3_col7\" class=\"data row3 col7\" >0.752522</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n"
|
||
],
|
||
"text/plain": [
|
||
"<pandas.io.formats.style.Styler at 0x272f5d04bc0>"
|
||
]
|
||
},
|
||
"execution_count": 106,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"class_metrics = pd.DataFrame.from_dict(param_grid, \"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": [
|
||
"#### **Выводы:**\n",
|
||
"1. Decision Tree (Решающие деревья)\n",
|
||
"* Precision (Точность):\n",
|
||
"Высокий уровень как на обучающем (0.99992), так и на тестовом (0.99868) наборах данных.\n",
|
||
"* Recall (Полнота):\n",
|
||
"Идеальный результат на обучающем наборе (1.00000), с незначительным падением на тесте (0.99865).\n",
|
||
"* Accuracy (Точность):\n",
|
||
"Очень высокая: 0.99833 на обучающем и 0.999049 на тестовом наборах.\n",
|
||
"* F1 Score:\n",
|
||
"Высокий на обоих наборах (0.998824 для тестового).\n",
|
||
"\n",
|
||
"Вывод: Деревья решений демонстрируют наилучшие результаты по всем метрикам. Они хорошо справляются как с обучающими, так и с тестовыми данными, и, вероятно, являются наилучшим выбором.\n",
|
||
"\n",
|
||
"2. K-Neighbors (Метод ближайших соседей)\n",
|
||
"* Precision:\n",
|
||
"Низкая точность как на обучающем (0.833878), так и на тестовом (0.822581) наборах.\n",
|
||
"* Recall:\n",
|
||
"Высокая полнота на обучающем (0.856855), но значительно ниже на тестовом (0.808454).\n",
|
||
"* Accuracy:\n",
|
||
"Умеренные результаты: 0.777619 на обучающем и 0.736441 на тестовом.\n",
|
||
"* F1 Score:\n",
|
||
"Умеренная производительность (0.815456 на тестовом).\n",
|
||
"\n",
|
||
"Вывод: Метод ближайших соседей показывает средние результаты. Хотя он имеет приемлемую полноту, точность значительно ниже, чем у деревьев решений.\n",
|
||
"\n",
|
||
"3. Naive Bayes (Наивный байесовский классификатор)\n",
|
||
"* Precision:\n",
|
||
"Низкая точность (0.708571 на обучающем, 0.720266 на тестовом).\n",
|
||
"* Recall:\n",
|
||
"Полнота идеально на обучающем (1.00000), но это может указывать на переобучение.\n",
|
||
"* Accuracy:\n",
|
||
"Точность на уровне 0.708571 на обучающем и 0.720266 на тестовом — значительно ниже, чем у лучших моделей.\n",
|
||
"* F1 Score:\n",
|
||
"Умеренные результаты (0.837389 на тестовом).\n",
|
||
"\n",
|
||
"Вывод: Наивный байесовский классификатор показывает проблемы с точностью, несмотря на хорошую полноту, что может указывать на его пригодность для задач, где много классов.\n",
|
||
"\n",
|
||
"4. Logistic Regression (Логистическая регрессия)\n",
|
||
"* Precision:\n",
|
||
"Низкая точность (0.677130 на обучающем и 0.683190 на тестовом).\n",
|
||
"* Recall:\n",
|
||
"Полнота также ниже (0.862567 на тестовом).\n",
|
||
"* Accuracy:\n",
|
||
"Совсем низкие значения: 0.611190 на обучающем и 0.603235 на тестовом.\n",
|
||
"* F1 Score:\n",
|
||
"Низкие значения (0.752522 на тестовом).\n",
|
||
"\n",
|
||
"Вывод: Логистическая регрессия демонстрирует наихудшие показатели по всем метрикам, что ставит под сомнение её применимость для данной задачи.\n",
|
||
"Лучшая модель: Деревья решений являются наиболее эффективной моделью."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### ROC-кривая, каппа Коэна, коэффициент корреляции Мэтьюса:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 107,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style type=\"text/css\">\n",
|
||
"#T_08895_row0_col0, #T_08895_row0_col1 {\n",
|
||
" background-color: #a8db34;\n",
|
||
" color: #000000;\n",
|
||
"}\n",
|
||
"#T_08895_row0_col2, #T_08895_row0_col3, #T_08895_row0_col4 {\n",
|
||
" background-color: #da5a6a;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_08895_row1_col0 {\n",
|
||
" background-color: #20a386;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_08895_row1_col1 {\n",
|
||
" background-color: #1e9b8a;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_08895_row1_col2 {\n",
|
||
" background-color: #aa2395;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_08895_row1_col3, #T_08895_row2_col2 {\n",
|
||
" background-color: #9a169f;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_08895_row1_col4 {\n",
|
||
" background-color: #9d189d;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_08895_row2_col0 {\n",
|
||
" background-color: #1fa088;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_08895_row2_col1 {\n",
|
||
" background-color: #20a486;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_08895_row2_col3 {\n",
|
||
" background-color: #6a00a8;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_08895_row2_col4 {\n",
|
||
" background-color: #6f00a8;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_08895_row3_col0, #T_08895_row3_col1 {\n",
|
||
" background-color: #26818e;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"#T_08895_row3_col2, #T_08895_row3_col3, #T_08895_row3_col4 {\n",
|
||
" background-color: #4e02a2;\n",
|
||
" color: #f1f1f1;\n",
|
||
"}\n",
|
||
"</style>\n",
|
||
"<table id=\"T_08895\">\n",
|
||
" <thead>\n",
|
||
" <tr>\n",
|
||
" <th class=\"blank level0\" > </th>\n",
|
||
" <th id=\"T_08895_level0_col0\" class=\"col_heading level0 col0\" >Accuracy_test</th>\n",
|
||
" <th id=\"T_08895_level0_col1\" class=\"col_heading level0 col1\" >F1_test</th>\n",
|
||
" <th id=\"T_08895_level0_col2\" class=\"col_heading level0 col2\" >ROC_AUC_test</th>\n",
|
||
" <th id=\"T_08895_level0_col3\" class=\"col_heading level0 col3\" >Cohen_kappa_test</th>\n",
|
||
" <th id=\"T_08895_level0_col4\" class=\"col_heading level0 col4\" >MCC_test</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_08895_level0_row0\" class=\"row_heading level0 row0\" >DecisionTree</th>\n",
|
||
" <td id=\"T_08895_row0_col0\" class=\"data row0 col0\" >0.999049</td>\n",
|
||
" <td id=\"T_08895_row0_col1\" class=\"data row0 col1\" >0.999340</td>\n",
|
||
" <td id=\"T_08895_row0_col2\" class=\"data row0 col2\" >0.998295</td>\n",
|
||
" <td id=\"T_08895_row0_col3\" class=\"data row0 col3\" >0.997636</td>\n",
|
||
" <td id=\"T_08895_row0_col4\" class=\"data row0 col4\" >0.997639</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_08895_level0_row1\" class=\"row_heading level0 row1\" >KNeighbors</th>\n",
|
||
" <td id=\"T_08895_row1_col0\" class=\"data row1 col0\" >0.736441</td>\n",
|
||
" <td id=\"T_08895_row1_col1\" class=\"data row1 col1\" >0.815456</td>\n",
|
||
" <td id=\"T_08895_row1_col2\" class=\"data row1 col2\" >0.769925</td>\n",
|
||
" <td id=\"T_08895_row1_col3\" class=\"data row1 col3\" >0.354679</td>\n",
|
||
" <td id=\"T_08895_row1_col4\" class=\"data row1 col4\" >0.354842</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_08895_level0_row2\" class=\"row_heading level0 row2\" >NaiveBayes</th>\n",
|
||
" <td id=\"T_08895_row2_col0\" class=\"data row2 col0\" >0.720266</td>\n",
|
||
" <td id=\"T_08895_row2_col1\" class=\"data row2 col1\" >0.837389</td>\n",
|
||
" <td id=\"T_08895_row2_col2\" class=\"data row2 col2\" >0.711442</td>\n",
|
||
" <td id=\"T_08895_row2_col3\" class=\"data row2 col3\" >0.000000</td>\n",
|
||
" <td id=\"T_08895_row2_col4\" class=\"data row2 col4\" >0.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th id=\"T_08895_level0_row3\" class=\"row_heading level0 row3\" >LogisticRegression</th>\n",
|
||
" <td id=\"T_08895_row3_col0\" class=\"data row3 col0\" >0.603235</td>\n",
|
||
" <td id=\"T_08895_row3_col1\" class=\"data row3 col1\" >0.752522</td>\n",
|
||
" <td id=\"T_08895_row3_col2\" class=\"data row3 col2\" >0.466647</td>\n",
|
||
" <td id=\"T_08895_row3_col3\" class=\"data row3 col3\" >-0.197637</td>\n",
|
||
" <td id=\"T_08895_row3_col4\" class=\"data row3 col4\" >-0.226884</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n"
|
||
],
|
||
"text/plain": [
|
||
"<pandas.io.formats.style.Styler at 0x272f27e11c0>"
|
||
]
|
||
},
|
||
"execution_count": 107,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"class_metrics = pd.DataFrame.from_dict(param_grid, \"index\")[\n",
|
||
" [\n",
|
||
" \"Accuracy_test\",\n",
|
||
" \"F1_test\",\n",
|
||
" \"ROC_AUC_test\",\n",
|
||
" \"Cohen_kappa_test\",\n",
|
||
" \"MCC_test\",\n",
|
||
" ]\n",
|
||
"]\n",
|
||
"class_metrics.sort_values(by=\"ROC_AUC_test\", ascending=False).style.background_gradient(\n",
|
||
" cmap=\"plasma\",\n",
|
||
" low=0.3,\n",
|
||
" high=1,\n",
|
||
" subset=[\n",
|
||
" \"ROC_AUC_test\",\n",
|
||
" \"MCC_test\",\n",
|
||
" \"Cohen_kappa_test\",\n",
|
||
" ],\n",
|
||
").background_gradient(\n",
|
||
" cmap=\"viridis\",\n",
|
||
" low=1,\n",
|
||
" high=0.3,\n",
|
||
" subset=[\n",
|
||
" \"Accuracy_test\",\n",
|
||
" \"F1_test\",\n",
|
||
" ],\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### **Выводы:**\n",
|
||
"1. Decision Tree (Решающие деревья)\n",
|
||
"* Accuracy (Точность): 0.999049\n",
|
||
"* F1 Score: 0.999340\n",
|
||
"* ROC AUC: 0.998295\n",
|
||
"* Cohen's Kappa: 0.997636\n",
|
||
"* MCC (Matthews Correlation Coefficient): 0.997639\n",
|
||
"\n",
|
||
"Вывод: Деревья решений показывают наилучшие результаты по всем метрикам. Высокие значения точности, F1 Score и ROC AUC указывают на то, что модель хорошо справляется как с классификацией, так и с предсказанием вероятностей. Это делает её наиболее подходящей для задачи прогнозирования.\n",
|
||
"\n",
|
||
"2. K-Neighbors (Метод ближайших соседей)\n",
|
||
"* Accuracy: 0.736441\n",
|
||
"* F1 Score: 0.815456\n",
|
||
"* ROC AUC: 0.769925\n",
|
||
"* Cohen's Kappa: 0.354679\n",
|
||
"* MCC: 0.354842\n",
|
||
"\n",
|
||
"Вывод: Метод ближайших соседей демонстрирует средние результаты. Хотя F1 Score и ROC AUC указывают на относительно приемлемую степень точности, это всё же значительно уступает показателям деревьев решений. Учитывая цель, K-Neighbors может быть менее эффективным выбором.\n",
|
||
"\n",
|
||
"3. Naive Bayes (Наивный байесовский классификатор)\n",
|
||
"* Accuracy: 0.720266\n",
|
||
"* F1 Score: 0.837389\n",
|
||
"* ROC AUC: 0.711442\n",
|
||
"* Cohen's Kappa: 0.000000\n",
|
||
"* MCC: 0.000000\n",
|
||
"\n",
|
||
"Вывод: Наивный байесовский классификатор показывает также средние результаты, но его Cohen's Kappa и MCC ровны нулю. Это свидетельствует о том, что модель может плохо предсказывать тренды. Следовательно, её применение может быть ограниченным.\n",
|
||
"\n",
|
||
"4. Logistic Regression (Логистическая регрессия)\n",
|
||
"* Accuracy: 0.603235\n",
|
||
"* F1 Score: 0.752522\n",
|
||
"* ROC AUC: 0.466647\n",
|
||
"* Cohen's Kappa: -0.197637\n",
|
||
"* MCC: -0.226884\n",
|
||
"\n",
|
||
"Вывод: Логистическая регрессия показывает наихудшие результаты среди всех моделей. Низкие значения точности и ROC AUC указывают на ненадежность этой модели для прогнозирования цен акций, что делает её наименее подходящим вариантом для текущей бизнес-цели.\n",
|
||
"\n",
|
||
"На основе проведенного анализа, Decision Tree является наилучшим выбором для построения модели прогнозирования цены акций. Она демонстрирует высокую производительность по всем ключевым метрикам, что делает её наиболее надежной и эффективной для предсказания цен закрытия. "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 108,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'DecisionTree'"
|
||
]
|
||
},
|
||
"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": [
|
||
"Визуализация ROC-кривой"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1kAAAK9CAYAAADWo6YTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3yTVfsG8CtJk3QPultWmQIiGxRkgwiK9FXL3kNBQPbeG0SWqIAgS4ZQ0AKKKKLIXoIskb07oIzupmnyvH+UPLQ0bZOS9Emb6/v7vJ+fOXmS3JS09Mo55z4yQRAEEBERERERkUXIpS6AiIiIiIioKGHIIiIiIiIisiCGLCIiIiIiIgtiyCIiIiIiIrIghiwiIiIiIiILYsgiIiIiIiKyIIYsIiIiIiIiC2LIIiIiIiIisiCGLCIiIiIiIgtiyCIiKmClS5dGz549pS7D7jRp0gRNmjSRuow8TZ06FTKZDLGxsVKXYnNkMhmmTp1qkee6desWZDIZ1q5da5HnIyLKjCGLiIqUtWvXQiaTif9zcHBAcHAwevbsifv370tdnk1LSkrCjBkz8Nprr8HZ2RkeHh5o2LAh1q9fD0EQpC7PJP/++y+mTp2KW7duSV1KNjqdDmvWrEGTJk1QrFgxqNVqlC5dGr169cKpU6ekLs8iNm3ahMWLF0tdRha2WBMRFX0OUhdARGQN06dPR0hICFJTU3Hs2DGsXbsWhw4dwoULF+Do6ChpbZcvX4ZcblufccXExKB58+a4dOkSOnbsiEGDBiE1NRXbt29Hjx49sHv3bmzcuBEKhULqUnP177//Ytq0aWjSpAlKly6d5b7ffvtNmqIApKSk4P3338eePXvQqFEjjB8/HsWKFcOtW7ewdetWrFu3Dnfu3EHx4sUlq9ESNm3ahAsXLmDo0KFWef6UlBQ4OJj3q0tONZUqVQopKSlQKpUWrJCIKANDFhEVSa1bt0bt2rUBAH379oWPjw/mzZuHnTt3on379pLWplarC/w1U1NToVKpcgx3PXr0wKVLl/Djjz/ivffeE8c//fRTjBo1Cp9//jlq1KiBMWPGFFTJADJm11xcXCzyXCqVyiLPkx+jRo3Cnj17sGjRomy/7E+ZMgWLFi0q0HoEQUBqaiqcnJwK9HXzQ6/XIy0tDY6Ojhb9gEQmk0n+gQsRFV229VEqEZGVNGzYEABw/fr1LOP//fcfPvzwQxQrVgyOjo6oXbs2du7cme3xT58+xbBhw1C6dGmo1WoUL14c3bt3z7JvRqPRYMqUKShXrhzUajVKlCiB0aNHQ6PRZHmuzHuyTp06BZlMhnXr1mV7zV9//RUymQw//fSTOHb//n307t0b/v7+UKvVqFKlClavXp3lcfv374dMJsP333+PiRMnIjg4GM7OzoiPjzf6tTl27Bh+/fVX9OzZM0vAMpgzZw7Kly+PefPmISUlBcDz/Syff/45Fi1ahFKlSsHJyQmNGzfGhQsXsj2HKV9nw1LPv/76C5988gn8/PzEmZ3bt2/jk08+QcWKFeHk5ARvb2+EhYVlWRa4du1ahIWFAQCaNm0qLhndv38/gOx7sgxfp61bt2LWrFkoXrw4HB0d0bx5c1y7di3bn+Grr75CmTJl4OTkhLp16+LgwYMm7fO6d+8eVqxYgZYtWxqd4VEoFBg5cmS2WaynT5+iZ8+e8PT0hIeHB3r16oXk5OQs16xZswbNmjWDn58f1Go1KleujGXLlmV7jdKlS+Pdd9/Fr7/+itq1a8PJyQkrVqww6zkA4JdffkHjxo3h5uYGd3d31KlTB5s2bQKQ8fX9+eefcfv2bfFrn3k20dTvD5lMhkGDBmHjxo2oUqUK1Go19uzZI96XeU9WQkIChg4dKn5f+vn5oWXLljh9+nSeNeW0J+u///5D+/bt4evrCycnJ1SsWBETJkww+vUgIsoJZ7KIyC4Yfhn38vISxy5evIgGDRogODgYY8eOhYuLC7Zu3YrQ0FBs374d//vf/wAAiYmJaNiwIS5duoTevXujZs2aiI2Nxc6dO3Hv3j34+PhAr9fjvffew6FDh/DRRx+hUqVKOH/+PBYtWoQrV64gIiLCaF21a9dGmTJlsHXrVvTo0SPLfVu2bIGXlxdatWoFIGNJ3+uvvy7+Eurr64tffvkFffr0QXx8fLZf4GfMmAGVSoWRI0dCo9HkOJOza9cuAED37t2N3u/g4IDOnTtj2rRpOHz4MFq0aCHet379eiQkJGDgwIFITU3FkiVL0KxZM5w/fx7+/v5mfZ0NPvnkE/j6+mLy5MlISkoCAJw8eRJHjhxBx44dUbx4cdy6dQvLli1DkyZN8O+//8LZ2RmNGjXCp59+ii+++ALjx49HpUqVAED8/zmZO3cu5HI5Ro4cibi4OHz22Wfo0qULjh8/Ll6zbNkyDBo0CA0bNsSwYcNw69YthIaGwsvLK88lfr/88gvS09PRrVu3XK97Ufv27RESEoI5c+bg9OnTWLVqFfz8/DBv3rwsdVWpUgXvvfceHBwcsGvXLnzyySfQ6/UYOHBglue7fPkyOnXqhI8//hj9+vVDxYoVzXqOtWvXonfv3qhSpQrGjRsHT09PnDlzBnv27EHnzp0xYcIExMXF4d69e+LMnKurKwCY/f3xxx9/YOvWrRg0aBB8fHyyLf006N+/P7Zt24ZBgwahcuXKePToEQ4dOoRLly6hZs2audZkzLlz59CwYUMolUp89NFHKF26NK5fv45du3Zh1qxZpv3FEREBgEBEVISsWbNGACD8/vvvwsOHD4W7d+8K27ZtE3x9fQW1Wi3cvXtXvLZ58+ZC1apVhdTUVHFMr9cL9evXF8qXLy+OTZ48WQAg/PDDD9leT6/XC4IgCN99950gl8uFgwcPZrl/+fLlAgDh8OHD4lipUqWEHj16iLfHjRsnKJVK4fHjx+KYRqMRPD09hd69e4tjffr0EQIDA4XY2Ngsr9GxY0fBw8NDSE5OFgRBEP78808BgFCmTBlxLDehoaECAOHJkyc5XvPDDz8IAIQvvvhCEARBuHnzpgBAcHJyEu7duyded/z4cQGAMGzYMHHM1K+z4e/uzTffFNLT07O8vrE/x9GjRwUAwvr168Wx8PBwAYDw559/Zru+cePGQuPGjcXbhq9TpUqVBI1GI44vWbJEACCcP39eEISMvwtvb2+hTp06glarFa9bu3atACDLcxozbNgwAYBw5syZXK8zmDJligAgy9+9IAjC//73P8Hb2zvLmLGvS6tWrYQyZcpkGStVqpQAQNizZ0+26015jqdPnwpubm5CvXr1hJSUlCzXGr4HBEEQ3nnnHaFUqVLZns+c7w8AglwuFy5evJjteQAIU6ZMEW97eHgIAwcOzHZdZjnVZHgPr1mzRhxr1KiR4ObmJty+fTvHPyMRkSm4XJCIiqQWLVrA19cXJUqUwIcffggXFxfs3LlTnHV4/Pgx/vjjD7Rv3x4JCQmIjY1FbGwsHj16hFatWuHq1atiN8Lt27ejWrVq2WZcgIzlSwAQHh6OSpUq4ZVXXhGfKzY2Fs2aNQMA/PnnnznW2qFDB2i1Wvzwww/i2G+//YanT5+iQ4cOADL20Gzfvh1t27aFIAhZXqNVq1aIi4sTl0gZ9OjRw6Q9NwkJCQAANze3HK8x3PfiksPQ0FAEBweLt+vWrYt69eph9+7dAMz7Ohv069cvW4ONzH8OrVaLR48eoVy5cvD09Mz25zZXr169sszyGZaW3rhxA0DGks5Hjx6hX79+WZoudOnSJcvMaE4MX7Pcvr7G9O/fP8vthg0b4tGjR1n+DjJ/XeLi4hAbG4vGjRvjxo0biIuLy/L4kJAQcVY0M1OeY+/evUhISMDYsWOz7WMyfA/kxtzvj8aNG6Ny5cp5Pq+npyeOHz+OyMjIPK/Ny8OHD3HgwAH07t0bJUuWzHKfKX9GIqLMuFyQiIqkr776ChUqVEBcXBxWr16NAwcOZGk4ce3aNQiCgEmTJmHSpElGn+PBgwcIDg7G9evX8cEHH+T6elevXsWlS5fg6+ub43PlpFq1anjllVewZcsW9OnTB0DGUkEfHx/xl9CHDx/i6dOn+Oabb/DNN9+Y9BohISG51mxg+OU/ISEBnp6eRq/JKYiVL18+27UVKlTA1q1bAZj3dc6t7pSUFMyZMwdr1qzB/fv3s7SUfzFMmOvFX6gNwenJkycAMvaDAUC5cuWyXOfg4JDjMrbM3N3dATz/GlqiLsNzHj58GFOmTMHRo0ez7deKi4uDh4eHeDun94Mpz2HYy/jqq6+a9WcwMPf7w9T37meffYYePXqgRIkSqFWrFtq0aYPu3bujTJkyZtdoCNX5/TMSEWXGkEVERVLdunXF7oKhoaF488030blzZ1y+fBmurq7Q6/UAgJEjRxr9dB/I/kt1bvR6PapWrYqFCxcavb9EiRK5Pr5Dhw6YNWsWYmNj4ebmhp07d6JTp07izImh3q5du2bbu2Xw2muvZbltaue4SpUqISIiAufOnUOjRo2MXnPu3DkAMGl2IbP8fJ2N1T148GCsWbMGQ4cOxRtvvAEPDw/IZDJ07NhRfI38yqktvWChs8FeeeUVAMD58+dRvXp1kx+XV13Xr19H8+bN8corr2DhwoUoUaIEVCoVdu/ejUWLFmX7uhj7upr7HPll7veHqe/d9u3bo2HDhvjxxx/x22+/Yf78+Zg3bx5++OEHtG7d+qXrJiLKL4YsIiryFAoF5syZg6ZNm+LLL7/E2LFjxU+6lUpllkYOxpQtW9Zox7wXrzl79iyaN2+er6VFHTp0wLRp07B9+3b4+/sjPj4eHTt2FO/39fWFm5sbdDpdnvWa691338WcOXOwfv16oyFLp9Nh06ZN8PLyQoMGDbLcd/Xq1WzXX7lyRZzhMefrnJtt27ahR48eWLBggTiWmpqKp0+fZrnOGsu6SpUqBSBjVq5p06bieHp6Om7dupUt3L6odevWUCgU2LBhg9nNL3Kza9cuaDQa7Ny5M8usV25LU/P7HGXLlgUAXLhwIdcPH3L6+r/s90duAgMD8cknn+CTTz7BgwcPULNmTcyaNUsMWaa+nuG9mtf3OhGRKbgni4jsQpMmTVC3bl0sXrwYqamp8PPzQ5MmTbBixQpERUVlu/7hw4fif3/wwQc4e/Ysfvzxx2zXGWYV2rdvj/v372PlypXZrklJSRG75OWkUqVKqFq1KrZs2YItW7YgMDAwS+BRKBT44IMPsH37dqO/BGau11z169dHixYtsGbNmizt4g0mTJiAK1euYPTo0dlmGCIiIrLsqTpx4gSOHz8u/oJrztc5NwqFItvM0tKlS6HT6bKMGc7UejF8vYzatWvD29sbK1euRHp6uji+ceNGcUlhbkqUKIF+/frht99+w9KlS7Pdr9frsWDBAty7d8+sugwzXS8unVyzZo3Fn+Ott96Cm5sb5syZg9TU1Cz3ZX6si4uL0eWbL/v9YYxOp8v2Wn5+fggKCsrSFj6nml7k6+uLRo0aYfXq1bhz506W+yw1q0lE9oMzWURkN0aNGoWwsDCsXbsW/fv3x1dffYU333wTVatWRb9+/VCmTBnExMTg6NGjuHfvHs6ePSs+btu2bQgLC0Pv3r1Rq1YtPH78GDt37sTy5ctRrVo1dOvWDVu3bkX//v3x559/okGDBtDpdPjvv/+wdetW8Xyi3HTo0AGTJ0+Go6Mj+vTpk+3g4Llz5+LPP/9EvXr10K9fP1SuXBmPHz/G6dOn8fvvv+Px48f5/tqsX78ezZs3R7t27dC5c2c0bNgQGo0GP/zwA/bv348OHTpg1KhR2R5Xrlw5vPnmmxgwYAA0Gg0WL14Mb29vjB49WrzG1K9zbt59911899138PDwQOXKlXH06FH8/vvv8Pb2znJd9erVoVAoMG/ePMTFxUGtVotnQOWXSqXC1KlTMXjwYDRr1gzt27fHrVu3sHbtWpQtW9akmZIFCxbg+vXr+PTTT/HDDz/g3XffhZeXF+7cuYPw8HD8999/WWYuTfHWW29BpVKhbdu2+Pjjj5GYmIiVK1fCz8/PaKB9medwd3fHokWL0LdvX9SpUwedO3eGl5cXzp49i+TkZPGct1q1amHLli0YPnw46tSpA1dXV7Rt29Yi3x8vSkhIQPHixfHhhx+iWrVqcHV1xe+//46TJ09mmfHMqSZjvvjiC7z55puoWbMmPvroI4SEhODWrVv4+eef8c8//5hVHxHZOUl6GhIRWYmhDfjJkyez3afT6YSyZcsKZcuWFVuEX79+XejevbsQEBAgKJVKITg4WHj33XeFbdu2ZXnso0ePhEGDBgnBwcGCSqUSihcvLvTo0SNLO/W0tDRh3rx5QpUqVQS1Wi14eXkJtWrVEqZNmybExcWJ173Ywt3g6tWrAgABgHDo0CGjf76YmBhh4MCBQokSJQSlUikEBAQIzZs3F7755hvxGkNr8vDwcLO+dgkJCcLUqVOFKlWqCE5OToKbm5vQoEEDYe3atdlaWBvaX8+fP19YsGCBUKJECUGtVgsNGzYUzp49m+25Tfk65/Z39+TJE6FXr16Cj4+P4OrqKrRq1Ur477//jH4tV65cKZQpU0ZQKBRZ2rnn1ML9xa+TsdbegiAIX3zxhVCqVClBrVYLdevWFQ4fPizUqlVLePvtt0346gpCenq6sGrVKqFhw4aCh4eHoFQqhVKlSgm9evXK0t7d0ML94cOHWR5v+PrcvHlTHNu5c6fw2muvCY6OjkLp0qWFefPmCatXr852XalSpYR33nnHaF2mPofh2vr16wtOTk6Cu7u7ULduXWHz5s3i/YmJiULnzp0FT09PAUCW1ummfn8AyLEtOzK1cNdoNMKoUaOEatWqCW5uboKLi4tQrVo14euvv87ymJxqyunv+cKFC8L//vc/wdPTU3B0dBQqVqwoTJo0yWg9REQ5kQkC58CJiMg8t27dQkhICObPn4+RI0dKXY4k9Ho9fH198f777xtdBkdERPaLe7KIiIjykJqamm1fzvr16/H48WM0adJEmqKIiMhmcU8WERFRHo4dO4Zhw4YhLCwM3t7eOH36NL799lu8+uqrCAsLk7o8IiKyMQxZREREeShdujRKlCiBL774Ao8fP0axYsXQvXt3zJ07FyqVSuryiIjIxnBPFhERERERkQVxTxYREREREZEFMWQRERERERFZkN3tydLr9YiMjISbm5tJB0gSEREREVHRJAgCEhISEBQUBLnccvNPdheyIiMjUaJECanLICIiIiIiG3H37l0UL17cYs9ndyHLzc0NAHDz5k0UK1ZM4mqoKNNqtfjtt9/w1ltvQalUSl0OFWF8r1FB4XuNCgrfa1RQHj9+jJCQEDEjWIrdhSzDEkE3Nze4u7tLXA0VZVqtFs7OznB3d+c/EGRVfK9RQeF7jQoK32tUULRaLQBYfBsRG18QERERERFZEEMWERERERGRBTFkERERERERWRBDFhERERERkQUxZBEREREREVkQQxYREREREZEFMWQRERERERFZEEMWERERERGRBTFkERERERERWRBDFhERERERkQUxZBEREREREVkQQxYREREREZEFMWQRERERERFZEEMWERERERGRBTFkERERERERWRBDFhERERERkQUxZBEREREREVkQQxYREREREZEFMWQRERERERFZEEMWERERERGRBTFkERERERERWRBDFhERERERkQVJGrIOHDiAtm3bIigoCDKZDBEREXk+Zv/+/ahZsybUajXKlSuHtWvXWr1OIiIiIiIiU0kaspKSklCtWjV89dVXJl1/8+ZNvPPOO2jatCn++ecfDB06FH379sWvv/5q5UqJiIiIiIhM4yDli7du3RqtW7c2+frly5cjJCQECxYsAABUqlQJhw4dwqJFi9CqVSuzX//60+u49vSa2Y8jMoVOp8OFtAtQ3lFCoVBIXQ4VYXyvUUHhe40KCt9rZCkOkQ+hvBEJ6AWj98cnJlnnda3yrFZy9OhRtGjRIstYq1atMHTo0Bwfo9FooNFoxNvx8fEAgFNRpzDy75FWqZMos+8PfS91CWQn+F6jgsL3GhUUvtfIXAqdgFfuCqh5XUCtawKCHud+/b4nT6xSR6EKWdHR0fD3988y5u/vj/j4eKSkpMDJySnbY+bMmYNp06ZlG99xcgfbfhARERERFXIeSQKqPwtVr90U4Jxm+mPfcnXF9AcxFq+pUIWs/Bg3bhyGDx8u3o6Pj0eJEiVQpkwZHLx1EABQ2682GgU3kqpEKqJ0eh2uXL6CChUrQCHnUgeyHr7XqKDwvUYFhe81G/DgAuTX9wHpZiQWTbzxcbW7ZWp6Rp4mwOkx4HEH8LwJuD4wfp0gAxICgfgSgF6ZMZaWrofK4flMy5NkADcsWh6AQhayAgICEBOTNWnGxMTA3d3d6CwWAKjV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",
|
||
"text/plain": [
|
||
"<Figure size 1000x800 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from sklearn.metrics import auc, roc_curve\n",
|
||
"\n",
|
||
"# Инициализация словаря для хранения результатов\n",
|
||
"results = {}\n",
|
||
"\n",
|
||
"# После подбора модели\n",
|
||
"for model_name in best_estimators.keys():\n",
|
||
" # Получаем вероятности для положительного класса\n",
|
||
" y_scores = best_estimators[model_name].predict_proba(X_test_close)[:, 1]\n",
|
||
" fpr, tpr, _ = roc_curve(y_test_close, y_scores)\n",
|
||
" roc_auc = auc(fpr, tpr)\n",
|
||
"\n",
|
||
" # Сохраняем полученные значения в словаре results\n",
|
||
" results[model_name] = {\n",
|
||
" 'fpr': fpr,\n",
|
||
" 'tpr': tpr,\n",
|
||
" 'roc_auc': roc_auc\n",
|
||
" }\n",
|
||
"\n",
|
||
"# Визуализация ROC-кривой\n",
|
||
"plt.figure(figsize=(10, 8))\n",
|
||
"for model_name, metrics in results.items():\n",
|
||
" plt.plot(metrics['fpr'], metrics['tpr'], lw=2, label=f'{model_name} (AUC = {metrics[\"roc_auc\"]:.2f})')\n",
|
||
"\n",
|
||
"# Диагональная линия глухого классификатора\n",
|
||
"plt.plot([0, 1], [0, 1], 'k--', lw=2)\n",
|
||
"\n",
|
||
"plt.xlim([0.0, 1.0])\n",
|
||
"plt.ylim([0.0, 1.05])\n",
|
||
"plt.xlabel('False Positive Rate')\n",
|
||
"plt.ylabel('True Positive Rate')\n",
|
||
"plt.title('Receiver Operating Characteristic')\n",
|
||
"plt.legend(loc='lower right')\n",
|
||
"plt.grid()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"ROC (Receiver Operating Characteristic) кривая — это график, используемый для оценки производительности классификаторов. Она отображает соотношение между двумя показателями:\n",
|
||
"\n",
|
||
"True Positive Rate (TPR), также известная как чувствительность или полнота — доля верных положительных результатов среди всех положительных примеров.\n",
|
||
"False Positive Rate (FPR) — доля ложных положительных результатов среди всех отрицательных примеров.\n",
|
||
"ROC-кривая и AUC\n",
|
||
"ROC-кривая строится путем отображения TPR против FPR при разных порогах классификации. Площадь под ROC-кривой (AUC - Area Under the Curve) служит одной из основных метрик для оценки качества классификатора:\n",
|
||
"\n",
|
||
"AUC = 1: Модель идеально классифицирует все примеры.\n",
|
||
"AUC = 0.5: Модель не лучше случайного угадывания.\n",
|
||
"AUC < 0.5: Модель показывает худшие результаты, чем случайный угадыватель.\n",
|
||
"\n",
|
||
"**Анализ получившейся ROC-кривой:**\n",
|
||
"* Decision Tree (зеленая линия): AUC равен 1, что указывает на отличную производительность модели. Она идеально разделяет положительные и отрицательные классы.\n",
|
||
"* KNeighbors (синяя линия): AUC равен 0.77. Эта модель показывает хорошую производительность, но не так идеальна, как дерево решений.\n",
|
||
"* Naive Bayes (оранжевая линия): AUC равен 0.71. Модель демонстрирует средние результаты, но имеет значительные недостатки по сравнению с деревом решений.\n",
|
||
"* Logistic Regression (красная линия): AUC равен 0.47, что говорит о том, что модель практически неэффективна и хуже случайного классификатора.\n",
|
||
"\n",
|
||
"**Общий вывод**\n",
|
||
"Модель дерева решений выделяется на фоне других, обеспечивая высокую точность. Это делает её наиболее предпочтительным вариантом для бизнес-прогнозирования. Остальные модели показывают более скромные результаты и могут быть менее надежными."
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "aimenv",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.12.5"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|