{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Выбор бизнес-целей\n", "### Задача регрессии:\n", "\n", "Цель: Предсказать цену автомобиля (Price) на основе других характеристик.\n", "\n", "Применение: Это может быть полезно для автосалонов, онлайн-площадок по продаже автомобилей, а также для частных лиц, которые хотят оценить рыночную стоимость своего автомобиля.\n", "\n", "Задача классификации:\n", "\n", "Цель: Классифицировать автомобили по категориям (например, \"Эконом\", \"Средний\", \"Премиум\") на основе цены и других характеристик.\n", "\n", "Применение: Это может быть полезно для маркетинговых кампаний, определения целевой аудитории, а также для анализа рынка автомобилей." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " ID Price Levy Manufacturer Model Prod. year Category \\\n", "0 45654403 13328 1399 LEXUS RX 450 2010 Jeep \n", "1 44731507 16621 1018 CHEVROLET Equinox 2011 Jeep \n", "2 45774419 8467 - HONDA FIT 2006 Hatchback \n", "3 45769185 3607 862 FORD Escape 2011 Jeep \n", "4 45809263 11726 446 HONDA FIT 2014 Hatchback \n", "\n", " Leather interior Fuel type Engine volume Mileage Cylinders \\\n", "0 Yes Hybrid 3.5 186005 km 6.0 \n", "1 No Petrol 3 192000 km 6.0 \n", "2 No Petrol 1.3 200000 km 4.0 \n", "3 Yes Hybrid 2.5 168966 km 4.0 \n", "4 Yes Petrol 1.3 91901 km 4.0 \n", "\n", " Gear box type Drive wheels Doors Wheel Color Airbags \n", "0 Automatic 4x4 04-May Left wheel Silver 12 \n", "1 Tiptronic 4x4 04-May Left wheel Black 8 \n", "2 Variator Front 04-May Right-hand drive Black 2 \n", "3 Automatic 4x4 04-May Left wheel White 0 \n", "4 Automatic Front 04-May Left wheel Silver 4 \n", "Index(['ID', 'Price', 'Levy', 'Manufacturer', 'Model', 'Prod. year',\n", " 'Category', 'Leather interior', 'Fuel type', 'Engine volume', 'Mileage',\n", " 'Cylinders', 'Gear box type', 'Drive wheels', 'Doors', 'Wheel', 'Color',\n", " 'Airbags'],\n", " dtype='object')\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "import sklearn\n", "from sklearn.model_selection import train_test_split, GridSearchCV, cross_val_score\n", "from sklearn.preprocessing import StandardScaler, OneHotEncoder\n", "from sklearn.compose import ColumnTransformer\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.linear_model import LinearRegression, LogisticRegression\n", "from sklearn.tree import DecisionTreeRegressor, DecisionTreeClassifier\n", "from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n", "from sklearn.metrics import mean_squared_error, f1_score, accuracy_score, roc_auc_score, confusion_matrix, classification_report\n", "df = pd.read_csv(\"./static/csv/car_price_prediction.csv\")\n", "print(df.head())\n", "print(df.columns)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Предобработка данных" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ID 0\n", "Price 0\n", "Levy 0\n", "Manufacturer 0\n", "Model 0\n", "Prod. year 0\n", "Category 0\n", "Leather interior 0\n", "Fuel type 0\n", "Engine volume 0\n", "Mileage 0\n", "Cylinders 0\n", "Gear box type 0\n", "Drive wheels 0\n", "Doors 0\n", "Wheel 0\n", "Color 0\n", "Airbags 0\n", "dtype: int64\n", "object\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\Egor\\AppData\\Local\\Temp\\ipykernel_18436\\3209090058.py:21: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n", "The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n", "\n", "For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n", "\n", "\n", " df['Levy'].fillna(df['Levy'].median(), inplace=True)\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\numpy\\lib\\_nanfunctions_impl.py:1241: RuntimeWarning: Mean of empty slice\n", " return np.nanmean(a, axis, out=out, keepdims=keepdims)\n", "C:\\Users\\Egor\\AppData\\Local\\Temp\\ipykernel_18436\\3209090058.py:22: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n", "The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n", "\n", "For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n", "\n", "\n", " df['Mileage'].fillna(df['Mileage'].median(), inplace=True)\n", "C:\\Users\\Egor\\AppData\\Local\\Temp\\ipykernel_18436\\3209090058.py:23: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n", "The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n", "\n", "For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n", "\n", "\n", " df['Engine volume'].fillna(df['Engine volume'].median(), inplace=True)\n" ] } ], "source": [ "# Проверка наличия пропущенных значений\n", "print(df.isnull().sum())\n", "\n", "# Очистка столбца 'Levy' от нечисловых значений\n", "df['Levy'] = pd.to_numeric(df['Levy'], errors='coerce')\n", "\n", "# Очистка столбца 'Mileage' от нечисловых значений\n", "df['Mileage'] = pd.to_numeric(df['Mileage'], errors='coerce')\n", "\n", "# Проверка типа данных в столбце 'Engine volume'\n", "print(df['Engine volume'].dtype)\n", "\n", "# Если столбец 'Engine volume' не является строковым, преобразуем его в строку\n", "if df['Engine volume'].dtype != 'object':\n", " df['Engine volume'] = df['Engine volume'].astype(str)\n", "\n", "# Очистка столбца 'Engine volume' от нечисловых значений\n", "df['Engine volume'] = df['Engine volume'].str.replace(r'[^0-9.]', '', regex=True).astype(float)\n", "\n", "# Заполнение пропущенных значений\n", "df['Levy'].fillna(df['Levy'].median(), inplace=True)\n", "df['Mileage'].fillna(df['Mileage'].median(), inplace=True)\n", "df['Engine volume'].fillna(df['Engine volume'].median(), inplace=True)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Определение числовых и категориальных признаков\n", "numeric_features = ['Levy', 'Prod. year', 'Engine volume', 'Mileage', 'Cylinders', 'Airbags']\n", "categorical_features = ['Manufacturer', 'Model', 'Category', 'Leather interior', 'Fuel type', 'Gear box type', 'Drive wheels', 'Doors', 'Wheel', 'Color']\n", "\n", "# Преобразование категориальных признаков в числовые\n", "df = pd.get_dummies(df, columns=categorical_features, drop_first=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Разделение данных на тренировочный и тестовый наборы" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Задача регрессии\n", "X_reg = df.drop(['ID', 'Price'], axis=1)\n", "y_reg = df['Price']\n", "\n", "# Задача классификации\n", "df['Category'] = pd.cut(df['Price'], bins=[0, 10000, 20000, np.inf], labels=['Эконом', 'Средний', 'Премиум'])\n", "X_class = df.drop(['ID', 'Price', 'Category'], axis=1)\n", "y_class = df['Category']\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", "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)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5. Построение конвейера и обучение моделей\n", "#### 5.1. Задача регрессии" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "LinearRegression RMSE: 16981.208711977062\n", "DecisionTreeRegressor RMSE: 141914.29349587928\n", "RandomForestRegressor RMSE: 173537.46233609488\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n" ] } ], "source": [ "# Конвейер для задачи регрессии\n", "from sklearn.impute import SimpleImputer\n", "\n", "\n", "numeric_transformer = Pipeline(steps=[\n", " ('imputer', SimpleImputer(strategy='median')),\n", " ('scaler', StandardScaler())\n", "])\n", "\n", "preprocessor_reg = ColumnTransformer(\n", " transformers=[\n", " ('num', numeric_transformer, numeric_features)\n", " ])\n", "\n", "pipeline_reg = Pipeline(steps=[\n", " ('preprocessor', preprocessor_reg),\n", " ('regressor', LinearRegression())\n", "])\n", "\n", "# Обучение моделей\n", "models_reg = {\n", " 'LinearRegression': LinearRegression(),\n", " 'DecisionTreeRegressor': DecisionTreeRegressor(),\n", " 'RandomForestRegressor': RandomForestRegressor()\n", "}\n", "\n", "for name, model in models_reg.items():\n", " pipeline_reg.set_params(regressor=model)\n", " pipeline_reg.fit(X_train_reg, y_train_reg)\n", " y_pred_reg = pipeline_reg.predict(X_test_reg)\n", " rmse = np.sqrt(mean_squared_error(y_test_reg, y_pred_reg))\n", " print(f'{name} RMSE: {rmse}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.2. Задача классификации" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "LogisticRegression F1-score: 0.48010296192139407\n", "DecisionTreeClassifier F1-score: 0.6836168013771631\n", "RandomForestClassifier F1-score: 0.6943295967769952\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n" ] } ], "source": [ "# Конвейер для задачи классификации\n", "preprocessor_class = ColumnTransformer(\n", " transformers=[\n", " ('num', numeric_transformer, numeric_features)\n", " ])\n", "\n", "pipeline_class = Pipeline(steps=[\n", " ('preprocessor', preprocessor_class),\n", " ('classifier', LogisticRegression())\n", "])\n", "\n", "# Обучение моделей\n", "models_class = {\n", " 'LogisticRegression': LogisticRegression(),\n", " 'DecisionTreeClassifier': DecisionTreeClassifier(),\n", " 'RandomForestClassifier': RandomForestClassifier()\n", "}\n", "\n", "for name, model in models_class.items():\n", " pipeline_class.set_params(classifier=model)\n", " pipeline_class.fit(X_train_class, y_train_class)\n", " y_pred_class = pipeline_class.predict(X_test_class)\n", " f1 = f1_score(y_test_class, y_pred_class, average='weighted')\n", " print(f'{name} F1-score: {f1}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6. Оценка качества моделей" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "LinearRegression RMSE: 16981.208711977062, MAE: 11731.578355206166\n", "DecisionTreeRegressor RMSE: 141914.29349587928, MAE: 9887.588955657844\n", "RandomForestRegressor RMSE: 173537.46233609488, MAE: 12656.846663315797\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n" ] } ], "source": [ "# Оценка качества моделей регрессии\n", "import sklearn\n", "#from sklearn.base import r2_score #r2 = r2_score(y_test_reg, y_pred_reg)\n", "from sklearn.metrics import mean_absolute_error\n", "\n", "\n", "for name, model in models_reg.items():\n", " pipeline_reg.set_params(regressor=model)\n", " y_pred_reg = pipeline_reg.predict(X_test_reg)\n", " rmse = np.sqrt(mean_squared_error(y_test_reg, y_pred_reg))\n", " mae = mean_absolute_error(y_test_reg, y_pred_reg)\n", " \n", " print(f'{name} RMSE: {rmse}, MAE: {mae}')" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "LogisticRegression F1-score: 0.48010296192139407, Accuracy: 0.502079002079002, ROC-AUC: 0.6953729054676709\n", "DecisionTreeClassifier F1-score: 0.6836168013771631, Accuracy: 0.6876299376299376, ROC-AUC: 0.8222065250497814\n", "RandomForestClassifier F1-score: 0.6943295967769952, Accuracy: 0.6993243243243243, ROC-AUC: 0.856645400908623\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n" ] } ], "source": [ "# Оценка качества моделей классификации\n", "for name, model in models_class.items():\n", " pipeline_class.set_params(classifier=model)\n", " y_pred_class = pipeline_class.predict(X_test_class)\n", " f1 = f1_score(y_test_class, y_pred_class, average='weighted')\n", " accuracy = accuracy_score(y_test_class, y_pred_class)\n", " roc_auc = roc_auc_score(y_test_class, pipeline_class.predict_proba(X_test_class), multi_class='ovr')\n", " print(f'{name} F1-score: {f1}, Accuracy: {accuracy}, ROC-AUC: {roc_auc}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Выводы по пункту 6: Оценка качества моделей\n", "Задача регрессии\n", "Линейная регрессия (LinearRegression):\n", "\n", "RMSE: 16981.208711977062\n", "\n", "MAE: 11731.578355206166\n", "\n", "Вывод: Линейная регрессия показала относительно низкое качество предсказаний. RMSE и MAE достаточно высоки, что указывает на то, что модель плохо предсказывает цены автомобилей.\n", "\n", "Дерево решений (DecisionTreeRegressor):\n", "\n", "RMSE: 141914.29349587928\n", "\n", "MAE: 9887.588955657844\n", "\n", "Вывод: Дерево решений показало значительно более высокое значение RMSE по сравнению с линейной регрессией, что указывает на то, что модель сильно переобучилась. Однако MAE ниже, чем у линейной регрессии, что может указывать на то, что модель лучше предсказывает средние значения цен.\n", "\n", "Случайный лес (RandomForestRegressor):\n", "\n", "RMSE: 173537.46233609488\n", "\n", "MAE: 12656.846663315797\n", "\n", "Вывод: Случайный лес показал еще более высокое значение RMSE, что указывает на то, что модель также сильно переобучилась. MAE выше, чем у линейной регрессии, что говорит о том, что модель предсказывает цены хуже, чем линейная регрессия.\n", "\n", "Задача классификации\n", "Логистическая регрессия (LogisticRegression):\n", "\n", "F1-score: 0.48010296192139407\n", "\n", "Accuracy: 0.502079002079002\n", "\n", "ROC-AUC: 0.6953729054676709\n", "\n", "Вывод: Логистическая регрессия показала низкое качество классификации. F1-score и точность близки к 0.5, что указывает на то, что модель почти не лучше случайного угадывания. ROC-AUC также низкий, что говорит о плохой способности модели различать классы.\n", "\n", "Дерево решений (DecisionTreeClassifier):\n", "\n", "F1-score: 0.6836168013771631\n", "\n", "Accuracy: 0.6876299376299376\n", "\n", "ROC-AUC: 0.8222065250497814\n", "\n", "Вывод: Дерево решений показало значительно лучшее качество классификации по сравнению с логистической регрессией. F1-score и точность выше, а ROC-AUC значительно лучше, что указывает на то, что модель хорошо различает классы.\n", "\n", "Случайный лес (RandomForestClassifier):\n", "\n", "F1-score: 0.6943295967769952\n", "\n", "Accuracy: 0.6993243243243243\n", "\n", "ROC-AUC: 0.856645400908623\n", "\n", "Вывод: Случайный лес показал лучшее качество классификации среди всех моделей. F1-score, точность и ROC-AUC выше, чем у дерева решений, что указывает на то, что модель хорошо обобщает данные и различает классы.\n", "\n", "Общие выводы:\n", "Задача регрессии: Линейная регрессия показала лучшее качество предсказаний цен по сравнению с деревьями решений и случайным лесом, несмотря на высокие значения RMSE и MAE. Деревья решений и случайный лес показали сильное переобучение, что привело к очень высоким значениям RMSE.\n", "\n", "Задача классификации: Случайный лес показал лучшее качество классификации по сравнению с логистической регрессией и деревом решений. Логистическая регрессия показала низкое качество, в то время как дерево решений и случайный лес показали хорошие результаты, причем случайный лес показал наилучшие результаты" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "LinearRegression Cross-Validation RMSE: 100651.03159099314, Std: 161863.4449796077\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "DecisionTreeRegressor Cross-Validation RMSE: 194034.64594171714, Std: 136171.92328322295\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "RandomForestRegressor Cross-Validation RMSE: 181627.2578040142, Std: 137879.8905706371\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "LogisticRegression Cross-Validation F1-score: 0.4742308354293046, Std: 0.007525407236566359\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "DecisionTreeClassifier Cross-Validation F1-score: 0.6862381973987357, Std: 0.004587968007336983\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n", "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "RandomForestClassifier Cross-Validation F1-score: 0.692567227648008, Std: 0.004169193228958696\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\Egor\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\sklearn\\impute\\_base.py:598: UserWarning: Skipping features without any observed values: ['Mileage']. At least one non-missing value is needed for imputation with strategy='median'.\n", " warnings.warn(\n" ] } ], "source": [ "# Оценка смещения и дисперсии для задачи регрессии\n", "for name, model in models_reg.items():\n", " pipeline_reg.set_params(regressor=model)\n", " scores = cross_val_score(pipeline_reg, X_reg, y_reg, cv=5, scoring='neg_mean_squared_error')\n", " rmse_scores = np.sqrt(-scores)\n", " print(f'{name} Cross-Validation RMSE: {rmse_scores.mean()}, Std: {rmse_scores.std()}')\n", "\n", "# Оценка смещения и дисперсии для задачи классификации\n", "for name, model in models_class.items():\n", " pipeline_class.set_params(classifier=model)\n", " scores = cross_val_score(pipeline_class, X_class, y_class, cv=5, scoring='f1_weighted')\n", " print(f'{name} Cross-Validation F1-score: {scores.mean()}, Std: {scores.std()}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Оценка смещения и дисперсии моделей\n", "Задача регрессии\n", "Дерево решений (DecisionTreeRegressor):\n", "\n", "Cross-Validation RMSE: 194034.64594171714\n", "\n", "Std: 136171.92328322295\n", "\n", "Вывод: Дерево решений показало очень высокое значение RMSE при кросс-валидации, что указывает на сильное переобучение. Стандартное отклонение также высокое, что говорит о нестабильности модели. Это означает, что модель плохо обобщает данные и имеет высокую дисперсию.\n", "\n", "Случайный лес (RandomForestRegressor):\n", "\n", "Cross-Validation RMSE: 181627.2578040142\n", "\n", "Std: 137879.8905706371\n", "\n", "Вывод: Случайный лес также показал высокое значение RMSE при кросс-валидации, хотя и немного ниже, чем у дерева решений. Стандартное отклонение также высокое, что указывает на нестабильность модели. Это говорит о том, что модель также переобучена и имеет высокую дисперсию.\n", "\n", "Задача классификации\n", "Дерево решений (DecisionTreeClassifier):\n", "\n", "Cross-Validation F1-score: 0.6862381973987357\n", "\n", "Std: 0.004587968007336983\n", "\n", "Вывод: Дерево решений показало хороший F1-score при кросс-валидации, но стандартное отклонение относительно высокое. Это указывает на некоторую нестабильность модели, хотя и не такую высокую, как в случае регрессии. Модель имеет умеренную дисперсию.\n", "\n", "Случайный лес (RandomForestClassifier):\n", "\n", "Cross-Validation F1-score: 0.692567227648008\n", "\n", "Std: 0.004169193228958696\n", "\n", "#### Вывод: Случайный лес показал лучший F1-score при кросс-валидации по сравнению с деревом решений. Стандартное отклонение также ниже, что указывает на более стабильную модель. Это говорит о том, что случайный лес лучше обобщает данные и имеет меньшую дисперсию по сравнению с деревом решений.\n", "\n", "Общие выводы:\n", "Задача регрессии: И дерево решений, и случайный лес показали высокие значения RMSE и высокое стандартное отклонение при кросс-валидации. Это указывает на сильное переобучение и высокую дисперсию. Модели плохо обобщают данные и нестабильны.\n", "\n", "Задача классификации: Дерево решений показало хороший F1-score, но с высоким стандартным отклонением, что указывает на некоторую нестабильность. Случайный лес показал лучший F1-score и более низкое стандартное отклонение, что говорит о более стабильной и обобщающей способности модели." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1QAAAIjCAYAAAAEMVqQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABdsElEQVR4nO3dd3wUdf7H8fem7GbTQxLASAiBRHpTBBWIBU5A9Cx4AupJsR+IniennkezIXee5x0WrKg/EVEBC5YTQUUQBaSJCAIGQQEhQLLpm+x+f3+ErCzpQ2ATeD0fjzwkM9+d+czMbvy+d2a+YzPGGAEAAAAA6iwo0AUAAAAAQGNFoAIAAAAAiwhUAAAAAGARgQoAAAAALCJQAQAAAIBFBCoAAAAAsIhABQAAAAAWEagAAAAAwCICFQAAAABYRKACgBOczWbT5MmTA11GwJ133nk677zzfL9v375dNptNL730UsBqOtKRNR4rDXHbAaCxIlABQB089dRTstls6tWrl+Vl7Nq1S5MnT9batWvrr7AG7rPPPpPNZvP9hIaGqnXr1rruuuv0448/Brq8Ovnyyy81efJkZWdnB6yGVq1a+e3Ppk2bqm/fvpo/f37AagKAk1VIoAsAgMZk1qxZatWqlVasWKGtW7cqLS2tzsvYtWuXpkyZolatWqlbt271X2QDNm7cOJ155pkqKSnR6tWr9eyzz+r999/Xt99+q6SkpONaS0pKigoLCxUaGlqn13355ZeaMmWKRo4cqdjY2GNTXC1069ZNf/nLXySVvaeeeeYZXXHFFXr66ad1yy23VPtaq9sOAKiIM1QAUEuZmZn68ssv9dhjjykxMVGzZs0KdEmNTt++fXXttddq1KhRmj59uh599FEdOHBAL7/8cpWvyc/PPya12Gw2hYWFKTg4+Jgs/1g79dRTde211+raa6/VX//6Vy1btkwRERH697//XeVrSktL5Xa7G/22A0BDQqACgFqaNWuW4uLiNHjwYF155ZVVBqrs7Gz9+c9/VqtWreRwONSiRQtdd911ysrK0meffaYzzzxTkjRq1CjfJVvl97K0atVKI0eOrLDMI++tcbvdmjhxos444wzFxMQoIiJCffv21aefflrn7fr1118VEhKiKVOmVJi3efNm2Ww2PfHEE5KkkpISTZkyRenp6QoLC1N8fLz69OmjhQsX1nm9knTBBRdIKgurkjR58mTZbDZt3LhRV199teLi4tSnTx9f+1dffVVnnHGGnE6nmjRpomHDhmnnzp0Vlvvss8+qTZs2cjqd6tmzp7744osKbaq6j2jTpk266qqrlJiYKKfTqbZt2+q+++7z1Td+/HhJUmpqqu/4bd++/ZjUWBfNmzdX+/btffuyfPseffRRPf7442rTpo0cDoc2btxoadvL/fLLLxo9erSaNWsmh8Ohjh076sUXX6xQz/Tp09WxY0eFh4crLi5OPXr00GuvvXZU2wgADRGX/AFALc2aNUtXXHGF7Ha7hg8frqefflorV670BSRJysvLU9++ffX9999r9OjROv3005WVlaV3331XP//8s9q3b6/7779fEydO1E033aS+fftKks4555w61eJyufT8889r+PDhuvHGG5Wbm6sXXnhBAwYM0IoVK+p0KWGzZs107rnn6o033tCkSZP85s2ZM0fBwcH6wx/+IKksUEydOlU33HCDevbsKZfLpVWrVmn16tX63e9+V6dtkKRt27ZJkuLj4/2m/+EPf1B6eroefvhhGWMkSQ899JAmTJigq666SjfccIP27dun6dOnKyMjQ2vWrPFdfvfCCy/o5ptv1jnnnKM77rhDP/74o37/+9+rSZMmSk5Orrae9evXq2/fvgoNDdVNN92kVq1aadu2bXrvvff00EMP6YorrtAPP/yg2bNn69///rcSEhIkSYmJicetxqqUlJRo586dFfblzJkzVVRUpJtuukkOh0NNmjSR1+ut87ZLZeH7rLPOks1m09ixY5WYmKgPP/xQ119/vVwul+644w5J0nPPPadx48bpyiuv1O23366ioiKtX79eX3/9ta6++mpL2wcADZYBANRo1apVRpJZuHChMcYYr9drWrRoYW6//Xa/dhMnTjSSzLx58yosw+v1GmOMWblypZFkZs6cWaFNSkqKGTFiRIXp5557rjn33HN9v5eWlpri4mK/NgcPHjTNmjUzo0eP9psuyUyaNKna7XvmmWeMJPPtt9/6Te/QoYO54IILfL937drVDB48uNplVebTTz81ksyLL75o9u3bZ3bt2mXef/9906pVK2Oz2czKlSuNMcZMmjTJSDLDhw/3e/327dtNcHCweeihh/ymf/vttyYkJMQ33e12m6ZNm5pu3br57Z9nn33WSPLbh5mZmRWOQ0ZGhomKijI//fST33rKj50xxvzzn/80kkxmZuYxr7EqKSkp5sILLzT79u0z+/btM+vWrTPDhg0zksxtt93mt33R0dFm7969fq+3uu3XX3+9OeWUU0xWVpZfm2HDhpmYmBhTUFBgjDHm0ksvNR07dqxxOwDgRMAlfwBQC7NmzVKzZs10/vnnSyq7/2bo0KF6/fXX5fF4fO3mzp2rrl276vLLL6+wDJvNVm/1BAcHy263S5K8Xq8OHDig0tJS9ejRQ6tXr67z8q644gqFhIRozpw5vmkbNmzQxo0bNXToUN+02NhYfffdd9qyZYulukePHq3ExEQlJSVp8ODBys/P18svv6wePXr4tTtyUIV58+bJ6/XqqquuUlZWlu+nefPmSk9P913quGrVKu3du1e33HKLb/9I0siRIxUTE1Ntbfv27dOSJUs0evRotWzZ0m9ebY7d8ajxcB9//LESExOVmJiorl276s0339Qf//hHTZs2za/dkCFDfGfQqlKbbTfGaO7cubrkkktkjPHbxgEDBignJ8f33ouNjdXPP/+slStX1np7AKCxOmEC1ZIlS3TJJZcoKSlJNptNb7/9dp2XYYzRo48+qtNOO00Oh0Onnnqq7zIHACcvj8ej119/Xeeff74yMzO1detWbd26Vb169dKvv/6qRYsW+dpu27ZNnTp1Oi51vfzyy+rSpYvvXqbExES9//77ysnJqfOyEhIS1K9fP73xxhu+aXPmzFFISIiuuOIK37T7779f2dnZOu2009S5c2eNHz9e69evr/V6Jk6cqIULF2rx4sVav369du3apT/+8Y8V2qWmpvr9vmXLFhljlJ6e7gsR5T/ff/+99u7dK0n66aefJEnp6el+ry8fpr065cO3Wz1+x6PGw/Xq1UsLFy7UJ598oi+//FJZWVl65ZVX5HQ6/doduS8rU5tt37dvn7Kzs/Xss89W2L5Ro0ZJkm8b7777bkVGRqpnz55KT0/XmDFjtGzZslpvGwA0JifMPVT5+fnq2rWrRo8e7fc//7q4/fbb9fHHH+vRRx9V586ddeDAAR04cKCeKwXQ2CxevFi7d+/W66+/rtdff73C/FmzZunCCy+sl3VVdSbE4/H4jcj26quvauTIkbrssss0fvx4NW3aVMHBwZo6darvvqS6GjZsmEaNGqW1a9eqW7dueuONN9SvXz/ffUKSlJGRoW3btumdd97Rxx9/rOeff17//ve/NWPGDN1www01rqNz587q379/je2ODAVer1c2m00ffvhhpSPTRUZG1mILj63jXWNCQoKlfWlV+X1X1157rUaMGFFpmy5dukiS2rdvr82bN2vBggX66KOPNHfuXD311FOaOHFipYOfAEBjdsIEqkGDBmnQoEFVzi8uLtZ9992n2bNnKzs7W506ddK0adN8o2Z9//33evrpp7Vhwwa1bdtWUu2+1QNw4ps1a5aaNm2qJ598ssK8efPmaf78+ZoxY4acTqfatGmjDRs2VLu86i4fi4uLq/SBsT/99JPf2Yu33npLrVu31rx58/yWd+SgEnVx2WWX6eabb/Zd9vfDDz/o3nvvrdCuSZMmGjVqlEaNGqW8vDxlZGRo8uTJtQpUVrVp00bGGKWmpuq0006rsl1KSoqksrNF5SMISmUDNmRmZqpr165VvrZ8/1o9fsejxmOlNtuemJioqKgoeTyeWgW5iIgIDR06VEOHDpXb7dYVV1yhhx56SPfee6/CwsLqrXYACLQT5pK/mowdO1bLly/X66+/rvXr1+sPf/iDBg4c6LsP4L333lPr1q21YMECpaamqlWrVrrhhhs4QwWc5AoLCzVv3jxdfPHFuvLKKyv8jB07Vrm5uXr33Xclld2vsm7dOs2fP7/Cssyh0eoiIiIkqdLg1KZNG3311Vdyu92+aQsWLKgw7Hb5GZDyZUrS119/reXLl1ve1tjYWA0YMEBvvPGGXn/9ddntdl122WV+bfbv3+/3e2RkpNLS0lRcXGx5vbVxxRVXKDg4WFOmTPHbZqlsH5TX1aNHDyUmJmrGjBl++/Cll16qdH8fLjExURkZGXrxxRe1Y8eOCusoV9XxOx41Hiu12fbg4GANGTJEc+fOrTR47du3z/fvI98ndrtdHTp0kDFGJSUlx2ALACBwTpgzVNXZsWOHZs6cqR07digpKUmSdNddd+mjjz7SzJkz9fDDD+vHH3/UTz/9pDfffFOvvPKKPB6P/vznP+vKK6/U4sWLA7wFAALl3XffVW5urn7/+99XOv+ss87yPeR36NChGj9+vN566y394Q9/0OjRo3XGGWfowIEDevfddzVjxgx17dpVbdq0UWxsrGbMmKGoqChFRESoV69eSk1N1Q033KC33npLAwcO1FVXXaVt27bp1VdfVZs2bfzWe/HFF2vevHm6/PLLNXjwYGVmZmrGjBnq0KGD8vLyLG/v0KFDde211+qpp57SgAEDfMN8l+vQoYPOO+88nXHGGWrSpIlWrVqlt956S2PHjrW8ztpo06aNHnzwQd17773avn27LrvsMkVFRSkzM1Pz58/XTTfdpLvuukuhoaF68MEHdfPNN+uCCy7Q0KFDlZmZqZkzZ9bq/qT//ve/6tOnj04//XTddNNNSk1N1fbt2/X+++9r7dq1kqQzzjhDknTfffdp2LBhCg0N1SWXXHLcajxWarPtjzzyiD799FP16tVLN954ozp06KADBw5o9erV+uSTT3xfQl544YVq3ry5evfurWbNmun777/XE088ocGDBysqKipg2wgAx8TxH1jw2JNk5s+f7/t9wYIFRpKJiIjw+wkJCTFXXXWVMcaYG2+80Ugymzdv9r3um2++MZLMpk2bjvcmAGggLrnkEhMWFmby8/OrbDNy5EgTGhrqG0p6//79ZuzYsebUU081drvdtGjRwowYMcJvqOl33nnHdOjQwYSEhFQYvvpf//qXOfXUU43D4TC9e/c2q1atqjBsutfrNQ8//LBJSUkxDofDdO/e3SxYsMCMGDHCpKSk+NWnWgybXs7lchmn02kkmVdffbXC/AcffND07NnTxMbGGqfTadq1a2ceeugh43a7q11u+bDpb775ZrXtyodN37dvX6Xz586da/r06eP7O96uXTszZswYv7/dxhjz1FNPmdTUVONwOEyPHj3MkiVLKuzDyoYON8aYDRs2mMsvv9zExsaasLAw07ZtWzNhwgS/Ng888IA59dRTTVBQUIUh1OuzxqqkpKTUOHx9+fb985//rHKelW3/9ddfzZgxY0xycrIJDQ01zZs3N/369TPPPvusr80zzzxjMjIyTHx8vHE4HKZNmzZm/PjxJicnp8ZtA4DGxmbMEdclnABsNpvmz5/vu1Rlzpw5uuaaa/Tdd99VuFE4MjJSzZs316RJk/Twww/7XYpQWFio8PBwffzxx5YeWAkAAADgxHZSXPLXvXt3eTwe7d27V3379q20Te/evVVaWqpt27b5Lq354YcfJP12AzEAAAAAHO6EOUOVl5enrVu3SioLUI899pjOP/98NWnSRC1bttS1116rZcuW6V//+pe6d++uffv2adGiRerSpYsGDx4sr9erM888U5GRkXr88cfl9Xo1ZswYRUdH6+OP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jAl0EVa5XC7FxMQoJydH0dHRgS4HAAAAQIAEKhtYeg7V//3f/6lPnz5KSkrSTz/9JEl6/PHH9c4779RrcQAAAADQkNU5UD399NO68847NWjQIGVnZ/sGooiNjdXjjz9e3/UBAAAAQINV50A1ffp0Pffcc7rvvvsUHBzsm96jRw99++239VocAAAAADRkdQ5UmZmZ6t69e4XpDodD+fn59VIUAAAAADQGdQ5UqampWrt2bYXpH330kdq3b18fNQEAAABAo1DnYdPvvPNOjRkzRkVFRTLGaMWKFZo9e7amTp2q559//ljUCAAAAAANUp0D1Q033CCn06m///3vKigo0NVXX62kpCT95z//0bBhw45FjQAAAADQIB3Vc6gKCgqUl5enpk2b1mdNtcZzqAAAAABIgcsGdT5DlZmZqdLSUqWnpys8PFzh4eGSpC1btig0NFStWrWq7xoBAAAAoEGq86AUI0eO1Jdffllh+tdff62RI0fWR00AAAAA0CjUOVCtWbNGvXv3rjD9rLPOqnT0PwAAAAA4UdU5UNlsNuXm5laYnpOTI4/HUy9FAQAAAEBjUOdAlZGRoalTp/qFJ4/Ho6lTp6pPnz71WhwAAAAANGR1HpRi2rRpysjIUNu2bdW3b19J0hdffCGXy6XFixfXe4EAAAAA0FDV+QxVhw4dtH79el111VXau3evcnNzdd1112nTpk3q1KnTsagRAAAAABqko3oOVaDxHCoAAAAAUgN/DtX69evVqVMnBQUFaf369dW27dKlS70UBgAAAAANXa0CVbdu3bRnzx41bdpU3bp1k81mU2Untmw2GyP9AQAAADhp1CpQZWZmKjEx0fdvAAAAAEAtA1VKSookqaSkRFOmTNGECROUmpp6TAsDAAAAgIauTqP8hYaGau7cuceqFgAAAABoVOo8bPpll12mt99++xiUAgAAAACNS50f7Juenq77779fy5Yt0xlnnKGIiAi/+ePGjau34gAAAACgIavzc6iqu3fKZrPpxx9/POqiaovnUAEAAACQGvhzqA7HKH8AAAAAUKZOgeqrr77Se++9J7fbrX79+mngwIHHqi4AAAAAaPBqHajeeustDR06VE6nU6GhoXrsscc0bdo03XXXXceyPgAAAABosGo9yt/UqVN14403KicnRwcPHtSDDz6ohx9++FjWBgAAAAANWq0HpYiMjNTatWuVlpYmSXK73YqIiNAvv/yipk2bHtMiq8KgFAAAAACkwGWDWp+hKigo8CvMbrcrLCxMeXl5x6QwAAAAAGjo6jQoxfPPP6/IyEjf76WlpXrppZeUkJDgm8ZzqAAAAACcLGp9yV+rVq1ks9mqXxjPoQIAAAAQAA3+OVTbt28/hmUAAAAAQONT63uoAAAAAAD+CFQAAAAAYBGBCgAAAAAsIlABAAAAgEUEKgAAAACwqFaj/LlcrlovkOHLAQAAAJwsahWoYmNja3wGVTmPx3NUBQEAAABAY1GrQPXpp5/6/r19+3bdc889GjlypM4++2xJ0vLly/Xyyy9r6tSpx6ZKAAAAAGiAbMYYU5cX9OvXTzfccIOGDx/uN/21117Ts88+q88++6w+66tWoJ6GDAAAAKBhCVQ2qPOgFMuXL1ePHj0qTO/Ro4dWrFhRL0UBAAAAQGNQ50CVnJys5557rsL0559/XsnJyfVSFAAAAAA0BrW6h+pw//73vzVkyBB9+OGH6tWrlyRpxYoV2rJli+bOnVvvBQIAAABAQ1XnM1QXXXSRfvjhB11yySU6cOCADhw4oEsuuUQ//PCDLrroomNRIwAAAAA0SHUelKIhYVAKAAAAAFIjGpRCkr744gtde+21Ouecc/TLL79Ikv7v//5PS5curdfiAAAAAKAhq3Ogmjt3rgYMGCCn06nVq1eruLhYkpSTk6OHH3643gsEAAAAgIaqzoHqwQcf1IwZM/Tcc88pNDTUN713795avXp1vRYHAAAAAA1ZnQPV5s2blZGRUWF6TEyMsrOz66MmAAAAAGgU6hyomjdvrq1bt1aYvnTpUrVu3bpeigIAAACAxqDOgerGG2/U7bffrq+//lo2m027du3SrFmzdNddd+nWW289FjUCAAAAQINU5wf73nPPPfJ6verXr58KCgqUkZEhh8Ohu+66S7fddtuxqBEAAAAAGiTLz6Fyu93aunWr8vLy1KFDB0VGRtZ3bTXiOVQAAAAApEb0HKrRo0crNzdXdrtdHTp0UM+ePRUZGan8/HyNHj36WNQIAAAAAA1SnQPVyy+/rMLCwgrTCwsL9corr9RLUQAAAADQGNT6HiqXyyVjjIwxys3NVVhYmG+ex+PRBx98oKZNmx6TIgEAAACgIap1oIqNjZXNZpPNZtNpp51WYb7NZtOUKVPqtTgAAAAAaMhqHag+/fRTGWN0wQUXaO7cuWrSpIlvnt1uV0pKipKSko5JkQAAAADQENU6UJ177rmSpMzMTLVs2VI2m+2YFQUAAAAAjUGdB6VYvHix3nrrrQrT33zzTb388suWC3nkkUdks9l0xx13WF4GAAAAABxPdQ5UU6dOVUJCQoXpTZs21cMPP2ypiJUrV+qZZ55Rly5dLL3+RJNT4NaWX3O1cvsBbdyVo5/25yunwB3osgAAAAAcodaX/JXbsWOHUlNTK0xPSUnRjh076lxAXl6errnmGj333HN68MEH6/z6E82u7ELd/dZ6fbE1yzetd1q8brsgXSlNwnVKrDOA1QEAAAA4XJ3PUDVt2lTr16+vMH3dunWKj4+vcwFjxozR4MGD1b9//xrbFhcXy+Vy+f2cSHIK3BXClCQt27pf0xdv0Wc/7ONMFQAAANCA1DlQDR8+XOPGjdOnn34qj8cjj8ejxYsX6/bbb9ewYcPqtKzXX39dq1ev1tSpU2vVfurUqYqJifH9JCcn17X8Bi0rz10hTJVbtnW/mkY5lJVHoAIAAAAaijpf8vfAAw9o+/bt6tevn0JCyl7u9Xp13XXX1ekeqp07d+r222/XwoUL/R4SXJ17771Xd955p+93l8t1QoUqV1FJtfOLS73KraENAAAAgOOnzoHKbrdrzpw5euCBB7Ru3To5nU517txZKSkpdVrON998o7179+r000/3TfN4PFqyZImeeOIJFRcXKzg42O81DodDDoejriU3GtFhodXOd4QEKaqGNgAAAACOnzoHqnKnnXaaTjvtNMsr7tevn7799lu/aaNGjVK7du109913VwhTJ4OESLsy0hO0ZEvFy/56p8Vrb26xeqTEBaAyAAAAAJWpVaC688479cADDygiIsLvkrvKPPbYY7VacVRUlDp16uQ3LSIiQvHx8RWmnyxiwu16ZEgX3T13vb7YUnGUv1ZNwhUTbg9ghQAAAAAOV6tAtWbNGpWUlPj+XRWbzVY/VZ3EkmKdemJ4d+3NLVZOYYnC7cGKsIcoNjyUMAUAAAA0MDZjjAl0EVa5XC7FxMQoJydH0dHRgS4HAAAAQIAEKhvUedh0AAAAAECZWl3yd8UVV9R6gfPmzbNcDAAAAAA0JrU6Q3X4w3Sjo6O1aNEirVq1yjf/m2++0aJFixQTE3PMCgUAAACAhqZWZ6hmzpzp+/fdd9+tq666SjNmzPANbe7xePSnP/2J+5gAAAAAnFTqPChFYmKili5dqrZt2/pN37x5s8455xzt37+/XgusDoNSAAAAAJAa0aAUpaWl2rRpU4XpmzZtktfrrZeiAAAAAKAxqNUlf4cbNWqUrr/+em3btk09e/aUJH399dd65JFHNGrUqHovEAAAAAAaqjoHqkcffVTNmzfXv/71L+3evVuSdMopp2j8+PH6y1/+Uu8FAgAAAEBDdVQP9nW5XJIUsPuXuIcKAAAAgNSI7qGSyu6j+uSTTzR79mzZbDZJ0q5du5SXl1evxQEAAABAQ1bnS/5++uknDRw4UDt27FBxcbF+97vfKSoqStOmTVNxcbFmzJhxLOoEAAAAgAanzmeobr/9dvXo0UMHDx6U0+n0Tb/88su1aNGiei0OAAAAABqyOp+h+uKLL/Tll1/Kbrf7TW/VqpV++eWXeisMAAAAABq6Op+h8nq98ng8Fab//PPPioqKqpeiAAAAAKAxqHOguvDCC/X444/7frfZbMrLy9OkSZN00UUX1WdtAAAAANCg1XnY9J07d2rgwIEyxmjLli3q0aOHtmzZooSEBC1ZskRNmzY9VrVWwLDpAAAAAKTAZQNLz6EqLS3VnDlztG7dOuXl5en000/XNddc4zdIxfFAoAIAAAAgNZJAVVJSonbt2mnBggVq3779sayrVghUAAAAAKRG8mDf0NBQFRUVHataAAAAAKBRqfOgFGPGjNG0adNUWlp6LOoBAAAAgEajzs+hWrlypRYtWqSPP/5YnTt3VkREhN/8efPm1VtxAAAAANCQ1TlQxcbGasiQIceiFgAAAABoVOocqGbOnHks6gAAAACARqfW91B5vV5NmzZNvXv31plnnql77rlHhYWFx7I2AAAAAGjQah2oHnroIf3tb39TZGSkTj31VP3nP//RmDFjjmVtAAAAANCg1TpQvfLKK3rqqaf0v//9T2+//bbee+89zZo1S16v91jWBwAAAAANVq0D1Y4dO3TRRRf5fu/fv79sNpt27dp1TAoDAAAAgIau1oGqtLRUYWFhftNCQ0NVUlJS70UBAAAAQGNQ61H+jDEaOXKkHA6Hb1pRUZFuueUWv2dR8RwqAAAAACeLWgeqESNGVJh27bXX1msxAAAAANCY1DpQ8fwpAAAAAPBX63uoAAAAAAD+CFQAAAAAYBGBCgAAAAAsIlABAAAAgEUEKgAAAACwiEAFAAAAABYRqAAAAADAIgIVAAAAAFhEoAIAAAAAiwhUAAAAAGARgQoAAAAALCJQAQAAAIBFBCoAAAAAsIhABQAAAAAWEagAAAAAwCICFQAAAABYRKACAAAAAIsIVAAAAABgEYEKAAAAACwiUAEAAACARQQqAAAAALCIQAUAAAAAFhGoAAAAAMAiAhUAAAAAWESgAgAAAACLCFQAAAAAYBGBCgAAAAAsIlABAAAAgEUEKgAAAACwiEAFAAAAABYRqAAAAADAIgIVAAAAAFhEoAIAAAAAiwhUAAAAAGARgQoAAAAALCJQAQAAAIBFBCoAAAAAsIhABQAAAAAWEagAAAAAwCICFQAAAABYRKACAAAAAIsIVAAAAABgEYEKAAAAACwiUAEAAACARQQqAAAAALCIQAUAAAAAFoUEugBIOQVuZeW55SoqUbQzVAkRdsWE2wNdFgAAAIAaEKgCbFd2oe6eu15fbMnyTctIT9AjQ7ooKdYZwMoAAAAA1IRL/gIop8BdIUxJ0pItWbpn7nrlFLgDVBkAAACA2iBQBVBWnrtCmCq3ZEuWsvIIVAAAAEBDRqAKIFdRSbXzc2uYDwAAACCwCFQBFB0WWu38qBrmAwAAAAgsAlUAJUTalZGeUOm8jPQEJUQy0h8AAADQkBGoAigm3K5HhnSpEKoy0hM0bUgXhk4HAAAAGriADps+depUzZs3T5s2bZLT6dQ555yjadOmqW3btoEs67hKinVq+vDuyspzK7eoRFFhoUqI5DlUAAAAQGMQ0DNUn3/+ucaMGaOvvvpKCxcuVElJiS688ELl5+cHsqzjLibcrjZNI9WtZZzaNI0kTAEAAACNhM0YYwJdRLl9+/apadOm+vzzz5WRkVFje5fLpZiYGOXk5Cg6Ovo4VAgAAACgIQpUNgjoJX9HysnJkSQ1adKk0vnFxcUqLi72/e5yuY5LXQAAAABQmQYzKIXX69Udd9yh3r17q1OnTpW2mTp1qmJiYnw/ycnJx7lKAAAAAPhNg7nk79Zbb9WHH36opUuXqkWLFpW2qewMVXJyMpf8AQAAACe5k/qSv7Fjx2rBggVasmRJlWFKkhwOhxwOx3GsDAAAAACqFtBAZYzRbbfdpvnz5+uzzz5TampqIMsBAAAAgDoJaKAaM2aMXnvtNb3zzjuKiorSnj17JEkxMTFyOp2BLA0AAAAAahTQe6hsNlul02fOnKmRI0fW+HqGTQcAAAAgnaT3UDWQ8TAAAAAAwJIGM2w6AAAAADQ2BCoAAAAAsIhABQAAAAAWEagAAAAAwCICFQAAAABYRKACAAAAAIsIVAAAAABgEYEKAAAAACwiUAEAAACARQQqAAAAALCIQAUAAAAAFhGoAAAAAMAiAhUAAAAAWESgAgAAAACLCFQAAAAAYBGBCgAAAAAsIlABAAAAgEUEKgAAAACwiEAFAAAAABYRqAAAAADAIgIVAAAAAFhEoAIAAAAAiwhUAAAAAGARgQoAAAAALCJQAQAAAIBFBCoAAAAAsIhABQAAAAAWEagAAAAAwCICFQAAAABYRKACAAAAAIsIVAAAAABgEYEKAAAAACwiUAEAAACARSGBLuBkllPgVlaeW66iEkU7Q5UQYVdMuD3QZQEAAACoJQJVgOzKLtTdc9friy1ZvmkZ6Ql6ZEgXJcU6A1gZAAAAgNrikr8AyClwVwhTkrRkS5bumbteOQXuAFUGAAAAoC4IVAGQleeuEKbKLdmSpaw8AhUAAADQGBCoAsBVVFLt/Nwa5gMAAABoGAhUARAdFlrt/Kga5gMAAABoGAhUAZAQaVdGekKl8zLSE5QQyUh/AAAAQGNAoAqAmHC7HhnSpUKoykhP0LQhXRg6HQAAAGgkGDY9QJJinZo+vLuy8tzKLSpRVFioEiJ5DhUAAADQmBCoAigmnAAFAAAANGZc8gcAAAAAFhGoAAAAAMAiAhUAAAAAWESgAgAAAACLCFQAAAAAYBGBCgAAAAAsIlABAAAAgEUEKgAAAACwiEAFAAAAABYRqAAAAADAIgIVAAAAAFhEoAIAAAAAiwhUAAAAAGARgQoAAAAALCJQAQAAAIBFBCoAAAAAsIhABQAAAAAWEagAAAAAwCICFQAAAABYRKACAAAAAIsIVAAAAABgEYEKAAAAACwiUAEAAACARQQqAAAAALCIQAUAAAAAFhGoAAAAAMAiAhUAAAAAWESgAgAAAACLQgJdwMkmp8CtrDy3XEUlinaGKiHCrphwe6DLAgAAAGABgeo42pVdqLvnrtcXW7J80zLSE/TIkC5KinUGsDIAAACgbjhRUIZAdZzkFLgrhClJWrIlS/fMXa/pw7uflG9AAAAAND6cKPgN91AdJ1l57gphqtySLVnKynMf54oAAACAuqvpREFOwcnVr+UM1XHiKiqpdn5uDfMB1A6XHwAAcGzV5kTByfT/XgJVPahNBy46LLTaZUTVMB9Azbj8AACAY48TBf4IVEepth24hEi7MtITtKSSNJ+RnqCEyJMnxQPHAvcpAgBwfHCiwB/3UB2Fulw/GhNu1yNDuigjPcGvbUZ6gqYN6UJHrxo5BW5t25unNTsOatu+vJPuulxU7sj3xd7cYu5TBADgOCg/UVCZk/FEAWeojkL59aPh9mCN7pOq7smxKi71Kiw0WKt3HNT+fP/rR5NinZo+vLuy8tzKLSpRVFioEiK5v6M6XMLV8NXlnqUj20Y6QpRfXKqcwspfe3j7GGeoIg61N5Imv7NBX2zd72v7woge1dZZl8sPjud9WHVdV0O9R6yh1gU0dHx20BiVnyi4Z+56v6uvTtYTBQSqo+AqKlG4PVj/Hd5dM5dl6onFW33zeqfF6/Lup1Z4TUx44/pDWZ9/6Ova8c4uKNHf3/7Wr9MscQmX5L8vIx0hsgcHyVXkVrTTLnepV3nFpXU6XuXLyysuUWy4/zKqCz01Bd7DlxvjtGvC2xv0xdbf2vZJi9fI3qkaN3uNCtwev9fuyi7UxHc2qN0p0eqREqcSj1Gh26PQkCA98N53Fd4XR6rwRYc9WL+6iqoNcHXZpvr4TNRlXTHOUNmDg3Tv/G8b3BcMh29H+X4/p3W87CFBiouw00EMADrpjQNfGqIx40TBb2zGGBPoIqxyuVyKiYlRTk6OoqOjj/v6t+3N0/y1v2jNjoNaVknnrm96gp6opNN/NN/oJ0SUtavpW/4j21S2jiOX7QwNVm5RiXKLSpQY4ZAtyKZfsgtV4jFqEmFXiccrd6lHzWOc8nqNwg+tN7eoYif8yPX9fKBA985b79cJ7pueoAcu7aS48FC/truyC3X3W+s1sncrXf/yqir3/wfj+sgZGqyw0GAVlXhUUOJRQbFH0c4QBQfZFGSzKf7QvsguKFG+u1T5bo+aRITKGRoiV2GJX0f1YIFb4Y4QOUKCZDNSUalXucWlinSEyCYpJMSmKEeo8opKfUEmLCRI+SUeuQpKFOUMVYQ9WDYjZR8WbnKLShTuCFGQJGOTbLIpJOi32sqPQYQjRKFBNu3PdysqLESRjhDluUuVU1CqaGeIIkKD5SpyK8JRFky+2XHQFxhskk6Nc2r1Twf1wPvfq8DtkST1b99UEy/uoMISj1yFpYpwBMsZGqwIR4iaRodJkn45WKCf9hco3+1Rm8QIuQpLtdtVKEdI2ZnW73flaHivFI2bvUaSNOHiDjq9Zazyi0tV4jFy2oMVZLMpt6hUMc4QlXrLgo8z1KYYp0MFJR65Dr03SzxejZm1WjsPFvqOY++0eHVvGef7QiIjPUH//ENX3Tf/Ww3r2VIzl2X6fb5m3dBL1zz/dYX3w9gL0nyfxcO/6Dj8tX3TEjSqTyv99a31GtazZYVOvySNnb2m0ksHM9ITNPWKzrpnXv0EmpwCd53Wdfj2VdY+UF8wHL4dVe13OojHF530xqGmvwEn85eGgFWBygYEqqOQU+DWd7tcurqSzl25hX/OUJDNJndpiSIdduW5PcopKFFUWIg8xuhgfolKvV61iAtXRGiQvJLy3WUd0JhDHfRSr/ELCwcL3Cpye1VQ4lGUI0QJUQ5JUn5xieIjHHJ7vNqVXSh7cJBaxIWroMSjvKJSRYaFKMhWVldocJCyywNEcJCKPd6yNo4QBQdJYSHB2nmwUNmFJQoLDda3v2QrOS5c3ZNj/WqRJCMjZ2iIiko8yi8uVVy4XcUer1yFZd9WRNiD5fUa7S9wK9weLI9XWrTpVz3z+Y86IyVOU37fUSUer4yk3MM6/fvz3bpyxvIq9+0bN5+lxMiy7d2TXaQmkQ4Vl3q0P9+t5DinnKHBOpDvltMerLCQYNlsUmiQTV5JPx+2bat3HNSm3S79fXB7hdpsyj0UPiIP1eExRnlFJYoNd2jCYWfMwu3BmjC4g7q1jD20rSEKCwlWYWnZ/okMC5G71KvsghKt/OmANu7K0bh+p6nIXaqQ4CDFhts15V3/y9b6psVrVJ9UjX1tjc5oGasJF3dU5v58hQYH6VdXkfq0idff5n+rb3ZkV9px7Z0Wr+v7pOrbX3LU9dRYnRIbpgcXbPRbR++0eI09P00tYp0Kstn013nrtaaa5Y0f0E6F7lJ5vEZNo8N0/3vfaemh0DLjmjNkD7UpwhGivCKPYsNDlVPo1sPvf6//DO+uv7+9wW95fdLi9cBlnXTdCyv8QtX7t/VRWGiwCkpK9cvBIrWKD9cv2YV68bB6ys98XNihmX4+WOg7di8uzVSB2+PrzL/85XZ1TY6t+ouOtHiNH9hO0z7aVKHTf9/g9hrw+BdVvudeu6FXpZ93K52fbXvz1O+xz2u9rhdG9Kj2C4ZFd56rhEh7hUsky78AOFZnKQ7fjoYa+k4mdNIbj5r+Biy681y1aRp5HCsCGr9AZQMu+TsKMeF2OUIqH9ejvPPn9niVX1zqGw3FZjMKDrIpJNim8OBgebxexTqdkk3KKykLW+GOYMWG21Xi8WjH/mK1iA9XkK0sCXmNFBtul8KNwkND/M48JEQ4FBRkk7dUigoLUXyko8Ilc+Ud9te+3qG/D+4gj/GqqNQrd0mpmkU5lOf26EB+iWKcUos4p+KjQuUMCVFykzDZFKSJR9y30jc9Qfdf2lGZ+/Jls9kUEx6qv7+zocJZgUm/7yhnaLD+992v2vBLju69qL1+3zVJBcVlAajU49Wybft9neO+aQm6Z1C7Kvdr9+RYSTbtzS1WfKRdzWLDlJ1fosiwEIUE2XTdiyvUtnmURvVO1R9fXKHuLWN1+wVpahodduiyM//QMKp3qh58/3vd0DdVo19apQK3RwmRdj1xdXfFOO1ye4zy3aUaP7CdbsgvUVGpR6kJEbr/ve907/xvazwjUhbYOuiXA4UKDwuRq9Ct/3zyQ4XL1sp+t+mmjNZ6/JMtmrLgO3VvGacXl2bq74PbK7/Eo+vOSdX9l0Zo4hH7WZKWbd0vZ0iwbshIVUhQkH4+WKhRfVqr66FlFLg9vtdc3CVJqQnhWrMjW6P7pOq1r39S95ZxGt071e9ewOmLflD7pBhJ8ussj72gjZLiwjTp3e8qhKb/Dj9d9y/4rkJ9S7fu14S3N+jJa07X759Y5pueW1yqfy3crA5JMeqeHKsfs/KV0iRc3VvGac2ObEmq8tLa/w7v7rtkcNzsNXp3bB8VlXj82h25j28pKq1Q25ItWRpxWMgrd/h7zmazaebIM+U1RsE2mwpKPFXeM1mTmoaczS70n19c6q2hvVuT3/vuuJwpOvzstiMkSGMvSNOLSzPVPTm2yv1+Mj6XJBB4NkzjwbDTwImjQQSqJ598Uv/85z+1Z88ede3aVdOnT1fPnj0DXVatRIWFVLhXwxkarPhIux7/5Ae/zkWftHhNuLijbp21Qll5bvVNS9DE33fQvrxiTV+0pUIn/45+6Upq4tR987/V0sPmXdAuUfcMaq/75vufLXlhRA899elWfbF1f5XfFJd32M9oFacJb2/QfYPb6fbZa/XMdWfonvnfVno24d8LN2t0n9b6x0cbKwaALVn6+9sb1L1lnCRVsc4sTXq3rM26HQc1uk9rZeUW64nFFbe5vHP8xdYsjSkuUZ+0eN+2V3W/2pH34fRJi9esG87SNc9/pZnLMjW6T6qeWLxVgzufoumLt1bYhvJ6u7eMk8db1nGf8u53en7EmRVCQfm6Nu1x6ZXl233zRvdJrdB5Ld92yahryzhNeuc7/XVgOw19drleu+GsKu8B+mJrlm7vn67HP9miZVv368Y+rdVteKxmLsvUg+9/r/8O765dOUWVvj7cHqxhvVrqySO288jgsWzrfo3unerbXkdQkLolx1YaWEb1TlVoUJBKvV6/eb/r0LxCmJIOhaZ3NqhrcqwWb9pXocalW/frb8H+X0QYY3R1r5QqA9OGX3Iq3b+H7/8nFm9V95axys4vlpGt0n1bLqewdh2Vmt5zd725TgVuT5X3TFanpiFnj/yypqovb8qVlHrVNTlWI89ppSYRdj328eZKQ+PR3n9Y2eVk5cep1Fv9BQ90EI89OumNB8NOAyeOgA+bPmfOHN15552aNGmSVq9era5du2rAgAHau3dvoEur0e6DBQoPDdaLI3pozY6Duv7lVfrTrNUa9dJK/eOjTbq6V4rC7cG+9ku37tcDC77TtCFdJJV1nFdlHqgQpqSyjuLWvXma+PYGvzAlSR2SYirclD+6T6qe+PS3TnT35NhKL7spX2+ftAR9sTVLRSVGT157eoVLs8rrnfD2Bo3q01q5RaVVBoBlW/ere3Jstessb/PF1v3anVOo6Ysr3+byACRJRW6vRvZOVe+0eN82VtapXnrE6w7fz+XrlaRm0WE1bkNOYYlmLsvUk9dUfYZl5rJMnd+2qd+86vd3+bZnyeM1Gt0nVUUlnkrblju8YxoTHurb7vJ9UFUgKJ9f076Vys54lG9vs9iwKgPLzGWZSoiyVzhDUlJqqt7mLVm+/V6Z3MPq75uWoAK3p9r190lLqPG91Tc9QaN6pyoxKkxuT/Vnc6oKJ2t2ZqvvYcPA1vY9t2zrfk1+97s6Delf3ZCzfdMTtGZndoXayj8LR+rfvqnC7CG+v0MH8t1VvtePZgj5qh4VUX6cTokJq/b1dBCPPTrpjQfDTgMnjoAHqscee0w33nijRo0apQ4dOmjGjBkKDw/Xiy++GOjSalTqNVr+4349+enWGjtch09vGu3w/d60mk5+VfPKg8mR0w6voabLg8o77EWlHpV6qu4YL926XyHBQRUuPzpScam3xnWWz28WHVYhJJY7PAAVlJRdwtW9ZZxeGNFDF3ZoVmOn+vC6y/dz+XprU58jJEjLDm1zdeuqatuqW7ZUtr+7J8cq3BFcbfvDg3hIsO23s2iHjnNVgaA2obacIyTIt72l3qrfA8u27pfNZquwzpq+6a5un0Q5yzp1vdPi9feL28tms1W7/lJP9Wc+YpyhevQPXTVnxQ4VlHi0/Mf9VYaPysJKuReXZuqBSzv5Ojl12Z9f1DGoVPdsuqmXd9bm3a4KtY3qnao+R2xXRnqCJlzcQf/832/3hNX0frR6lqK6y8mWbd0vd6m3yv1OB/H4oJPeePB8SuDEEdBL/txut7755hvde++9vmlBQUHq37+/li+vOBhBcXGxiouLfb+7XK4KbY6nPLdHTSId1Z71GN07tcL0vKLfzk5U1/Gpal5l04+cVtPlQeUd9nB7sFw1hKXcwpIal1fT/MPb1DZ8OEKCVOD+7V6Yp645vVavK1e+n8vXW1ONMc5QLf+x7Fjm1rBPykfRK1fb/RNuLxsoQyoLE5V11g/vkPZOi9fB/N9qKd/G8rMVR76+tvu2d1q8fnUVaVdOkaSatzevqLTCOiPDqv/zEeOs/JvwPmnxijx0ieqandnanV1U4xm7mgJoXLhdzaLDNOXSTtp5oEAvLs3Uf4d3l+QfgHunxWvSJR318AcbK11Oj5Q4xYWH+oaB3Z9ffUA6cn/XNahUN+TslEs7qbj0t+d7FLg9mrNih6YN6aKiEq9f+92uIr/trOn9aPUsRU2Xk0nS/Zd20uR3v6swwhwdxOODZ8M0Lgw7DZwYAhqosrKy5PF41KxZM7/pzZo106ZNmyq0nzp1qqZMmXK8yquRq7Ck1h3Yw0WG/dY5rK7jU9W8yqYfOa2qDrf0W4e9/L/RVXR8y0U5Q/XF1iz1TU+o9Nvp3mnxvm/8q1tneZvaho+9rmK/ddY11EWGBfut91dXkfqmxVcagPukxSsqLEQvLs2U9NsZlKqEBNn8trW6/d33UA3l+9sREqRPN+/V2PPTJFXs8I89P12fbt7ru3/p8Mv/yrexqsAQW0PdjpAg3zqKSjx68P3vJUnhjur/FITbgyus81dXkd89bofrkxav5Dhnhfll9+V11s79BZq5LFNLD93vd3brys9qlItyhFT5/jv8W/ekWKdyCkt8A1SM7pPqG2TDERKkNTuzVer16r7BHVTiqb7THxNul/bmVVvXke85K0GlqmfT1aWjtW2ff53VvR+P5ixFTZeTxYXb1SYxUk/QQQwoOumNS2N7PiWAihrEoBS1de+99+rOO+/0/e5yuZScnByweqKdocorLq22zZEdrj5p8drr+u0s215Xkfoeup/pSHurCABrdmZXmH5kB6q6b+jHnp+uzbtdGnt+ujbtdql7Sly1HeNSj1ebduVo0iUdNPnd7/zalXf6y59R9N/h3WWTqm2z11VUYzjrm5agbi1j1K1ljB56/3st3bq/xpB4+GVcfdLilV9c6ltv77R4tUmM1IRLOmrKe/73RvVNT9BdF7bV6JdW+gYYKPV4q9wnvdPitXRrlkb1/u3+mfL9feS2l4/y9+pXP/n2946DhXpxaabOSm2iizuf4tfh3+sqVrNohy7s0ExNo8J8oaB8uw/fB0cGhhhnqE6NDaty3/ZNT1BKfLjuHthOn27eq2c+//HQiIrxigkLqfJ92OfQ2azykDJhcHvdM6id9rqK9cBlnTThiPv8+qTF66HLO6vA7dbUyzsrz+3xdeoko+te+FqFJR7NuuEsPbDgO724NFMXdmhW5f7OSE9Qkwi7ptXyW/cmEXbfso4cca5PWrz+eFaKmkWH1arTX3751JIavkgor6W+L6eqbUcrxunfpqrP/9Gepahufxy+/XQQA49jAADHT0CfQ+V2uxUeHq633npLl112mW/6iBEjlJ2drXfeeafa1wf6OVQ/HyzQF1uy9MH63VV2RLsd9sDSPmnxmnhJR1393Fd+o/wdzHdr+qKtfssoH+UvIcpRocNaPsrfA+9t9L3mt1H+tvlNmzC4vTq1iNHPB8ueS7XXVayzWjfRmh0H1SIuXJL097c36Jnrzqi0Y/zAZZ31308265Jup8oeFKT4SLsOFJQ9ELdFnFPf/pyjBw9/kGy7RE24pKMKDz37yl3q1Zc/+g+H/teBbVVY4qmwzX3TEzT5ko5yezwKCwmWPcimYq+Ru9SrA/lu5RaXKjU+Qg8s8B+Qo7JR/h68vLPkNdqf71aYPVjhocFatf2gpv1vk4b1bOm79yUp1qnFm37Vk59uK6svPUH3/76jcgrdig0vG3b+yH0y8rBwOGFwe3VPiVNOQYlCg20q9RpFO0MPPccqRCUerw7mu7Urp1BtEiNV4PZozGurdUZKnCb/voN27C+QkU1FJR7FOkOVHOdUcnyEdu7P1/If96t1YqS8xigh0qFJ736nb346WOlw2OXvretfWqkpl3bUzKX+A1P0TU/Qg5d10v3vfadFh428Vx5+UuIj9NP+/AojSpbP93qNcg49VywyrOyBzuXPSnOEBh96SHKposNCFBdRdvldZX51FelgvluuolLFhocowh6i3KJSFbhL1STCoQnvbKj0rNEph4b5Lh+uu6Zv3Xfsz9ffKtmWhy/vrJbxEZXWVpVd2YUVgtyR77kj6zzecgrcum32Gr8ay0cfPad1vMJCgxXjrJ+zFJXtj0BvPwAA0kn8YN9evXqpZ8+emj59uiTJ6/WqZcuWGjt2rO65555qXxvoQCWVddz2uIrLRq07rIPRNy1B91/WUcWHHuwa7QyVx+NVobtUQUFBigwre6BuTqFb0U67bJKKSsserhtmD5I9OEglHq/25bqV0iRcbo9XucVlnfQgW9nDdH3PoSoqVfih0BAcZFP+oTMC0WGhirQHK6/E43vIblhIkIo9HtmDgxUaZJPHa1RY6pW7tFRNwh1+ZxMi7MEqLC2VMyREhaVlASkuvKzWghKPitweNYmwy+3x+tVgk5SVX6zIsFCFhwYr3132wN8IR0jZYNY2KSLU/4HFkWEhCgsNkk1SiM2m/BKPCopLlRDpUJ67VKHBQSou9arI7VFcuF1ur9f3sOKI0GDlH7aNkfZgFXlLFaJgFZWW3WsS7QxVRGiwcotLVeD2KOLQfnQEB6nosIcQR9p/W1ZMeKjCQ4L99snh83/bR55DDyQOUVhIkEqNV/bgIBWVeOUqLFW447f9Uh7wIuzBCrHZ5DpUT4wzVE2jHH6d3cPDR4wzRJGOkLL6i0sVFRaqEo+Rq7BEEYeevRUcLGXnl7WNCgtV4WF1l3ekfzlYIFdRqW96dFiITj0UrKWyznJOYYlvfowz9KifWVQXtQ1MtXH4/qsp6NW1rsNDZUO5nOp4Bp36PE4AANSXkzZQzZkzRyNGjNAzzzyjnj176vHHH9cbb7yhTZs2Vbi36kgNIVBJZcOnF3vKHpCbe6gD7QwNVpAkt9erYFuQsgvdirCXPbOqyOOR8epQSPAoyGaT15Td+B/l/C0g5BaVKiosRKFBZa+PdIQoNDhIOQVuxYaXBZncQ6GiPLgc3vEv9HiUW1A2v3wZUWGhinaGVtoZzClw62C+W0GHhbKosFDFOkMVFGQ71Dn9LZwUlnjlKipRuD1YUY4QFXvKQk59d7COtvN2Inb+TsRtwtHjfQEAOJkFKhsE/B6qoUOHat++fZo4caL27Nmjbt266aOPPqoxTDUkpxz2DX9jVtM191a/3T9aR3svwIl4L8GJuE04erwvAAA4/gJ+hupoNJQzVAAAAAACK1DZIOAP9gUAAACAxopABQAAAAAWEagAAAAAwCICFQAAAABYRKACAAAAAIsIVAAAAABgEYEKAAAAACwiUAEAAACARQQqAAAAALCIQAUAAAAAFhGoAAAAAMAiAhUAAAAAWESgAgAAAACLQgJdwNEwxkiSXC5XgCsBAAAAEEjlmaA8IxwvjTpQ5ebmSpKSk5MDXAkAAACAhiA3N1cxMTHHbX02c7wjXD3yer3atWuXoqKiZLPZAlqLy+VScnKydu7cqejo6IDWgmOH43zy4FifHDjOJweO88mB43xyqO44G2OUm5urpKQkBQUdvzubGvUZqqCgILVo0SLQZfiJjo7mQ3wS4DifPDjWJweO88mB43xy4DifHKo6zsfzzFQ5BqUAAAAAAIsIVAAAAABgEYGqnjgcDk2aNEkOhyPQpeAY4jifPDjWJweO88mB43xy4DifHBricW7Ug1IAAAAAQCBxhgoAAAAALCJQAQAAAIBFBCoAAAAAsIhABQAAAAAWEajqyZNPPqlWrVopLCxMvXr10ooVKwJdEg6ZPHmybDab30+7du1884uKijRmzBjFx8crMjJSQ4YM0a+//uq3jB07dmjw4MEKDw9X06ZNNX78eJWWlvq1+eyzz3T66afL4XAoLS1NL730UoVaeJ/UnyVLluiSSy5RUlKSbDab3n77bb/5xhhNnDhRp5xyipxOp/r3768tW7b4tTlw4ICuueYaRUdHKzY2Vtdff73y8vL82qxfv159+/ZVWFiYkpOT9Y9//KNCLW+++abatWunsLAwde7cWR988EGda0HlajrOI0eOrPD5HjhwoF8bjnPDN3XqVJ155pmKiopS06ZNddlll2nz5s1+bRrS3+ra1IKKanOczzvvvAqf6VtuucWvDce5YXv66afVpUsX34N3zz77bH344Ye++SfkZ9ngqL3++uvGbrebF1980Xz33XfmxhtvNLGxsebXX38NdGkwxkyaNMl07NjR7N692/ezb98+3/xbbrnFJCcnm0WLFplVq1aZs846y5xzzjm++aWlpaZTp06mf//+Zs2aNeaDDz4wCQkJ5t577/W1+fHHH014eLi58847zcaNG8306dNNcHCw+eijj3xteJ/Urw8++MDcd999Zt68eUaSmT9/vt/8Rx55xMTExJi3337brFu3zvz+9783qampprCw0Ndm4MCBpmvXruarr74yX3zxhUlLSzPDhw/3zc/JyTHNmjUz11xzjdmwYYOZPXu2cTqd5plnnvG1WbZsmQkODjb/+Mc/zMaNG83f//53Exoaar799ts61YLK1XScR4wYYQYOHOj3+T5w4IBfG45zwzdgwAAzc+ZMs2HDBrN27Vpz0UUXmZYtW5q8vDxfm4b0t7qmWlC52hznc88919x4441+n+mcnBzffI5zw/fuu++a999/3/zwww9m8+bN5m9/+5sJDQ01GzZsMMacmJ9lAlU96NmzpxkzZozvd4/HY5KSkszUqVMDWBXKTZo0yXTt2rXSednZ2SY0NNS8+eabvmnff/+9kWSWL19ujCnr0AUFBZk9e/b42jz99NMmOjraFBcXG2OM+etf/2o6duzot+yhQ4eaAQMG+H7nfXLsHNnR9nq9pnnz5uaf//ynb1p2drZxOBxm9uzZxhhjNm7caCSZlStX+tp8+OGHxmazmV9++cUYY8xTTz1l4uLifMfZGGPuvvtu07ZtW9/vV111lRk8eLBfPb169TI333xzrWtB7VQVqC699NIqX8Nxbpz27t1rJJnPP//cGNOw/lbXphbUzpHH2ZiyQHX77bdX+RqOc+MUFxdnnn/++RP2s8wlf0fJ7Xbrm2++Uf/+/X3TgoKC1L9/fy1fvjyAleFwW7ZsUVJSklq3bq1rrrlGO3bskCR98803Kikp8Tt+7dq1U8uWLX3Hb/ny5ercubOaNWvmazNgwAC5XC599913vjaHL6O8TfkyeJ8cX5mZmdqzZ4/f/o6JiVGvXr38jmtsbKx69Ojha9O/f38FBQXp66+/9rXJyMiQ3W73tRkwYIA2b96sgwcP+tpUd+xrUwuOzmeffaamTZuqbdu2uvXWW7V//37fPI5z45STkyNJatKkiaSG9be6NrWgdo48zuVmzZqlhIQEderUSffee68KCgp88zjOjYvH49Hrr7+u/Px8nX322SfsZzmkTq1RQVZWljwej99Bl6RmzZpp06ZNAaoKh+vVq5deeukltW3bVrt379aUKVPUt29fbdiwQXv27JHdbldsbKzfa5o1a6Y9e/ZIkvbs2VPp8S2fV10bl8ulwsJCHTx4kPfJcVR+XCrb34cfs6ZNm/rNDwkJUZMmTfzapKamVlhG+by4uLgqj/3hy6ipFlg3cOBAXXHFFUpNTdW2bdv0t7/9TYMGDdLy5csVHBzMcW6EvF6v7rjjDvXu3VudOnWSpAb1t7o2taBmlR1nSbr66quVkpKipKQkrV+/Xnfffbc2b96sefPmSeI4Nxbffvutzj77bBUVFSkyMlLz589Xhw4dtHbt2hPys0ygwglv0KBBvn936dJFvXr1UkpKit544w05nc4AVgbgaA0bNsz3786dO6tLly5q06aNPvvsM/Xr1y+AlcGqMWPGaMOGDVq6dGmgS8ExVNVxvummm3z/7ty5s0455RT169dP27ZtU5s2bY53mbCobdu2Wrt2rXJycvTWW29pxIgR+vzzzwNd1jHDJX9HKSEhQcHBwRVGBPn111/VvHnzAFWF6sTGxuq0007T1q1b1bx5c7ndbmVnZ/u1Ofz4NW/evNLjWz6vujbR0dFyOp28T46z8n1a3f5u3ry59u7d6ze/tLRUBw4cqJdjf/j8mmpB/WndurUSEhK0detWSRznxmbs2LFasGCBPv30U7Vo0cI3vSH9ra5NLaheVce5Mr169ZIkv880x7nhs9vtSktL0xlnnKGpU6eqa9eu+s9//nPCfpYJVEfJbrfrjDPO0KJFi3zTvF6vFi1apLPPPjuAlaEqeXl52rZtm0455RSdccYZCg0N9Tt+mzdv1o4dO3zH7+yzz9a3337r1ylbuHChoqOj1aFDB1+bw5dR3qZ8GbxPjq/U1FQ1b97cb3+7XC59/fXXfsc1Oztb33zzja/N4sWL5fV6ff8DP/vss7VkyRKVlJT42ixcuFBt27ZVXFycr011x742taD+/Pzzz9q/f79OOeUUSRznxsIYo7Fjx2r+/PlavHhxhUswG9Lf6trUgsrVdJwrs3btWkny+0xznBsfr9er4uLiE/ezXKchLFCp119/3TgcDvPSSy+ZjRs3mptuusnExsb6jU6CwPnLX/5iPvvsM5OZmWmWLVtm+vfvbxISEszevXuNMWVDZrZs2dIsXrzYrFq1ypx99tnm7LPP9r2+fPjOCy+80Kxdu9Z89NFHJjExsdLhO8ePH2++//578+STT1Y6fCfvk/qTm5tr1qxZY9asWWMkmccee8ysWbPG/PTTT8aYsiGsY2NjzTvvvGPWr19vLr300kqHTe/evbv5+uuvzdKlS016errfcNrZ2dmmWbNm5o9//KPZsGGDef311014eHiF4bRDQkLMo48+ar7//nszadKkSofTrqkWVK6645ybm2vuuusus3z5cpOZmWk++eQTc/rpp5v09HRTVFTkWwbHueG79dZbTUxMjPnss8/8hssuKCjwtWlIf6trqgWVq+k4b9261dx///1m1apVJjMz07zzzjumdevWJiMjw7cMjnPDd88995jPP//cZGZmmvXr15t77rnH2Gw28/HHHxtjTszPMoGqnkyfPt20bNnS2O1207NnT/PVV18FuiQcMnToUHPKKacYu91uTj31VDN06FCzdetW3/zCwkLzpz/9ycTFxZnw8HBz+eWXm927d/stY/v27WbQoEHG6XSahIQE85e//MWUlJT4tfn0009Nt27djN1uN61btzYzZ86sUAvvk/rz6aefGkkVfkaMGGGMKRvGesKECaZZs2bG4XCYfv36mc2bN/stY//+/Wb48OEmMjLSREdHm1GjRpnc3Fy/NuvWrTN9+vQxDofDnHrqqeaRRx6pUMsbb7xhTjvtNGO3203Hjh3N+++/7ze/NrWgctUd54KCAnPhhReaxMREExoaalJSUsyNN95Y4UsKjnPDV9kxluT3d7Qh/a2uTS2oqKbjvGPHDpORkWGaNGliHA6HSUtLM+PHj/d7DpUxHOeGbvTo0SYlJcXY7XaTmJho+vXr5wtTxpyYn2WbMcbU7ZwWAAAAAEDiHioAAAAAsIxABQAAAAAWEagAAAAAwCICFQAAAABYRKACAAAAAIsIVAAAAABgEYEKAAAAACwiUAEAAACARQQqAECjZLPZ9Pbbb9f7clu1aqXHH3+83pcLADgxEagAANVavny5goODNXjw4Dq/NpDhZOTIkbLZbLLZbLLb7UpLS9P999+v0tLSal+3cuVK3XTTTcepSgBAY0egAgBU64UXXtBtt92mJUuWaNeuXYEup04GDhyo3bt3a8uWLfrLX/6iyZMn65///Gelbd1utyQpMTFR4eHhx7NMAEAjRqACAFQpLy9Pc+bM0a233qrBgwfrpZdeqtDmvffe05lnnqmwsDAlJCTo8ssvlySdd955+umnn/TnP//Zd6ZIkiZPnqxu3br5LePxxx9Xq1atfL+vXLlSv/vd75SQkKCYmBide+65Wr16dZ3rdzgcat68uVJSUnTrrbeqf//+evfddyWVncG67LLL9NBDDykpKUlt27aVVPGsWnZ2tm6++WY1a9ZMYWFh6tSpkxYsWOCbv3TpUvXt21dOp1PJyckaN26c8vPzffOfeuoppaenKywsTM2aNdOVV15Z5+0AADRcBCoAQJXeeOMNtWvXTm3bttW1116rF198UcYY3/z3339fl19+uS666CKtWbNGixYtUs+ePSVJ8+bNU4sWLXT//fdr9+7d2r17d63Xm5ubqxEjRmjp0qX66quvlJ6erosuuki5ublHtT1Op9N3JkqSFi1apM2bN2vhwoV+Iamc1+vVoEGDtGzZMr366qvauHGjHnnkEQUHB0uStm3bpoEDB2rIkCFav3695syZo6VLl2rs2LGSpFWrVmncuHG6//77tXnzZn300UfKyMg4qm0AADQsIYEuAADQcL3wwgu69tprJZVdPpeTk6PPP/9c5513niTpoYce0rBhwzRlyhTfa7p27SpJatKkiYKDgxUVFaXmzZvXab0XXHCB3+/PPvusYmNj9fnnn+viiy+u83YYY7Ro0SL973//02233eabHhERoeeff152u73S133yySdasWKFvv/+e5122mmSpNatW/vmT506Vddcc43uuOMOSVJ6err++9//6txzz9XTTz+tHTt2KCIiQhdffLGioqKUkpKi7t2717l+AEDDxRkqAEClNm/erBUrVmj48OGSpJCQEA0dOlQvvPCCr83atWvVr1+/el/3r7/+qhtvvFHp6emKiYlRdHS08vLytGPHjjotZ8GCBYqMjFRYWJgGDRqkoUOHavLkyb75nTt3rjJMSWXb16JFC1+YOtK6dev00ksvKTIy0vczYMAAeb1eZWZm6ne/+51SUlLUunVr/fGPf9SsWbNUUFBQp20AADRsnKECAFTqhRdeUGlpqZKSknzTjDFyOBx64oknFBMTI6fTWeflBgUF+V02KEklJSV+v48YMUL79+/Xf/7zH6WkpMjhcOjss8/2u1yvNs4//3w9/fTTstvtSkpKUkiI///2IiIiqn19TduXl5enm2++WePGjaswr2XLlrLb7Vq9erU+++wzffzxx5o4caImT56slStXKjY2tk7bAgBomDhDBQCooLS0VK+88or+9a9/ae3atb6fdevWKSkpSbNnz5YkdenSRYsWLapyOXa7XR6Px29aYmKi9uzZ4xeq1q5d69dm2bJlGjdunC666CJ17NhRDodDWVlZdd6OiIgIpaWlqWXLlhXCVG106dJFP//8s3744YdK559++unauHGj0tLSKvyUn/kKCQlR//799Y9//EPr16/X9u3btXjx4jrXAgBomDhDBQCoYMGCBTp48KCuv/56xcTE+M0bMmSIXnjhBd1yyy2aNGmS+vXrpzZt2mjYsGEqLS3VBx98oLvvvltS2Yh5S5Ys0bBhw+RwOJSQkKDzzjtP+/bt0z/+8Q9deeWV+uijj/Thhx8qOjrat4709HT93//9n3r06CGXy6Xx48dbOht2tM4991xlZGRoyJAheuyxx5SWlqZNmzbJZrNp4MCBuvvuu3XWWWdp7NixuuGGGxQREaGNGzdq4cKFeuKJJ7RgwQL9+OOPysjIUFxcnD744AN5vV7fiIIAgMaPM1QAgApeeOEF9e/fv0KYksoC1apVq7R+/Xqdd955evPNN/Xuu++qW7duuuCCC7RixQpf2/vvv1/bt29XmzZtlJiYKElq3769nnrqKT355JPq2rWrVqxYobvuuqvC+g8ePKjTTz9df/zjHzVu3Dg1bdr02G50FebOnaszzzxTw4cPV4cOHfTXv/7Vd9atS5cu+vzzz/XDDz+ob9++6t69uyZOnOi7TDI2Nlbz5s3TBRdcoPbt22vGjBmaPXu2OnbsGJBtAQDUP5s58kJ2AAAAAECtcIYKAAAAACwiUAEAAACARQQqAAAAALCIQAUAAAAAFhGoAAAAAMAiAhUAAAAAWESgAgAAAACLCFQAAAAAYBGBCgAAAAAsIlABAAAAgEUEKgAAAACw6P8BjODgZfDjylkAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Визуализация результатов для задачи регрессии\n", "plt.figure(figsize=(10, 6))\n", "sns.scatterplot(x=y_test_reg, y=y_pred_reg)\n", "plt.xlabel('Actual Prices')\n", "plt.ylabel('Predicted Prices')\n", "plt.title('Actual vs Predicted Prices')\n", "plt.show()\n", "\n", "# Визуализация результатов для задачи классификации\n", "conf_matrix = confusion_matrix(y_test_class, y_pred_class)\n", "sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')\n", "plt.xlabel('Predicted')\n", "plt.ylabel('Actual')\n", "plt.title('Confusion Matrix')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1) Плохое качество предсказаний в первой диаграмме: \n", "Модель регрессии плохо предсказывает цены автомобилей, так как точки на диаграмме рассеяния распределены хаотично и далеко от диагонали. Значительные ошибки: Ошибки предсказаний значительны, что указывает на то, что модель не может точно предсказать цены автомобилей. Необходимость улучшения модели: Для улучшения качества предсказаний стоит рассмотреть другие модели, такие как градиентный бустинг или нейронные сети, а также улучшить предобработку данных.\n", "\n", "2) Выводы по второй диаграмме:\n", "Хорошее качество классификации: Матрица ошибок показывает высокие значения на диагонали и низкие значения вне диагонали, что указывает на хорошее качество классификации.\n", "Правильные предсказания: Большинство предсказаний модели являются правильными, что говорит о ее способности хорошо различать классы.\n", "Низкие ошибки: Низкие значения вне диагонали указывают на то, что модель допускает мало ошибок при классификации." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.5" } }, "nbformat": 4, "nbformat_minor": 2 }