From 60f448f6af5b9de5f8a1dc8fcede3a358163d877 Mon Sep 17 00:00:00 2001 From: K Date: Fri, 22 Nov 2024 21:20:26 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BA=D0=B0=D0=BF=D0=B5=D1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab4/lab4.ipynb | 3950 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3950 insertions(+) create mode 100644 lab4/lab4.ipynb diff --git a/lab4/lab4.ipynb b/lab4/lab4.ipynb new file mode 100644 index 00000000..93e77225 --- /dev/null +++ b/lab4/lab4.ipynb @@ -0,0 +1,3950 @@ +{ + "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", + "\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": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
DateOpenHighLowCloseAdj CloseVolume
52462022-04-295.665.695.505.515.5116613300
52472022-05-025.335.395.185.305.3027106700
52482022-05-035.325.535.325.475.4718914200
52492022-05-045.475.615.375.605.6020530700
52502022-05-055.635.665.345.445.4419879200
\n", + "
" + ], + "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": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OpenHighLowCloseVolume
47895.665.735.475.56000023355100.0
34693.863.933.813.8800007605300.0
250312.1912.2811.9512.0200007243200.0
158011.7711.8411.5311.5700003025900.0
275915.7716.1715.7616.1200016113400.0
..................
30929.579.879.309.7500007283100.0
37724.764.974.674.93000012920800.0
51914.184.294.174.20000011192400.0
52265.585.685.555.58000012692800.0
8603.183.193.133.18000099100.0
\n", + "

4200 rows × 5 columns

\n", + "
" + ], + "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": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Volatility
47890.046763
34690.030928
25030.027454
15800.026793
27590.025434
......
30920.058462
37720.060852
51910.028571
52260.023297
8600.018868
\n", + "

4200 rows × 1 columns

\n", + "
" + ], + "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": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OpenHighLowCloseVolume
143713.71000014.00000013.67000013.9400007623200.0
270015.52000015.72000015.30000015.3200006098800.0
36471.8700001.9300001.8300001.83000010980000.0
251211.26000011.47000011.26000011.3200005029300.0
290216.37999916.58000016.25000016.5499995485800.0
..................
30959.2900009.3500009.0700009.1300005861400.0
8593.0900003.1600003.0400003.100000211300.0
31348.5500008.7700008.5500008.7700005335400.0
257716.70999917.07000016.37999916.40000014524400.0
3782.5714292.5714292.5714292.5714290.0
\n", + "

1051 rows × 5 columns

\n", + "
" + ], + "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": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Volatility
14370.023673
27000.027415
36470.054645
25120.018551
29020.019940
......
30950.030668
8590.038710
31340.025086
25770.042073
3780.000000
\n", + "

1051 rows × 1 columns

\n", + "
" + ], + "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": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OpenHighLowVolumeVolatility
47895.665.735.4723355100.00.046763
34693.863.933.817605300.00.030928
250312.1912.2811.957243200.00.027454
158011.7711.8411.533025900.00.026793
275915.7716.1715.766113400.00.025434
..................
30929.579.879.307283100.00.058462
37724.764.974.6712920800.00.060852
51914.184.294.1711192400.00.028571
52265.585.685.5512692800.00.023297
8603.183.193.1399100.00.018868
\n", + "

4200 rows × 5 columns

\n", + "
" + ], + "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": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Close
01
11
20
30
40
......
41951
41961
41971
41981
41991
\n", + "

4200 rows × 1 columns

\n", + "
" + ], + "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": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OpenHighLowVolumeVolatility
143713.71000014.00000013.6700007623200.00.023673
270015.52000015.72000015.3000006098800.00.027415
36471.8700001.9300001.83000010980000.00.054645
251211.26000011.47000011.2600005029300.00.018551
290216.37999916.58000016.2500005485800.00.019940
..................
30959.2900009.3500009.0700005861400.00.030668
8593.0900003.1600003.040000211300.00.038710
31348.5500008.7700008.5500005335400.00.025086
257716.70999917.07000016.37999914524400.00.042073
3782.5714292.5714292.5714290.00.000000
\n", + "

1051 rows × 5 columns

\n", + "
" + ], + "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": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Close
00
10
21
30
40
......
10461
10471
10481
10490
10501
\n", + "

1051 rows × 1 columns

\n", + "
" + ], + "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": [ + "
GradientBoostingRegressor(max_depth=5)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "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": [ + "
" + ] + }, + "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": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OpenHighLowVolumeVolatilityRange
0-0.264188-0.270892-0.2788871.9867140.288393-0.037298
1-0.642218-0.642866-0.634425-0.197546-0.295086-0.634720
21.1072191.0826831.108998-0.247763-0.4230810.261413
31.0190120.9917561.019043-0.832639-0.4474300.176067
41.8590781.8865611.925023-0.404450-0.4975140.602796
.....................
41950.5569760.5846500.541422-0.2422300.7194761.285564
4196-0.453203-0.427948-0.4502300.5396340.8075570.133394
4197-0.575013-0.568471-0.5573200.299931-0.381914-0.634720
4198-0.280990-0.281224-0.2617520.508014-0.576248-0.592047
4199-0.785029-0.795789-0.780067-1.238542-0.739469-0.890757
\n", + "

4200 rows × 6 columns

\n", + "
" + ], + "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": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OpenHighLowVolumeVolatilityRange
01.4982411.5083361.545213-0.154202-0.4967250.326979
11.8821691.8670241.897223-0.360102-0.3649520.705871
2-1.013194-1.008735-1.0117180.2991990.593864-0.641300
30.9785610.9807311.024756-0.504559-0.677069-0.178210
42.0645872.0463672.102382-0.442899-0.6281830.326979
.....................
10460.5606950.5386270.551811-0.392167-0.2504070.116483
1047-0.754415-0.752231-0.750410-1.1553230.032753-0.557102
10480.4037310.4176750.439513-0.463214-0.446983-0.136111
10492.1345852.1485522.1304560.7779400.1511911.842550
1050-0.864411-0.874972-0.851601-1.183864-1.330298-1.062291
\n", + "

1051 rows × 6 columns

\n", + "
" + ], + "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+3blzBwMGDICzszMsLCzQuHFjrFq1SqNNwefN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", + "text/plain": [ + "
" + ] + }, + "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": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 Precision_trainPrecision_testRecall_trainRecall_testAccuracy_trainAccuracy_testF1_trainF1_test
DecisionTree0.9989920.9986810.9986561.0000000.9983330.9990490.9988240.999340
KNeighbors0.8338780.8225810.8568550.8084540.7776190.7364410.8452100.815456
NaiveBayes0.7085710.7202661.0000001.0000000.7085710.7202660.8294310.837389
LogisticRegression0.6771300.6831900.8625670.8375170.6111900.6032350.7586820.752522
\n" + ], + "text/plain": [ + "" + ] + }, + "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": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 Accuracy_testF1_testROC_AUC_testCohen_kappa_testMCC_test
DecisionTree0.9990490.9993400.9982950.9976360.997639
KNeighbors0.7364410.8154560.7699250.3546790.354842
NaiveBayes0.7202660.8373890.7114420.0000000.000000
LogisticRegression0.6032350.7525220.466647-0.197637-0.226884
\n" + ], + "text/plain": [ + "" + ] + }, + "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": "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JAgCEhISEBQUBLnccvNPdheyIiMjUaJECanLICIiIiIiG3H37l0UL17cYs9ndyHLzc0NAHDz5k0UK1ZM4mqoKNNqtfjtt9/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": [ + "
" + ] + }, + "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 +}