1774 lines
212 KiB
Plaintext
1774 lines
212 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Начало лабораторной работы"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 67,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Index(['Store ID ', 'Store_Area', 'Items_Available', 'Daily_Customer_Count',\n",
|
||
" 'Store_Sales'],\n",
|
||
" dtype='object')\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"df = pd.read_csv(\".//static//csv//Stores.csv\")\n",
|
||
"print(df.columns)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Бизнес-цели"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"1. Прогнозирование посетителей в магазине:\n",
|
||
"\n",
|
||
"Цель: Разработать модель, которая будет предсказывать посещение клиентами магазина на основе его характеристик (размер, распродажи, количество ассортимента).\n",
|
||
"\n",
|
||
"Применение:\n",
|
||
"Предсказывание посещения магазинов клиентами.\n",
|
||
"\n",
|
||
"2. Оптимизация параметров магазина:\n",
|
||
"\n",
|
||
"Цель: Определить оптимальные коэффициенты для различных факторов, влияющих на посещаемость магазина чтобы максимизировать прибыль компании при наименьших затратах на пространство магазина и его ассортиментт.\n",
|
||
"\n",
|
||
"Применение:\n",
|
||
"Создавать магазин с максимальной посещаемостью."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"1. Прогнозирование посетителей в магазине"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 68,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Среднее значение поля 'Daily_Customer_Count': 786.3504464285714\n",
|
||
" Store ID Store_Area Items_Available Daily_Customer_Count Store_Sales \\\n",
|
||
"0 1 1659 1961 530 66490 \n",
|
||
"1 2 1461 1752 210 39820 \n",
|
||
"2 3 1340 1609 720 54010 \n",
|
||
"3 4 1451 1748 620 53730 \n",
|
||
"4 5 1770 2111 450 46620 \n",
|
||
"\n",
|
||
" above_average_count customers_volatility \n",
|
||
"0 0 1550 \n",
|
||
"1 0 1550 \n",
|
||
"2 0 1550 \n",
|
||
"3 0 1550 \n",
|
||
"4 0 1550 \n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"\n",
|
||
"# Загружаем набор данных\n",
|
||
"df = pd.read_csv(\".//static//csv//Stores.csv\")\n",
|
||
"\n",
|
||
"# Устанавливаем случайное состояние\n",
|
||
"random_state = 42\n",
|
||
"\n",
|
||
"# Рассчитываем среднее значение посещаемости\n",
|
||
"average_count = df['Daily_Customer_Count'].mean()\n",
|
||
"print(f\"Среднее значение поля 'Daily_Customer_Count': {average_count}\")\n",
|
||
"\n",
|
||
"# Создаем новую переменную, указывающую, превышает ли посещаемость среднюю\n",
|
||
"df[\"above_average_count\"] = (df[\"Daily_Customer_Count\"] > average_count).astype(int)\n",
|
||
"\n",
|
||
"# Рассчитываем волатильность (разницу между максимальной и минимальной посещаемостью)\n",
|
||
"df[\"customers_volatility\"] = df[\"Daily_Customer_Count\"].max() - df[\"Daily_Customer_Count\"].min()\n",
|
||
"\n",
|
||
"# Выводим первые строки измененной таблицы для проверки\n",
|
||
"print(df.head())"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"2. Оптимизация параметров магазина:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 69,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Средняя посещаемость для 'Store_Area':\n",
|
||
"Store_Area\n",
|
||
"775 1090.0\n",
|
||
"780 790.0\n",
|
||
"854 660.0\n",
|
||
"869 850.0\n",
|
||
"891 630.0\n",
|
||
" ... \n",
|
||
"2063 810.0\n",
|
||
"2067 790.0\n",
|
||
"2169 600.0\n",
|
||
"2214 740.0\n",
|
||
"2229 660.0\n",
|
||
"Name: Daily_Customer_Count, Length: 583, dtype: float64\n",
|
||
"\n",
|
||
"Средняя посещаемость для 'Items_Available':\n",
|
||
"Items_Available\n",
|
||
"932 1090.0\n",
|
||
"951 790.0\n",
|
||
"1018 660.0\n",
|
||
"1050 850.0\n",
|
||
"1059 870.0\n",
|
||
" ... \n",
|
||
"2492 790.0\n",
|
||
"2493 810.0\n",
|
||
"2617 600.0\n",
|
||
"2647 740.0\n",
|
||
"2667 660.0\n",
|
||
"Name: Daily_Customer_Count, Length: 616, dtype: float64\n",
|
||
"\n",
|
||
"Средняя посещаемость для 'Store_Sales':\n",
|
||
"Store_Sales\n",
|
||
"14920 990.0\n",
|
||
"16370 880.0\n",
|
||
"17670 660.0\n",
|
||
"20270 870.0\n",
|
||
"21300 850.0\n",
|
||
" ... \n",
|
||
"101820 820.0\n",
|
||
"102310 1310.0\n",
|
||
"102920 680.0\n",
|
||
"105150 980.0\n",
|
||
"116320 860.0\n",
|
||
"Name: Daily_Customer_Count, Length: 816, dtype: float64\n",
|
||
"\n",
|
||
"Средняя посещаемость для комбинации 'Store_Area' и 'Items_Available':\n",
|
||
"Store_Area Items_Available\n",
|
||
"775 932 1090.0\n",
|
||
"780 951 790.0\n",
|
||
"854 1018 660.0\n",
|
||
"869 1050 850.0\n",
|
||
"891 1073 630.0\n",
|
||
" ... \n",
|
||
"2063 2493 810.0\n",
|
||
"2067 2492 790.0\n",
|
||
"2169 2617 600.0\n",
|
||
"2214 2647 740.0\n",
|
||
"2229 2667 660.0\n",
|
||
"Name: Daily_Customer_Count, Length: 892, dtype: float64\n",
|
||
"\n",
|
||
"Средняя посещаемость для комбинации 'Store_Sales' и 'Items_Available':\n",
|
||
"Store_Sales Items_Available\n",
|
||
"14920 1508 990.0\n",
|
||
"16370 1790 880.0\n",
|
||
"17670 1877 660.0\n",
|
||
"20270 1946 870.0\n",
|
||
"21300 1686 850.0\n",
|
||
" ... \n",
|
||
"101820 1758 820.0\n",
|
||
"102310 1587 1310.0\n",
|
||
"102920 1638 680.0\n",
|
||
"105150 2104 980.0\n",
|
||
"116320 2414 860.0\n",
|
||
"Name: Daily_Customer_Count, Length: 896, dtype: float64\n",
|
||
"\n",
|
||
"Средняя посещаемость для комбинации 'Store_Sales' и 'Store_Area':\n",
|
||
"Store_Sales Store_Area\n",
|
||
"14920 1250 990.0\n",
|
||
"16370 1477 880.0\n",
|
||
"17670 1537 660.0\n",
|
||
"20270 1624 870.0\n",
|
||
"21300 1397 850.0\n",
|
||
" ... \n",
|
||
"101820 1486 820.0\n",
|
||
"102310 1303 1310.0\n",
|
||
"102920 1365 680.0\n",
|
||
"105150 1775 980.0\n",
|
||
"116320 1989 860.0\n",
|
||
"Name: Daily_Customer_Count, Length: 896, dtype: float64\n",
|
||
"\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"\n",
|
||
"# Загружаем набор данных\n",
|
||
"df = pd.read_csv(\".//static//csv//Stores.csv\")\n",
|
||
"\n",
|
||
"# Устанавливаем случайное состояние\n",
|
||
"random_state = 42\n",
|
||
"\n",
|
||
"# Рассчитываем среднюю посещаемость для каждого значения каждого признака\n",
|
||
"for column in [\n",
|
||
" \"Store_Area\",\n",
|
||
" \"Items_Available\",\n",
|
||
" \"Store_Sales\"\n",
|
||
"]:\n",
|
||
" print(f\"Средняя посещаемость для '{column}':\")\n",
|
||
" print(df.groupby(column)[\"Daily_Customer_Count\"].mean())\n",
|
||
" print()\n",
|
||
"\n",
|
||
"\n",
|
||
"print(\"Средняя посещаемость для комбинации 'Store_Area' и 'Items_Available':\")\n",
|
||
"print(df.groupby([\"Store_Area\", \"Items_Available\"])[\"Daily_Customer_Count\"].mean())\n",
|
||
"print()\n",
|
||
"\n",
|
||
"\n",
|
||
"print(\"Средняя посещаемость для комбинации 'Store_Sales' и 'Items_Available':\")\n",
|
||
"print(df.groupby([\"Store_Sales\", \"Items_Available\"])[\"Daily_Customer_Count\"].mean())\n",
|
||
"print()\n",
|
||
"\n",
|
||
"\n",
|
||
"print(\"Средняя посещаемость для комбинации 'Store_Sales' и 'Store_Area':\")\n",
|
||
"print(df.groupby([\"Store_Sales\", \"Store_Area\"])[\"Daily_Customer_Count\"].mean())\n",
|
||
"print()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Выбор ориентира:\n",
|
||
"1. Прогнозирование стоимости страховых взносов:\n",
|
||
"Ориентир:\n",
|
||
"\n",
|
||
"R² (коэффициент детерминации): 0.75 - 0.85\n",
|
||
"\n",
|
||
"MAE (средняя абсолютная ошибка): 150 - 300 человек\n",
|
||
"\n",
|
||
"RMSE (среднеквадратичная ошибка): 175 - 315 человек\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 70,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"MAE: 241.24369535006045\n",
|
||
"MSE: 82946.49105226391\n",
|
||
"RMSE: 288.004324711043\n",
|
||
"R²: -0.008816097180501359\n",
|
||
"Ориентиры для прогнозирования не достигнуты.\n",
|
||
"Средняя посещаемость 'Store_Area':\n",
|
||
"Store_Area\n",
|
||
"775 1090.0\n",
|
||
"780 790.0\n",
|
||
"854 660.0\n",
|
||
"869 850.0\n",
|
||
"891 630.0\n",
|
||
" ... \n",
|
||
"2063 810.0\n",
|
||
"2067 790.0\n",
|
||
"2169 600.0\n",
|
||
"2214 740.0\n",
|
||
"2229 660.0\n",
|
||
"Name: Daily_Customer_Count, Length: 583, dtype: float64\n",
|
||
"\n",
|
||
"Средняя посещаемость 'Items_Available':\n",
|
||
"Items_Available\n",
|
||
"932 1090.0\n",
|
||
"951 790.0\n",
|
||
"1018 660.0\n",
|
||
"1050 850.0\n",
|
||
"1059 870.0\n",
|
||
" ... \n",
|
||
"2492 790.0\n",
|
||
"2493 810.0\n",
|
||
"2617 600.0\n",
|
||
"2647 740.0\n",
|
||
"2667 660.0\n",
|
||
"Name: Daily_Customer_Count, Length: 616, dtype: float64\n",
|
||
"\n",
|
||
"Средняя посещаемость 'Store_Sales':\n",
|
||
"Store_Sales\n",
|
||
"14920 990.0\n",
|
||
"16370 880.0\n",
|
||
"17670 660.0\n",
|
||
"20270 870.0\n",
|
||
"21300 850.0\n",
|
||
" ... \n",
|
||
"101820 820.0\n",
|
||
"102310 1310.0\n",
|
||
"102920 680.0\n",
|
||
"105150 980.0\n",
|
||
"116320 860.0\n",
|
||
"Name: Daily_Customer_Count, Length: 816, dtype: float64\n",
|
||
"\n",
|
||
"Средняя стоимость страховых взносов для комбинации 'Store_Area' и 'Items_Available':\n",
|
||
"Store_Area Items_Available\n",
|
||
"775 932 1090.0\n",
|
||
"780 951 790.0\n",
|
||
"854 1018 660.0\n",
|
||
"869 1050 850.0\n",
|
||
"891 1073 630.0\n",
|
||
" ... \n",
|
||
"2063 2493 810.0\n",
|
||
"2067 2492 790.0\n",
|
||
"2169 2617 600.0\n",
|
||
"2214 2647 740.0\n",
|
||
"2229 2667 660.0\n",
|
||
"Name: Daily_Customer_Count, Length: 892, dtype: float64\n",
|
||
"\n",
|
||
"Средняя стоимость страховых взносов для комбинации 'Items_Available' и 'Store_Sales':\n",
|
||
"Items_Available Store_Sales\n",
|
||
"932 42530 1090.0\n",
|
||
"951 25600 790.0\n",
|
||
"1018 77740 660.0\n",
|
||
"1050 52540 850.0\n",
|
||
"1059 75110 870.0\n",
|
||
" ... \n",
|
||
"2492 70230 790.0\n",
|
||
"2493 51480 810.0\n",
|
||
"2617 67080 600.0\n",
|
||
"2647 65900 740.0\n",
|
||
"2667 87410 660.0\n",
|
||
"Name: Daily_Customer_Count, Length: 896, dtype: float64\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"d:\\3_КУРС_ПИ\\МИИ\\aisenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n",
|
||
"\n",
|
||
"# Загружаем набор данных\n",
|
||
"df = pd.read_csv(\".//static//csv//Stores.csv\")\n",
|
||
"\n",
|
||
"\n",
|
||
"# Разделяем данные на признаки (X) и целевую переменную (y)\n",
|
||
"X = df.drop(\"Daily_Customer_Count\", axis=1)\n",
|
||
"y = df[\"Daily_Customer_Count\"]\n",
|
||
"\n",
|
||
"# Разделяем данные на обучающую и тестовую выборки\n",
|
||
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
|
||
"\n",
|
||
"# Стандартизируем признаки\n",
|
||
"scaler = StandardScaler()\n",
|
||
"X_train = scaler.fit_transform(X_train)\n",
|
||
"X_test = scaler.transform(X_test)\n",
|
||
"\n",
|
||
"# Обучаем модель линейной регрессии\n",
|
||
"model = LinearRegression()\n",
|
||
"model.fit(X_train, y_train)\n",
|
||
"\n",
|
||
"# Делаем предсказания на тестовой выборке\n",
|
||
"y_pred = model.predict(X_test)\n",
|
||
"\n",
|
||
"# Оцениваем качество модели\n",
|
||
"mae = mean_absolute_error(y_test, y_pred)\n",
|
||
"mse = mean_squared_error(y_test, y_pred)\n",
|
||
"rmse = mean_squared_error(y_test, y_pred, squared=False)\n",
|
||
"r2 = r2_score(y_test, y_pred)\n",
|
||
"\n",
|
||
"print(f\"MAE: {mae}\")\n",
|
||
"print(f\"MSE: {mse}\")\n",
|
||
"print(f\"RMSE: {rmse}\")\n",
|
||
"print(f\"R²: {r2}\")\n",
|
||
"\n",
|
||
"# Проверяем, достигнуты ли ориентиры\n",
|
||
"if r2 >= 0.75 and mae <= 300 and rmse <= 350:\n",
|
||
" print(\"Ориентиры для прогнозирования достигнуты!\")\n",
|
||
"else:\n",
|
||
" print(\"Ориентиры для прогнозирования не достигнуты.\")\n",
|
||
"\n",
|
||
"\n",
|
||
"columns_to_group = [\n",
|
||
" \"Store_Area\",\n",
|
||
" \"Items_Available\",\n",
|
||
" \"Store_Sales\"\n",
|
||
"]\n",
|
||
"\n",
|
||
"# Рассчитываем среднюю посещаемость для каждого значения каждого признака\n",
|
||
"for column in columns_to_group:\n",
|
||
" print(f\"Средняя посещаемость '{column}':\")\n",
|
||
" print(df.groupby(column)[\"Daily_Customer_Count\"].mean())\n",
|
||
" print()\n",
|
||
"\n",
|
||
"# Рассчитываем среднюю посещаемость для комбинаций признаков\n",
|
||
"\n",
|
||
"print(\n",
|
||
" \"Средняя стоимость страховых взносов для комбинации 'Store_Area' и 'Items_Available':\"\n",
|
||
")\n",
|
||
"print(df.groupby([\"Store_Area\", \"Items_Available\"])[\"Daily_Customer_Count\"].mean())\n",
|
||
"print()\n",
|
||
"\n",
|
||
"print(\n",
|
||
" \"Средняя стоимость страховых взносов для комбинации 'Items_Available' и 'Store_Sales':\"\n",
|
||
")\n",
|
||
"print(df.groupby([\"Items_Available\", \"Store_Sales\"])[\"Daily_Customer_Count\"].mean())\n",
|
||
"print()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Анализ применимости алгоритмов обучения с учителем для решения поставленных задач:\n",
|
||
"1. Прогнозирование посещаемости магазинов:\n",
|
||
"Задача: Регрессия\n",
|
||
"\n",
|
||
"Свойства алгоритмов:\n",
|
||
"\n",
|
||
"Линейная регрессия:\n",
|
||
"Применимость: Хорошо подходит для задач, где зависимость между признаками и целевой переменной линейна.\n",
|
||
"Преимущества: Проста в реализации, интерпретируема.\n",
|
||
"Недостатки: Может плохо работать, если зависимость нелинейна.\n",
|
||
"\n",
|
||
"Деревья решений (регрессия):\n",
|
||
"Применимость: Подходит для задач с нелинейными зависимостями.\n",
|
||
"Преимущества: Может обрабатывать категориальные признаки, не требует масштабирования данных.\n",
|
||
"Недостатки: Подвержены переобучению, могут давать нестабильные результаты.\n",
|
||
"\n",
|
||
"Случайный лес (регрессия):\n",
|
||
"Применимость: Хорошо подходит для задач с нелинейными зависимостями и большим количеством признаков.\n",
|
||
"Преимущества: Устойчив к переобучению, может обрабатывать категориальные признаки.\n",
|
||
"Недостатки: Менее интерпретируем, чем линейная регрессия.\n",
|
||
"\n",
|
||
"Градиентный бустинг (регрессия):\n",
|
||
"Применимость: Подходит для задач с нелинейными зависимостями и сложными взаимосвязями между признаками.\n",
|
||
"Преимущества: Может достигать высокой точности, устойчив к переобучению.\n",
|
||
"Недостатки: Сложнее в настройке, чем случайный лес, менее интерпретируем.\n",
|
||
"\n",
|
||
"Нейронные сети (регрессия):\n",
|
||
"Применимость: Подходит для задач с очень сложными зависимостями и большим количеством данных.\n",
|
||
"Преимущества: Может моделировать очень сложные зависимости.\n",
|
||
"Недостатки: Требует большого количества данных, сложнее в настройке и интерпретации.\n",
|
||
"\n",
|
||
"Вывод:\n",
|
||
"\n",
|
||
"Линейная регрессия: Может быть хорошим выбором для начала, особенно если зависимость между признаками и целевой переменной линейна.\n",
|
||
"\n",
|
||
"Деревья решений и случайный лес: Подходят для задач с нелинейными зависимостями.\n",
|
||
"\n",
|
||
"Градиентный бустинг: Может давать более высокую точность, чем случайный лес, но требует больше времени на настройку.\n",
|
||
"\n",
|
||
"Нейронные сети: Могут быть излишними для этой задачи, если данных недостаточно много.\n",
|
||
"\n",
|
||
"2. Оптимизация тарифной сетки:\n",
|
||
"Задача: Классификация (группировка клиентов по группам риска)\n",
|
||
"\n",
|
||
"Свойства алгоритмов:\n",
|
||
"\n",
|
||
"Логистическая регрессия:\n",
|
||
"Применимость: Хорошо подходит для задач бинарной классификации, где зависимость между признаками и целевой переменной линейна.\n",
|
||
"Преимущества: Проста в реализации, интерпретируема.\n",
|
||
"Недостатки: Может плохо работать, если зависимость нелинейна.\n",
|
||
"\n",
|
||
"Деревья решений (классификация):\n",
|
||
"Применимость: Подходит для задач с нелинейными зависимостями.\n",
|
||
"Преимущества: Может обрабатывать категориальные признаки, не требует масштабирования данных.\n",
|
||
"Недостатки: Подвержены переобучению, могут давать нестабильные результаты.\n",
|
||
"\n",
|
||
"Случайный лес (классификация):\n",
|
||
"Применимость: Хорошо подходит для задач с нелинейными зависимостями и большим количеством признаков.\n",
|
||
"Преимущества: Устойчив к переобучению, может обрабатывать категориальные признаки.\n",
|
||
"Недостатки: Менее интерпретируем, чем линейная регрессия.\n",
|
||
"\n",
|
||
"Градиентный бустинг (классификация):\n",
|
||
"Применимость: Подходит для задач с нелинейными зависимостями и сложными взаимосвязями между признаками.\n",
|
||
"Преимущества: Может достигать высокой точности, устойчив к переобучению.\n",
|
||
"Недостатки: Сложнее в настройке, чем случайный лес, менее интерпретируем.\n",
|
||
"\n",
|
||
"Нейронные сети (классификация):\n",
|
||
"Применимость: Подходит для задач с очень сложными зависимостями и большим количеством данных.\n",
|
||
"Преимущества: Может моделировать очень сложные зависимости.\n",
|
||
"Недостатки: Требует большого количества данных, сложнее в настройке и интерпретации.\n",
|
||
"\n",
|
||
"Вывод:\n",
|
||
"\n",
|
||
"Логистическая регрессия: Может быть хорошим выбором для начала, особенно если зависимость между признаками и целевой переменной линейна.\n",
|
||
"\n",
|
||
"Деревья решений и случайный лес: Подходят для задач с нелинейными зависимостями.\n",
|
||
"\n",
|
||
"Градиентный бустинг: Может давать более высокую точность, чем случайный лес, но требует больше времени на настройку.\n",
|
||
"\n",
|
||
"Нейронные сети: Могут быть излишними для этой задачи, если данных недостаточно много.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"1. Прогнозирование стоимости страховых взносов:\n",
|
||
"Выбранные модели:\n",
|
||
"\n",
|
||
"Линейная регрессия\n",
|
||
"\n",
|
||
"Случайный лес (регрессия)\n",
|
||
"\n",
|
||
"Градиентный бустинг (регрессия)\n",
|
||
"\n",
|
||
"2. Оптимизация тарифной сетки:\n",
|
||
"Выбранные модели:\n",
|
||
"\n",
|
||
"Логистическая регрессия\n",
|
||
"\n",
|
||
"Случайный лес (классификация)\n",
|
||
"\n",
|
||
"Градиентный бустинг (классификация)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 71,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Результаты для задачи регрессии:\n",
|
||
"Model: Linear Regression\n",
|
||
"MAE: 241.24369535006045\n",
|
||
"MSE: 82946.49105226391\n",
|
||
"RMSE: 288.004324711043\n",
|
||
"R²: -0.008816097180501359\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"d:\\3_КУРС_ПИ\\МИИ\\aisenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n",
|
||
" warnings.warn(\n",
|
||
"d:\\3_КУРС_ПИ\\МИИ\\aisenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Model: Random Forest Regression\n",
|
||
"MAE: 240.68666666666667\n",
|
||
"MSE: 85748.043\n",
|
||
"RMSE: 292.82766775016324\n",
|
||
"R²: -0.042889276963148815\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"d:\\3_КУРС_ПИ\\МИИ\\aisenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Model: Gradient Boosting Regression\n",
|
||
"MAE: 243.53822748120598\n",
|
||
"MSE: 86937.70201509264\n",
|
||
"RMSE: 294.85200018838714\n",
|
||
"R²: -0.05735820927548918\n",
|
||
"\n",
|
||
"Результаты для задачи классификации:\n",
|
||
"Model: Logistic Regression\n",
|
||
"Accuracy: 0.43333333333333335\n",
|
||
"\n",
|
||
"Model: Random Forest Classification\n",
|
||
"Accuracy: 0.4777777777777778\n",
|
||
"\n",
|
||
"Model: Gradient Boosting Classification\n",
|
||
"Accuracy: 0.4888888888888889\n",
|
||
"\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"from sklearn.linear_model import LinearRegression, LogisticRegression\n",
|
||
"from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n",
|
||
"from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier\n",
|
||
"from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score, accuracy_score\n",
|
||
"\n",
|
||
"# Загружаем набор данных\n",
|
||
"df = pd.read_csv(\".//static//csv//Stores.csv\")\n",
|
||
"\n",
|
||
"\n",
|
||
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n",
|
||
"X_reg = df.drop(\"Daily_Customer_Count\", axis=1)\n",
|
||
"y_reg = df[\"Daily_Customer_Count\"]\n",
|
||
"\n",
|
||
"# Разделяем данные на обучающую и тестовую выборки для задачи регрессии\n",
|
||
"X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.2, random_state=42)\n",
|
||
"\n",
|
||
"# Стандартизируем признаки для задачи регрессии\n",
|
||
"scaler_reg = StandardScaler()\n",
|
||
"X_train_reg = scaler_reg.fit_transform(X_train_reg)\n",
|
||
"X_test_reg = scaler_reg.transform(X_test_reg)\n",
|
||
"\n",
|
||
"# Список моделей для задачи регрессии\n",
|
||
"models_reg = {\n",
|
||
" \"Linear Regression\": LinearRegression(),\n",
|
||
" \"Random Forest Regression\": RandomForestRegressor(),\n",
|
||
" \"Gradient Boosting Regression\": GradientBoostingRegressor()\n",
|
||
"}\n",
|
||
"\n",
|
||
"# Обучаем и оцениваем модели для задачи регрессии\n",
|
||
"print(\"Результаты для задачи регрессии:\")\n",
|
||
"for name, model in models_reg.items():\n",
|
||
" model.fit(X_train_reg, y_train_reg)\n",
|
||
" y_pred_reg = model.predict(X_test_reg)\n",
|
||
" mae = mean_absolute_error(y_test_reg, y_pred_reg)\n",
|
||
" mse = mean_squared_error(y_test_reg, y_pred_reg)\n",
|
||
" rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)\n",
|
||
" r2 = r2_score(y_test_reg, y_pred_reg)\n",
|
||
" print(f\"Model: {name}\")\n",
|
||
" print(f\"MAE: {mae}\")\n",
|
||
" print(f\"MSE: {mse}\")\n",
|
||
" print(f\"RMSE: {rmse}\")\n",
|
||
" print(f\"R²: {r2}\")\n",
|
||
" print()\n",
|
||
"\n",
|
||
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n",
|
||
"X_class = df.drop(\"Daily_Customer_Count\", axis=1)\n",
|
||
"y_class = (df[\"Daily_Customer_Count\"] > df[\"Daily_Customer_Count\"].mean()).astype(int)\n",
|
||
"\n",
|
||
"# Разделяем данные на обучающую и тестовую выборки для задачи классификации\n",
|
||
"X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.2, random_state=42)\n",
|
||
"\n",
|
||
"# Стандартизируем признаки для задачи классификации\n",
|
||
"scaler_class = StandardScaler()\n",
|
||
"X_train_class = scaler_class.fit_transform(X_train_class)\n",
|
||
"X_test_class = scaler_class.transform(X_test_class)\n",
|
||
"\n",
|
||
"# Список моделей для задачи классификации\n",
|
||
"models_class = {\n",
|
||
" \"Logistic Regression\": LogisticRegression(),\n",
|
||
" \"Random Forest Classification\": RandomForestClassifier(),\n",
|
||
" \"Gradient Boosting Classification\": GradientBoostingClassifier()\n",
|
||
"}\n",
|
||
"\n",
|
||
"# Обучаем и оцениваем модели для задачи классификации\n",
|
||
"print(\"Результаты для задачи классификации:\")\n",
|
||
"for name, model in models_class.items():\n",
|
||
" model.fit(X_train_class, y_train_class)\n",
|
||
" y_pred_class = model.predict(X_test_class)\n",
|
||
" accuracy = accuracy_score(y_test_class, y_pred_class)\n",
|
||
" print(f\"Model: {name}\")\n",
|
||
" print(f\"Accuracy: {accuracy}\")\n",
|
||
" print()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"1. Прогнозирование стоимости страховых взносов:\n",
|
||
"Конвейер для задачи регрессии:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 72,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Результаты для задачи регрессии:\n",
|
||
"Model: Linear Regression\n",
|
||
"MAE: 240.99246411452697\n",
|
||
"MSE: 82771.10925011222\n",
|
||
"RMSE: 287.6996858707222\n",
|
||
"R²: -0.0066830595689202354\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"d:\\3_КУРС_ПИ\\МИИ\\aisenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Model: Random Forest Regression\n",
|
||
"MAE: 247.89333333333335\n",
|
||
"MSE: 94993.29455555555\n",
|
||
"RMSE: 308.2098222892248\n",
|
||
"R²: -0.15533235289568936\n",
|
||
"\n",
|
||
"Model: Gradient Boosting Regression\n",
|
||
"MAE: 251.77123469394226\n",
|
||
"MSE: 91978.0886332414\n",
|
||
"RMSE: 303.27889579270334\n",
|
||
"R²: -0.11866065970944106\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"d:\\3_КУРС_ПИ\\МИИ\\aisenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n",
|
||
" warnings.warn(\n",
|
||
"d:\\3_КУРС_ПИ\\МИИ\\aisenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor\n",
|
||
"from sklearn.pipeline import Pipeline\n",
|
||
"from sklearn.compose import ColumnTransformer\n",
|
||
"from sklearn.preprocessing import OneHotEncoder\n",
|
||
"from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n",
|
||
"\n",
|
||
"# Загружаем набор данных\n",
|
||
"df = pd.read_csv(\".//static//csv//Stores.csv\")\n",
|
||
"\n",
|
||
"\n",
|
||
"numerical_cols = [\"Store_Area\", \"Items_Available\", \"Store_Sales\"]\n",
|
||
"\n",
|
||
"\n",
|
||
"preprocessor = ColumnTransformer(\n",
|
||
" transformers=[\n",
|
||
" ('num', StandardScaler(), numerical_cols)\n",
|
||
" ])\n",
|
||
"\n",
|
||
"# Список моделей для задачи регрессии\n",
|
||
"models_reg = {\n",
|
||
" \"Linear Regression\": LinearRegression(),\n",
|
||
" \"Random Forest Regression\": RandomForestRegressor(),\n",
|
||
" \"Gradient Boosting Regression\": GradientBoostingRegressor()\n",
|
||
"}\n",
|
||
"\n",
|
||
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n",
|
||
"X_reg = df[numerical_cols]\n",
|
||
"y_reg = df[\"Daily_Customer_Count\"]\n",
|
||
"\n",
|
||
"# Разделяем данные на обучающую и тестовую выборки для задачи регрессии\n",
|
||
"X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.2, random_state=42)\n",
|
||
"\n",
|
||
"# Обучаем и оцениваем модели для задачи регрессии\n",
|
||
"print(\"Результаты для задачи регрессии:\")\n",
|
||
"for name, model in models_reg.items():\n",
|
||
" pipeline = Pipeline(steps=[\n",
|
||
" ('preprocessor', preprocessor),\n",
|
||
" ('model', model)\n",
|
||
" ])\n",
|
||
" pipeline.fit(X_train_reg, y_train_reg)\n",
|
||
" y_pred_reg = pipeline.predict(X_test_reg)\n",
|
||
" mae = mean_absolute_error(y_test_reg, y_pred_reg)\n",
|
||
" mse = mean_squared_error(y_test_reg, y_pred_reg)\n",
|
||
" rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)\n",
|
||
" r2 = r2_score(y_test_reg, y_pred_reg)\n",
|
||
" print(f\"Model: {name}\")\n",
|
||
" print(f\"MAE: {mae}\")\n",
|
||
" print(f\"MSE: {mse}\")\n",
|
||
" print(f\"RMSE: {rmse}\")\n",
|
||
" print(f\"R²: {r2}\")\n",
|
||
" print()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"2. Оптимизация характеристик магазина:\n",
|
||
"Конвейер для задачи классификации:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 73,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Результаты для задачи классификации:\n",
|
||
"Model: Logistic Regression\n",
|
||
"Accuracy: 0.46111111111111114\n",
|
||
"\n",
|
||
"Model: Random Forest Classification\n",
|
||
"Accuracy: 0.4722222222222222\n",
|
||
"\n",
|
||
"Model: Gradient Boosting Classification\n",
|
||
"Accuracy: 0.4722222222222222\n",
|
||
"\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"from sklearn.linear_model import LogisticRegression\n",
|
||
"from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier\n",
|
||
"from sklearn.pipeline import Pipeline\n",
|
||
"from sklearn.compose import ColumnTransformer\n",
|
||
"from sklearn.preprocessing import OneHotEncoder\n",
|
||
"from sklearn.metrics import accuracy_score\n",
|
||
"\n",
|
||
"# Загружаем набор данных\n",
|
||
"df = pd.read_csv(\".//static//csv//Stores.csv\")\n",
|
||
"\n",
|
||
"numerical_cols = [\"Store_Area\", \"Items_Available\", \"Store_Sales\"]\n",
|
||
"\n",
|
||
"# Создаем преобразователь для категориальных и числовых столбцов\n",
|
||
"preprocessor = ColumnTransformer(\n",
|
||
" transformers=[\n",
|
||
" ('num', StandardScaler(), numerical_cols)\n",
|
||
" ])\n",
|
||
"\n",
|
||
"# Список моделей для задачи классификации\n",
|
||
"models_class = {\n",
|
||
" \"Logistic Regression\": LogisticRegression(),\n",
|
||
" \"Random Forest Classification\": RandomForestClassifier(),\n",
|
||
" \"Gradient Boosting Classification\": GradientBoostingClassifier()\n",
|
||
"}\n",
|
||
"\n",
|
||
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n",
|
||
"X_class = df[numerical_cols]\n",
|
||
"y_class = (df[\"Daily_Customer_Count\"] > df[\"Daily_Customer_Count\"].mean()).astype(int)\n",
|
||
"\n",
|
||
"# Разделяем данные на обучающую и тестовую выборки для задачи классификации\n",
|
||
"X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.2, random_state=42)\n",
|
||
"\n",
|
||
"# Обучаем и оцениваем модели для задачи классификации\n",
|
||
"print(\"Результаты для задачи классификации:\")\n",
|
||
"for name, model in models_class.items():\n",
|
||
" pipeline = Pipeline(steps=[\n",
|
||
" ('preprocessor', preprocessor),\n",
|
||
" ('model', model)\n",
|
||
" ])\n",
|
||
" pipeline.fit(X_train_class, y_train_class)\n",
|
||
" y_pred_class = pipeline.predict(X_test_class)\n",
|
||
" accuracy = accuracy_score(y_test_class, y_pred_class)\n",
|
||
" print(f\"Model: {name}\")\n",
|
||
" print(f\"Accuracy: {accuracy}\")\n",
|
||
" print()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"1. Прогнозирование посещения:\n",
|
||
"\n",
|
||
"Настройка гиперпараметров для задачи регрессии:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 74,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Результаты для задачи регрессии:\n",
|
||
"Model: Linear Regression\n",
|
||
"Best Parameters: {}\n",
|
||
"MAE: 240.99246411452697\n",
|
||
"MSE: 82771.10925011222\n",
|
||
"RMSE: 287.6996858707222\n",
|
||
"R²: -0.0066830595689202354\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"d:\\3_КУРС_ПИ\\МИИ\\aisenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n",
|
||
" warnings.warn(\n",
|
||
"d:\\3_КУРС_ПИ\\МИИ\\aisenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Model: Random Forest Regression\n",
|
||
"Best Parameters: {'model__max_depth': 10, 'model__n_estimators': 100}\n",
|
||
"MAE: 242.55834193962204\n",
|
||
"MSE: 87591.55194330998\n",
|
||
"RMSE: 295.9586997256712\n",
|
||
"R²: -0.06531049664000643\n",
|
||
"\n",
|
||
"Model: Gradient Boosting Regression\n",
|
||
"Best Parameters: {'model__learning_rate': 0.01, 'model__max_depth': 3, 'model__n_estimators': 100}\n",
|
||
"MAE: 241.05326789654333\n",
|
||
"MSE: 82428.16277986151\n",
|
||
"RMSE: 287.1030525436146\n",
|
||
"R²: -0.0025120582972431027\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"d:\\3_КУРС_ПИ\\МИИ\\aisenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"from sklearn.model_selection import train_test_split, GridSearchCV\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor\n",
|
||
"from sklearn.pipeline import Pipeline\n",
|
||
"from sklearn.compose import ColumnTransformer\n",
|
||
"from sklearn.preprocessing import OneHotEncoder\n",
|
||
"from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n",
|
||
"\n",
|
||
"# Загружаем набор данных\n",
|
||
"df = pd.read_csv(\".//static//csv//Stores.csv\")\n",
|
||
"\n",
|
||
"# Определяем категориальные и числовые столбцы\n",
|
||
"\n",
|
||
"numerical_cols = [\"Store_Area\", \"Items_Available\", \"Store_Sales\"]\n",
|
||
"\n",
|
||
"# Создаем преобразователь для категориальных и числовых столбцов\n",
|
||
"preprocessor = ColumnTransformer(\n",
|
||
" transformers=[\n",
|
||
" ('num', StandardScaler(), numerical_cols)\n",
|
||
" ])\n",
|
||
"\n",
|
||
"# Список моделей и их гиперпараметров для задачи регрессии\n",
|
||
"models_reg = {\n",
|
||
" \"Linear Regression\": (LinearRegression(), {}),\n",
|
||
" \"Random Forest Regression\": (RandomForestRegressor(), {\n",
|
||
" 'model__n_estimators': [100, 200],\n",
|
||
" 'model__max_depth': [None, 10, 20]\n",
|
||
" }),\n",
|
||
" \"Gradient Boosting Regression\": (GradientBoostingRegressor(), {\n",
|
||
" 'model__n_estimators': [100, 200],\n",
|
||
" 'model__learning_rate': [0.01, 0.1],\n",
|
||
" 'model__max_depth': [3, 5]\n",
|
||
" })\n",
|
||
"}\n",
|
||
"\n",
|
||
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n",
|
||
"X_reg = df[numerical_cols]\n",
|
||
"y_reg = df['Daily_Customer_Count']\n",
|
||
"\n",
|
||
"# Разделяем данные на обучающую и тестовую выборки для задачи регрессии\n",
|
||
"X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.2, random_state=42)\n",
|
||
"\n",
|
||
"# Обучаем и оцениваем модели для задачи регрессии\n",
|
||
"print(\"Результаты для задачи регрессии:\")\n",
|
||
"for name, (model, params) in models_reg.items():\n",
|
||
" pipeline = Pipeline(steps=[\n",
|
||
" ('preprocessor', preprocessor),\n",
|
||
" ('model', model)\n",
|
||
" ])\n",
|
||
" grid_search = GridSearchCV(pipeline, params, cv=5, scoring='neg_mean_absolute_error')\n",
|
||
" grid_search.fit(X_train_reg, y_train_reg)\n",
|
||
" best_model = grid_search.best_estimator_\n",
|
||
" y_pred_reg = best_model.predict(X_test_reg)\n",
|
||
" mae = mean_absolute_error(y_test_reg, y_pred_reg)\n",
|
||
" mse = mean_squared_error(y_test_reg, y_pred_reg)\n",
|
||
" rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)\n",
|
||
" r2 = r2_score(y_test_reg, y_pred_reg)\n",
|
||
" print(f\"Model: {name}\")\n",
|
||
" print(f\"Best Parameters: {grid_search.best_params_}\")\n",
|
||
" print(f\"MAE: {mae}\")\n",
|
||
" print(f\"MSE: {mse}\")\n",
|
||
" print(f\"RMSE: {rmse}\")\n",
|
||
" print(f\"R²: {r2}\")\n",
|
||
" print()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"2. Оптимизация характеристик:\n",
|
||
"\n",
|
||
"Настройка гиперпараметров для задачи классификации:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 75,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Результаты для задачи классификации:\n",
|
||
"Model: Logistic Regression\n",
|
||
"Best Parameters: {'model__C': 10, 'model__solver': 'lbfgs'}\n",
|
||
"Accuracy: 0.46111111111111114\n",
|
||
"\n",
|
||
"Model: Random Forest Classification\n",
|
||
"Best Parameters: {'model__max_depth': 10, 'model__n_estimators': 100}\n",
|
||
"Accuracy: 0.49444444444444446\n",
|
||
"\n",
|
||
"Model: Gradient Boosting Classification\n",
|
||
"Best Parameters: {'model__learning_rate': 0.1, 'model__max_depth': 3, 'model__n_estimators': 100}\n",
|
||
"Accuracy: 0.4777777777777778\n",
|
||
"\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"from sklearn.model_selection import train_test_split, GridSearchCV\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"from sklearn.linear_model import LogisticRegression\n",
|
||
"from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier\n",
|
||
"from sklearn.pipeline import Pipeline\n",
|
||
"from sklearn.compose import ColumnTransformer\n",
|
||
"from sklearn.preprocessing import OneHotEncoder\n",
|
||
"from sklearn.metrics import accuracy_score\n",
|
||
"\n",
|
||
"# Загружаем набор данных\n",
|
||
"df = pd.read_csv(\".//static//csv//Stores.csv\")\n",
|
||
"\n",
|
||
"# Определяем категориальные и числовые столбцы\n",
|
||
"\n",
|
||
"numerical_cols = [\"Store_Area\", \"Items_Available\", \"Store_Sales\"]\n",
|
||
"\n",
|
||
"# Создаем преобразователь для категориальных и числовых столбцов\n",
|
||
"preprocessor = ColumnTransformer(\n",
|
||
" transformers=[\n",
|
||
" ('num', StandardScaler(), numerical_cols)\n",
|
||
" ])\n",
|
||
"\n",
|
||
"# Список моделей и их гиперпараметров для задачи классификации\n",
|
||
"models_class = {\n",
|
||
" \"Logistic Regression\": (LogisticRegression(), {\n",
|
||
" 'model__C': [0.1, 1, 10],\n",
|
||
" 'model__solver': ['liblinear', 'lbfgs']\n",
|
||
" }),\n",
|
||
" \"Random Forest Classification\": (RandomForestClassifier(), {\n",
|
||
" 'model__n_estimators': [100, 200],\n",
|
||
" 'model__max_depth': [None, 10, 20]\n",
|
||
" }),\n",
|
||
" \"Gradient Boosting Classification\": (GradientBoostingClassifier(), {\n",
|
||
" 'model__n_estimators': [100, 200],\n",
|
||
" 'model__learning_rate': [0.01, 0.1],\n",
|
||
" 'model__max_depth': [3, 5]\n",
|
||
" })\n",
|
||
"}\n",
|
||
"\n",
|
||
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n",
|
||
"X_class = df[numerical_cols]\n",
|
||
"y_class = (df['Daily_Customer_Count'] > df['Daily_Customer_Count'].mean()).astype(int)\n",
|
||
"\n",
|
||
"# Разделяем данные на обучающую и тестовую выборки для задачи классификации\n",
|
||
"X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.2, random_state=42)\n",
|
||
"\n",
|
||
"# Обучаем и оцениваем модели для задачи классификации\n",
|
||
"print(\"Результаты для задачи классификации:\")\n",
|
||
"for name, (model, params) in models_class.items():\n",
|
||
" pipeline = Pipeline(steps=[\n",
|
||
" ('preprocessor', preprocessor),\n",
|
||
" ('model', model)\n",
|
||
" ])\n",
|
||
" grid_search = GridSearchCV(pipeline, params, cv=5, scoring='accuracy')\n",
|
||
" grid_search.fit(X_train_class, y_train_class)\n",
|
||
" best_model = grid_search.best_estimator_\n",
|
||
" y_pred_class = best_model.predict(X_test_class)\n",
|
||
" accuracy = accuracy_score(y_test_class, y_pred_class)\n",
|
||
" print(f\"Model: {name}\")\n",
|
||
" print(f\"Best Parameters: {grid_search.best_params_}\")\n",
|
||
" print(f\"Accuracy: {accuracy}\")\n",
|
||
" print()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"1. Прогнозирование посещаемости::\n",
|
||
"Задача: Регрессия\n",
|
||
"\n",
|
||
"Выбор метрик:\n",
|
||
"\n",
|
||
"MAE (Mean Absolute Error): Средняя абсолютная ошибка. Показывает среднее отклонение предсказанных значений от фактических. Эта метрика легко интерпретируется, так как она измеряется в тех же единицах, что и целевая переменная \n",
|
||
"\n",
|
||
"MSE (Mean Squared Error): Среднеквадратичная ошибка. Показывает среднее квадратичное отклонение предсказанных значений от фактических. Эта метрика чувствительна к выбросам, так как ошибки возводятся в квадрат.\n",
|
||
"\n",
|
||
"RMSE (Root Mean Squared Error): Квадратный корень из среднеквадратичной ошибки. Показывает среднее отклонение предсказанных значений от фактических в тех же единицах, что и целевая переменная. Эта метрика также чувствительна к выбросам, но легче интерпретируется, чем MSE.\n",
|
||
"\n",
|
||
"R² (R-squared): Коэффициент детерминации. Показывает, какую долю дисперсии целевой переменной объясняет модель. Значение R² близкое к 1 указывает на хорошее качество модели.\n",
|
||
"\n",
|
||
"Обоснование:\n",
|
||
"\n",
|
||
"MAE: Хорошо подходит для задач, где важно понимать среднее отклонение предсказаний от фактических значений.\n",
|
||
"\n",
|
||
"MSE и RMSE: Полезны для задач, где важно минимизировать влияние выбросов, так как они возводят ошибки в квадрат.\n",
|
||
"\n",
|
||
"R²: Позволяет оценить, насколько хорошо модель объясняет вариацию целевой переменной.\n",
|
||
"\n",
|
||
"2. Оптимизация характеристик:\n",
|
||
"Задача: Классификация\n",
|
||
"\n",
|
||
"Выбор метрик:\n",
|
||
"\n",
|
||
"Accuracy: Доля правильных предсказаний среди всех предсказаний. Эта метрика показывает общую точность модели.\n",
|
||
"\n",
|
||
"Precision: Доля правильных положительных предсказаний среди всех положительных предсказаний. Эта метрика важна, если важно минимизировать количество ложноположительных результатов.\n",
|
||
"\n",
|
||
"Recall (Sensitivity): Доля правильных положительных предсказаний среди всех фактических положительных случаев. Эта метрика важна, если важно минимизировать количество ложноотрицательных результатов.\n",
|
||
"\n",
|
||
"F1-score: Гармоническое среднее между precision и recall. Эта метрика показывает баланс между precision и recall.\n",
|
||
"\n",
|
||
"Обоснование:\n",
|
||
"\n",
|
||
"Accuracy: Хорошо подходит для задач, где классы сбалансированы.\n",
|
||
"\n",
|
||
"Precision и Recall: Важны для задач, где важно минимизировать ошибки определенного типа (ложноположительные или ложноотрицательные).\n",
|
||
"\n",
|
||
"F1-score: Позволяет оценить баланс между precision и recall."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 76,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Результаты для задачи регрессии:\n",
|
||
"Model: Linear Regression\n",
|
||
"Best Parameters: {}\n",
|
||
"MAE: 240.99246411452697\n",
|
||
"MSE: 82771.10925011222\n",
|
||
"RMSE: 287.6996858707222\n",
|
||
"R²: -0.0066830595689202354\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"d:\\3_КУРС_ПИ\\МИИ\\aisenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n",
|
||
" warnings.warn(\n",
|
||
"d:\\3_КУРС_ПИ\\МИИ\\aisenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Model: Random Forest Regression\n",
|
||
"Best Parameters: {'model__max_depth': 10, 'model__n_estimators': 200}\n",
|
||
"MAE: 244.5229418633195\n",
|
||
"MSE: 87788.51054250356\n",
|
||
"RMSE: 296.29125964581465\n",
|
||
"R²: -0.06770595668688673\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"d:\\3_КУРС_ПИ\\МИИ\\aisenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Model: Gradient Boosting Regression\n",
|
||
"Best Parameters: {'model__learning_rate': 0.01, 'model__max_depth': 3, 'model__n_estimators': 100}\n",
|
||
"MAE: 240.99176421026533\n",
|
||
"MSE: 82412.10586641222\n",
|
||
"RMSE: 287.075087505712\n",
|
||
"R²: -0.002316770075243779\n",
|
||
"\n",
|
||
"Результаты для задачи классификации:\n",
|
||
"Model: Logistic Regression\n",
|
||
"Best Parameters: {'model__C': 10, 'model__solver': 'lbfgs'}\n",
|
||
"Accuracy: 0.46111111111111114\n",
|
||
"Precision: 0.475\n",
|
||
"Recall: 0.2\n",
|
||
"F1-score: 0.2814814814814815\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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7GEgIiKSCIckiIiISCMOSRAREVGlxh4GIiIiicggwZCEJJFIjwkDERGRRPRkMugVM2Mo7vNLCockiIiISCP2MBAREUmEqySIiIhIo4q8SoIJAxERkUT0ZC+34tahiziHgYiIiDRiDwMREZFUZBIMKehoDwMTBiIiIolU5EmPHJIgIiIijdjDQEREJBHZf/8rbh26iAkDERGRRLhKgoiIiCo19jAQERFJpNJfuGnnzp2FrvC9994rcjBERETlWUVeJVGohKF3796FqkwmkyEnJ6c48RAREZEOKlTCoFQqSzoOIiKicq8i3966WHMY0tPTYWRkJFUsRERE5VpFHpLQepVETk4OZs2ahVq1asHU1BQ3b94EAEydOhWrV6+WPEAiIqLyInfSY3E3XaR1wvDNN99gzZo1mDdvHgwNDVXlDRs2xKpVqyQNjoiIiHSD1gnDunXrsGLFCgwcOBD6+vqq8saNG+P69euSBkdERFSe5A5JFHfTRVrPYbh37x5cXFzylCuVSmRlZUkSFBERUXlUkSc9at3D4Obmhj///DNPeUREBJo2bSpJUERERKRbtO5h+Prrr+Hv74979+5BqVRi27ZtiImJwbp167B79+6SiJGIiKhckP13K24dukjrHoZevXph165dOHjwIExMTPD1118jOjoau3btQufOnUsiRiIionKBqyRe07ZtWxw4cAAPHz7E8+fPcfz4cfj4+EgdGxEREb3B9OnT8yQbDRo0UO1PT09HUFAQqlWrBlNTU/Tp0weJiYlFaqvIF246e/YsoqOjAbyc19C8efOiVkVERFQhlMXtrd9++20cPHhQ9bhKlf/9aQ8ODsaePXuwZcsWmJubY9SoUfDz88OJEye0jkvrhOGff/7BgAEDcOLECVhYWAAAkpOT0bp1a2zatAm1a9fWOggiIqKKoCzuVlmlShXY2trmKU9JScHq1auxceNGdOzYEQAQHh4OV1dXnDp1Cu+++65W7Wg9JDFs2DBkZWUhOjoaT548wZMnTxAdHQ2lUolhw4ZpWx0REREVw40bN2BnZ4e6deti4MCBiI+PBwCcO3cOWVlZ8Pb2Vh3boEEDODg4ICoqSut2tO5hOHr0KE6ePIn69euryurXr4/Fixejbdu2WgdARERUkUg1ZzE1NVXtsVwuh1wuVytr1aoV1qxZg/r16+PBgweYMWMG2rZtiytX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",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Model: Random Forest Classification\n",
|
||
"Best Parameters: {'model__max_depth': 10, 'model__n_estimators': 200}\n",
|
||
"Accuracy: 0.4888888888888889\n",
|
||
"Precision: 0.5211267605633803\n",
|
||
"Recall: 0.3894736842105263\n",
|
||
"F1-score: 0.4457831325301205\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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CpMFIiIiiZhqZYFzFoiIiEgnVhaIiIgkwmEIIiIi0onDEERERPReYmWBiIhIIjJIMAwhSSTSYrJAREQkETOZDGb5zBby+/yCwGEIIiIi0omVBSIiIonwaggiIiLSyVSvhmCyQEREJBEz2cslv30YG85ZICIiIp1YWSAiIpKKTIJhBCOsLDBZICIikoipTnDkMAQRERHpxMoCERGRRGT//pffPowNkwUiIiKJ8GoIIiIiei+xskBERCSR9/qmTP/73//07rBDhw5vHQwREVFRZqpXQ+iVLHTq1EmvzmQyGbKysvITDxERERkZvZIFtVpd0HEQEREVeab6FdX5mrOQmpoKCwsLqWIhIiIq0kx1GMLgqyGysrIwZcoUlC5dGjY2Nrh+/ToAYMKECVi6dKnkARIRERUV2RMc87sYG4OThalTp2L58uWYMWMG5HK5pr169epYsmSJpMERERFR4TM4WVi5ciUWLVqEnj17wtzcXNNes2ZNXLlyRdLgiIiIipLsYYj8LsbG4DkL9+7dQ4UKFXK0q9VqZGRkSBIUERFRUWSqExwNrix4eXnh8OHDOdrXr1+P2rVrSxIUERERGQ+DKwvffPMNAgMDce/ePajVamzcuBFRUVFYuXIltm3bVhAxEhERFQmyf5f89mFsDK4sdOzYEVu3bsWePXtgbW2Nb775BpGRkdi6dStatWpVEDESEREVCaZ6NcRb3WehcePG2L17t9SxEBERkRF665synT59GpGRkQBezmOoW7euZEEREREVRab6FdUGJwt3795F9+7dcfToUdjb2wMAEhIS8NFHH2Ht2rUoU6aM1DESEREVCab6rZMGz1no378/MjIyEBkZiSdPnuDJkyeIjIyEWq1G//79CyJGIiIiKkQGVxYOHjyIY8eOoXLlypq2ypUrY968eWjcuLGkwRERERU1RlgYyDeDkwV3d/dcb76UlZUFNzc3SYIiIiIqijgM8a+ZM2di6NChOH36tKbt9OnTGD58OL777jtJgyMiIipKsic45ncxNnpVFkqUKKGV6Tx//hwNGjRAsWIvn56ZmYlixYqhX79+6NSpU4EESkRERIVDr2Rhzpw5BRwGERFR0WeqwxB6JQuBgYEFHQcREVGRZ6q3e37rmzIBQGpqKtLT07XalEplvgIiIiIi42JwsvD8+XOEhobi999/R3x8fI71WVlZkgRG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RBIx1QmOHIYgIiIinVhZICIikgivhiAiIiKdTHTKAochiIiISDdWFoiIiKRioqUFJgtEREQS4dUQRERE9F5iZYGIiEgivBqCiIiIdDLRKQtMFoiIiCRjotkC5ywQERGRTqwsEBERScRUr4ZgskBERCQVCSY4GmGuwGEIIiIi0o2VBSIiIomY6PxGJgtERESSMdFsgcMQREREpBMrC0RERBLh1RBERESkk6ne7pnDEERERKQTKwtEREQSMdH5jUwWiIiIJGOi2QKTBSIiIomY6gRHzlkgIiIinVhZICIikogMElwNIUkk0mKyQEREJBETnbLAYQgiIiLSjZUFIiIiiZjqTZmYLBAREUnGNAciOAxBREREOrGyQEREJBEOQxAREZFOpjkIwWEIIiIiegNWFoiIiCTCYQgiIiLSyVS/G4LJAhERkVRMdNIC5ywQERGRTqwsEBERScRECwtMFoiIiKRiqhMcOQxBREREOrGyQEREJBFeDUFERES6meikBQ5DEBERkU6sLBAREUnERAsLTBaIiIikwqshiIiI6L3EZIGIiEgysnz/Z8hAxIIFC1CjRg0olUoolUo0bNgQf/31l2Z9s2bNIJPJtJZBgwYZfFQchiAiIpLIux6GKFOmDKZPn46KFStCCIEVK1agY8eOOHfuHKpVqwYAGDBgAMLCwjTPsbKyMjgmJgtERERFVPv27bUeT506FQsWLMCJEyc0yYKVlRVcXFzytR8OQxARERmhpKQkrSUtLU3n9llZWVi7di2eP3+Ohg0batpXr14NR0dHVK9eHePHj0dKSorBsbCyQEREJBEphyHc3d212idOnIhJkybl2P7ixYto2LAhUlNTYWNjg02bNsHLywsA0KNHD6hUKri5ueHChQsIDQ1FVFQUNm7caFBMTBaIiIgkIuXtnu/cuQOlUqlpVygUuW5fuXJlREREIDExEevXr0dgYCAOHjwILy8vDBw4ULOdt7c3XF1d0bJlS8TExMDT01PvmJgsEBERGaHsKxzeRC6Xo0KFCgCAunXr4tSpU/jhhx+wcOHCHNs2aNAAABAdHc1kgYiIqDAYw02Z1Gp1nvMbIiIiAACurq4G9clkgYiISCLv+nbP48ePR5s2bVC2bFk8e/YMa9aswYEDB7Bz507ExMRgzZo1aNu2LUqWLIkLFy4gJCQETZo0QY0aNQyKickCERFR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",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Model: Gradient Boosting Classification\n",
|
||
"Best Parameters: {'model__learning_rate': 0.1, 'model__max_depth': 3, 'model__n_estimators': 100}\n",
|
||
"Accuracy: 0.4722222222222222\n",
|
||
"Precision: 0.5\n",
|
||
"Recall: 0.42105263157894735\n",
|
||
"F1-score: 0.45714285714285713\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgwAAAHHCAYAAADTQQDlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABYGUlEQVR4nO3deVxN+f8H8Ndtu6W6pZREUlmSbDEM2aU0xli/RmOpMIaxNpaYGSPbZAzDDAZjq7EMxjbDGGTJPr72wWAqESKEFmn//P7w7f5ct9xuneqW19PjPHQ/59zPeZ97b6f3/SznyIQQAkRERERvoFfWARAREZHuY8JAREREGjFhICIiIo2YMBAREZFGTBiIiIhIIyYMREREpBETBiIiItKICQMRERFpxISBiIiINGLCUAhRUVHw9vaGhYUFZDIZdu7cKWn9t27dgkwmQ1hYmKT1lmcdOnRAhw4dJKsvNTUVw4YNg52dHWQyGcaPHy9Z3bouv89XSEgIZDJZ2QVVwZSX11MXzjW1atVCQECASll+59iwsDDIZDLcunWr1GOUyWQICQkp9f3qunKTMMTExOCTTz6Bs7MzjI2NoVAo4Onpie+//x4vXrwo0X37+/vj8uXLmDNnDtatW4fmzZuX6P5KU0BAAGQyGRQKRb6vY1RUFGQyGWQyGebPn691/fHx8QgJCcHFixcliLbovv76a4SFhWHkyJFYt24dBg0aVOL7zM3Nxc8//4wuXbqgSpUqMDQ0hK2tLby9vfHTTz8hIyOjxGMoS9q+93l/IF5dbG1t0bFjR/z5558lG2whpKWlISQkBJGRkWUdSr4iIyPRu3dv2NnZwcjICLa2tujevTu2b99e1qFpVBbn2D179jAp0JYoB3bv3i1MTEyEpaWlGDt2rPjpp5/EkiVLRP/+/YWhoaH4+OOPS2zfaWlpAoD44osvSmwfubm54sWLFyI7O7vE9lEQf39/YWBgIPT19cXmzZvV1k+fPl0YGxsLAOLbb7/Vuv4zZ84IAGLt2rVaPS8jI0NkZGRovb+CtGzZUnh6ekpWnyZpaWnCx8dHABCtW7cWoaGhYs2aNWL+/Pmie/fuQl9fXwwZMqRUYomNjVV7D7KyssSLFy9KdL/avvdr164VAMTMmTPFunXrxM8//yy+/fZb0aBBAwFA7Nq1q0Tj1eTRo0cCgJg+fbrautJ4Pd/kq6++EgBEnTp1xFdffSVWr14t5s2bJzp06CAAiA0bNggh8v8slLb09HSRmZmpfFzQOTY7O1u8ePFC5Obmlkgco0aNEgX9CXzx4oXIysoqkf2WZwZlkaRoIzY2Fv3794ejoyMOHTqEatWqKdeNGjUK0dHR+OOPP0ps/48ePQIAWFpaltg+ZDIZjI2NS6x+TeRyOTw9PfHLL7+gX79+Kus2btyIbt26Ydu2baUSS1paGipVqgQjIyNJ63348CHc3Nwkqy87Oxu5ubkFxhkUFIR9+/Zh0aJFGDdunMq6CRMmICoqChEREcXaR3EYGBjAwEA3f/19fX1VvmEOHToUVatWxS+//IL333+/DCMrWFm+nlu3bsXMmTPRt29fbNy4EYaGhsp1kyZNwr59+5CVlVUmseVHLperPC7oHKuvrw99ff3SCktFWZ6PdVpZZyyajBgxQgAQJ06cKNT2WVlZYubMmcLZ2VkYGRkJR0dHMXXqVJGenq6ynaOjo+jWrZs4duyYeOedd4RcLhdOTk4iPDxcuc306dMFAJXF0dFRCPHym3nez6/Ke86r9u/fLzw9PYWFhYUwNTUVdevWFVOnTlWuLyjrP3jwoGjTpo2oVKmSsLCwEB988IH4559/8t1fVFSU8Pf3FxYWFkKhUIiAgADx/Plzja+Xv7+/MDU1FWFhYUIul4unT58q1/33v/8VAMS2bdvUWhgSExPFhAkThLu7uzA1NRXm5uaia9eu4uLFi8ptDh8+rPb6vXqc7du3Fw0aNBBnz54Vbdu2FSYmJmLcuHHKde3bt1fWNXjwYCGXy9WO39vbW1haWop79+7le3wFxRAbGyuEECIhIUEMGTJE2NraCrlcLho1aiTCwsJU6sh7f7799luxcOFC4ezsLPT09MSFCxfy3WdcXJzQ19cXXbt2fcMrr+pN+8jIyBDTpk0THh4eQqFQiEqVKok2bdqIQ4cOqdXz9OlT4e/vLxQKhbCwsBCDBw8WFy5cUPt85fc5FUKIdevWCQ8PD2FsbCwqV64sPvzwQxEXF6eyTd77dvXqVdGhQwdhYmIi7O3txTfffKPcRtN7n5+8FoYzZ86olOfm5gqFQiEGDx6sUp6amio+++wzUaNGDWFkZCTq1q0rvv32W7VvpIU9J5w5c0Z4e3sLa2trYWxsLGrVqiUCAwNV3p/Xl7zWhvxeTwBi1KhRYseOHaJBgwbCyMhIuLm5iT///FPt2A8fPiyaNWsm5HK5cHZ2FsuXLy/wPXqdq6ursLKyEsnJyRq3ze9cc+nSJeHv7y+cnJyEXC4XVatWFYGBgeLx48cqz01OThbjxo0Tjo6OwsjISNjY2AgvLy9x7tw55Tb//vuv6N27t6hataqQy+WievXq4sMPPxTPnj1TbuPo6Cj8/f1VXrf8zrF5n4e839U8e/bsEe3atRNmZmbC3NxcNG/eXNmCIoQQR48eFX379hUODg7CyMhI1KhRQ4wfP16kpaUpt/H398/3/czz6nub5/z586Jr167C3NxcmJqaik6dOolTp06pbJMX8/Hjx0VQUJCoUqWKqFSpkujZs6d4+PChxvdH1+nmV4xX7Nq1C87OzmjdunWhth82bBjCw8PRt29fTJgwAadPn0ZoaCiuXbuGHTt2qGwbHR2Nvn37YujQofD398eaNWsQEBCAZs2aoUGDBujduzcsLS0RFBQEPz8/vPfeezAzM9Mq/qtXr+L9999Ho0aNMHPmTMjlckRHR+PEiRNvfN6BAwfg6+sLZ2dnhISE4MWLF1i8eDE8PT1x/vx51KpVS2X7fv36wcnJCaGhoTh//jxWrVoFW1tbfPPNN4WKs3fv3hgxYgS2b9+OIUOGAHjZuuDq6goPDw+17W/evImdO3fiP//5D5ycnJCQkIAVK1agffv2+Oeff2Bvb4/69etj5syZ+OqrrzB8+HC0bdsWAFTey8TERPj6+qJ///4YOHAgqlatmm9833//PQ4dOgR/f3+cOnUK+vr6WLFiBfbv349169bB3t4+3+fVr18f69atQ1BQEGrUqIEJEyYAAGxsbPDixQt06NAB0dHRGD16NJycnPDrr78iICAAz549U2sZWLt2LdLT0zF8+HDI5XJYWVnlu88///wTOTk5GDhwoIZXXV1++0hOTsaqVavg5+eHjz/+GCkpKVi9ejV8fHzw3//+F02aNAEACCHQo0cPHD9+HCNGjED9+vWxY8cO+Pv7F2rfc+bMwbRp09CvXz8MGzYMjx49wuLFi9GuXTtcuHBB5Rvg06dP0bVrV/Tu3Rv9+vXD1q1bERwcjIYNG8LX17dQ731BkpKS8PjxYwgh8PDhQyxevBipqakqr6cQAh988AEOHz6MoUOHokmTJti3bx8mTZqEe/fuYeHChcptC3NOePjwIby9vWFjY4MpU6bA0tISt27dUvb/29jYYNmyZRg5ciR69eqF3r17AwAaNWr0xmM5fvw4tm/fjk8//RTm5ub44Ycf0KdPH8TFxcHa2hoAcOHCBXTt2hXVqlXDjBkzkJOTg5kzZ8LGxkbjaxUVFYXr169jyJAhMDc317h9fiIiInDz5k0EBgbCzs4OV69exU8//YSrV6/ir7/+Ug7mHDFiBLZu3YrRo0fDzc0NiYmJOH78OK5duwYPDw9kZmbCx8cHGRkZGDNmDOzs7HDv3j3s3r0bz549g4WFhdq+tT3HhoWFYciQIWjQoAGmTp0KS0tLXLhwAXv37sVHH30EAPj111+RlpaGkSNHwtraGv/973+xePFi3L17F7/++isA4JNPPkF8fDwiIiKwbt06ja/R1atX0bZtWygUCkyePBmGhoZYsWIFOnTogCNHjqBly5Yq248ZMwaVK1fG9OnTcevWLSxatAijR4/G5s2bC/2+6KQyTljeKCkpSQAQPXr0KNT2Fy9eFADEsGHDVMonTpwoAKh8I3N0dBQAxNGjR5VlDx8+FHK5XEyYMEFZ9uo3v1cVtoVh4cKFAoB49OhRgXHnl/U3adJE2NraisTERGXZpUuXhJ6enso3rbz9vd4f3qtXL2FtbV3gPl89DlNTUyGEEH379hWdO3cWQgiRk5Mj7OzsxIwZM/J9DdLT00VOTo7accjlcjFz5kxl2Zv6sdu3by8AiOXLl+e77tUWBiGE2LdvnwAgZs+eLW7evCnMzMxEz549NR6jEP/fovSqRYsWCQBi/fr1yrLMzEzRqlUrYWZmpvzGlnf8CoWiUN8SgoKCBACV1hYhXo7LePTokXJ59Rvcm/aRnZ2tNp7j6dOnomrVqirv+86dOwUAMW/ePJXntm3bVmMLw61bt4S+vr6YM2eOyn4uX74sDAwMVMrz3reff/5Z5djs7OxEnz59lGVFHcPw+iKXy9VaffKOdfbs2Srlffv2FTKZTERHRwshCn9O2LFjR76tG6960xiGgloYjIyMlLEI8fJ3GIBYvHixsqx79+6iUqVKKq1kUVFRwsDAQGMLw2+//SYAiIULF75xuzz5nWte/ead55dfflE7P1pYWIhRo0YVWHdeS9avv/76xhhebWF4NabXz7GvtzA8e/ZMmJubi5YtW6qNF3m1VSm/4wkNDRUymUzcvn1bWfamMQyvv889e/YURkZGIiYmRlkWHx8vzM3NRbt27dRi9vLyUokpKChI6Ovrq7S0lEc6PUsiOTkZAAqdOe/ZswcA8Nlnn6mU532rfH2sg5ubm/KbD/DyW0S9evVw8+bNIsf8urxvZb/99htyc3ML9Zz79+/j4sWLCAgIUPkW26hRI3Tp0kV5nK8aMWKEyuO2bdsiMTFR+RoWxkcffYTIyEg8ePAAhw4dwoMHD5RZ++vkcjn09F5+fHJycpCYmAgzMzPUq1cP58+fL/Q+5XI5AgMDC7Wtt7c3PvnkE8ycORO9e/eGsbExVqxYUeh9vW7Pnj2ws7ODn5+fsszQ0BBjx45Famoqjhw5orJ9nz59CvWtL+81f/2b0p49e2BjY6NcHB0d1Z6b3z709fWV4xhyc3Px5MkTZGdno3nz5iqv9Z49e2BgYICRI0eqPHfMmDEaY96+fTtyc3PRr18/PH78WLnY2dmhTp06OHz4sMr2ZmZmKt/4jYyM0KJFC0l+d5YuXYqIiAhERERg/fr16NixI4YNG6Yy2n/Pnj3Q19fH2LFjVZ47YcIECCGUsyoKe07I+z3dvXu3pP39Xl5ecHFxUT5u1KgRFAqF8nXKycnBgQMH0LNnT5VWstq1a8PX11dj/dqeI/NjYmKi/Dk9PR2PHz/Gu+++CwAqny9LS0ucPn0a8fHx+daT14Kwb98+pKWlFTmegkRERCAlJQVTpkxRG2Pw6pTWV4/n+fPnePz4MVq3bg0hBC5cuKD1fnNycrB//3707NkTzs7OyvJq1arho48+wvHjx9XOs8OHD1eJqW3btsjJycHt27e13r8u0emEQaFQAABSUlIKtf3t27ehp6eH2rVrq5Tb2dnB0tJS7c2qWbOmWh2VK1fG06dPixixug8//BCenp4YNmwYqlativ79+2PLli1vTB7y4qxXr57auvr16+Px48d4/vy5Svnrx1K5cmUA0OpY3nvvPZibm2Pz5s3YsGED3nnnHbXXMk9ubi4WLlyIOnXqQC6Xo0qVKrCxscHff/+NpKSkQu+zevXqWg3qmz9/PqysrHDx4kX88MMPsLW1LfRzX3f79m3UqVNHmfjkqV+/vnL9q5ycnApVb97JOzU1VaXc09NT+YfQ29s73+cWtI/w8HA0atQIxsbGsLa2ho2NDf744w+V1/r27duoVq2aWqKS3+fodVFRURBCoE6dOipJjY2NDa5du4aHDx+qbF+jRg216w5I9bvTokULeHl5wcvLCwMGDMAff/wBNzc3jB49GpmZmQBeHqu9vb3aH8rX37vCnhPat2+PPn36YMaMGahSpQp69OiBtWvXFnvqq6ZzzMOHD/HixYt8f88K+t17lbbnyPw8efIE48aNQ9WqVWFiYgIbGxvl5/DVz9e8efNw5coVODg4oEWLFggJCVFJEJ2cnPDZZ59h1apVqFKlCnx8fLB06VKtzgdvEhMTAwBwd3d/43ZxcXHKL1tmZmawsbFB+/bt1Y6nsB49eoS0tLQCz8e5ubm4c+eOSrkU52NdpPMJg729Pa5cuaLV8wp7AZWCRuAKIYq8j5ycHJXHJiYmOHr0KA4cOIBBgwbh77//xocffoguXbqobVscxTmWPHK5HL1790Z4eDh27NhRYOsC8PK6Bp999hnatWuH9evXY9++fYiIiECDBg0K3ZICqH4bKIwLFy4o/3hdvnxZq+cWV2FjdXV1BQC1z62NjY3yD+Grs3007WP9+vUICAiAi4sLVq9ejb179yIiIgKdOnXS6rV+k9zcXMhkMmXdry+vt+RI8XkrLD09PXTs2BH3799HVFRUkerQdE6QyWTYunUrTp06hdGjR+PevXsYMmQImjVrppb4aaOkX6e8z1pxfhf69euHlStXKscw7d+/H3v37gUAlc9Xv379cPPmTSxevBj29vb49ttv0aBBA5VrZCxYsAB///03Pv/8c7x48QJjx45FgwYNcPfu3SLHp42cnBx06dIFf/zxB4KDg7Fz505EREQoL1Ql1e+LJqX5+1GadDphAID3338fMTExOHXqlMZtHR0dkZubq3ZSSUhIwLNnz/JtAi6qypUr49mzZ2rl+TU56enpoXPnzvjuu+/wzz//YM6cOTh06JBaM2+evDhv3Lihtu769euoUqUKTE1Ni3cABfjoo49w4cIFpKSkoH///gVut3XrVnTs2BGrV69G//794e3tDS8vL7XXRMqr3z1//hyBgYFwc3PD8OHDMW/ePJw5c6bI9Tk6OiIqKkrtJHL9+nXl+qLw9fWFvr4+NmzYUOTYXrV161Y4Oztj+/btGDRoEHx8fODl5YX09HSV7RwdHXH//n21P3D5fY5e5+LiAiEEnJyclEnNq0teE7U2pHzvs7OzAfx/q42joyPi4+PVvlm//t5pe0549913MWfOHJw9exYbNmzA1atXsWnTJsmPJ4+trS2MjY0RHR2tti6/stfVrVsX9erVw2+//VakxObp06c4ePAgpkyZghkzZqBXr17o0qWLStP7q6pVq4ZPP/0UO3fuRGxsLKytrTFnzhyVbRo2bIgvv/wSR48exbFjx3Dv3j0sX75c69hel9e186YvkJcvX8a///6LBQsWIDg4GD169ICXl1e+g6IL+37a2NigUqVKBZ6P9fT04ODgUMijKN90PmGYPHkyTE1NMWzYMCQkJKitj4mJwffffw/gZZM6ACxatEhlm++++w4A0K1bN8nicnFxQVJSEv7++29l2f3799VmYjx58kTtuXmj2gtq7qxWrRqaNGmC8PBwlT/AV65cwf79+5XHWRI6duyIWbNmYcmSJbCzsytwO319fbVs+ddff8W9e/dUyvISm/ySK20FBwcjLi4O4eHh+O6771CrVi34+/sXudn4vffew4MHD1RGLmdnZ2Px4sUwMzNTNmNqq2bNmhgyZAj+/PNPLFmyJN9ttPmmkfdt5dXnnD59Wi2Jfu+995CdnY1ly5Ypy3JycrB48WKN++jduzf09fUxY8YMtdiEEEhMTCx0vHmkeu+zsrKwf/9+GBkZKbsc3nvvPeTk5Ki9vgsXLoRMJlP2/xf2nPD06VO1437997RSpUqSHM+r9PX14eXlhZ07d6qMDYiOji701S1nzJiBxMREDBs2TJlYvWr//v3YvXt3gfsH1D+Pr79eOTk5as35tra2sLe3V74+ycnJavtv2LAh9PT0JLmqqbe3N8zNzREaGqqWLOfFn9/xCCGUfyNeVdjPp76+Pry9vfHbb7+pXKY6ISEBGzduRJs2bZRdQxWdzk+rdHFxwcaNG/Hhhx+ifv36GDx4MNzd3ZGZmYmTJ08qp8EBQOPGjeHv74+ffvoJz549Q/v27fHf//4X4eHh6NmzJzp27ChZXP3790dwcDB69eqFsWPHIi0tDcuWLUPdunVVBgrNnDkTR48eRbdu3eDo6IiHDx/ixx9/RI0aNdCmTZsC6//222/h6+uLVq1aYejQocpplRYWFiV6OVM9PT18+eWXGrd7//33MXPmTAQGBqJ169a4fPkyNmzYoPbNxMXFBZaWlli+fDnMzc1hamqKli1bFno8QJ5Dhw7hxx9/xPTp05XTPNeuXYsOHTpg2rRpmDdvnlb1AS8HJq1YsQIBAQE4d+4catWqha1bt+LEiRNYtGhRsQaSLVq0CLGxsRgzZgw2bdqE7t27w9bWFo8fP8aJEyewa9euQo0tAF6+1tu3b0evXr3QrVs3xMbGYvny5XBzc1P5Vtm9e3d4enpiypQpuHXrFtzc3LB9+/ZC9du6uLhg9uzZmDp1Km7duoWePXvC3NwcsbGx2LFjB4YPH46JEydq9RoU9b3/888/lS0FDx8+xMaNGxEVFYUpU6YoT8zdu3dHx44d8cUXX+DWrVto3Lgx9u/fj99++w3jx49Xfhst7DkhPDwcP/74I3r16gUXFxekpKRg5cqVUCgUyqTDxMQEbm5u2Lx5M+rWrQsrKyu4u7tr7FPXJCQkBPv374enpydGjhypTITc3d0LdVntDz/8UHlZ5QsXLsDPzw+Ojo5ITEzE3r17cfDgQWzcuDHf5yoUCrRr1w7z5s1DVlYWqlevjv379yM2NlZlu5SUFNSoUQN9+/ZF48aNYWZmhgMHDuDMmTNYsGABgJe/o6NHj8Z//vMf1K1bF9nZ2Vi3bh309fXRp0+fYr1GebEuXLgQw4YNwzvvvIOPPvoIlStXxqVLl5CWlobw8HC4urrCxcUFEydOxL1796BQKLBt27Z8xw40a9YMADB27Fj4+PhAX1+/wFbV2bNnIyIiAm3atMGnn34KAwMDrFixAhkZGUU695RbpTwro8j+/fdf8fHHH4tatWoJIyMjYW5uLjw9PcXixYtVLsCSlZUlZsyYIZycnIShoaFwcHB444WbXvf6dL6CpvwI8fKCTO7u7sLIyEjUq1dPrF+/Xm161cGDB0WPHj2Evb29MDIyEvb29sLPz0/8+++/avt4ffrZgQMHhKenpzAxMREKhUJ07969wAs3vT5ts6CLnrzu1WmVBSloWuWECRNEtWrVhImJifD09BSnTp3Kdzrkb7/9Jtzc3JTTxF6/cFN+Xq0nOTlZODo6Cg8PD7XLtQYFBQk9PT21C6i8rqD3OyEhQQQGBooqVaoIIyMj0bBhQ7X34U2fgTfJzs4Wa9euFZ06dRJWVlbCwMBAVKlSRXTu3FksX75cZWrYm/aRm5srvv76a+Ho6Cjkcrlo2rSp2L17d75TexMTE8WgQYOUF24aNGiQVhdu2rZtm2jTpo0wNTUVpqamwtXVVYwaNUrcuHFDuU1B71t+8RT03ucnv2mVxsbGokmTJmLZsmVqF2RKSUkRQUFBwt7eXhgaGoo6deoUeOEmTeeE8+fPCz8/P1GzZk0hl8uFra2teP/998XZs2dV6jp58qRo1qyZMDIyKvSFm173+rRCIV6eJ5o2bSqMjIyEi4uLWLVqlZgwYYIwNjYu8PV6Xd65xtbWVhgYGAgbGxvRvXt38dtvvym3ye9cc/fuXdGrVy9haWkpLCwsxH/+8x8RHx+vcnwZGRli0qRJonHjxsoLFzVu3Fj8+OOPynpu3rwphgwZIlxcXISxsbGwsrISHTt2FAcOHHjj8Rd2WmWe33//XbRu3Vp5XmzRooX45ZdflOv/+ecf4eXlJczMzESVKlXExx9/rJzO+upxZ2dnizFjxggbGxshk8kKdeEmHx8fYWZmJipVqiQ6duwoTp48mW/Mr0/PzbuQ2eHDh0V5JhOinI/CICKqgHr27ImrV68WeaAnkdR0fgwDEVFF9/qdYqOiorBnzx5Jb/FOVFxsYSAiKmPVqlVDQEAAnJ2dcfv2bSxbtgwZGRm4cOEC6tSpU9bhEQEoB4MeiYgquq5du+KXX37BgwcPIJfL0apVK3z99ddMFkinsIWBiIiINOIYBiIiItKICQMRERFpxDEMhZCbm4v4+HiYm5uXyOVhiYio5AghkJKSAnt7e7WbzUkpPT1deYO04jIyMlK7K2dZY8JQCPHx8W/NtcKJiCqqO3fuoEaNGiVSd3p6OkzMrYFsaW7tbWdnh9jYWJ1KGpgwFELeJYKX7z0LE1MzDVsTlU9d3fK/gyZReZeSnIzaTg7Futy7JpmZmUB2GuRu/oC+UfEqy8nEg3/CkZmZyYShvMnrhjAxNUMls5L7wBGVpbflBjr09iqVLmUDY8iKmTAImW4OL2TCQEREJBUZgOImJjo6VI4JAxERkVRkei+X4tahg3QzKiIiItIpbGEgIiKSikwmQZeEbvZJMGEgIiKSCrskiIiI6G3GFgYiIiKpsEuCiIiINJOgS0JHG/91MyoiIiLSKWxhICIikgq7JIiIiEgjzpIgIiKitxlbGIiIiKTCLgkiIiLSqAJ3STBhICIikkoFbmHQzTSGiIiIdApbGIiIiKRSgbskdDMqIiKi8kgm+/+kochL4bskQkJCIJPJVBZXV1e17YQQ8PX1hUwmw86dO4t0aGxhICIiKscaNGiAAwcOKB8bGKj/aV+0aBFkxRwbwYSBiIhIKnqyl0tx69CCgYEB7OzsClx/8eJFLFiwAGfPnkW1atWKHlaRn0lERESqit0dof0YiKioKNjb28PZ2RkDBgxAXFyccl1aWho++ugjLF269I1JRWGwhYGIiEgHJScnqzyWy+WQy+UqZS1btkRYWBjq1auH+/fvY8aMGWjbti2uXLkCc3NzBAUFoXXr1ujRo0ex42HCQEREJBUJr8Pg4OCgUjx9+nSEhISolPn6+ip/btSoEVq2bAlHR0ds2bIFNjY2OHToEC5cuFC8eP6HCQMREZFUJJxWeefOHSgUCmXx660L+bG0tETdunURHR2Ny5cvIyYmBpaWlirb9OnTB23btkVkZKRWYTFhICIi0kEKhUIlYSiM1NRUxMTEYNCgQejXrx+GDRumsr5hw4ZYuHAhunfvrnU8TBiIiIikUsqXhp44cSK6d+8OR0dHxMfHY/r06dDX14efnx9sbGzyHehYs2ZNODk5aR0WEwYiIiKplPKVHu/evQs/Pz8kJibCxsYGbdq0wV9//QUbG5vixZAPJgxERERSKeUWhk2bNmlVtRBC22iUeB0GIiIi0ogtDERERFKpwDefYsJAREQklVLukihNupnGEBERkU5hCwMREZFkJOiS0NHv8kwYiIiIpMIuCSIiInqbsYWBiIhIKjKZBLMkdLOFgQkDERGRVCrwtErdjIqIiIh0ClsYiIiIpFKBBz0yYSAiIpJKBe6SYMJAREQklQrcwqCbaQwRERHpFLYwEBERSYVdEkRERKQRuySIiIjobcYWBiIiIonIZDLIKmgLAxMGIiIiiVTkhIFdEkRERKQRWxiIiIikIvvfUtw6dBATBiIiIomwS4KIiIjeamxhICIikkhFbmFgwkBERCQRJgxERESkUUVOGDiGgYiIiDRiCwMREZFUOK2SiIiINGGXBBEREb3V2MJAREQkkZd3ty5uC4M0sUiNCQMREZFEZJCgS0JHMwZ2SRAREZFGbGEgIiKSSEUe9MiEgYiISCoVeFoluySIiIhII7YwEBERSUWCLgnBLgkiIqKKTYoxDMWfZVEymDAQERFJpCInDBzDQEREVE6FhIQok5S8xdXVFQDw5MkTjBkzBvXq1YOJiQlq1qyJsWPHIikpqUj7YgsDERGRVMpglkSDBg1w4MAB5WMDg5d/2uPj4xEfH4/58+fDzc0Nt2/fxogRIxAfH4+tW7dqHRYTBiIiIomURZeEgYEB7Ozs1Mrd3d2xbds25WMXFxfMmTMHAwcORHZ2tjKxKCx2SRAREemg5ORklSUjIyPf7aKiomBvbw9nZ2cMGDAAcXFxBdaZlJQEhUKhdbIAMGEgIiKSzOvjCYq6AICDgwMsLCyUS2hoqNr+WrZsibCwMOzduxfLli1DbGws2rZti5SUFLVtHz9+jFmzZmH48OFFOjZ2SRAREUlEyi6JO3fuQKFQKMvlcrnatr6+vsqfGzVqhJYtW8LR0RFbtmzB0KFDleuSk5PRrVs3uLm5ISQkpEhxMWEgIiLSQQqFQiVhKAxLS0vUrVsX0dHRyrKUlBR07doV5ubm2LFjBwwNDYsUD7skiIiIJCJll0RRpKamIiYmBtWqVQPwsmXB29sbRkZG+P3332FsbFzkupkwEBERSUUm0VJIEydOxJEjR3Dr1i2cPHkSvXr1gr6+Pvz8/JTJwvPnz7F69WokJyfjwYMHePDgAXJycrQ+NHZJEBERlVN3796Fn58fEhMTYWNjgzZt2uCvv/6CjY0NIiMjcfr0aQBA7dq1VZ4XGxuLWrVqabUvJgxEREQSKe3rMGzatKnAdR06dIAQolixvIoJAxERkUQq8r0kmDAQERFJpCInDBz0SERERBqxhYGIiEgqZXDzqdLChIGIiEgi7JIgIiKitxpbGEgn7PrjJLZsjYRPl3cw8KMuAIA5c9fj+g3Vu6516tAUgf6++VVBpNMWhu3HzKW/Y0T/Dgid0BcAkJ6RhS8Xbcf2iHPIzMxGp3frY37wh7C11u5ywKQ7KnILg04lDAEBAXj27Bl27txZ1qFQKbp5Mx6HIi/AwcFWbV2H9k3Qp1c75WO5UdGugU5Uls5fvY2wHSfQoE51lfLPF27D/uNXERY6FAozE0z+dgsGTV6Ffas/K6NIqbhkkCBh0NFBDOySoDKVnp6JZT/9jqEB78G0kvo1zuVGhrC0MFMuJibqd2sj0mWpaRkY/lUYvv/cD5bmJsrypNQXWP/bKcwJ6o1279RDk/o1seSrgfjv3zdx5nJsGUZMlL9ykzBcuXIFvr6+MDMzQ9WqVTFo0CA8fvxYuX7r1q1o2LAhTExMYG1tDS8vLzx//hwAEBkZiRYtWsDU1BSWlpbw9PTE7du3y+pQ6BXh6/ahcWMXuDdwynf9yVNXMHLMQkz58ids/vUwMjKySjlCouKZNG8zvD3d0aGlq0r5pWtxyMrOQYcW9ZRldWvZoYZdZSYM5VhZ33yqJJWLhOHZs2fo1KkTmjZtirNnz2Lv3r1ISEhAv379AAD379+Hn58fhgwZgmvXriEyMhK9e/eGEALZ2dno2bMn2rdvj7///hunTp3C8OHDdfYNeZucOn0Vt24/QL++HfNd3+rdBhgxvAc+nzwA3bu1xolTV7D8p99KOUqiotu2/ywuXb+Dr0Z9oLYuITEZRoYGsDCvpFJua6VAQmJyaYVIUivlm0+VJp0aw1CQJUuWoGnTpvj666+VZWvWrIGDgwP+/fdfpKamIjs7G71794ajoyMAoGHDhgCAJ0+eICkpCe+//z5cXFwAAPXr13/j/jIyMpCRkaF8nJzMX16pJSYmY/3GCARP/AhGhvl/DDt1aKr82cHBFpYWZpj77UYkPHyKqraVSytUoiK5++Appi7Yhu1LRsNYzrE3VP6Vi4Th0qVLOHz4MMzMzNTWxcTEwNvbG507d0bDhg3h4+MDb29v9O3bF5UrV4aVlRUCAgLg4+ODLl26wMvLC/369VPeKzw/oaGhmDFjRkke0lsv9vZ9JCenYVrIamVZbq7AjX/jEHHwLNauDIaenmoDmIuLPQAgIYEJA+m+S9fj8OhJCjoM+kZZlpOTi5MXYrDy16PY9sMoZGZlIyklTaWV4eGTZFTlLIlyi7Mkylhqaiq6d++Ob775Rm1dtWrVoK+vj4iICJw8eRL79+/H4sWL8cUXX+D06dNwcnLC2rVrMXbsWOzduxebN2/Gl19+iYiICLz77rv57m/q1Kn47LP/H6WcnJwMBweHEju+t1GD+rXw9axhKmUrV/8B+2rW6Pbeu2rJAgDExSUAACwt1RNHIl3T7p16OPHL5yplo2euR51aVTFucBdUt6sMQwN9HDlzAx90etmaFnUrAXcfPMU7DfMf00O6jwlDGfPw8MC2bdtQq1YtGBjkH7JMJoOnpyc8PT3x1VdfwdHRETt27FD+4W/atCmaNm2KqVOnolWrVti4cWOBCYNcLodcztH4JcnERA6HGqrTKOVyQ5iZmcChhi0SHj7Fqb+uonEjF5iZmeDOnYfY8MsB1KvngJr5TL8k0jXmpsZwq22vUlbJxAhWFqbK8oE9WuGLhdtRWWEKc1NjTP72V7zT0IkJQzkmk71ciluHLtK5hCEpKQkXL15UKRs+fDhWrlwJPz8/TJ48GVZWVoiOjsamTZuwatUqnD17FgcPHoS3tzdsbW1x+vRpPHr0CPXr10dsbCx++uknfPDBB7C3t8eNGzcQFRWFwYMHl80BUqEY6Ovjyj+x2Lf/DDIyMmFlpUDz5q7o2d2zrEMjkszXQX2gJ5NhcPAqlQs3EekinUsYIiMj0bRpU5WyoUOH4sSJEwgODoa3tzcyMjLg6OiIrl27Qk9PDwqFAkePHsWiRYuQnJwMR0dHLFiwAL6+vkhISMD169cRHh6OxMREVKtWDaNGjcInn3xSRkdIBfliykDlz9bWCnw5ZVAZRkMkvd0rxqs8NpYbYn7wh0wSKpCXLQzF7ZKQKBiJyYQQoqyD0HXJycmwsLBA+LHrqGRmXtbhEJWI993tNW9EVA4lJyejqrUFkpKSoFCUzIDSvL8TzmO3Ql9uWqy6cjKe4+YPfUs03qIoF9dhICIiorKlc10SRERE5RVnSRAREZFGFXmWBLskiIiISCO2MBAREUlET08GPb3iNRGIYj6/pDBhICIikgi7JIiIiOitxhYGIiIiiXCWBBEREWlUkbskmDAQERFJpCK3MHAMAxEREWnEFgYiIiKJVOQWBiYMREREEqnIYxjYJUFEREQasYWBiIhIIjJI0CUB3WxiYMJAREQkEXZJEBER0VuNLQxEREQS4SwJIiIi0ohdEkRERPRWY8JAREQkkbwuieIuhRUSEqL2XFdXV+X69PR0jBo1CtbW1jAzM0OfPn2QkJBQpGNjwkBERCSRvC6J4i7aaNCgAe7fv69cjh8/rlwXFBSEXbt24ddff8WRI0cQHx+P3r17F+nYOIaBiIhIImUx6NHAwAB2dnZq5UlJSVi9ejU2btyITp06AQDWrl2L+vXr46+//sK7776r1X7YwkBERKSDkpOTVZaMjIx8t4uKioK9vT2cnZ0xYMAAxMXFAQDOnTuHrKwseHl5Kbd1dXVFzZo1cerUKa3jYcJAREQkFSm6I/7XwODg4AALCwvlEhoaqra7li1bIiwsDHv37sWyZcsQGxuLtm3bIiUlBQ8ePICRkREsLS1VnlO1alU8ePBA60NjlwQREZFEpOySuHPnDhQKhbJcLperbevr66v8uVGjRmjZsiUcHR2xZcsWmJiYFCuO17GFgYiISAcpFAqVJb+E4XWWlpaoW7cuoqOjYWdnh8zMTDx79kxlm4SEhHzHPGjChIGIiEgiZTFL4lWpqamIiYlBtWrV0KxZMxgaGuLgwYPK9Tdu3EBcXBxatWqldd3skiAiIpJIac+SmDhxIrp37w5HR0fEx8dj+vTp0NfXh5+fHywsLDB06FB89tlnsLKygkKhwJgxY9CqVSutZ0gATBiIiIjKrbt378LPzw+JiYmwsbFBmzZt8Ndff8HGxgYAsHDhQujp6aFPnz7IyMiAj48PfvzxxyLtiwkDERGRREr7XhKbNm1643pjY2MsXboUS5cuLV5QYMJAREQkmYp8t0oOeiQiIiKN2MJAREQkkYrcwsCEgYiISCKlPYahNDFhICIikkhFbmHgGAYiIiLSiC0MREREEmGXBBEREWnELgkiIiJ6q7GFgYiISCIySNAlIUkk0mPCQEREJBE9mQx6xcwYivv8ksIuCSIiItKILQxEREQS4SwJIiIi0qgiz5JgwkBERCQRPdnLpbh16CKOYSAiIiKN2MJAREQkFZkEXQo62sLAhIGIiEgiFXnQI7skiIiISCO2MBAREUlE9r9/xa1DFzFhICIikghnSRAREdFbjS0MREREEnnrL9z0+++/F7rCDz74oMjBEBERlWcVeZZEoRKGnj17FqoymUyGnJyc4sRDREREOqhQCUNubm5Jx0FERFTuVeTbWxdrDEN6ejqMjY2lioWIiKhcq8hdElrPksjJycGsWbNQvXp1mJmZ4ebNmwCAadOmYfXq1ZIHSEREVF7kDXos7qKLtE4Y5syZg7CwMMybNw9GRkbKcnd3d6xatUrS4IiIiEg3aJ0w/Pzzz/jpp58wYMAA6OvrK8sbN26M69evSxocERFReZLXJVHcRRdpPYbh3r17qF27tlp5bm4usrKyJAmKiIioPKrIgx61bmFwc3PDsWPH1Mq3bt2Kpk2bShIUERER6RatWxi++uor+Pv74969e8jNzcX27dtx48YN/Pzzz9i9e3dJxEhERFQuyP63FLcOXaR1C0OPHj2wa9cuHDhwAKampvjqq69w7do17Nq1C126dCmJGImIiMqFijxLokjXYWjbti0iIiKkjoWIiIh0VJEv3HT27Flcu3YNwMtxDc2aNZMsKCIiovKoIt/eWuuE4e7du/Dz88OJEydgaWkJAHj27Blat26NTZs2oUaNGlLHSEREVC5U5LtVaj2GYdiwYcjKysK1a9fw5MkTPHnyBNeuXUNubi6GDRtWEjESERFRGdM6YThy5AiWLVuGevXqKcvq1auHxYsX4+jRo5IGR0REVN6U5UWb5s6dC5lMhvHjxyvLHjx4gEGDBsHOzg6mpqbw8PDAtm3btK5b6y4JBweHfC/QlJOTA3t7e60DICIiqijKskvizJkzWLFiBRo1aqRSPnjwYDx79gy///47qlSpgo0bN6Jfv344e/asVtdP0rqF4dtvv8WYMWNw9uxZZdnZs2cxbtw4zJ8/X9vqiIiIKoy8QY/FXbSVmpqKAQMGYOXKlahcubLKupMnT2LMmDFo0aIFnJ2d8eWXX8LS0hLnzp3Tah+FamGoXLmySsbz/PlztGzZEgYGL5+enZ0NAwMDDBkyBD179tQqACIiIiqeUaNGoVu3bvDy8sLs2bNV1rVu3RqbN29Gt27dYGlpiS1btiA9PR0dOnTQah+FShgWLVqkVaVERERvIym7JJKTk1XK5XI55HK52vabNm3C+fPncebMmXzr27JlCz788ENYW1vDwMAAlSpVwo4dO/K9L9SbFCph8Pf316pSIiKit5GUl4Z2cHBQKZ8+fTpCQkJUyu7cuYNx48YhIiICxsbG+dY3bdo0PHv2DAcOHECVKlWwc+dO9OvXD8eOHUPDhg0LHVeRL9wEAOnp6cjMzFQpUygUxamSiIiI8DIZePVvan6tC+fOncPDhw/h4eGhLMvJycHRo0exZMkS3LhxA0uWLMGVK1fQoEEDAEDjxo1x7NgxLF26FMuXLy90PFonDM+fP0dwcDC2bNmCxMREtfU5OTnaVklERFQhSHl7a4VCofFLeOfOnXH58mWVssDAQLi6uiI4OBhpaWkv69RTneOgr6+P3NxcreLSOmGYPHkyDh8+jGXLlmHQoEFYunQp7t27hxUrVmDu3LnaVkdERFRhSHEtBW2eb25uDnd3d5UyU1NTWFtbw93dHVlZWahduzY++eQTzJ8/H9bW1ti5cyciIiK0vsO01gnDrl278PPPP6NDhw4IDAxE27ZtUbt2bTg6OmLDhg0YMGCAtlUSERFRCTA0NMSePXswZcoUdO/eHampqahduzbCw8Px3nvvaVWX1gnDkydP4OzsDOBlc8mTJ08AAG3atMHIkSO1rY6IiKjC0IV7SURGRqo8rlOnTpGu7Pg6rS/c5OzsjNjYWACAq6srtmzZAuBly0PezaiIiIjeRsW9LLQUXRolReuEITAwEJcuXQIATJkyBUuXLoWxsTGCgoIwadIkyQMkIiKisqd1l0RQUJDyZy8vL1y/fh3nzp1D7dq11a5fTURE9DaRcpaErinWdRgAwNHREY6OjlLEQkREVK6V9iyJ0lSohOGHH34odIVjx44tcjBERETlmS4MeiwphUoYFi5cWKjKZDIZEwYiIqIKqFAJQ96siLfd8E8XQKZvVNZhEJWIp2eWlHUIROWeHoowmyCfOnRRsccwEBER0UsVuUtCVxMZIiIi0iFsYSAiIpKITAbovc2zJIiIiEgzPQkShuI+v6SwS4KIiIg0KlLCcOzYMQwcOBCtWrXCvXv3AADr1q3D8ePHJQ2OiIioPMkb9FjcRRdpnTBs27YNPj4+MDExwYULF5CRkQEASEpKwtdffy15gEREROVFXpdEcRddpHXCMHv2bCxfvhwrV66EoaGhstzT0xPnz5+XNDgiIiLSDVoPerxx4wbatWunVm5hYYFnz55JERMREVG5VJHvJaF1C4OdnR2io6PVyo8fPw5nZ2dJgiIiIiqP8u5WWdxFF2mdMHz88ccYN24cTp8+DZlMhvj4eGzYsAETJ07EyJEjSyJGIiKickFPokUXad0lMWXKFOTm5qJz585IS0tDu3btIJfLMXHiRIwZM6YkYiQiIqIypnXCIJPJ8MUXX2DSpEmIjo5Gamoq3NzcYGZmVhLxERERlRsVeQxDka/0aGRkBDc3NyljISIiKtf0UPwxCHrQzYxB64ShY8eOb7yoxKFDh4oVEBEREekerROGJk2aqDzOysrCxYsXceXKFfj7+0sVFxERUbnDLolXLFy4MN/ykJAQpKamFjsgIiKi8oo3nyqEgQMHYs2aNVJVR0RERDpEsttbnzp1CsbGxlJVR0REVO7IZCj2oMcK0yXRu3dvlcdCCNy/fx9nz57FtGnTJAuMiIiovOEYhldYWFioPNbT00O9evUwc+ZMeHt7SxYYERER6Q6tEoacnBwEBgaiYcOGqFy5cknFREREVC5x0OP/6Ovrw9vbm3elJCIiyodMon+6SOtZEu7u7rh582ZJxEJERFSu5bUwFHfRRVonDLNnz8bEiROxe/du3L9/H8nJySoLERERVTyFHsMwc+ZMTJgwAe+99x4A4IMPPlC5RLQQAjKZDDk5OdJHSUREVA5U5DEMhU4YZsyYgREjRuDw4cMlGQ8REVG5JZPJ3ni/pcLWoYsKnTAIIQAA7du3L7FgiIiISDdpNa1SV7MeIiIiXcAuif+pW7euxqThyZMnxQqIiIiovOKVHv9nxowZald6JCIioopPq4Shf//+sLW1LalYiIiIyjU9mazYN58q7vNLSqGvw8DxC0RERG9W1hdumjt3LmQyGcaPH69SfurUKXTq1AmmpqZQKBRo164dXrx4oVXdWs+SICIiIt1z5swZrFixAo0aNVIpP3XqFLp27YqpU6di8eLFMDAwwKVLl6Cnp921GwudMOTm5mpVMRER0VtHgkGPRbmVRGpqKgYMGICVK1di9uzZKuuCgoIwduxYTJkyRVlWr149rfeh9aWhiYiIKH96kEmyAFC79UJGRkaB+x01ahS6desGLy8vlfKHDx/i9OnTsLW1RevWrVG1alW0b98ex48fL8KxERERkSTyplUWdwEABwcHWFhYKJfQ0NB897lp0yacP38+3/V5N4sMCQnBxx9/jL1798LDwwOdO3dGVFSUVsem1SwJIiIiKh137tyBQqFQPpbL5fluM27cOERERMDY2Fhtfd5wgk8++QSBgYEAgKZNm+LgwYNYs2ZNgUlIfpgwEBERSUTKKz0qFAqVhCE/586dw8OHD+Hh4aEsy8nJwdGjR7FkyRLcuHEDAODm5qbyvPr16yMuLk6ruJgwEBERSaS0r8PQuXNnXL58WaUsMDAQrq6uCA4OhrOzM+zt7ZWJQ55///0Xvr6+WsXFhIGIiKicMjc3h7u7u0qZqakprK2tleWTJk3C9OnT0bhxYzRp0gTh4eG4fv06tm7dqtW+mDAQERFJRBfvJTF+/Hikp6cjKCgIT548QePGjREREQEXFxet6mHCQEREJBE9SNAlUZQLMbwiMjJSrWzKlCkq12EoCk6rJCIiIo3YwkBERCQRXeySkAoTBiIiIonoofhN97ra9K+rcREREZEOYQsDERGRRGQyGWTF7FMo7vNLChMGIiIiichQpJtNqtWhi5gwEBERSaS0r/RYmjiGgYiIiDRiCwMREZGEdLN9oPiYMBAREUmkIl+HgV0SREREpBFbGIiIiCTCaZVERESkEa/0SERERG81tjAQERFJhF0SREREpFFFvtIjuySIiIhII7YwEBERSYRdEkRERKRRRZ4lwYSBiIhIIhW5hUFXExkiIiLSIWxhICIikkhFniXBhIGIiEgivPkUERERvdXYwkBERCQRPcigV8xOheI+v6QwYSAiIpIIuySIiIjorcYWBiIiIonI/vevuHXoIiYMREREEmGXBBEREb3V2MJAREQkEZkEsyTYJUFERFTBVeQuCSYMREREEqnICQPHMBAREZFGbGEgIiKSCKdVEhERkUZ6spdLcevQReySICIiIo3YwkBERCSRitwlwRYGIiIiieTNkijuUlRz586FTCbD+PHj1dYJIeDr6wuZTIadO3dqXTcTBiIiogrgzJkzWLFiBRo1apTv+kWLFkFWjGyECQMREZFEZPj/bomi/9NeamoqBgwYgJUrV6Jy5cpq6y9evIgFCxZgzZo1RT42JgxEREQSyZslUdwFAJKTk1WWjIyMAvc7atQodOvWDV5eXmrr0tLS8NFHH2Hp0qWws7Mr+rEV+ZlERERUYhwcHGBhYaFcQkND891u06ZNOH/+fIHrg4KC0Lp1a/To0aNY8XCWBJWJ4I/fw5Th76mU/XvrAVr+ZzYAYNfycWjTrI7K+rXbjuOzuZtKLUYiKS0M24+ZS3/HiP4dEDqhLwAgPSMLXy7aju0R55CZmY1O79bH/OAPYWutKONoqaiknCVx584dKBT//1mQy+Vq2965cwfjxo1DREQEjI2N1db//vvvOHToEC5cuFCsmIAybmEICAiATCbDiBEj1NaNGjUKMpkMAQEBpR8YlYprMfGo13WqcvEdtlBlfdiOEyrrpy/eWTaBEhXT+au3EbbjBBrUqa5S/vnCbdh77ArCQodi94rxePA4CYMmryqjKEkKUs6SUCgUKkt+CcO5c+fw8OFDeHh4wMDAAAYGBjhy5Ah++OEHGBgYICIiAjExMbC0tFSuB4A+ffqgQ4cOWh1bmbcwODg4YNOmTVi4cCFMTEwAAOnp6di4cSNq1qxZ5HqFEMjJyVG+OKR7snNy8TAxpcD1L9Iz37ieqDxITcvA8K/C8P3nfpi/Zq+yPCn1Bdb/dgorZweg3Tv1AABLvhqIlv+ZjTOXY/FOQ6eyCpmKQfa/pbh1FFbnzp1x+fJllbLAwEC4uroiODgYVapUwSeffKKyvmHDhli4cCG6d++uVVxlPobBw8MDDg4O2L59u7Js+/btqFmzJpo2baosy8jIwNixY2FrawtjY2O0adMGZ86cUa6PjIyETCbDn3/+iWbNmkEul+P48ePIzc1FaGgonJycYGJigsaNG2Pr1q2leoyUP2cHG/yzZw4u7AzBT7P8UaOq6sje/3RtjuiIuTi56XN8NeoDmMgNyyhSoqKbNG8zvD3d0aGlq0r5pWtxyMrOQYcW9ZRldWvZoYZdZZy5HFvaYVI5ZW5uDnd3d5XF1NQU1tbWcHd3h52dndp6AKhZsyacnLRLSnXi6/eQIUOwdu1aDBgwAACwZs0aBAYGIjIyUrnN5MmTsW3bNoSHh8PR0RHz5s2Dj48PoqOjYWVlpdxuypQpmD9/PpydnVG5cmWEhoZi/fr1WL58OerUqYOjR49i4MCBsLGxQfv27fONJyMjQ2U0anJycskc+Fvs3NVbGDVjPaJvJ6BqFQsEf+yLPSuD0Lr/HKSmZWDrvrO4c/8JHjxKQoM69pg+ugdqO9piMJtrqRzZtv8sLl2/g0Phk9XWJSQmw8jQABbmlVTKba0USEjkOae80oMMesW8P7Wejl7pUScShoEDB2Lq1Km4ffs2AODEiRPYtGmTMmF4/vw5li1bhrCwMPj6+gIAVq5ciYiICKxevRqTJk1S1jVz5kx06dIFwMs//F9//TUOHDiAVq1aAQCcnZ1x/PhxrFixosCEITQ0FDNmzCipwyUAB07+o/z5anQ8zl65hcu7ZqKnlwfW/34K4TtOKNf/ExOPB4+T8fuysahVvQpu3XtcFiETaeXug6eYumAbti8ZDWO2jr01SrtLIj+vftnOjxCiSPXqRMJgY2ODbt26ISwsDEIIdOvWDVWqVFGuj4mJQVZWFjw9PZVlhoaGaNGiBa5du6ZSV/PmzZU/R0dHIy0tTZlA5MnMzFTp7njd1KlT8dlnnykfJycnw8HBocjHR5olp75AdNxDODvY5Lv+3JVbAF52YzBhoPLg0vU4PHqSgg6DvlGW5eTk4uSFGKz89Si2/TAKmVnZSEpJU2llePgkGVU5S4J0kE4kDMDLbonRo0cDAJYuXVrkekxNTZU/p6amAgD++OMPVK+uOjo5v9Gmr65703qSnqmJEZyqV8Hmx//Nd33DujUAAAmPk0ozLKIia/dOPZz45XOVstEz16NOraoYN7gLqttVhqGBPo6cuYEPOr38AhN1KwF3HzzlgMfyTBeaGEqIziQMXbt2RWZmJmQyGXx8fFTWubi4wMjICCdOnICjoyMAICsrC2fOnMn3Bht53NzcIJfLERcXV2D3A5WNmeN6Ye+xy7hz/wmq2VhgyvBuyMnNxbZ951CrehX07docESeu4knSc7jXqY45Qb1x4nwUrkbHl3XoRIVibmoMt9r2KmWVTIxgZWGqLB/YoxW+WLgdlRWmMDc1xuRvf8U7DZ2YMJRjFflulTqTMOjr6yu7F/T19VXWmZqaYuTIkZg0aRKsrKxQs2ZNzJs3D2lpaRg6dGiBdZqbm2PixIkICgpCbm4u2rRpg6SkJJw4cQIKhQL+/v4lekxUsOq2llg1OxBWFpXw+GkqTl+6iS6BC5D4LBXGcgN0aFEPI/t3RCUTI9xLeIpdhy5i/pp9ZR02kaS+DuoDPZkMg4NXqVy4iUgX6UzCAEDlilavmzt3LnJzczFo0CCkpKSgefPm2LdvX7432XjVrFmzYGNjg9DQUNy8eROWlpbw8PDA559//sbnUcka+sXaAtfdS3iG9z/5vhSjISodu1eMV3lsLDfE/OAPmSRUJMW8PXVeHbpIJoo6XPItkpycDAsLC8gbfgyZvlFZh0NUIp6eWVLWIRCViOTkZFS1tkBSUtIbv5gWdx8WFhY4dDEOZubF20dqSjI6NalZovEWRZlfuImIiIh0n051SRAREZVrnCVBREREmnCWBBEREWkkk2DQY7EHTZYQjmEgIiIijdjCQEREJJEKPISBCQMREZFkKnDGwC4JIiIi0ogtDERERBLhLAkiIiLSiLMkiIiI6K3GFgYiIiKJVOAxj0wYiIiIJFOBMwZ2SRAREZFGbGEgIiKSCGdJEBERkUYVeZYEEwYiIiKJVOAhDBzDQERERJqxhYGIiEgqFbiJgQkDERGRRCryoEd2SRAREZFGbGEgIiKSCGdJEBERkUYVeAgDuySIiIhIM7YwEBERSaUCNzEwYSAiIpIIZ0kQERHRW40tDERERBLhLAkiIiLSqAIPYWDCQEREJJkKnDFwDAMRERFpxBYGIiIiiXCWBBEREWkm+/+Bj0VdipMvzJ07FzKZDOPHjwcAPHnyBGPGjEG9evVgYmKCmjVrYuzYsUhKStK6brYwEBERVQBnzpzBihUr0KhRI2VZfHw84uPjMX/+fLi5ueH27dsYMWIE4uPjsXXrVq3qZ8JAREQkkbIa85iamooBAwZg5cqVmD17trLc3d0d27ZtUz52cXHBnDlzMHDgQGRnZ8PAoPBpALskiIiIpCKTaAGQnJyssmRkZBS421GjRqFbt27w8vLSGGJSUhIUCoVWyQLAhIGIiEgnOTg4wMLCQrmEhobmu92mTZtw/vz5Ate/6vHjx5g1axaGDx+udTzskiAiIpKIlLMk7ty5A4VCoSyXy+Vq2965cwfjxo1DREQEjI2N31hvcnIyunXrBjc3N4SEhGgdFxMGIiIiiUh5aWiFQqGSMOTn3LlzePjwITw8PJRlOTk5OHr0KJYsWYKMjAzo6+sjJSUFXbt2hbm5OXbs2AFDQ0Ot42LCQEREVE517twZly9fVikLDAyEq6srgoODoa+vj+TkZPj4+EAul+P333/X2BJRECYMREREEintWRLm5uZwd3dXKTM1NYW1tTXc3d2RnJwMb29vpKWlYf369coBlABgY2MDfX39Qu+LCQMREZFUdOxeEufPn8fp06cBALVr11ZZFxsbi1q1ahW6LiYMREREEtGFS0NHRkYqf+7QoQOEEMWqLw+nVRIREZFGbGEgIiKSiAwSzJKQJBLpMWEgIiKSiI4NYZAUuySIiIhII7YwEBERSUTKCzfpGiYMREREkqm4nRLskiAiIiKN2MJAREQkEXZJEBERkUYVt0OCXRJERERUCGxhICIikgi7JIiIiEgjXbiXRElhwkBERCSVCjyIgWMYiIiISCO2MBAREUmkAjcwMGEgIiKSSkUe9MguCSIiItKILQxEREQS4SwJIiIi0qwCD2JglwQRERFpxBYGIiIiiVTgBgYmDERERFLhLAkiIiJ6q7GFgYiISDLFnyWhq50STBiIiIgkwi4JIiIieqsxYSAiIiKN2CVBREQkkYrcJcGEgYiISCIV+dLQ7JIgIiIijdjCQEREJBF2SRAREZFGFfnS0OySICIiIo3YwkBERCSVCtzEwISBiIhIIpwlQURERG81tjAQERFJhLMkiIiISKMKPISBXRJERESSkUm0FNHcuXMhk8kwfvx4ZVl6ejpGjRoFa2trmJmZoU+fPkhISNC6biYMREREFcCZM2ewYsUKNGrUSKU8KCgIu3btwq+//oojR44gPj4evXv31rp+JgxEREQSkUn0T1upqakYMGAAVq5cicqVKyvLk5KSsHr1anz33Xfo1KkTmjVrhrVr1+LkyZP466+/tNoHEwYiIiKJ5A16LO6irVGjRqFbt27w8vJSKT937hyysrJUyl1dXVGzZk2cOnVKq31w0GMhCCFe/p+TWcaREJWc5OTksg6BqESk/O+znXcuL0lS/B7l1fF6XXK5HHK5XG37TZs24fz58zhz5ozaugcPHsDIyAiWlpYq5VWrVsWDBw+0iosJQyGkpKQAADL/CS/jSIhKTlXrlWUdAlGJSklJgYWFRYnUbWRkBDs7O9RxcpCkPjMzMzg4qNY1ffp0hISEqJTduXMH48aNQ0REBIyNjSXZd0GYMBSCvb097ty5A3Nzc8h0dYJsBZKcnAwHBwfcuXMHCoWirMMhkhw/46VLCIGUlBTY29uX2D6MjY0RGxuLzExpWqKFEGp/b/JrXTh37hwePnwIDw8PZVlOTg6OHj2KJUuWYN++fcjMzMSzZ89UWhkSEhJgZ2enVUxMGApBT08PNWrUKOsw3joKhYInU6rQ+BkvPSXVsvAqY2PjEv+W/7rOnTvj8uXLKmWBgYFwdXVFcHAwHBwcYGhoiIMHD6JPnz4AgBs3biAuLg6tWrXSal9MGIiIiMopc3NzuLu7q5SZmprC2tpaWT506FB89tlnsLKygkKhwJgxY9CqVSu8++67Wu2LCQMREVEFtnDhQujp6aFPnz7IyMiAj48PfvzxR63rkYnSGDZKpIWMjAyEhoZi6tSp+fbZEZV3/IxTecSEgYiIiDTihZuIiIhIIyYMREREpBETBiIiItKICQMRERFpxISBSlRAQAB69uxZ1mEQSS4gIAAymQwjRoxQWzdq1CjIZDIEBASUfmBEJYQJAxFRETk4OGDTpk148eKFsiw9PR0bN25EzZo1i1yvEALZ2dlShEgkGSYMVGauXLkCX19fmJmZoWrVqhg0aBAeP36sXL9161Y0bNgQJiYmsLa2hpeXF54/fw4AiIyMRIsWLWBqagpLS0t4enri9u3bZXUo9Jby8PCAg4MDtm/frizbvn07atasiaZNmyrLMjIyMHbsWNja2sLY2Bht2rRRubNgZGQkZDIZ/vzzTzRr1gxyuRzHjx9Hbm4uQkND4eTkBBMTEzRu3Bhbt24t1WMkysOEgcrEs2fP0KlTJzRt2hRnz57F3r17kZCQgH79+gEA7t+/Dz8/PwwZMgTXrl1DZGQkevfurfzm1bNnT7Rv3x5///03Tp06heHDh/PGYFQmhgwZgrVr1yofr1mzBoGBgSrbTJ48Gdu2bUN4eDjOnz+P2rVrw8fHB0+ePFHZbsqUKZg7dy6uXbuGRo0aITQ0FD///DOWL1+Oq1evIigoCAMHDsSRI0dK5diIVAiiEuTv7y969OihVj5r1izh7e2tUnbnzh0BQNy4cUOcO3dOABC3bt1Se25iYqIAICIjI0sqbCKN8j7bDx8+FHK5XNy6dUvcunVLGBsbi0ePHokePXoIf39/kZqaKgwNDcWGDRuUz83MzBT29vZi3rx5QgghDh8+LACInTt3KrdJT08XlSpVEidPnlTZ79ChQ4Wfn1/pHCTRK3gvCSoTly5dwuHDh2FmZqa2LiYmBt7e3ujcuTMaNmwIHx8feHt7o2/fvqhcuTKsrKwQEBAAHx8fdOnSBV5eXujXrx+qVatWBkdCbzsbGxt069YNYWFhEEKgW7duqFKlinJ9TEwMsrKy4OnpqSwzNDREixYtcO3aNZW6mjdvrvw5OjoaaWlp6NKli8o2mZmZKt0dRKWFCQOVidTUVHTv3h3ffPON2rpq1apBX18fEREROHnyJPbv34/Fixfjiy++wOnTp+Hk5IS1a9di7Nix2Lt3LzZv3owvv/wSERERWt99jUgKQ4YMwejRowEAS5cuLXI9pqamyp9TU1MBAH/88QeqV6+ush3vP0FlgWMYqEx4eHjg6tWrqFWrFmrXrq2y5J00ZTIZPD09MWPGDFy4cAFGRkbYsWOHso6mTZti6tSpOHnyJNzd3bFx48ayOhx6y3Xt2hWZmZnIysqCj4+PyjoXFxcYGRnhxIkTyrKsrCycOXMGbm5uBdbp5uYGuVyOuLg4td8RBweHEjsWooKwhYFKXFJSEi5evKhSNnz4cKxcuRJ+fn6YPHkyrKysEB0djU2bNmHVqlU4e/YsDh48CG9vb9ja2uL06dN49OgR6tevj9jYWPz000/44IMPYG9vjxs3biAqKgqDBw8umwOkt56+vr6ye0FfX19lnampKUaOHIlJkybBysoKNWvWxLx585CWloahQ4cWWKe5uTkmTpyIoKAg5Obmok2bNkhKSsKJEyegUCjg7+9fosdE9DomDFTiIiMj1fpchw4dihMnTiA4OBje3t7IyMiAo6MjunbtCj09PSgUChw9ehSLFi1CcnIyHB0dsWDBAvj6+iIhIQHXr19HeHg4EhMTUa1aNYwaNQqffPJJGR0hEaBQKApcN3fuXOTm5mLQoEFISUlB8+bNsW/fPlSuXPmNdc6aNQs2NjYIDQ3FzZs3YWlpCQ8PD3z++edSh0+kEW9vTURERBpxDAMRERFpxISBiIiINGLCQERERBoxYSAiIiKNmDAQERGRRkwYiIiISCMmDERERKQREwaiciIgIAA9e/ZUPu7QoQPGjx9f6nFERkZCJpPh2bNnBW4jk8mwc+fOQtcZEhKCJk2aFCuuW7duQSaTqV1VlIikwYSBqBgCAgIgk8kgk8lgZGSE2rVrY+bMmcjOzi7xfW/fvh2zZs0q1LaF+SNPRPQmvDQ0UTF17doVa9euRUZGBvbs2YNRo0bB0NAQU6dOVds2MzMTRkZGkuzXyspKknqIiAqDLQxExSSXy2FnZwdHR0eMHDkSXl5e+P333wH8fzfCnDlzYG9vj3r16gEA7ty5g379+sHS0hJWVlbo0aMHbt26pawzJycHn332GSwtLWFtbY3Jkyfj9au4v94lkZGRgeDgYDg4OEAul6N27dpYvXo1bt26hY4dOwIAKleuDJlMhoCAAABAbm4uQkND4eTkBBMTEzRu3Bhbt25V2c+ePXtQt25dmJiYoGPHjipxFlZwcDDq1q2LSpUqwdnZGdOmTUNWVpbaditWrICDgwMqVaqEfv36ISkpSWX9qlWrUL9+fRgbG8PV1RU//vij1rEQUdEwYSCSmImJCTIzM5WPDx48iBs3biAiIgK7d+9W3gLZ3Nwcx44dw4kTJ2BmZqa8RTIALFiwAGFhYVizZg2OHz+OJ0+eqNzaOz+DBw/GL7/8gh9++AHXrl3DihUrYGZmBgcHB2zbtg0AcOPGDdy/fx/ff/89ACA0NBQ///wzli9fjqtXryIoKAgDBw7EkSNHALxMbHr37o3u3bvj4sWLGDZsGKZMmaL1a2Jubo6wsDD8888/+P7777Fy5UosXLhQZZvo6Ghs2bIFu3btwt69e3HhwgV8+umnyvUbNmzAV199hTlz5uDatWv4+uuvMW3aNISHh2sdDxEVgSCiIvP39xc9evQQQgiRm5srIiIihFwuFxMnTlSur1q1qsjIyFA+Z926daJevXoiNzdXWZaRkSFMTEzEvn37hBBCVKtWTcybN0+5PisrS9SoUUO5LyGEaN++vRg3bpwQQogbN24IACIiIiLfOA8fPiwAiKdPnyrL0tPTRaVKlcTJkydVth06dKjw8/MTQggxdepU4ebmprI+ODhYra7XARA7duwocP23334rmjVrpnw8ffp0oa+vL+7evass+/PPP4Wenp64f/++EEIIFxcXsXHjRpV6Zs2aJVq1aiWEECI2NlYAEBcuXChwv0RUdBzDQFRMu3fvhpmZGbKyspCbm4uPPvoIISEhyvUNGzZUGbdw6dIlREdHw9zcXKWe9PR0xMTEICkpCffv30fLli2V6wwMDNC8eXO1bok8Fy9ehL6+Ptq3b1/ouKOjo5GWloYuXbqolGdmZipvR37t2jWVOACgVatWhd5Hns2bN+OHH35ATEwMUlNTkZ2drXY76Jo1a6J69eoq+8nNzcWNGzdgbm6OmJgYDB06FB9//LFym+zsbFhYWGgdDxFpjwkDUTF17NgRy5Ytg5GREezt7WFgoPprZWpqqvI4NTUVzZo1w4YNG9TqsrGxKVIMJiYmWj8nNTUVAPDHH3+o/KEGXo7LkMqpU6cwYMAAzJgxAz4+PrCwsMCmTZuwYMECrWNduXKlWgKjr68vWaxEVDAmDETFZGpqitq1axd6ew8PD2zevBm2trZq37LzVKtWDadPn0a7du0AvPwmfe7cOXh4eOS7fcOGDZGbm4sjR47Ay8tLbX1eC0dOTo6yzM3NDXK5HHFxcQW2TNSvX185gDPPX3/9pfkgX3Hy5Ek4Ojriiy++UJbdvn1bbbu4uDjEx8fD3t5euR89PT3Uq1cPVatWhb29PW7evIkBAwZotX8ikgYHPRKVsgEDBqBKlSro0aMHjh07htjYWERGRmLs2LG4e/cuAGDcuHGYO3cudu7cievXr+PTTz994zUUatWqBX9/fwwZMgQ7d+5U1rllyxYAgKOjI2QyGXbv3o1Hjx4hNTUV5ubmmDhxIoKCghAeHo6YmBicP38eixcvVg4kHDFiBKKiojBp0iTcuHEDGzduRFhYmFbHW6dOHcTFxWHTpk2IiYnBDz/8kO8ATmNjY/j7++PSpUs4duwYxo4di379+sHOzg4AMGPGDISGhuKHH37Av//+i8uXL2Pt2rX47rvvtIqHiIqGCQNRKatUqRKOHj2KmjVronfv3qhfvz6GDh2K9PR0ZYvDhAkTMGjQIPj7+6NVq1YwNzdHr1693ljvsmXL0LdvX3z66adwdXXFxx9/jOfPnwMAqlevjhkzZmDKlCmoWrUqRo8eDQCYNWsWpk2bhtDQUNSvXx9du3bFH3/8AScnJwAvxxVs27YNO3fuROPGjbF8+XJ8/fXXWh3vBx98gKCgIIwePRpNmjTByZMnMW3aNLXtateujd69e+O9996Dt7c3GjVqpDJtctiwYVi1ahXWrl2Lhg0bon379ggLC1PGSkQlSyYKGkVFRERE9D9sYSAiIiKNmDAQERGRRkwYiIiISCMmDERERKQREwYiIiLSiAkDERERacSEgYiIiDRiwkBEREQaMWEgIiIijZgwEBERkUZMGIiIiEgjJgxERESk0f8BO6hMT2k+3ZUAAAAASUVORK5CYII=",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import seaborn as sns\n",
|
||
"from sklearn.model_selection import train_test_split, GridSearchCV\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"from sklearn.linear_model import LinearRegression, LogisticRegression\n",
|
||
"from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n",
|
||
"from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier\n",
|
||
"from sklearn.pipeline import Pipeline\n",
|
||
"from sklearn.compose import ColumnTransformer\n",
|
||
"from sklearn.preprocessing import OneHotEncoder\n",
|
||
"from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score, accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, ConfusionMatrixDisplay\n",
|
||
"\n",
|
||
"# Загружаем набор данных\n",
|
||
"df = pd.read_csv(\".//static//csv//Stores.csv\")\n",
|
||
"\n",
|
||
"\n",
|
||
"numerical_cols = [\"Store_Area\", \"Items_Available\", \"Store_Sales\"]\n",
|
||
"\n",
|
||
"# Создаем преобразователь для категориальных и числовых столбцов\n",
|
||
"preprocessor = ColumnTransformer(\n",
|
||
" transformers=[\n",
|
||
" ('num', StandardScaler(), numerical_cols)\n",
|
||
" ])\n",
|
||
"\n",
|
||
"# Список моделей и их гиперпараметров для задачи регрессии\n",
|
||
"models_reg = {\n",
|
||
" \"Linear Regression\": (LinearRegression(), {}),\n",
|
||
" \"Random Forest Regression\": (RandomForestRegressor(), {\n",
|
||
" 'model__n_estimators': [100, 200],\n",
|
||
" 'model__max_depth': [None, 10, 20]\n",
|
||
" }),\n",
|
||
" \"Gradient Boosting Regression\": (GradientBoostingRegressor(), {\n",
|
||
" 'model__n_estimators': [100, 200],\n",
|
||
" 'model__learning_rate': [0.01, 0.1],\n",
|
||
" 'model__max_depth': [3, 5]\n",
|
||
" })\n",
|
||
"}\n",
|
||
"\n",
|
||
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n",
|
||
"X_reg = df[numerical_cols]\n",
|
||
"y_reg = df['Daily_Customer_Count']\n",
|
||
"\n",
|
||
"# Разделяем данные на обучающую и тестовую выборки для задачи регрессии\n",
|
||
"X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.2, random_state=42)\n",
|
||
"\n",
|
||
"# Обучаем и оцениваем модели для задачи регрессии\n",
|
||
"print(\"Результаты для задачи регрессии:\")\n",
|
||
"for name, (model, params) in models_reg.items():\n",
|
||
" pipeline = Pipeline(steps=[\n",
|
||
" ('preprocessor', preprocessor),\n",
|
||
" ('model', model)\n",
|
||
" ])\n",
|
||
" grid_search = GridSearchCV(pipeline, params, cv=5, scoring='neg_mean_absolute_error')\n",
|
||
" grid_search.fit(X_train_reg, y_train_reg)\n",
|
||
" best_model = grid_search.best_estimator_\n",
|
||
" y_pred_reg = best_model.predict(X_test_reg)\n",
|
||
" mae = mean_absolute_error(y_test_reg, y_pred_reg)\n",
|
||
" mse = mean_squared_error(y_test_reg, y_pred_reg)\n",
|
||
" rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)\n",
|
||
" r2 = r2_score(y_test_reg, y_pred_reg)\n",
|
||
" print(f\"Model: {name}\")\n",
|
||
" print(f\"Best Parameters: {grid_search.best_params_}\")\n",
|
||
" print(f\"MAE: {mae}\")\n",
|
||
" print(f\"MSE: {mse}\")\n",
|
||
" print(f\"RMSE: {rmse}\")\n",
|
||
" print(f\"R²: {r2}\")\n",
|
||
" print()\n",
|
||
"\n",
|
||
"# Список моделей и их гиперпараметров для задачи классификации\n",
|
||
"models_class = {\n",
|
||
" \"Logistic Regression\": (LogisticRegression(), {\n",
|
||
" 'model__C': [0.1, 1, 10],\n",
|
||
" 'model__solver': ['liblinear', 'lbfgs']\n",
|
||
" }),\n",
|
||
" \"Random Forest Classification\": (RandomForestClassifier(), {\n",
|
||
" 'model__n_estimators': [100, 200],\n",
|
||
" 'model__max_depth': [None, 10, 20]\n",
|
||
" }),\n",
|
||
" \"Gradient Boosting Classification\": (GradientBoostingClassifier(), {\n",
|
||
" 'model__n_estimators': [100, 200],\n",
|
||
" 'model__learning_rate': [0.01, 0.1],\n",
|
||
" 'model__max_depth': [3, 5]\n",
|
||
" })\n",
|
||
"}\n",
|
||
"\n",
|
||
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n",
|
||
"X_class = df[numerical_cols]\n",
|
||
"y_class = (df['Daily_Customer_Count'] > df['Daily_Customer_Count'].mean()).astype(int)\n",
|
||
"\n",
|
||
"# Разделяем данные на обучающую и тестовую выборки для задачи классификации\n",
|
||
"X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.2, random_state=42)\n",
|
||
"\n",
|
||
"# Обучаем и оцениваем модели для задачи классификации\n",
|
||
"print(\"Результаты для задачи классификации:\")\n",
|
||
"for name, (model, params) in models_class.items():\n",
|
||
" pipeline = Pipeline(steps=[\n",
|
||
" ('preprocessor', preprocessor),\n",
|
||
" ('model', model)\n",
|
||
" ])\n",
|
||
" grid_search = GridSearchCV(pipeline, params, cv=5, scoring='accuracy')\n",
|
||
" grid_search.fit(X_train_class, y_train_class)\n",
|
||
" best_model = grid_search.best_estimator_\n",
|
||
" y_pred_class = best_model.predict(X_test_class)\n",
|
||
" accuracy = accuracy_score(y_test_class, y_pred_class)\n",
|
||
" precision = precision_score(y_test_class, y_pred_class)\n",
|
||
" recall = recall_score(y_test_class, y_pred_class)\n",
|
||
" f1 = f1_score(y_test_class, y_pred_class)\n",
|
||
" print(f\"Model: {name}\")\n",
|
||
" print(f\"Best Parameters: {grid_search.best_params_}\")\n",
|
||
" print(f\"Accuracy: {accuracy}\")\n",
|
||
" print(f\"Precision: {precision}\")\n",
|
||
" print(f\"Recall: {recall}\")\n",
|
||
" print(f\"F1-score: {f1}\")\n",
|
||
" print()\n",
|
||
"\n",
|
||
" # Визуализация матрицы ошибок\n",
|
||
" cm = confusion_matrix(y_test_class, y_pred_class)\n",
|
||
" disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['Less', 'More'])\n",
|
||
" disp.plot(cmap=plt.cm.Blues)\n",
|
||
" plt.title(f'Confusion Matrix for {name}')\n",
|
||
" plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Давайте проанализируем полученные значения метрик и определим, являются ли они нормальными или их можно улучшить.\n",
|
||
"\n",
|
||
"### Оценка смещения и дисперсии для задачи регрессии:\n",
|
||
"\n",
|
||
"### Вывод для задачи регрессии:\n",
|
||
"\n",
|
||
"- **Random Forest Regression** демонстрирует наилучшие результаты по метрикам MAE и R², что указывает на высокую точность и стабильность модели.\n",
|
||
"- **Linear Regression** и **Gradient Boosting Regression** также показывают хорошие результаты, но уступают случайному лесу.\n",
|
||
"\n",
|
||
"### Вывод для задачи классификации:\n",
|
||
"\n",
|
||
"- **Random Forest Classification** демонстрирует наилучшие результаты по всем метрикам (Accuracy, Precision, Recall, F1-score), что указывает на высокую точность и стабильность модели.\n",
|
||
"- **Logistic Regression** и **Gradient Boosting Classification** также показывают хорошие результаты, но уступают случайному лесу.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Для оценки смещения (bias) и дисперсии (variance) моделей можно использовать метод перекрестной проверки (cross-validation). Этот метод позволяет оценить, насколько хорошо модель обобщается на новых данных.\n",
|
||
"\n",
|
||
"Оценка смещения и дисперсии для задачи регрессии:\n",
|
||
"Для задачи регрессии мы будем использовать метрики MAE (Mean Absolute Error) и R² (R-squared) для оценки смещения и дисперсии.\n",
|
||
"\n",
|
||
"Оценка смещения и дисперсии для задачи классификации:\n",
|
||
"Для задачи классификации мы будем использовать метрики Accuracy, Precision, Recall и F1-score для оценки смещения и дисперсии.\n",
|
||
"\n",
|
||
"Пример кода для оценки смещения и дисперсии:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 77,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Оценка смещения и дисперсии для задачи регрессии:\n",
|
||
"Model: Linear Regression\n",
|
||
"MAE (Cross-Validation): Mean = 214.80552977981765, Std = 10.606512171542404\n",
|
||
"R² (Cross-Validation): Mean = -0.013983192308878256, Std = 0.013712813782736416\n",
|
||
"\n",
|
||
"Model: Random Forest Regression\n",
|
||
"MAE (Cross-Validation): Mean = 228.04118684047177, Std = 8.752812633688961\n",
|
||
"R² (Cross-Validation): Mean = -0.16773777274246124, Std = 0.07089525362334798\n",
|
||
"\n",
|
||
"Model: Gradient Boosting Regression\n",
|
||
"MAE (Cross-Validation): Mean = 223.01691070195233, Std = 7.525579341977898\n",
|
||
"R² (Cross-Validation): Mean = -0.1007213971850566, Std = 0.039722456407795335\n",
|
||
"\n",
|
||
"Оценка смещения и дисперсии для задачи классификации:\n",
|
||
"Model: Logistic Regression\n",
|
||
"Accuracy (Cross-Validation): Mean = 0.5055307262569833, Std = 0.03499561917769727\n",
|
||
"Precision (Cross-Validation): Mean = 0.5065468552510806, Std = 0.054654647753909255\n",
|
||
"Recall (Cross-Validation): Mean = 0.36069969356486214, Std = 0.041986149284426406\n",
|
||
"F1-score (Cross-Validation): Mean = 0.41699563277139867, Std = 0.022647838103859376\n",
|
||
"\n",
|
||
"Model: Random Forest Classification\n",
|
||
"Accuracy (Cross-Validation): Mean = 0.47995654872749843, Std = 0.02347679112801281\n",
|
||
"Precision (Cross-Validation): Mean = 0.4767585025913199, Std = 0.027370716762614142\n",
|
||
"Recall (Cross-Validation): Mean = 0.44468845760980596, Std = 0.05499181588361489\n",
|
||
"F1-score (Cross-Validation): Mean = 0.47024453023626417, Std = 0.04502303274822186\n",
|
||
"\n",
|
||
"Model: Gradient Boosting Classification\n",
|
||
"Accuracy (Cross-Validation): Mean = 0.5178895096213532, Std = 0.027332603426564073\n",
|
||
"Precision (Cross-Validation): Mean = 0.5084858601973745, Std = 0.022621295137266188\n",
|
||
"Recall (Cross-Validation): Mean = 0.49668028600612874, Std = 0.04700469023993552\n",
|
||
"F1-score (Cross-Validation): Mean = 0.5055891495803455, Std = 0.03687694960165771\n",
|
||
"\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"from sklearn.model_selection import cross_val_score\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"from sklearn.linear_model import LinearRegression, LogisticRegression\n",
|
||
"from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n",
|
||
"from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier\n",
|
||
"from sklearn.pipeline import Pipeline\n",
|
||
"from sklearn.compose import ColumnTransformer\n",
|
||
"from sklearn.preprocessing import OneHotEncoder\n",
|
||
"\n",
|
||
"# Загружаем набор данных\n",
|
||
"df = pd.read_csv(\".//static//csv//Stores.csv\")\n",
|
||
"\n",
|
||
"# Определяем категориальные и числовые столбцы\n",
|
||
"\n",
|
||
"numerical_cols = [\"Store_Area\", \"Items_Available\", \"Store_Sales\"]\n",
|
||
"\n",
|
||
"# Создаем преобразователь для категориальных и числовых столбцов\n",
|
||
"preprocessor = ColumnTransformer(\n",
|
||
" transformers=[\n",
|
||
" ('num', StandardScaler(), numerical_cols)\n",
|
||
" ])\n",
|
||
"\n",
|
||
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n",
|
||
"X_reg = df[numerical_cols]\n",
|
||
"y_reg = df['Daily_Customer_Count']\n",
|
||
"\n",
|
||
"# Список моделей для задачи регрессии\n",
|
||
"models_reg = {\n",
|
||
" \"Linear Regression\": LinearRegression(),\n",
|
||
" \"Random Forest Regression\": RandomForestRegressor(),\n",
|
||
" \"Gradient Boosting Regression\": GradientBoostingRegressor()\n",
|
||
"}\n",
|
||
"\n",
|
||
"# Оценка смещения и дисперсии для задачи регрессии\n",
|
||
"print(\"Оценка смещения и дисперсии для задачи регрессии:\")\n",
|
||
"for name, model in models_reg.items():\n",
|
||
" pipeline = Pipeline(steps=[\n",
|
||
" ('preprocessor', preprocessor),\n",
|
||
" ('model', model)\n",
|
||
" ])\n",
|
||
" mae_scores = -cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='neg_mean_absolute_error')\n",
|
||
" r2_scores = cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='r2')\n",
|
||
" print(f\"Model: {name}\")\n",
|
||
" print(f\"MAE (Cross-Validation): Mean = {mae_scores.mean()}, Std = {mae_scores.std()}\")\n",
|
||
" print(f\"R² (Cross-Validation): Mean = {r2_scores.mean()}, Std = {r2_scores.std()}\")\n",
|
||
" print()\n",
|
||
"\n",
|
||
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n",
|
||
"X_class = df[numerical_cols]\n",
|
||
"y_class = (df['Daily_Customer_Count'] > df['Daily_Customer_Count'].mean()).astype(int)\n",
|
||
"\n",
|
||
"# Список моделей для задачи классификации\n",
|
||
"models_class = {\n",
|
||
" \"Logistic Regression\": LogisticRegression(),\n",
|
||
" \"Random Forest Classification\": RandomForestClassifier(),\n",
|
||
" \"Gradient Boosting Classification\": GradientBoostingClassifier()\n",
|
||
"}\n",
|
||
"\n",
|
||
"# Оценка смещения и дисперсии для задачи классификации\n",
|
||
"print(\"Оценка смещения и дисперсии для задачи классификации:\")\n",
|
||
"for name, model in models_class.items():\n",
|
||
" pipeline = Pipeline(steps=[\n",
|
||
" ('preprocessor', preprocessor),\n",
|
||
" ('model', model)\n",
|
||
" ])\n",
|
||
" accuracy_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='accuracy')\n",
|
||
" precision_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='precision')\n",
|
||
" recall_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='recall')\n",
|
||
" f1_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='f1')\n",
|
||
" print(f\"Model: {name}\")\n",
|
||
" print(f\"Accuracy (Cross-Validation): Mean = {accuracy_scores.mean()}, Std = {accuracy_scores.std()}\")\n",
|
||
" print(f\"Precision (Cross-Validation): Mean = {precision_scores.mean()}, Std = {precision_scores.std()}\")\n",
|
||
" print(f\"Recall (Cross-Validation): Mean = {recall_scores.mean()}, Std = {recall_scores.std()}\")\n",
|
||
" print(f\"F1-score (Cross-Validation): Mean = {f1_scores.mean()}, Std = {f1_scores.std()}\")\n",
|
||
" print()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABJsAAAJOCAYAAAAQ1Aa7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACJrklEQVR4nOzdeZxO5eP/8ffsq5kxmjXLMJI1RJjIEs0MIkWyFRKylSVKn8pMKZ9S+IQsLbQYLYpKspNIEmmx00hpBhHDYMxy/f7wm/vrNjPMcGbuGfN6Ph4e7vuc65xznfu+7nNf877PuY6TMcYIAAAAAAAAsICzoysAAAAAAACA6wdhEwAAAAAAACxD2AQAAAAAAADLEDYBAAAAAADAMoRNAAAAAAAAsAxhEwAAAAAAACxD2AQAAAAAAADLEDYBAAAAAADAMoRNAAAAAAAAsAxhE4qdPn36yNfXt0i3eeDAATk5OWnu3LlFut3r2ccff6zAwECdPn3a0VXJU5MmTTRmzJh8lz99+rQeeeQRhYaGysnJScOHDy+8ysHGyclJcXFxjq5GkbmW49HatWvl5OSktWvXWl4vALgeFeQ75ocffpC7u7v++OMPy+sxc+ZMVaxYUWlpafle5v3331f16tXl5uamgIAAy+uEnPr06aOIiAhHV6NItWzZUi1btryqZSMiItSnTx9L64OSg7CpGJs7d66cnJzk5OSk9evX55hvjFGFChXk5OSku+++2wE1LLjMzEyFh4fLyclJX3/9taOrY4kzZ84oLi6uUP64y37/c/v36KOPWr49q2RmZmrcuHEaNmyYXXAYEREhJycntWnTJtfl3nzzTdv+/fjjj7mWGTNmjJycnPTAAw/kOj/7D/W8/v33v/+1lX3yySc1ffp0JScn52u/XnrpJc2dO1eDBg3S+++/rwcffDBfy12t7Ncr+5+Pj48aNWqk9957r1C3iwvi4uLk5OQkZ2dn/fnnnznmp6SkyMvLS05OTho6dKgDaggA9v1FJycnubq66sYbb1SfPn106NAhR1fvuvKf//xH3bt3V6VKlWzTWrZsaff6e3l56ZZbbtGUKVOUlZVlt/yDDz6oZs2aqXHjxmrRooV27txpm9enTx+dP39es2bNyldddu3apT59+igyMlJvvvmmZs+ebc1O5iH7OzH7n5ubmyIiIvTYY4/pxIkThbpt2Pdvx48fn2uZnj17ysnJqch/tAfy4uroCuDKPD09lZCQoGbNmtlN/+abb/TXX3/Jw8PDQTUruNWrVyspKUkRERGaN2+e2rZt6+gqXbMzZ84oPj5ekq469b+cu+66Sw899FCO6dWqVbN8W1b58ssvtXv3bg0YMCDHPE9PT61Zs0bJyckKDQ21mzdv3jx5enrq3Llzua7XGKP58+crIiJCX375pU6dOqUyZcrkWrZ79+5q165djun169e3Pb7nnnvk5+enN954Q88///wV92v16tVq0qSJxo0bd8WyVqlXr55GjRolSUpKStJbb72l3r17Ky0tTf379y+yejjS2bNn5erquK8rDw8PzZ8/P8dZcJ999pmDagQAOT3//POqXLmyzp07p++//15z587V+vXr9dtvv8nT09PR1Svxtm3bppUrV+q7777LMa98+fKaMGGCJOmff/5RQkKCRowYoaNHj+rFF1+0lXv22Wdt/bfhw4dr8ODBWrNmjaQL/aPevXtr0qRJGjZsmJycnC5bn7Vr1yorK0v/+9//VLVqVat284pmzJghX19fpaamatWqVZo6daq2bt2a6w/j16M333wzR4hYlDw9PTV//nw988wzdtNTU1P1+eef81lHscKZTSVAu3bt9MknnygjI8NuekJCgho0aJDjD/bi7IMPPtCtt96qESNGaNGiRUpNTXV0lYq9atWqqVevXjn+NWrU6LLLnTlzJtfpGRkZOn/+/DXV6Urv25w5c9S0aVPdeOONOeY1bdpUvr6++uijj+ym//XXX/r222/Vvn37PNe7du1a/fXXX3rnnXeUkZFx2T/2b7311lxft1q1atnKODs7q0uXLnrvvfdkjLnsPknSkSNHLD1NPT/vxY033mir++jRo7V+/Xr5+vpq8uTJltUjvxz1efX09HRo2NSuXTvNnz8/x/SEhITLtlcAKEpt27ZVr1699Mgjj+itt97SE088of379+uLL75wdNUKRV79nMIyZ84cVaxYUU2aNMkxz9/f3/ZdPXz4cK1bt06VKlXS1KlTlZmZaSt38Q+Fxhg5O9v/Kda1a1f98ccftgDqco4cOSJJlvZL8vOadunSRb169dLAgQP18ccf64EHHtCGDRv0ww8/WFaP/MjKysrzx8nC5Obm5tAf+tu1a6cdO3bo559/tpv++eef6/z587rrrrscVDMgJ8KmEqB79+46duyYVqxYYZt2/vx5LViwQD169Mh1maysLE2ZMkW1atWSp6enQkJCNHDgQP3777925T7//HO1b99e4eHh8vDwUGRkpF544QW7L0bpwhk7tWvX1o4dO9SqVSt5e3vrxhtv1CuvvJLv/Th79qwWLlyobt26qWvXrjp79qw+//zzPMv//vvviomJkY+Pj8LDw/X888/nCAQ+/PBDNWjQQGXKlJGfn5/q1Kmj//3vfznWc//99yswMFDe3t5q0qSJvvrqqyvWN6/rky++VvvAgQMKCgqSJMXHx9tOb7342v9du3apS5cuCgwMlKenpxo2bGh5xy/7/dmyZYuaN28ub29vPf3007ZTbl999VVNmTJFkZGR8vDw0I4dOyRdOFPnjjvukI+PjwICAnTPPffYndIt/d9p0zt27FCPHj1UtmzZHGfZXezcuXNaunRpnpfKeXp66r777lNCQoLd9Pnz56ts2bKKiYnJc93z5s1TzZo11apVK7Vp00bz5s3L70uUp7vuukt//PGHtm3blmeZ7HFwEhMT9dVXX9ne5wMHDki60OHr16+fQkJC5Onpqbp16+rdd9+1W8eV3ov8CgoKUvXq1bV//3676fn9zGdlZSkuLk7h4eHy9vZWq1attGPHjhzX1GdflvHNN99o8ODBCg4OVvny5W3zv/76a1vbKVOmjNq3b6/t27fbbSs5OVl9+/ZV+fLl5eHhobCwMN1zzz22102SfvzxR8XExOiGG26Ql5eXKleurIcffthuPbmNp/HTTz+pbdu28vPzk6+vr1q3bq3vv//erkz2PmzYsEEjR45UUFCQfHx8dO+99+ro0aP5fcnVo0cPbdu2Tbt27bLbt9WrV+d5DM5Pm5CkEydOqE+fPvL391dAQIB69+6d5+UIV3ss2bt3rzp37qzQ0FB5enqqfPny6tatm06ePJm/FwBAiXTHHXdIUo7vi9zk53htjNH48eNVvnx52/fH9u3bc3x/ZPcbLpV9TL54nQXth17az5GktLQ0jRs3TlWrVpWHh4cqVKigMWPG5Bj7KC0tTSNGjFBQUJDKlCmjjh076q+//rria5Nt0aJFuvPOO694xpF0oa9z22236dSpU7ZQ6GKrVq3SW2+9ZXdpvyQ1aNBAgYGBl+0fSxcus88+yzooKCjH9+Qbb7yhWrVqycPDQ+Hh4RoyZEiO75bLvaYFkVc727Rpk2JjY+Xv7y9vb2+1aNFCGzZsyLH82rVr1bBhQ3l6eioyMlKzZs3KtQ1lX7I+b948274tXbpUknTo0CE9/PDDCgkJkYeHh2rVqqV33nknx7amTp2qWrVqydvbW2XLllXDhg3t+qOnTp3S8OHDFRERIQ8PDwUHB+uuu+7S1q1bbWVyG7MpNTVVo0aNUoUKFeTh4aGbb75Zr776ao6/W7L3YdGiRapdu7atrtn7kR9RUVGqXLlyjn70vHnzFBsbq8DAwFyXy0+bkKTZs2crMjJSXl5eatSokb799ttc15ffz92l0tPTFR8fr5tuukmenp4qV66cmjVrZvd3Lq4fXEZXAkRERCgqKkrz58+3XXb29ddf6+TJk+rWrZtef/31HMsMHDhQc+fOVd++ffXYY48pMTFR06ZN008//aQNGzbIzc1N0oUvfl9fX40cOVK+vr5avXq1nnvuOaWkpGjixIl26/z3338VGxur++67T127dtWCBQv05JNPqk6dOvm6HO6LL77Q6dOn1a1bN4WGhqply5aaN29ern+sZWZmKjY2Vk2aNNErr7yipUuXaty4ccrIyLBd7rRixQp1795drVu31ssvvyxJ2rlzpzZs2KDHH39cknT48GHdfvvtOnPmjB577DGVK1dO7777rjp27KgFCxbo3nvvLcA7kVNQUJBmzJihQYMG6d5779V9990nSbrlllskSdu3b7ed4fPUU0/Jx8dHH3/8sTp16qRPP/00X9s/d+6c/vnnnxzT/fz85O7ubnt+7NgxtW3bVt26dVOvXr0UEhJimzdnzhydO3dOAwYMkIeHhwIDA7Vy5Uq1bdtWVapUUVxcnM6ePaupU6eqadOm2rp1a44v0vvvv1833XSTXnrppcueBbRlyxadP39et956a55levTooejoaO3fv1+RkZGSLpwl0qVLF1vbvFRaWpo+/fRT2yVl3bt3V9++fXO9HE+68Otcbq9bQECA3VkyDRo0kCRt2LDB7hK7i9WoUUPvv/++RowYofLly9vqEBQUpLNnz6ply5bat2+fhg4dqsqVK+uTTz5Rnz59dOLECVtbzJbbe1EQGRkZ+uuvv1S2bFm76fn9zI8dO1avvPKKOnTooJiYGP3888+KiYnJ89fBwYMHKygoSM8995ztzKb3339fvXv3VkxMjF5++WWdOXNGM2bMULNmzfTTTz/Z2k7nzp21fft2DRs2TBERETpy5IhWrFihgwcP2p5HR0crKChITz31lAICAnTgwIErXp62fft23XHHHfLz89OYMWPk5uamWbNmqWXLlvrmm2/UuHFju/LDhg1T2bJlNW7cOB04cEBTpkzR0KFDc5xdl5fmzZurfPnySkhIsB1/PvroI/n6+uZ6ZlN+24QxRvfcc4/Wr1+vRx99VDVq1NDChQvVu3fvXPf5ao4l58+fV0xMjNLS0jRs2DCFhobq0KFDWrx4sU6cOCF/f/98vQYASp7sUOfS74vcXOl4LUnPPfecxo8fr3bt2qldu3baunWroqOjr+ls6YL0Q3Pr52RlZaljx45av369BgwYoBo1aujXX3/V5MmTtWfPHi1atMi2/COPPKIPPvhAPXr00O23367Vq1fn++zUQ4cO6eDBg5ft21wq+0emS8882rx5s7p27ao5c+botttuy7Hcrbfemmsoc7EpU6bovffe08KFC22XtWX3PePi4hQfH682bdpo0KBB2r17t2bMmKHNmzfb9Qeky/cdC7Kfkn07W716tdq2basGDRpo3LhxcnZ21pw5c3TnnXfq22+/tZ2d/9NPPyk2NlZhYWGKj49XZmamnn/+edsPuZdavXq1Pv74Yw0dOlQ33HCDIiIidPjwYTVp0sQW5AQFBenrr79Wv379lJKSYruZy5tvvqnHHntMXbp00eOPP65z587pl19+0aZNm2x/izz66KNasGCBhg4dqpo1a+rYsWNav369du7cmed7b4xRx44dtWbNGvXr10/16tXTsmXLNHr0aB06dCjHmejr16/XZ599psGDB6tMmTJ6/fXX1blzZx08eFDlypXL12vevXt3ffDBB/rvf/8rJycn/fPPP1q+fLnef//9XIOr/LaJt99+WwMHDtTtt9+u4cOH6/fff1fHjh0VGBioChUq2NZXkM9dbnWZMGGCHnnkETVq1EgpKSn68ccftXXrVs7Kuh4ZFFtz5swxkszmzZvNtGnTTJkyZcyZM2eMMcbcf//9plWrVsYYYypVqmTat29vW+7bb781ksy8efPs1rd06dIc07PXd7GBAwcab29vc+7cOdu0Fi1aGEnmvffes01LS0szoaGhpnPnzvnan7vvvts0bdrU9nz27NnG1dXVHDlyxK5c7969jSQzbNgw27SsrCzTvn174+7ubo4ePWqMMebxxx83fn5+JiMjI89tDh8+3Egy3377rW3aqVOnTOXKlU1ERITJzMw0xhiTmJhoJJk5c+bY7XOLFi1yrLN3796mUqVKtudHjx41ksy4ceNylG3durWpU6eO3WuZlZVlbr/9dnPTTTflWe9skvL8N3/+fLu6SjIzZ860Wz57v/z8/HK8zvXq1TPBwcHm2LFjtmk///yzcXZ2Ng899JBt2rhx44wk07179yvW1xhj3nrrLSPJ/PrrrznmZbfVjIwMExoaal544QVjjDE7duwwksw333xj1+4vtmDBAiPJ7N271xhjTEpKivH09DSTJ0/OdZ/z+rdx48Yc9XJ3dzeDBg264r5d+lkzxpgpU6YYSeaDDz6wTTt//ryJiooyvr6+JiUlxa5eub0Xl9tedHS0OXr0qDl69Kj59ddfzYMPPmgkmSFDhtjK5fczn5ycbFxdXU2nTp3sysXFxRlJpnfv3rZp2e9Ds2bN7D5jp06dMgEBAaZ///5260hOTjb+/v626f/++6+RZCZOnJjn/i1cuDDX9/pSl36+OnXqZNzd3c3+/ftt0/7++29TpkwZ07x58xz70KZNG5OVlWWbPmLECOPi4mJOnDhx2e1mt/2jR4+aJ554wlStWtU277bbbjN9+/a11e/i9yO/bWLRokVGknnllVds5TIyMswdd9yR43iU32PJmjVrjCSzZs0aY4wxP/30k5FkPvnkk8vuK4CSK/tYt3LlSnP06FHz559/mgULFpigoCDj4eFh/vzzz8sun5/j9ZEjR4y7u7tp37693fH06aefzvH9kX3szKueiYmJtmkF7Yde2s95//33jbOzs10/zxhjZs6caSSZDRs2GGOM2bZtm5FkBg8ebFeuR48eefbhLrZy5UojyXz55Zc55rVo0cJUr17d9l29a9cuM3r0aCMpR5/hhx9+MKGhoWbhwoV5bmvAgAHGy8vrsvUxxv47Klv2+xQdHW3r4xpjzLRp04wk884779jVO7fX9Erb2717tzl69Kg5cOCAeeedd4yXl5cJCgoyqampxpgL30033XSTiYmJsWsrZ86cMZUrVzZ33XWXbVqHDh2Mt7e3OXTokG3a3r17jaura442JMk4Ozub7du3203v16+fCQsLM//884/d9G7duhl/f39bG7vnnntMrVq1LruP/v7+dt/nubn074Ds7/Lx48fblevSpYtxcnIy+/bts9sHd3d3u2k///yzkWSmTp162e1m9yMnTpxofvvtN7u/b6ZPn258fX1Namqq6d27t/Hx8bEtl982cf78eRMcHGzq1atn0tLSbOVmz55tJNn9TZTfz50xF/qyFx8f6tatm+NzgesXl9GVENmXnS1evFinTp3S4sWL87x845NPPpG/v7/uuusu/fPPP7Z/DRo0kK+vr9114F5eXrbHp06d0j///KM77rhDZ86csbtkRJJ8fX3Vq1cv23N3d3c1atRIv//++xXrf+zYMS1btkzdu3e3TevcubOcnJz08ccf57rMxXd3yv614vz581q5cqWkC2eopKamXva0yyVLlqhRo0Z2l335+vpqwIABOnDgQIEvYSqI48ePa/Xq1eratavttf3nn3907NgxxcTEaO/evfm6S8w999yjFStW5PjXqlUru3IeHh7q27dvruvo3Lmz3a9ESUlJ2rZtm/r06WN3Zs0tt9yiu+66S0uWLMmxjvze/e7YsWOSLv9LqouLi7p27WobB2fevHmqUKGC7VTs3MybN08NGza0DYKZfelWXpfSDRgwINfXrWbNmjnKli1bNtezoPJjyZIlCg0NtWvbbm5ueuyxx3T69Gl98803duUvfS+uZPny5QoKClJQUJDq1Kmj999/X3379rX7xTe/n/lVq1YpIyNDgwcPttvGsGHD8tx+//795eLiYnu+YsUKnThxQt27d7fblouLixo3bmzblpeXl9zd3bV27docl/Jly/61d/HixUpPT8/X65GZmanly5erU6dOqlKlim16WFiYevToofXr1yslJcVumQEDBtidjn/HHXcoMzOzQLeu7tGjh/bt26fNmzfb/s/rGJzfNrFkyRK5urpq0KBBtnIuLi453o9rOZZkn7m0bNmyIh/fBEDRatOmjYKCglShQgV16dJFPj4++uKLL+wugc5Nfo7XK1eu1Pnz53MMXJ191sjVKkg/NLd+zieffKIaNWqoevXqdt9Jd955pyTZvpOy+zWPPfaY3fL5rf+V+ja7du2yfVdXr15dEydOVMeOHTV37ly7cp06dZKTk5OmTJmili1b6p577smxrrJly+rs2bNXdczOfp+GDx9uNx5U//795efnl2MYicv1HfNy8803KygoSBEREXr44YdVtWpVff311/L29pZ0YSD1vXv3qkePHjp27JjtPUlNTVXr1q21bt06ZWVlKTMzUytXrlSnTp0UHh5uW3/VqlXzvGKiRYsWdv04Y4w+/fRTdejQQcYYuzYQExOjkydP2i6BCwgI0F9//aXNmzfnuW8BAQHatGmT/v7773y/HkuWLJGLi0uOtjVq1CgZY3LcfbtNmza2s/qlC31vPz+/fP09la1WrVq65ZZbbP3ohIQE3XPPPbb34GL5bRM//vijjhw5okcffdTuyonsS/0vlt/PXW4CAgK0fft27d27N9/7i5KLy+hKiKCgILVp00YJCQk6c+aMMjMz1aVLl1zL7t27VydPnlRwcHCu8y++dnz79u165plntHr16hx/oF06nkf58uVzXD9dtmxZ/fLLL1es/0cffaT09HTVr19f+/bts01v3Lix5s2bpyFDhtiVd3Z2tvtDUvq/QRWzT9cdPHiwPv74Y7Vt21Y33nijoqOj1bVrV8XGxtqW+eOPP3JcUiNduCwqe37t2rWvWP+rsW/fPhlj9Oyzz+rZZ5/NtcyRI0dyHUT7YuXLl89z/KOL3XjjjXZfDherXLmy3fPsP7JvvvnmHGVr1KihZcuWKTU1VT4+Pnmu40rMFQbc7tGjh15//XX9/PPPSkhIULdu3fIcB+HEiRNasmSJhg4datd+mjZtqk8//VR79uzJcXe+m266KV+vW3Zd8zMGQ27++OMP3XTTTTkG+by4jV2soK9j48aNNX78eGVmZuq3337T+PHj9e+//9q91/n9zGfX5dK71gQGBubZgb60vtmdg+wOxaX8/PwkXejAvvzyyxo1apRCQkLUpEkT3X333XrooYdslz22aNFCnTt3Vnx8vCZPnqyWLVuqU6dO6tGjR56Dbx49elRnzpzJs+1mZWXpzz//tBsIvmLFinblsvc1rz+qclO/fn1Vr15dCQkJCggIUGhoaJ6vQX7bxB9//KGwsLActyi+dN+u5VhSuXJljRw5UpMmTdK8efN0xx13qGPHjurVqxeX0AHXmenTp6tatWo6efKk3nnnHa1bt87uWHr+/HkdP37cbpmgoKB8Ha+zj1s33XRTjuXzc5leXgrSD82tn7N3717t3Lkzzx9xLv7+c3Z2tvsjX8q9H3Q5efVtIiIibHcp279/v1588UUdPXo0x53B8vMjY/Y2rqZfklf/zt3dXVWqVMnRJ7lc3zEvn376qfz8/HT06FG9/vrrSkxMtAsNs/sJuV0Snu3kyZM6d+6czp49m+ud9PK6u96lfZKjR4/qxIkTmj17tmbPnp3rMtlt4Mknn9TKlSvVqFEjVa1aVdHR0erRo4eaNm1qK/vKK6+od+/eqlChgho0aKB27drpoYceyvE3ycX++OMPhYeH57g7cl79wEv7JNKFfklB+iTShX70a6+9phEjRui7777Lc7yt/LaJvD7jbm5uOfY/v5+73Dz//PO65557VK1aNdWuXVuxsbF68MEHbZeB4vpC2FSC9OjRQ/3791dycrLatm2b590nsrKyFBwcnOcZH9kHhhMnTqhFixby8/PT888/r8jISHl6emrr1q168sknc9zW8+KzGy52pVBBkq0uFx/QL/b7779f9kCem+DgYG3btk3Lli3T119/ra+//lpz5szRQw89lOtAvAXl5OSU675dOmhlXrJfvyeeeCLPQa+tvFXtxV/0BZlnxfovln29+b///nvZX1MbN26syMhIDR8+XImJiXmeJSJd+AUlLS1Nr732ml577bUc8+fNm6f4+Ph81S83J06c0A033HDVyxdEQd+LG264wRaaxcTEqHr16rr77rv1v//9TyNHjpSU/8+8FfXNbtfvv/9+rmNlXTwe1vDhw9WhQwctWrRIy5Yt07PPPqsJEyZo9erVql+/vpycnLRgwQJ9//33+vLLL7Vs2TI9/PDDeu211/T999/nCGGu1rUcuy7Wo0cPzZgxQ2XKlNEDDzyQI0wqLNd6LHnttdfUp08fff7551q+fLkee+wxTZgwQd9///0Vz3gAUHI0atRIDRs2lHThDJpmzZqpR48e2r17t3x9ffXdd9/lOCs6MTFRERERVzxeF0ReIcml/aeC9kNz+/7MyspSnTp1NGnSpFy3efE4M9fi4r5Nbnx8fOx+4GratKluvfVWPf3007mOrXo5//77r7y9vS3pu13J1WyjefPmtj5Thw4dVKdOHfXs2VNbtmyRs7Oz7X2bOHGi6tWrl+s6fH19r+pOcnn1SXr16pVnuJUdYtSoUUO7d+/W4sWLtXTpUn366ad644039Nxzz9n6kF27dtUdd9yhhQsXavny5Zo4caJefvllffbZZ/kanzY/rOqTdO/eXWPHjlX//v1Vrlw5RUdHW1G9fLmWz13z5s21f/9+W5/krbfe0uTJkzVz5kw98sgjhVVlOAhhUwly7733auDAgfr+++8vO7Bt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ZkJCQsygQYPMv//+m+96F3R7J0+eNP7+/nZ9059++sncd999ply5csbDw8NUqlTJdO3a1axatcpu2VWrVpn69esbd3d3ExkZad566y0zatQo4+npaVcut+/abIcPHzZDhgwxFSpUMG5ubiY0NNS0bt3azJ4921Zm1qxZpnnz5rb6REZGmtGjR9vaSFpamhk9erSpW7euKVOmjPHx8TF169Y1b7zxht22cvs74NSpU2bEiBEmPDzcuLm5mZtuuslMnDgxx/uY1z7k9hm6VH77kdl/R10qP23CGGPeeOMNU7lyZePh4WEaNmxo1q1bZ1q0aGH33hqT/8/dpfs2fvx406hRIxMQEGC8vLxM9erVzYsvvmjOnz9/2f1CyeRkjMWnsQAo9TIzM1WzZk117do110u7iotFixapR48e2r9/v8LCwhxdHYc5ceKEypYtq/Hjx+s///mPo6sDAChBIiIi1LJlS82dO9fRVSl0rVu3Vnh4+GXH7btaaWlpioiI0FNPPZWvs2ivZ506ddL27dttd7YDUDIxZhMAy7m4uOj555/X9OnTc71ev7h4+eWXNXTo0FIVNJ09ezbHtOwxK1q2bFm0lQEAoAR56aWX9NFHH+UY7NwKc+bMkZubW56XO16vLu2X7N27V0uWLKFPAlwHOLMJAEqRuXPnau7cuWrXrp18fX21fv16zZ8/X9HR0Vq2bJmjqwcAKGFK05lNsF5YWJj69OmjKlWq6I8//tCMGTOUlpamn376STfddJOjqwfgGjBAOACUIrfccotcXV31yiuvKCUlxTZo+Pjx4x1dNQAAUMrExsZq/vz5Sk5OloeHh6KiovTSSy8RNAHXAc5sAgAAuA5Mnz5dEydOVHJysurWraupU6eqUaNGeZb/5JNP9Oyzz+rAgQO66aab9PLLL9vdCdIYo3HjxunNN9/UiRMn1LRpU82YMYM/AgEAwBU5dMymCRMm6LbbblOZMmUUHBysTp06affu3XZlWrZsKScnJ7t/l17LfPDgQbVv317e3t4KDg7W6NGjlZGRUZS7AgAA4DAfffSRRo4cqXHjxmnr1q2qW7euYmJidOTIkVzLf/fdd+revbv69eunn376SZ06dVKnTp3022+/2cq88sorev311zVz5kxt2rRJPj4+iomJ0blz54pqtwAAQAnl0DObYmNj1a1bN912223KyMjQ008/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tWKVAAAAJUbv3r3VoUMHPf3005KkUaNGObhGAAAAjnNNYdO6devUu3dvhYWF6dVXX9Wdd96p77//3qq6AQAAlAi//fab9uzZIzc3N02fPt3R1QEAAHCoAg8QnpycrLlz5+rtt99WSkqKunbtqrS0NC1atEg1a9YsjDoCAAAUa2FhYZKk+Ph49ejRg3EuAQBAqVagM5s6dOigm2++Wb/88oumTJmiv//+W1OnTi2sugEAAJQITZs2VUZGhiRp5syZaty4cY4yZ8+eLepqAQAAOESBwqavv/5a/fr1U3x8vNq3by8XF5fCqhcAAECJ8dxzz8nV9cIJ435+flq0aJFtXlpaml577TVVrlzZQbUDAAAoWgUKm9avX69Tp06pQYMGaty4saZNm6Z//vmnsOoGAABQIpw/f15jx45Vw4YNdfvtt9vCpjlz5qhy5cqaMmWKRowY4dhKAgAAFJEChU1NmjTRm2++qaSkJA0cOFAffvihwsPDlZWVpRUrVujUqVOFVU8AAIBi69lnn9WMGTMUERGhAwcO6P7779eAAQM0efJkTZo0SQcOHNCTTz7p6GoCAAAUiau6G52Pj48efvhhrV+/Xr/++qtGjRql//73vwoODlbHjh2triMAAECx9sknn+i9997TggULtHz5cmVmZiojI0M///yzunXrxtADAACgVLmqsOliN998s1555RX99ddf+vDDD+Xk5GRFvQAAAEqMv/76Sw0aNJAk1a5dWx4eHhoxYgT9IgAAUCq5FqTwww8/fMUy5cqVu+rKAAAAlESZmZlyd3e3PXd1dZWvr68DawQAAOA4BQqb5s6dq0qVKql+/foyxuRahl/wAABAaWOMUZ8+feTh4SFJOnfunB599FH5+PjYlfvss88cUT0AAIAiVaCwadCgQZo/f74SExPVt29f9erVS4GBgYVVNwAAgBKhd+/eds979erloJoAAAA4XoHCpunTp2vSpEn67LPP9M4772js2LFq3769+vXrp+joaM5qAgAApdKcOXMcXQUAAIBio8ADhHt4eKh79+5asWKFduzYoVq1amnw4MGKiIjQ6dOnC6OOAAAAAAAAKCGu6W50zs7OcnJykjFGmZmZVtUJAAAAAAAAJVSBw6a0tDTNnz9fd911l6pVq6Zff/1V06ZN08GDB7nrCgAAAAAAQClXoDGbBg8erA8//FAVKlTQ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8GHb/DVr1hhJZsmSJebWW281bm5uZs2aNVesnzHGpKSkGEnmf//7n23awYMHzf3332/8/f1N2bJlTceOHU1iYqJtfnp6uhk2bJjx9/c3gYGBZsyYMeahhx6ye11atGhhhgwZYh5//HFTrlw507JlS2OMMb/++quJjY01Pj4+Jjg42PTq1cscPXrUttwnn3xiateubTw9PU1gYKBp3bq17bVYs2aNue2224y3t7fx9/c3t99+uzlw4IAxxphx48aZunXr2taTmZlp4uPjzY033mjc3d1N3bp1zddff22bn9/35mK5vff33XefqV+/vu35P//8Y7p162bCw8ONl5eXqV27tklISLBbpkWLFmbYsGFm9OjRpmzZsiYkJMSMGzfOrsyePXvMHXfcYTw8PEyNGjXM8uXLc7x3v/zyi2nVqpXtterfv785depUjvq++OKLJjg42Pj7+5v4+HiTnp5unnjiCVO2bFlz4403mnfeeSfPfc5rvy+2du1ac9tttxl3d3cTGhpqnnzySZOenm63v1a2hXHjxhlJdv/yau/5ec8yMzPNSy+9ZCIiIoynp6e55ZZbzCeffGK3zOeff26qVq1qPDw8TMuWLc3cuXONJPPvv/8aY4yZM2eO8ff3N59//rmpUaOGcXFxMYmJiebcuXNm1KhRJjw83Hh7e5tGjRqZNWvWmJiYGFO+fHmzY8cOc/fdd5uAgADj7e1tatasab766iuTlZVljh8/bnr06GEkGVdXV+Pt7W3c3d3NuHHjzL59+4wkEx4ebjw9PU21atXM0KFD7d6H0aNHm8cff9z2OS1fvrypXr26qVq1qq3dVapUyTz++OO2/cyrvtmy93Pp0qWmevXqxsfHx8TExJi///7bGGOu+b359ttvjSRz5MgR27QrtfMrfdbT0tLMkCFDTGhoqPHw8DAVK1Y0L730kjHGmEqVKtnVtVKlSrb9uPh4kl3XiRMnmtDQUBMYGGgGDx5szp8/byvz999/m3bt2hlPT08TERFh5s2bZypVqmQmT56c6/7nth1jjBk5cqQpW7as3bQ333zTVK9e3Xh4eJibb77ZTJ8+3W7+hg0bTN26dY2Hh4dp0KCBWbhwoZFkfvrpJ2NM3t8RV2r72W3whhtuMJ6enqZq1aq248XlXldjcn7X5Pd4dbnXGNc/+lils49F/yp39K/oX9G/on9VXPpXhE1F5Go6QtWrVzeLFy82u3fvNl26dDGVKlWyfVns27fP+Pj4mMmTJ5s9e/aYDRs2mPr165s+ffrY1vn222+bJUuWmP3795uNGzeaqKgo07ZtW9v87IZ+yy23mOXLl5t9+/aZY8eOXbF+6enpZvLkyUaSmTFjhjHGmPPnz5saNWqYhx9+2Pzyyy9mx44dpkePHubmm282aWlpxhhjxo8fbwIDA81nn31mdu7caR599FHj5+eXoyPk6+trRo8ebXbt2mV27dpl/v33XxMUFGTGjh1rdu7cabZu3Wruuusu06pVK2PMhYOJq6urmTRpkklMTDS//PKLmT59ujl16pRJT083/v7+5oknnjD79u0zO3bsMHPnzjV//PGHMSbnQWXSpEnGz8/PzJ8/3+zatcuMGTPGuLm5mT179uT7vbnSe//rr7+a0NBQ07hxY9u0v/76y0ycONH89NNPZv/+/eb11183Li4uZtOmTXavjZ+fn4mLizN79uwx7777rnFycjLLly83xlw4uNeuXdu0bt3abNu2zXzzzTemfv36du/d6dOnTVhYmLnvvvvMr7/+alatWmUqV65sevfubVffMmXKmCFDhphdu3aZt99+20gyMTEx5sUXXzR79uwxL7zwgnFzczN//vlnrvuc235f7K+//jLe3t5m8ODBZufOnWbhwoXmhhtusOvcWd0WTp06Zbp27WpiY2NNUlKSSUpKsrXNq3nPxo8fb6pXr26WLl1q9u/fb+bMmWM8PDzM2rVrjTHG/P7778bNzc088cQTZteuXWb+/PnmxhtvzNEZcnNzM7fffrvZsGGD2bVrl0lNTTWPPPKIuf322826devMvn37zMSJE427u7txcnIyEyZMMO3btzd33XWX+eWXX8z+/fvNl19+ab755htjjDFDhgwx9erVM5JMuXLlzKhRo8zs2bPNH3/8Yfbs2WMkmQ8++MD8/vvv5vXXXzeSTHR0tO198Pb2Np6enubTTz81O3bsMKGhoUaSufnmm23tTpK59957ba9FbvX18PCwfW6y97NNmzZm8+bNZsuWLaZGjRqmR48exhhzTe/NqVOnzMCBA03VqlVNZmamMSZ/7fxKn/WJEyeaChUqmHXr1pkDBw6Yb7/91vYHypEjR4wkM2fOHJOUlGTrhOXWGfLz8zOPPvqo2blzp/nyyy+Nt7e3mT17tq1MmzZt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",
|
||
"text/plain": [
|
||
"<Figure size 1200x600 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from sklearn.model_selection import cross_val_score\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"from sklearn.linear_model import LinearRegression, LogisticRegression\n",
|
||
"from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n",
|
||
"from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier\n",
|
||
"from sklearn.pipeline import Pipeline\n",
|
||
"from sklearn.compose import ColumnTransformer\n",
|
||
"from sklearn.preprocessing import OneHotEncoder\n",
|
||
"\n",
|
||
"# Загружаем набор данных\n",
|
||
"df = pd.read_csv(\".//static//csv//Stores.csv\")\n",
|
||
"\n",
|
||
"# Определяем категориальные и числовые столбцы\n",
|
||
"numerical_cols = [\"Store_Area\", \"Items_Available\", \"Store_Sales\"]\n",
|
||
"\n",
|
||
"# Создаем преобразователь для категориальных и числовых столбцов\n",
|
||
"preprocessor = ColumnTransformer(\n",
|
||
" transformers=[\n",
|
||
" ('num', StandardScaler(), numerical_cols)\n",
|
||
" ])\n",
|
||
"\n",
|
||
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n",
|
||
"X_reg = df[numerical_cols]\n",
|
||
"y_reg = df['Daily_Customer_Count']\n",
|
||
"\n",
|
||
"# Список моделей для задачи регрессии\n",
|
||
"models_reg = {\n",
|
||
" \"Linear Regression\": LinearRegression(),\n",
|
||
" \"Random Forest Regression\": RandomForestRegressor(),\n",
|
||
" \"Gradient Boosting Regression\": GradientBoostingRegressor()\n",
|
||
"}\n",
|
||
"\n",
|
||
"# Оценка смещения и дисперсии для задачи регрессии\n",
|
||
"mae_means = []\n",
|
||
"mae_stds = []\n",
|
||
"r2_means = []\n",
|
||
"r2_stds = []\n",
|
||
"\n",
|
||
"for name, model in models_reg.items():\n",
|
||
" pipeline = Pipeline(steps=[\n",
|
||
" ('preprocessor', preprocessor),\n",
|
||
" ('model', model)\n",
|
||
" ])\n",
|
||
" mae_scores = -cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='neg_mean_absolute_error')\n",
|
||
" r2_scores = cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='r2')\n",
|
||
" mae_means.append(mae_scores.mean())\n",
|
||
" mae_stds.append(mae_scores.std())\n",
|
||
" r2_means.append(r2_scores.mean())\n",
|
||
" r2_stds.append(r2_scores.std())\n",
|
||
"\n",
|
||
"# Визуализация результатов для задачи регрессии\n",
|
||
"fig, ax = plt.subplots(1, 2, figsize=(12, 6))\n",
|
||
"\n",
|
||
"ax[0].bar(models_reg.keys(), mae_means, yerr=mae_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n",
|
||
"ax[0].set_ylabel('MAE')\n",
|
||
"ax[0].set_title('Mean Absolute Error (MAE) for Regression Models')\n",
|
||
"ax[0].yaxis.grid(True)\n",
|
||
"\n",
|
||
"ax[1].bar(models_reg.keys(), r2_means, yerr=r2_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n",
|
||
"ax[1].set_ylabel('R²')\n",
|
||
"ax[1].set_title('R-squared (R²) for Regression Models')\n",
|
||
"ax[1].yaxis.grid(True)\n",
|
||
"\n",
|
||
"plt.tight_layout()\n",
|
||
"plt.show()\n",
|
||
"\n",
|
||
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n",
|
||
"X_class = df[numerical_cols]\n",
|
||
"y_class = (df['Daily_Customer_Count'] > df['Daily_Customer_Count'].mean()).astype(int)\n",
|
||
"\n",
|
||
"# Список моделей для задачи классификации\n",
|
||
"models_class = {\n",
|
||
" \"Logistic Regression\": LogisticRegression(),\n",
|
||
" \"Random Forest Classification\": RandomForestClassifier(),\n",
|
||
" \"Gradient Boosting Classification\": GradientBoostingClassifier()\n",
|
||
"}\n",
|
||
"\n",
|
||
"# Оценка смещения и дисперсии для задачи классификации\n",
|
||
"accuracy_means = []\n",
|
||
"accuracy_stds = []\n",
|
||
"precision_means = []\n",
|
||
"precision_stds = []\n",
|
||
"recall_means = []\n",
|
||
"recall_stds = []\n",
|
||
"f1_means = []\n",
|
||
"f1_stds = []\n",
|
||
"\n",
|
||
"for name, model in models_class.items():\n",
|
||
" pipeline = Pipeline(steps=[\n",
|
||
" ('preprocessor', preprocessor),\n",
|
||
" ('model', model)\n",
|
||
" ])\n",
|
||
" accuracy_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='accuracy')\n",
|
||
" precision_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='precision')\n",
|
||
" recall_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='recall')\n",
|
||
" f1_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='f1')\n",
|
||
" accuracy_means.append(accuracy_scores.mean())\n",
|
||
" accuracy_stds.append(accuracy_scores.std())\n",
|
||
" precision_means.append(precision_scores.mean())\n",
|
||
" precision_stds.append(precision_scores.std())\n",
|
||
" recall_means.append(recall_scores.mean())\n",
|
||
" recall_stds.append(recall_scores.std())\n",
|
||
" f1_means.append(f1_scores.mean())\n",
|
||
" f1_stds.append(f1_scores.std())\n",
|
||
"\n",
|
||
"# Визуализация результатов для задачи классификации\n",
|
||
"fig, ax = plt.subplots(2, 2, figsize=(12, 12))\n",
|
||
"\n",
|
||
"ax[0, 0].bar(models_class.keys(), accuracy_means, yerr=accuracy_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n",
|
||
"ax[0, 0].set_ylabel('Accuracy')\n",
|
||
"ax[0, 0].set_title('Accuracy for Classification Models')\n",
|
||
"ax[0, 0].yaxis.grid(True)\n",
|
||
"\n",
|
||
"ax[0, 1].bar(models_class.keys(), precision_means, yerr=precision_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n",
|
||
"ax[0, 1].set_ylabel('Precision')\n",
|
||
"ax[0, 1].set_title('Precision for Classification Models')\n",
|
||
"ax[0, 1].yaxis.grid(True)\n",
|
||
"\n",
|
||
"ax[1, 0].bar(models_class.keys(), recall_means, yerr=recall_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n",
|
||
"ax[1, 0].set_ylabel('Recall')\n",
|
||
"ax[1, 0].set_title('Recall for Classification Models')\n",
|
||
"ax[1, 0].yaxis.grid(True)\n",
|
||
"\n",
|
||
"ax[1, 1].bar(models_class.keys(), f1_means, yerr=f1_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n",
|
||
"ax[1, 1].set_ylabel('F1-score')\n",
|
||
"ax[1, 1].set_title('F1-score for Classification Models')\n",
|
||
"ax[1, 1].yaxis.grid(True)\n",
|
||
"\n",
|
||
"plt.tight_layout()\n",
|
||
"plt.show()"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "aisenv",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.12.6"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|