From 29a6fcc40490c79271677683122af1da88a4a1a4 Mon Sep 17 00:00:00 2001 From: GokaPek Date: Sat, 2 Nov 2024 00:25:32 +0400 Subject: [PATCH] 4 --- lab_4/lab4.ipynb | 876 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 876 insertions(+) create mode 100644 lab_4/lab4.ipynb diff --git a/lab_4/lab4.ipynb b/lab_4/lab4.ipynb new file mode 100644 index 0000000..7eff299 --- /dev/null +++ b/lab_4/lab4.ipynb @@ -0,0 +1,876 @@ +{ + "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+OPPw7w1gEAAABoiE6YQPXZZ5/p/PPPrzB9xIgReumll1RSUqIHH3xQr7zyin755RclJCTorLPO0pQpU9S5c2dJ0q5du3Tbbbfp448/VkREhAYNGqR//etfatKkyfHeHAAAAACNwAkTqAAAAADgeDtpnkMFAAAAAPWNQAUAAAAAFjXqUf68Xq927dqlqKgo2Wy2QJcDAAAAIECMMcrNzVVSUpKCgo7feaNGHah27dql5OTkQJcBAAAAoIHYuXOnWrRocdzW16gDVVRUlKSynRYdHR3gagAAAAAEisvlUnJysi8jHC+NOlCVX+YXHR1NoAIAAABw3G8FYlAKAAAAALCIQAUAAAAAFhGoAAAAAMAiAhUAAAAAWESgAgAAAACLCFQAAAAAYBGBCgAAAAAsIlABAAAAgEUEKgAAAACwiEAFAAAAABYRqAAAAADAIgIVAAAAAFhEoAIAAAAAiwhUAAAAAGBRSKALOFnkFLiVleeWq6hE0c5QJUTYFRNuD3RZAAAAAI4Cgeo42JVdqLvnrtcXW7J80zLSE/TIkC5KinUGsDIAAAAAR4NL/o6xnAJ3hTAlSUu2ZOmeueuVU+AOUGUAAAAAjhaB6hjLynNXCFPllmzJUlYegQoAAABorAhUx5irqKTa+bk1zAcAAADQcBGojrHosNBq50fVMB8AAABAw0WgOsYSIu3KSE+odF5GeoISIhnpDwAAAGisCFTHWEy4XY8M6VIhVGWkJ2jakC4MnQ4AAAA0YgybfhwkxTo1fXh3ZeW5lVtUoqiwUCVE8hwqAAAAoLEjUB0nMeEEKAAAAOBEwyV/AAAAAGARgQoAAAAALCJQAQAAAIBFBCoAAAAAsIhABQAAAAAWEagAAAAAwCICFQAAAABYRKACAAAAAIsIVAAAAABgEYEKAAAAACwiUAEAAACARQQqAAAAALCIQAUAAAAAFhGoAAAAAMAiAhUAAAAAWESgAgAAAACLCFQAAAAAYBGBCgAAAAAsIlABAAAAgEUEKgAAAACwiEAFAAAAABYRqAAAAADAIgIVAAAAAFhEoAIAAAAAiwhUAAAAAGARgQoAAAAALCJQAQAAAIBFBCoAAAAAsIhABQAAAAAWBTRQeTweTZgwQampqXI6nWrTpo0eeOABGWMCWRYAAAAA1EpIIFc+bdo0Pf3003r55ZfVsWNHrVq1SqNGjVJMTIzGjRsXyNIAAAAAoEYBDVRffvmlLr30Ug0ePFiS1KpVK82ePVsrVqwIZFkAAAAAUCsBveTvnHPO0aJFi/TDDz9IktatW6elS5dq0KBBlbYvLi6Wy+Xy+wEAAACAQAnoGap77rlHLpdL7dq1U3BwsDwejx566CFdc801lbafOnWqpkyZcpyrBAAAAIDKBfQM1RtvvKFZs2bptdde0+rVq/Xyyy/r0Ucf1csvv1xp+3vvvVc5OTm+n507dx7nigEAAADgNzYTwCH1kpOTdc8992jMmDG+aQ8++KBeffVVbdq0qcbXu1wuxcTEKCcnR9HR0ceyVAAAAAANWKCyQUDPUBUUFCgoyL+E4OBgeb3eAFUEAAAAALUX0HuoLrnkEj300ENq2bKlOnbsqDVr1uixxx7T6NGjA1kWAAAAANRKQC/5y83N1YQJEzR//nzt3btXSUlJGj58uCZOnCi73V7j67nkDwAAAIAUuGwQ0EB1tAhUAAAAAKST9B4qAAAAAGjMCFQAAAAAYBGBCgAAAAAsIlABAAAAgEUEKgAAAACwiEAFAAAAABYRqAAAAADAIgIVAAAAAFhEoAIAAAAAiwhUAAAAAGARgQoAAAAALCJQAQAAAIBFBCoAAAAAsIhABQAAAAAWEagAAAAAwCICFQAAAABYRKACAAAAAIsIVAAAAABgEYEKAAAAACwiUAEAAACARQQqAAAAALCIQAUAAAAAFhGoAAAAAMAiAhUAAAAAWESgAgAAAACLCFQAAAAAYBGBCgAAAAAsIlABAAAAgEUEKgAAAACwiEAFAAAAABYRqAAAAADAIgIVAAAAAFhEoAIAAAAAiwhUAAAAAGARgQoAAAAALCJQAQAAAIBFBCoAAAAAsIhABQAAAAAWEagAAAAAwCICFQAAAABYRKACAAAAAIsIVAAAAABgEYEKAAAAACwiUAEAAACARQQqAAAAALCIQAUAAAAAFhGoAAAAAMAiAhUAAAAAWESgAgAAAACLCFQAAAAAYBGBCgAAAAAsIlABAAAAgEUEKgAAAACwiEAFAAAAABYRqAAAAADAIgIVAAAAAFhEoAIAAAAAiwhUAAAAAGARgQoAAAAALCJQAQAAAIBFBCoAAAAAsIhABQAAAAAWEagAAAAAwCICFQAAAABYRKACAAAAAIsIVAAAAABgEYEKAAAAACwiUAEAAACARQQqAAAAALCIQAUAAAAAFhGoAAAAAMAiAhUAAAAAWESgAgAAAACLCFQAAAAAYBGBCgAAAAAsIlABAAAAgEUEKgAAAACwiEAFAAAAABYRqAAAAADAIgIVAAAAAFhEoAIAAAAAiwhUAAAAAGARgQoAAAAALCJQAQAAAIBFAQ9Uv/zyi6699lrFx8fL6XSqc+fOWrVqVaDLAgAAAIAahQRy5QcPHlTv3r11/vnn68MPP1RiYqK2bNmiuLi4QJYFAAAAALUS0EA1bdo0JScna+bMmb5pqampAawIAAAAAGovoJf8vfvuu+rRo4f+8Ic/qGnTpurevbuee+65KtsXFxfL5XL5/QAAAABAoAQ0UP344496+umnlZ6erv/973+69dZbNW7cOL388suVtp86dapiYmJ8P8nJyce5YgAAAAD4jc0YYwK1crvdrh49eujLL7/0TRs3bpxWrlyp5cuXV2hfXFys4uJi3+8ul0vJycnKyclRdHT0cakZAAAAQMPjcrkUExNz3LNBQM9QnXLKKerQoYPftPbt22vHjh2Vtnc4HIqOjvb7AQAAAIBACWig6t27tzZv3uw37YcfflBKSkqAKgIAAACA2gtooPrzn/+sr776Sg8//LC2bt2q1157Tc8++6zGjBkTyLIAAAAAoFYCGqjOPPNMzZ8/X7Nnz1anTp30wAMP6PHHH9c111wTyLIAAAAAoFYCOijF0QrUjWcAAAAAGpaTclAKAAAAAGjMCFQAAAAAYBGBCgAAAAAsIlABAAAAgEUEKgAAAACwiEAFAAAAABYRqAAAAADAIgIVAAAAAFhEoAIAAAAAiwhUAAAAAGARgQoAAAAALCJQAQAAAIBFBCoAAAAAsIhABQAAAAAWEagAAAAAwKJ6CVTZ2dn1sRgAAAAAaFTqHKimTZumOXPm+H6/6qqrFB8fr1NPPVXr1q2r1+IAAAAAoCGrc6CaMWOGkpOTJUkLFy7UwoUL9eGHH2rQoEEaP358vRcIAAAAAA1VSF1fsGfPHl+gWrBgga666ipdeOGFatWqlXr16lXvBQIAAABAQ1XnM1RxcXHauXOnJOmjjz5S//79JUnGGHk8nvqtDgAAAAAasDqfobriiit09dVXKz09Xfv379egQYMkSWvWrFFaWlq9FwgAAAAADVWdA9W///1vtWrVSjt37tQ//vEPRUZGSpJ2796tP/3pT/VeIAAAAAA0VDZjjAl0EVa5XC7FxMQoJydH0dHRgS4HAAAAQIAEKhtYeg7V//3f/6lPnz5KSkrSTz/9JEl6/PHH9c4779RrcQAAAADQkNU5UD399NO68847NWjQIGVnZ/sGooiNjdXjjz9e3/UBAAAAQINV50A1ffp0Pffcc7rvvvsUHBzsm96jRw99++239VocAAAAADRkdQ5UmZmZ6t69e4XpDodD+fn59VIUAAAAADQGdQ5UqampWrt2bYXpH330kdq3b18fNQEAAABAo1DnYdPvvPNOjRkzRkVFRTLGaMWKFZo9e7amTp2q559//ljUCAAAAAANUp0D1Q033CCn06m///3vKigo0NVXX62kpCT95z//0bBhw45FjQAAAADQIB3Vc6gKCgqUl5enpk2b1mdNtcZzqAAAAABIgcsGdT5DlZmZqdLSUqWnpys8PFzh4eGSpC1btig0NFStWrWq7xoBAAAAoEGq86AUI0eO1Jdffllh+tdff62RI0fWR00AAAAA0CjUOVCtWbNGvXv3rjD9rLPOqnT0PwAAAAA4UdU5UNlsNuXm5laYnpOTI4/HUy9FAQAAAEBjUOdAlZGRoalTp/qFJ4/Ho6lTp6pPnz71WhwAAAAANGR1HpRi2rRpysjIUNu2bdW3b19J0hdffCGXy6XFixfXe4EAAAAA0FDV+QxVhw4dtH79el111VXau3evcnNzdd1112nTpk3q1KnTsagRAAAAABqko3oOVaDxHCoAAAAAUgN/DtX69evVqVMnBQUFaf369dW27dKlS70UBgAAAAANXa0CVbdu3bRnzx41bdpU3bp1k81mU2Untmw2GyP9AQAAADhp1CpQZWZmKjEx0fdvAAAAAEAtA1VKSookqaSkRFOmTNGECROUmpp6TAsDAAAAgIauTqP8hYaGau7cuceqFgAAAABoVOo8bPpll12mt99++xiUAgAAAACNS50f7Juenq77779fy5Yt0xlnnKGIiAi/+ePGjau34gAAAACgIavzc6iqu3fKZrPpxx9/POqiaovnUAEAAACQGvhzqA7HKH8AAAAAUKZOgeqrr77Se++9J7fbrX79+mngwIHHqi4AAAAAaPBqHajeeustDR06VE6nU6GhoXrsscc0bdo03XXXXceyPgAAAABosGo9yt/UqVN14403KicnRwcPHtSDDz6ohx9++FjWBgAAAAANWq0HpYiM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W1A2v3wZUWGhinaGVtoZzClw62C+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 +}