diff --git a/lab_4/laba4.ipynb b/lab_4/laba4.ipynb new file mode 100644 index 0000000..ba34768 --- /dev/null +++ b/lab_4/laba4.ipynb @@ -0,0 +1,1381 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "df = pd.read_csv(\"..//static//csv//car_price_prediction.csv\", sep=\",\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
IDPriceLevyManufacturerModelProd. yearCategoryLeather interiorFuel typeEngine volumeMileageCylindersGear box typeDrive wheelsDoorsWheelColorAirbags
045654403133281399LEXUSRX 4502010JeepYesHybrid3.5186005 km6.0Automatic4x404-MayLeft wheelSilver12
144731507166211018CHEVROLETEquinox2011JeepNoPetrol3192000 km6.0Tiptronic4x404-MayLeft wheelBlack8
2457744198467-HONDAFIT2006HatchbackNoPetrol1.3200000 km4.0VariatorFront04-MayRight-hand driveBlack2
3457691853607862FORDEscape2011JeepYesHybrid2.5168966 km4.0Automatic4x404-MayLeft wheelWhite0
44580926311726446HONDAFIT2014HatchbackYesPetrol1.391901 km4.0AutomaticFront04-MayLeft wheelSilver4
\n", + "
" + ], + "text/plain": [ + " 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 " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Бизнес-цели\n", + "- **Задача регрессии**: Построить модель для предсказания цены автомобиля (`Price`) на основе его характеристик.\n", + "- **Задача классификации**: Определить категорию автомобиля (`Category`) по характеристикам." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ввиду того что я первый раз обучаю модель прогнозируемое качество предсказания - не выше 50 %" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "ID int64\n", + "Price int64\n", + "Levy object\n", + "Manufacturer object\n", + "Model object\n", + "Prod. year int64\n", + "Category object\n", + "Leather interior object\n", + "Fuel type object\n", + "Engine volume object\n", + "Mileage object\n", + "Cylinders float64\n", + "Gear box type object\n", + "Drive wheels object\n", + "Doors object\n", + "Wheel object\n", + "Color object\n", + "Airbags int64\n", + "dtype: object" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.dtypes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# небольшая обработка данных" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "Q1 = df['Price'].quantile(0.25)\n", + "Q3 = df['Price'].quantile(0.75)\n", + "IQR = Q3 - Q1\n", + "df = df[(df['Price'] >= Q1 - 1.5 * IQR) & (df['Price'] <= Q3 + 1.5 * IQR)]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "df['Levy']=pd.to_numeric(df['Levy'],errors='coerce')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "df['Mileage'] = df['Mileage'].str.replace(' km', '').str.replace(',', '')\n", + "df['Mileage'] = df['Mileage'].astype(int)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "import re\n", + "\n", + "df['Engine volume'] = df['Engine volume'].apply(lambda x: float(re.match(r'\\d+(\\.\\d+)?', x).group()) if isinstance(x, str) else x)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "df.drop_duplicates(inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Разделим данные на признаки и целевые переменные\n", + "X = df.drop(columns=['Price','ID']) # Признаки\n", + "y = df['Price'] # Целевая переменная для регрессии" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# наполняем пайплайн обработчиками" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.impute import SimpleImputer\n", + "from sklearn.preprocessing import StandardScaler, OneHotEncoder\n", + "\n", + "# Определение числовых и категориальных столбцов\n", + "numeric_features = ['Prod. year', 'Engine volume', 'Mileage', 'Cylinders', 'Airbags']\n", + "categorical_features = ['Manufacturer', 'Model', 'Category', 'Fuel type', \n", + " 'Gear box type', 'Drive wheels', 'Doors', \n", + " 'Wheel', 'Color']\n", + "\n", + "# Обработка числовых данных\n", + "numeric_transformer = Pipeline(steps=[\n", + " ('imputer', SimpleImputer(strategy='median')), # Заполнение пропусков медианой\n", + " ('scaler', StandardScaler()) # Нормализация данных\n", + "])\n", + "\n", + "# Обработка категориальных данных\n", + "categorical_transformer = Pipeline(steps=[\n", + " ('imputer', SimpleImputer(strategy='most_frequent')), # Заполнение пропусков модой\n", + " ('onehot', OneHotEncoder(handle_unknown='ignore')) # Преобразование в One-Hot Encoding\n", + "])\n", + "\n", + "# Комбинированный трансформер\n", + "preprocessor = ColumnTransformer(\n", + " transformers=[\n", + " ('num', numeric_transformer, numeric_features), # Применяем числовую обработку\n", + " ('cat', categorical_transformer, categorical_features) # Применяем категориальную обработку\n", + " ]\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Transformed feature shape: (17869, 1610)\n" + ] + } + ], + "source": [ + "X_transformed = preprocessor.fit_transform(X)\n", + "\n", + "print(f\"Transformed feature shape: {X_transformed.shape}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# посмотрим результат пайплайна" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Prod. yearEngine volumeMileageCylindersAirbagsManufacturer_ACURAManufacturer_ALFA ROMEOManufacturer_AUDIManufacturer_BMWManufacturer_BUICK...Color_GreenColor_GreyColor_OrangeColor_PinkColor_PurpleColor_RedColor_SilverColor_Sky blueColor_WhiteColor_Yellow
0-0.1170711.427610-0.0290001.2561011.2550220.00.00.00.00.0...0.00.00.00.00.00.01.00.00.00.0
10.0608610.844069-0.0288811.2561010.3302200.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
2-0.828800-1.139970-0.028722-0.470989-1.0569830.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
30.0608610.260528-0.029340-0.470989-1.5193840.00.00.00.00.0...0.00.00.00.00.00.00.00.01.00.0
40.594657-1.139970-0.030874-0.470989-0.5945820.00.00.00.00.0...0.00.00.00.00.00.01.00.00.00.0
..................................................................
17864-2.074326-0.323013-0.026730-0.470989-0.3633820.00.00.00.00.0...0.00.00.00.00.00.01.00.00.00.0
178650.0608610.143820-0.029486-0.4709890.3302200.00.00.00.00.0...0.00.00.00.00.01.00.00.00.00.0
17866-0.117071-0.323013-0.030387-0.470989-0.5945820.00.00.00.00.0...0.01.00.00.00.00.00.00.00.00.0
17867-0.650868-0.323013-0.031684-0.470989-0.5945820.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
178680.2387930.143820-0.028982-0.4709891.2550220.00.00.00.00.0...0.00.00.00.00.00.00.00.01.00.0
\n", + "

17869 rows × 1610 columns

\n", + "
" + ], + "text/plain": [ + " Prod. year Engine volume Mileage Cylinders Airbags \\\n", + "0 -0.117071 1.427610 -0.029000 1.256101 1.255022 \n", + "1 0.060861 0.844069 -0.028881 1.256101 0.330220 \n", + "2 -0.828800 -1.139970 -0.028722 -0.470989 -1.056983 \n", + "3 0.060861 0.260528 -0.029340 -0.470989 -1.519384 \n", + "4 0.594657 -1.139970 -0.030874 -0.470989 -0.594582 \n", + "... ... ... ... ... ... \n", + "17864 -2.074326 -0.323013 -0.026730 -0.470989 -0.363382 \n", + "17865 0.060861 0.143820 -0.029486 -0.470989 0.330220 \n", + "17866 -0.117071 -0.323013 -0.030387 -0.470989 -0.594582 \n", + "17867 -0.650868 -0.323013 -0.031684 -0.470989 -0.594582 \n", + "17868 0.238793 0.143820 -0.028982 -0.470989 1.255022 \n", + "\n", + " Manufacturer_ACURA Manufacturer_ALFA ROMEO Manufacturer_AUDI \\\n", + "0 0.0 0.0 0.0 \n", + "1 0.0 0.0 0.0 \n", + "2 0.0 0.0 0.0 \n", + "3 0.0 0.0 0.0 \n", + "4 0.0 0.0 0.0 \n", + "... ... ... ... \n", + "17864 0.0 0.0 0.0 \n", + "17865 0.0 0.0 0.0 \n", + "17866 0.0 0.0 0.0 \n", + "17867 0.0 0.0 0.0 \n", + "17868 0.0 0.0 0.0 \n", + "\n", + " Manufacturer_BMW Manufacturer_BUICK ... Color_Green Color_Grey \\\n", + "0 0.0 0.0 ... 0.0 0.0 \n", + "1 0.0 0.0 ... 0.0 0.0 \n", + "2 0.0 0.0 ... 0.0 0.0 \n", + "3 0.0 0.0 ... 0.0 0.0 \n", + "4 0.0 0.0 ... 0.0 0.0 \n", + "... ... ... ... ... ... \n", + "17864 0.0 0.0 ... 0.0 0.0 \n", + "17865 0.0 0.0 ... 0.0 0.0 \n", + "17866 0.0 0.0 ... 0.0 1.0 \n", + "17867 0.0 0.0 ... 0.0 0.0 \n", + "17868 0.0 0.0 ... 0.0 0.0 \n", + "\n", + " Color_Orange Color_Pink Color_Purple Color_Red Color_Silver \\\n", + "0 0.0 0.0 0.0 0.0 1.0 \n", + "1 0.0 0.0 0.0 0.0 0.0 \n", + "2 0.0 0.0 0.0 0.0 0.0 \n", + "3 0.0 0.0 0.0 0.0 0.0 \n", + "4 0.0 0.0 0.0 0.0 1.0 \n", + "... ... ... ... ... ... \n", + "17864 0.0 0.0 0.0 0.0 1.0 \n", + "17865 0.0 0.0 0.0 1.0 0.0 \n", + "17866 0.0 0.0 0.0 0.0 0.0 \n", + "17867 0.0 0.0 0.0 0.0 0.0 \n", + "17868 0.0 0.0 0.0 0.0 0.0 \n", + "\n", + " Color_Sky blue Color_White Color_Yellow \n", + "0 0.0 0.0 0.0 \n", + "1 0.0 0.0 0.0 \n", + "2 0.0 0.0 0.0 \n", + "3 0.0 1.0 0.0 \n", + "4 0.0 0.0 0.0 \n", + "... ... ... ... \n", + "17864 0.0 0.0 0.0 \n", + "17865 0.0 0.0 0.0 \n", + "17866 0.0 0.0 0.0 \n", + "17867 0.0 0.0 0.0 \n", + "17868 0.0 1.0 0.0 \n", + "\n", + "[17869 rows x 1610 columns]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Получим имена категориальных признаков после OneHotEncoder\n", + "categorical_feature_names = preprocessor.named_transformers_['cat']['onehot'].get_feature_names_out(categorical_features)\n", + "\n", + "# Объединим их с именами числовых признаков\n", + "feature_names = list(numeric_features) + list(categorical_feature_names)\n", + "\n", + "# Создадим DataFrame для преобразованных данных\n", + "X_transformed_df = pd.DataFrame(X_transformed.toarray() if hasattr(X_transformed, 'toarray') else X_transformed, columns=feature_names)\n", + "\n", + "# Выведем пример 5 строк\n", + "X_transformed_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# обучим 3 разные модели с применением RandomizedSearchCV(для подора гиперпараметров)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training LinearRegression...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\МИИ\\AIM-PIbd-31-Kouvshinoff-T-A\\laba\\Lib\\site-packages\\sklearn\\model_selection\\_search.py:320: UserWarning: The total space of parameters 1 is smaller than n_iter=10. Running 1 iterations. For exhaustive searches, use GridSearchCV.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training RandomForestRegressor...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\МИИ\\AIM-PIbd-31-Kouvshinoff-T-A\\laba\\Lib\\site-packages\\sklearn\\model_selection\\_search.py:320: UserWarning: The total space of parameters 9 is smaller than n_iter=10. Running 9 iterations. For exhaustive searches, use GridSearchCV.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training GradientBoostingRegressor...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\МИИ\\AIM-PIbd-31-Kouvshinoff-T-A\\laba\\Lib\\site-packages\\numpy\\ma\\core.py:2881: RuntimeWarning: invalid value encountered in cast\n", + " _data = np.array(data, dtype=dtype, copy=copy,\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Model: LinearRegression\n", + "Best Params: {}\n", + "MAE: 6722.0902357642335\n", + "RMSE: 8991.273616765677\n", + "R2: 0.3722951567248176\n", + "\n", + "Model: RandomForestRegressor\n", + "Best Params: {'model__n_estimators': 200, 'model__max_depth': None}\n", + "MAE: 3568.360497561258\n", + "RMSE: 6055.406570308487\n", + "R2: 0.7152920023310496\n", + "\n", + "Model: GradientBoostingRegressor\n", + "Best Params: {'model__n_estimators': 200, 'model__max_depth': 10, 'model__learning_rate': 0.2}\n", + "MAE: 3933.35109066405\n", + "RMSE: 6171.208466996527\n", + "R2: 0.7042985281049783\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn.ensemble import RandomForestRegressor\n", + "from sklearn.ensemble import GradientBoostingRegressor\n", + "from sklearn.model_selection import GridSearchCV, RandomizedSearchCV\n", + "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n", + "import matplotlib.pyplot as plt\n", + "\n", + "random_state = 42\n", + "\n", + "# Модели и параметры\n", + "models_regression = {\n", + " \"LinearRegression\": LinearRegression(),\n", + " \"RandomForestRegressor\": RandomForestRegressor(random_state=random_state),\n", + " \"GradientBoostingRegressor\": GradientBoostingRegressor(random_state=random_state)\n", + "}\n", + "\n", + "param_grids_regression = {\n", + " \"LinearRegression\": {},\n", + " \"RandomForestRegressor\": {\n", + " 'model__n_estimators': [50, 100, 200],\n", + " 'model__max_depth': [None, 10, 20],\n", + " },\n", + " \"GradientBoostingRegressor\": {\n", + " 'model__n_estimators': [50, 100, 200],\n", + " 'model__learning_rate': [0.01, 0.1, 0.2],\n", + " 'model__max_depth': [3, 5, 10]\n", + " }\n", + "}\n", + "\n", + "# Результаты\n", + "results_regression = {}\n", + "\n", + "# Перебор моделей\n", + "for name, model in models_regression.items():\n", + " print(f\"Training {name}...\")\n", + " pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('model', model)\n", + " ])\n", + " param_grid = param_grids_regression[name]\n", + " grid_search = RandomizedSearchCV(pipeline, param_grid, cv=5, scoring='neg_mean_absolute_error', n_jobs=-1)\n", + " grid_search.fit(X_train, y_train)\n", + "\n", + " # Лучшая модель\n", + " best_model = grid_search.best_estimator_\n", + " y_pred = best_model.predict(X_test)\n", + "\n", + " # Метрики\n", + " mae = mean_absolute_error(y_test, y_pred)\n", + " rmse = np.sqrt(mean_squared_error(y_test, y_pred))\n", + " r2 = r2_score(y_test, y_pred)\n", + "\n", + " # Сохранение результатов\n", + " results_regression[name] = {\n", + " \"Best Params\": grid_search.best_params_,\n", + " \"MAE\": mae,\n", + " \"RMSE\": rmse,\n", + " \"R2\": r2\n", + " }\n", + "\n", + "# Печать результатов\n", + "for name, metrics in results_regression.items():\n", + " print(f\"\\nModel: {name}\")\n", + " for metric, value in metrics.items():\n", + " print(f\"{metric}: {value}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 MAERMSER2
RandomForestRegressor3568.3604986055.4065700.715292
GradientBoostingRegressor3933.3510916171.2084670.704299
LinearRegression6722.0902368991.2736170.372295
\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Импортируем pandas для работы с таблицами\n", + "import pandas as pd\n", + "\n", + "# Формируем таблицу метрик\n", + "reg_metrics = pd.DataFrame.from_dict(results_regression, orient=\"index\")[\n", + " [\"MAE\", \"RMSE\", \"R2\"]\n", + "]\n", + "\n", + "# Визуализация результатов с помощью стилизации\n", + "styled_metrics = (\n", + " reg_metrics.sort_values(by=\"RMSE\")\n", + " .style.background_gradient(cmap=\"viridis\", low=1, high=0.3, subset=[\"RMSE\", \"MAE\"])\n", + " .background_gradient(cmap=\"plasma\", low=0.3, high=1, subset=[\"R2\"])\n", + ")\n", + "\n", + "styled_metrics" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# невероятно\n", + "Модель может что-то даже предсказать, с погрешностью в 3к$ конечно и ошибкой 70% но всё же. Я думал и 50% не будет.\n", + "Возможно если сузить сильнее входные данные, потому что выбросы очень большие, результат будет лучше. Линейная регрессия кстати вообще не справилась с данными а вот 2 другие ещё более менее" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# приступим к задаче классификации" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training LogisticRegression...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\МИИ\\AIM-PIbd-31-Kouvshinoff-T-A\\laba\\Lib\\site-packages\\sklearn\\model_selection\\_search.py:320: UserWarning: The total space of parameters 3 is smaller than n_iter=10. Running 3 iterations. For exhaustive searches, use GridSearchCV.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training RandomForestClassifier...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\МИИ\\AIM-PIbd-31-Kouvshinoff-T-A\\laba\\Lib\\site-packages\\numpy\\ma\\core.py:2881: RuntimeWarning: invalid value encountered in cast\n", + " _data = np.array(data, dtype=dtype, copy=copy,\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training KNN...\n", + "\n", + "Model: LogisticRegression\n", + "Best Params: {'model__C': 10}\n", + "Accuracy: 0.8612199216564074\n", + "F1 Score: 0.9032383925087788\n", + "Confusion_matrix: [[ 763 303]\n", + " [ 193 2315]]\n", + "\n", + "Model: RandomForestClassifier\n", + "Best Params: {'model__n_estimators': 500, 'model__max_features': 'log2', 'model__max_depth': 20, 'model__criterion': 'gini'}\n", + "Accuracy: 0.802182428651371\n", + "F1 Score: 0.874800779174783\n", + "Confusion_matrix: [[ 397 669]\n", + " [ 38 2470]]\n", + "\n", + "Model: KNN\n", + "Best Params: {'model__weights': 'uniform', 'model__n_neighbors': 5}\n", + "Accuracy: 0.8718522663682149\n", + "F1 Score: 0.9082532051282052\n", + "Confusion_matrix: [[ 849 217]\n", + " [ 241 2267]]\n" + ] + } + ], + "source": [ + "from sklearn.ensemble import RandomForestClassifier\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.neighbors import KNeighborsClassifier\n", + "from sklearn.metrics import accuracy_score, confusion_matrix, f1_score\n", + "\n", + "X = df.drop(columns=['Leather interior','ID']) # Признаки\n", + "# Целевая переменная для классификации\n", + "y_class = df['Leather interior'].map({'Yes': 1, 'No': 0}) # Преобразуем в 0/1\n", + "\n", + "# Разделение данных\n", + "X_train_clf, X_test_clf, y_train_clf, y_test_clf = train_test_split(X, y_class, test_size=0.2, random_state=42)\n", + "\n", + "# Модели и параметры\n", + "models_classification = {\n", + " \"LogisticRegression\": LogisticRegression(max_iter=1000),\n", + " \"RandomForestClassifier\": RandomForestClassifier(random_state=42),\n", + " \"KNN\": KNeighborsClassifier()\n", + "}\n", + "\n", + "param_grids_classification = {\n", + " \"LogisticRegression\": {\n", + " 'model__C': [0.1, 1, 10]\n", + " },\n", + " \"RandomForestClassifier\": {\n", + " \"model__n_estimators\": [10, 20, 30, 40, 50, 100, 150, 200, 250, 500],\n", + " \"model__max_features\": [\"sqrt\", \"log2\", 2],\n", + " \"model__max_depth\": [2, 3, 4, 5, 6, 7, 8, 9 ,10, 20],\n", + " \"model__criterion\": [\"gini\", \"entropy\", \"log_loss\"],\n", + " },\n", + " \"KNN\": {\n", + " 'model__n_neighbors': [3, 5, 7, 9, 11],\n", + " 'model__weights': ['uniform', 'distance']\n", + " }\n", + "}\n", + "\n", + "# Результаты\n", + "results_classification = {}\n", + "\n", + "# Перебор моделей\n", + "for name, model in models_classification.items():\n", + " print(f\"Training {name}...\")\n", + " pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('model', model)\n", + " ])\n", + " param_grid = param_grids_classification[name]\n", + " grid_search = RandomizedSearchCV(pipeline, param_grid, cv=5, scoring='f1', n_jobs=-1)\n", + " grid_search.fit(X_train_clf, y_train_clf)\n", + "\n", + " # Лучшая модель\n", + " best_model = grid_search.best_estimator_\n", + " y_pred = best_model.predict(X_test_clf)\n", + "\n", + " # Метрики\n", + " acc = accuracy_score(y_test_clf, y_pred)\n", + " f1 = f1_score(y_test_clf, y_pred)\n", + "\n", + " # Вычисление матрицы ошибок\n", + " c_matrix = confusion_matrix(y_test_clf, y_pred)\n", + "\n", + " # Сохранение результатов\n", + " results_classification[name] = {\n", + " \"Best Params\": grid_search.best_params_,\n", + " \"Accuracy\": acc,\n", + " \"F1 Score\": f1,\n", + " \"Confusion_matrix\": c_matrix\n", + " }\n", + "\n", + "# Печать результатов\n", + "for name, metrics in results_classification.items():\n", + " print(f\"\\nModel: {name}\")\n", + " for metric, value in metrics.items():\n", + " print(f\"{metric}: {value}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# отресуем красивые квадратики\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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fv0UGBioRx99VF999VWeGvc5U33OnTt33bxXc/r0ab3wwgsKDAyUp6enypUrp8qVK0uSzc984sSJ2rVrl0JCQnTXXXdp9OjRNl+SVK5cWS+++KI+/fRTlS1bVlFRUfrwww+v+HtzI/bu3StJuueee3J9pqtWrbJ+njmu9PyCwqugYrOzYw498C+1atVSfHy8li5dqhUrVmjhwoWaNm2aRo4cqTFjxjj0vW+//XZrw/y+++6Tq6urXnnlFbVu3dq6WrHFYtG9996roUOHXrGMnAeI/DKbzbm227NYLAoICNDcuXOveE1O49lkMmnBggXavHmzlixZopUrV6pPnz6aNGmSNm/eLC8vLwUEBCguLk4rV67U999/r++//16zZs3SE088oTlz5txQnS9nz1VygRtlXGdOX6tWra6bp127dmrXrt1136tVq1bavn17vuqH4uGuu+6yxo3OnTurWbNmeuyxxxQfHy8vLy/997//Ve/evdW5c2cNGTJEAQEBcnV11YQJE3ItxCpd/e/r9X6X7eFq710QdbrS+hQWi0Xh4eF69913r3hNzhcPnp6eWrdundauXatly5ZpxYoV+vLLL3XPPfdo1apV14xhNWvWlCTrYoA3olu3btq0aZOGDBmi+vXry8vLSxaLRe3atbP5UqFbt25q3ry5vv32W61atUpvv/223nrrLX3zzTdq3769JGnSpEnq3bu3Fi9erFWrVun555/XhAkTtHnz5ptuXOfU5YsvvlBQUFCu85dv73ml5xeguKFBjyKhXLlyKlmypOLj43Od++OPP+Ti4mINmqGhodq3b1+ufFc6diWlSpXSI488okceeUQZGRnq0qWL3njjDQ0fPlweHh65hspfS9WqVbVr16485/+3V199VZ988olee+01a2921apVlZqammv/6cuFhoZq7dq1ubbUyetnkPNeq1evVtOmTfO0yFaTJk3UpEkTvfHGG5o3b5569Oih+fPnq1+/fpIu9Xh06tRJnTp1ksVi0bPPPquPPvpII0aMuOLIgZwVcePj461DF3PEx8dbzwNXkm1cSvYqCyiqchrqrVu31gcffKBXXnlFCxYsUJUqVfTNN9/YxLR/jwLJj5y/xzm9q/92edwODQ3V6tWrde7cOZte+j/++MOmrFvh33Hm39P5MjIylJCQcN1YK12Klb/99pvatGlz3ecDFxcXtWnTRm3atNG7776r8ePH69VXX9XatWvVtm3bq15fvXp11ahRQ4sXL9aUKVOuuaDclZw5c0Y//PCDxowZo5EjR1qPX+nnJV2azvjss8/q2Wef1fHjx9WwYUO98cYb1ga9JIWHhys8PFyvvfaaNm3apKZNm2rGjBl6/fXX81W3y1WtWlWSFBAQkKfPH0ULsdkx+EoLRYKrq6siIyO1ePFim61NkpKSNG/ePDVr1sw6JC0qKkqxsbGKi4uz5jt9+vRVe5r/7fLtW9zd3RUWFibDMKzzw3P2N718S5sr6dq1q3777bcrbt1zvV4EPz8/DRgwQCtXrrTeS7du3RQbG6uVK1fmyn/27FllZWVJuvQZZGZm6pNPPrGet1gs+vDDD69b5xzdunVTdna2xo0bl+tcVlaW9f7PnDmT615y1i/IGXZ/+efq4uKiunXr2uS53B133KGAgADNmDHDJs/333+vPXv2qGPHjnm+FxQ/zNMD/tGqVSvdddddeu+993Tx4kVrb/C//3Zv2bJFsbGxN1R++fLlVb9+fc2ZM8dm6HVMTIx+//13m7wdOnRQdna2PvjgA5vjkydPlslksmk0Olrbtm3l7u6u999/3+azmDlzppKTk/MUZ7p166YjR47YxNscFy5cUFpamqRLzyGXuzxWXuv5YsyYMTp16pT69etnjfX/tmrVKi1duvSKdbzSz1uSdWecHNnZ2bmGzgcEBCg4ONhax5SUlFzvHx4eLhcXl6vG8/yIioqSj4+Pxo8ff8V1eXL2s0fRRGx2DHroUeh89tlnV5xfPXr0aOsers8++6xKlCihjz76SOnp6Zo4caI139ChQ/Xf//5X9957r5577jnrtnUVK1bU6dOnr/kNemRkpIKCgtS0aVMFBgZqz549+uCDD9SxY0drT0LO3LtXX31Vjz76qNzc3NSpUydrIP63IUOGaMGCBXr44YfVp08fNWrUSKdPn9Z3332nGTNmqF69etf8LF544QW99957evPNNzV//nwNGTJE3333ne677z717t1bjRo1Ulpamnbu3KkFCxbowIEDKlu2rDp37qy77rpLL730kvbt26eaNWvqu+++sz5Q5GWUQcuWLTVgwABNmDBBcXFxioyMlJubm/bu3auvv/5aU6ZM0UMPPaQ5c+Zo2rRpevDBB1W1alWdO3dOn3zyiXx8fNShQwdJUr9+/XT69Gndc889qlChgv7++29NnTpV9evXt86bvJybm5veeustPfnkk2rZsqW6d+9u3bauUqVKLP4FAPkwZMgQPfzww5o9e7buu+8+ffPNN3rwwQfVsWNHJSQkaMaMGQoLC1NqauoNlT9hwgR17NhRzZo1U58+fXT69GlNnTpVtWvXtimzU6dOat26tV599VUdOHBA9erV06pVq7R48WINGjTI2kN7K5QrV07Dhw/XmDFj1K5dO91///2Kj4/XtGnTdOedd+rxxx+/bhk9e/bUV199paefflpr165V06ZNlZ2drT/++ENfffWVVq5cqTvuuENjx47VunXr1LFjR4WGhur48eOaNm2aKlSooGbNmkm61Dvt5+enGTNmyNvbW6VKlVLjxo1VuXJlPfLII9q5c6feeOMNbd++Xd27d1doaKhOnTqlFStW6IcfftC8efOuWEcfHx+1aNFCEydOVGZmpm677TatWrVKCQkJNvnOnTunChUq6KGHHlK9evXk5eWl1atX65dffrEuJLhmzRoNHDhQDz/8sKpXr66srCx98cUXcnV1VdeuXW/yJ3KprtOnT1fPnj3VsGFDPfrooypXrpwOHjyoZcuWqWnTprm+DAKKvQJaXR/IJWfrkqulQ4cOGb/++qsRFRVleHl5GSVLljRat25tbNq0KVdZ27dvN5o3b26YzWajQoUKxoQJE4z333/fkGQkJiZa812+bd1HH31ktGjRwihTpoxhNpuNqlWrGkOGDMm1Jca4ceOM2267zXBxcbHZbuXybVoM49KWeQMHDjRuu+02w93d3ahQoYLRq1cv4+TJk4ZhXH0rlxy9e/c2XF1drVv5nDt3zhg+fLhRrVo1w93d3Shbtqxx9913G++8846RkZFhve7EiRPGY489Znh7exu+vr5G7969jY0bNxqSjPnz51vz9erVyyhVqtRVfy4ff/yx0ahRI8PT09Pw9vY2wsPDjaFDhxpHjx41DMMwfv31V6N79+5GxYoVDbPZbAQEBBj33XefsXXrVmsZCxYsMCIjI42AgADD3d3dqFixojFgwADj2LFj1jyXb1uX48svvzQaNGhgmM1mw9/f3+jRo4dx+PBhmzxXu4dRo0YZ/JkrXnK2xvn190Djz0Pl7ZJ+/Z2tcVA0XGv71+zsbKNq1apG1apVjaysLGP8+PFGaGioYTabjQYNGhhLly41evXq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SW3bts11PqcXIjs723osLCxMZrNZBw8evGrvQa1atayLCOXYvHnz9W/yXzZt2qTQ0FC9+uqr1mN///13rnwHDx7U0aNHFRwcbH0fFxcX1ahRQ4GBgQoODtZff/2lHj165Ov9AQDFD7H52ojNAK6GRfGA6+jRo4fKli2rBx54QOvXr1dCQoJ+/PFHPf/88zp8+LAk6YUXXtCbb76pRYsW6Y8//tCzzz6rs2fPXrXMSpUqqVevXurTp48WLVpkLfOrr76SJIWGhspkMmnp0qU6ceKEUlNT5e3trZdfflmDBw/WnDlztH//fv3666+aOnWqdTGbp59+Wnv37tWQIUMUHx+vefPmafbs2fm639tvv10HDx7U/PnztX//fr3//vtXXETIw8NDvXr10m+//ab169fr+eefV7du3RQUFCRJGjNmjCZMmKD3339ff/75p3bu3KlZs2bp3XffzVd9AAC4HLGZ2AzgEhr0wHWULFlS69atU8WKFdWlSxfVqlVLffv21cWLF629Ai+99JJ69uypXr16KSIiQt7e3nrwwQevWe706dP10EMP6dlnn1XNmjXVv39/paWlSZJuu+02jRkzRq+88ooCAwM1cOBASdK4ceM0YsQITZgwQbVq1VK7du20bNkyVa5cWdKluXMLFy7UokWLVK9ePc2YMUPjx4/P1/3ef//9Gjx4sAYOHKj69etr06ZNGjFiRK581apVU5cuXdShQwdFRkaqbt26Nlvf9OvXT59++qn+r707D6uqWtw4/h5QwAFQM0AScbrOKGpFZE5JoHktq9tgpjg2QYNkmZWAWmKaZoNlWWrdq1cr01+pV0XLLCW7DpRTlFNgCmoOCCYIZ//+8HLqBCroZjjnfD/Ps57rWXvtddbZlyd4z1p77blz5yokJETdu3fXvHnzbGMFAOBy8buZ380AzrMYF9oZBAAAAAAAVFnM0AMAAAAA4IAI9AAAAAAAOCACPQAAAAAADohADwAAAACAAyLQAwAAAADggAj0AAAAAAA4IAI9AAAAAAAOiEAPAAAAAIADItADAAAAAOCACPQAAAAAADggAj0AAAAAAA6IQA8AAAAAgAMi0AMAAAAA4IAI9AAAAAAAOCACPQAAAAAADohADwAAAACAAyLQAwAAAADggAj0AAAAAAA4IAI9AAAAAAAOiEAPAAAAAIADItADAAAAAOCACPQAAAAAADggAj0AAAAAAA6IQA8AAAAAgAMi0AMAAAAA4IAI9AAAAAAAOCACPQAAAAAADohADwAAAACAAyLQAwAAAADggAj0AAAAAAA4IAI9AAAAAAAOiEAPAAAAAIADItADAAAAAOCACPQAAAAAADggAj0AAAAAAA6IQA8AAAAAgAMi0AMAAAAA4IAI9AAAAAAAOCACPQAAAAAADohADwAAAACAAyLQAwAAAADggAj0AAAAAAA4IAI9AAAAAAAOiEAPAAAAAIADItADAAAAAOCACPQAAAAAADggAj0AAAAAAA6IQA8AAAAAgAMi0AMAAAAA4IAI9AAAAAAAOCACPQAAAAAADohADwAAAACAAyLQAwAAAADggAj0AAAAAAA4IAI9AAAAAAAOiEAPAAAAAIADItADAAAAAOCACPQAAAAAADggAj0AAAAAAA6IQA8AAAAAgAMi0AMAAAAA4IAI9AAAAAAAOCACPQAAAAAADohADwAAAACAAyLQAwAAAADggAj0AAAAAAA4IAI9AAAAAAAOiEAPAAAAAIADItADAAAAAOCACPQAAAAAADggAj0AAAAAAA6IQA8AAAAAgAMi0AMAAAAA4IAI9AAAAAAAOCACPQAAAAAADohADwAAAACAAyLQAwAAAADggAj0AAAAAAA4IAI9AAAAAAAOiEAPAAAAAIADItADAAAAAOCACPQAAAAAADggAj0AAAAAAA6IQA8AAAAAgAMi0AMAAAAA4IAI9AAAAAAAOCACPQAAAAAADohADwAAAACAAyLQAwAAAADggAj0AAAAAAA4IAI9AAAAAAAOiEAPAAAAAIADItADAAAAAOCACPQAAAAAADggAj0AAAAAAA6IQA8AAAAAgAMi0AMAAAAA4IAI9AAAAAAAOCACPQAAAAAADohADwAAAACAAyLQAwAAAADggAj0AAAAAAA4IAI9AAAAAAAOiEAPAAAAAIADItADAAAAAOCACPQAAAAAADggAj0AAAAAAA6IQA8AAAAAgAMi0AMAAAAA4IAI9AAAAAAAOCACPQAAAAAADohADwAAAACAAyLQAwAAAADggAj0AAAAAAA4IAI9AAAAAAAOiEAPAAAAAIADItADAAAAAOCACPQAAAAAADggAj0AAAAAAA6IQA8AAAAAgAMi0AMAAAAA4IAI9AAAAAAAOCACPQAAAAAADohADwAAAACAAyLQ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TUyhKb0AAACYz+UCfdEye/fqXnL3INDDMVWzVK/sIQBXxjj/P9z6BAAAcPlcLtADAJyfYeKmeAab4gEAgCqKQA8AcDrcQw8AAFwBWwsDAAAAAOCAmKEHADidQsNNhYZJm+IZpnQDAABgOmboAQAAAABwQMzQAwCcjlUWWU36ztoqpugBAEDVRKAHADgdNsUDAACugCX3AAAAAAA4IGboAQBOx9xN8VhyDwAAqiZm6AEAAAAAcEDM0AMAnM75TfHMuffdrH4AAADMRqAHADgdq9xUyC73AADAybHkHgAAAAAAB8QMPQDA6bApHgAAcAUEegCA07HKTVaW3AMAACfHknsAAAAAABwQgR4A4HQKDYuppbSSkpJ03XXXydvbW35+furfv7/S0tLs2pw9e1YxMTG66qqrVLt2bd11113Kysqya5Oenq6+ffuqZs2a8vPz09NPP62CggK7NuvWrVOnTp3k6emp5s2ba968eZd9vQAAgGMi0AMAYJKvvvpKMTEx+vbbb5WcnKxz584pMjJSubm5tjajRo3S559/ro8//lhfffWVDh06pDvvvNN2vLCwUH379lV+fr42btyoDz74QPPmzVN8fLytzf79+9W3b1/17NlTqampevLJJzVixAitWrWqQj8vAACoXNxDDwBwOoUmPrausAz30K9cudLu9bx58+Tn56ctW7aoW7duOnXqlN5//30tWLBAN998syRp7ty5at26tb799lvdcMMNWr16tXbt2qU1a9bI399foaGhmjhxosaMGaPExER5eHho1qxZatKkiaZNmyZJat26tb755hu9+uqrioqKMuVzAwCAqo8ZegCA07EabqYWScrOzrYreXl5lxzHqVOnJEn16tWTJG3ZskXnzp1TRESErU2rVq3UqFEjpaSkSJJSUlIUEhIif39/W5uoqChlZ2dr586dtjZ/7qOoTVEfAADANRDoAQAohaCgIPn6+tpKUlLSRdtbrVY9+eST6tKli9q1aydJyszMlIeHh+rUqWPX1t/fX5mZmbY2fw7zRceLjl2sTXZ2tn7//ffL/owAAMCxsOQeAOB0ymPJfUZGhnx8fGz1np6eFz0vJiZGO3bs0DfffGPKOAAAAP6KGXoAAErBx8fHrlws0MfGxmrZsmX68ssv1bBhQ1t9QECA8vPzdfLkSbv2WVlZCggIsLX56673Ra8v1cbH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E4EepvP09FRCQoI8PT0reyjAZeFn2Amw5B4AALgAAj1M5+npqcTExMoeBnDZ+BkGAACAIyDQAwCcDzP0AADABRDoAQDOx2rItAfIWwn0AACgamKXewAAAAAAHBAz9AAAp2MYVhmGObvTm9UPAACA2ZihBwAAAADAARHocVmGDBkii8WiyZMn29UvXbpUFoulkkYFXJxhGIqIiFBUVFSxY2+99Zbq1KmjgwcPVsLIYDrDOH/vuxmFTfEAAEAVRaDHZfPy8tLLL7+sEydOVPZQgFKxWCyaO3euNm3apHfeecdWv3//fj3zzDN644031LBhw0ocIUxTtMu9WQUAAKAKItDjskVERCggIEBJSUkXbLN48WK1bdtWnp6eaty4saZNm1aBIwSKCwoK0muvvabRo0dr//79MgxDw4cPV2RkpDp27Kg+ffqodu3a8vf316BBg3Ts2DHbuZ988olCQkJUo0YNXXXVVYqIiFBubm4lfhoAAAC4MgI9Lpu7u7smTZqkN954o8Rlylu2bNE999yj++67T9u3b1diYqLGjRunefPmVfxggT+Jjo5Wr169NGzYML355pvasWOH3nnnHd18883q2LGjNm/erJUrVyorK0v33HOPJOnw4cMaMGCAhg0bpt27d2vdunW68847ZTB7WzVZreYWAACAKshi8NcoLsOQIUN08uRJLV26VOHh4WrTpo3ef/99LV26VHfccYcMw9DAgQN19OhRrV692nbeM888o+XLl2vnzp2VOHpAOnLkiNq2bavjx49r8eLF2rFjh77++mutWrXK1ubgwYMKCgpSWlqacnJy1LlzZx04cEDBwcGVOHJcTHZ2tnx9fdXLe6CqWTxM6bPAyNfa0/N16tQp+fj4mNIniiv6/47rDABwRuX1e44Zelyxl19+WR988IF2795tV79792516dLFrq5Lly76+eefVVhYWJFDBIrx8/PTQw89pNatW6t///76/vvv9eWXX6p27dq20qpVK0nS3r171aFDB/Xq1UshISG6++67NXv2bPaPqMq4hx4AALgAAj2uWLdu3RQVFaWxY8dW9lCAMqlWrZqqVasmScrJyVG/fv2UmppqV37++Wd169ZN7u7uSk5O1n/+8x+1adNGb7zxhlq2bKn9+/dX8qdASQyr1dQCAABQFVWr7AHAOUyePFmhoaFq2bKlra5169basGGDXbsNGzaoRYsWcnd3r+ghAhfVqVMnLV68WI0bN7aF/L+yWCzq0qWLunTpovj4eAUHB2vJkiWKi4ur4NECAAAAzNDDJCEhIRo4cKBef/11W91TTz2ltWvXauLEifrpp5/0wQcf6M0339To0aMrcaRAyWJiYnT8+HENGDBA//3vf7V3716tWrVKQ4cOVWFhoTZt2qRJkyZp8+bNSk9P16effqqjR4+qdevWlT10lIQl9wAAwAUQ6GGaCRMmyPqnpamdOnXSRx99pIULF6pdu3aKj4/XhAkTNGTIkMobJHABgYGB2rBhgwoLCxUZGamQkBA9+eSTqlOnjtzc3OTj46P169fr1ltvVYsWLfTCCy9o2rRp6tOnT2UPHVVIUlKSrrvuOnl7e8vPz0/9+/dXWlqaXZsePXrIYrHYlYcfftiuTXp6uvr27auaNWvKz89PTz/9tAoKCiryowAAAAfALvcAAKdRtIPszZ73mLrL/Rd5H5VqV9revXvrvvvu03XXXaeCggI999xz2rFjh3bt2qVatWpJOh/oW7RooQkTJtjOq1mzpq3vwsJChYaGKiAgQFOnTtXhw4c1ePBgjRw5UpMmTTLlM1VF7HIPAHBm5fV7jnvoAQDOxzAkmbSZXRm+9165cqXd63nz5snPz09btmxRt27dbPU1a9ZUQEBAiX2sXr1au3bt0po1a+Tv76/Q0FBNnDhRY8aMUWJiojw8zPmiAgAAOD6W3AMAUArZ2dl2JS8v75LnnDp1SpJUr149u/r58+erfv36ateuncaOHaszZ87YjqWkpCgkJET+/v62uqioKGVnZ2vnzp0mfRoAAOAMmKEHADgdw2rIsJhzR1nRnWlBQUF29QkJCUpMTLzgeVarVU8++aS6dOmidu3a2ervv/9+BQcHKzAwUD/88IPGjBmjtLQ0ffrpp5KkzMxMuzAvyfY6MzPTjI8EAACcBIEeAOB8DKvMW3J/vp+MjAy7e948PT0velpMTIx27Nihb775xq7+wQcftP07JCREDRo0UK9evbR37141a9bMnDEDAACXwJJ7AABKwcfHx65cLNDHxsZq2bJl+vLLL9WwYcOL9hsWFiZJ2rNnjyQpICBAWVlZdm2KXl/ovnsAAOCaCPQAAKdjWA1TS6nf1zAUGxurJUuW6IsvvlCTJk0ueU5qaqokqUGDBpKk8PBwbd++XUeOHLG1SU5Olo+Pj9q0aVO2C3EFZs6cqcaNG8vLy0thYWH67rvvLtr+448/VqtWreTl5aWQkBCtWLGigkYKAIDrItADAGCSmJgY/etf/9KCBQvk7e2tzMxMZWZm6vfff5ck7d27VxMnTtSWLVt04MABffbZZxo8eLC6deum9u3bS5IiIyPVpk0bDRo0SN9//71WrVqlF154QTExMZdc5m+WRYsWKS4uTgkJCdq6das6dOigqKgouy8Z/mzjxo0aMGCAhg8frm3btql///7q37+/duzYUSHjBQDAVfEceqCcDBkyRCdPntTSpUslnX/2dGhoqGbMmFGh41i3bp169uypEydOqE6dOiW2sVgsWrJkifr371+qPhMTE7V06VLbzOLlOHDggJo0aaJt27YpNDT0svsB/qzoGa836VZVU3VT+izQOX2jFaV6bqzFYimxfu7cuRoyZIgyMjL0wAMPaMeOHcrNzVVQUJDuuOMOvfDCC3Z9//LLL3rkkUe0bt061apVS9HR0Zo8ebKqVauYrW/CwsJ03XXX6c0335R0foO/oKAgPfbYY3r22WeLtb/33nuVm5urZcuW2epuuOEGhYaGatasWSW+R15ent2TAk6dOqVGjRoV26sAAABnkJ2draCgIJ08eVK+vr6m9cumeHApQ4YM0QcffCBJql69uho1aqTBgwfrueeeK/c/lD/99FNVr166gFGaEA6gOA8PDwUEBOibTHOXewcEBJTq+e+X+o48KChIX3311SX7CQ4OrrQl6/n5+dqyZYvGjh1rq3Nzc1NERIRSUlJKPCclJUVxcXF2dVFRUbYvNEuSlJSk8ePHF6v/69MEAABwJr/99huBHrgSvXv31ty5c5WXl6cVK1YoJiZG1atXt/vjtUh+fn6p/ogvjb8+hxqA+by8vLR//37l5+eb2q+Hh4e8vLxM7bOqOnbsmAoLC0t8dN6PP/5Y4jkXetTexR6zN3bsWLsvAU6ePKng4GClp6eb+ocOziuaGWIFRPnhGpcvrm/54xqXr6KVaGZnAgI9XI6np6dtp+hHHnlES5Ys0WeffaaxY8falslfd911mjlzpjw9PbV//35lZGToqaee0urVq+Xm5qauXbvqtddeU+PGjSVJhYWFevrppzVnzhy5u7tr+PDhxWbq/rrkPi8vT/Hx8VqwYIGOHDmioKAgjR07Vr169VLPnj0lSXXr1pUkRUdHa968ebJarXr55Zf17rvvKjMzUy1atNC4ceP0j3/8w/Y+K1as0JNPPqmMjAzdcMMNio6OLvM1GjNmjJYsWaKDBw8qICBAAwcOVHx8fLEVBu+8845efPFF/fbbb/r73/+u2bNn2/0h/t5772natGnav3+/GjdurMcff1yPPvpomccDlIWXl5fLhG9H5unpWeKeAL6+vvwhWY6KntKA8sM1Ll9c3/LHNS5fbm7mbmPHpnhweTVq1LCbzVu7dq3S0tKUnJysZcuW6dy5c4qKipK3t7e+/vprbdiwQbVr11bv3r1t502bNk3z5s3TnDlz9M033+j48eNasmTJRd938ODB+ve//63XX39du3fv1jvvvKPatWsrKChIixcvliSlpaXp8OHDeu211ySdX6L64YcfatasWdq5c6dGjRqlBx54wLaENyMjQ3feeaf69eun1NRUjRgxosT7XS/F29tb8+bN065du/Taa69p9uzZevXVV+3a7NmzRx999JE+//xzrVy5Utu2bbML6/Pnz1d8fLxeeukl7d69W5MmTdK4ceNstzwAqJrq168vd3f3Eh+dd6HH5l3oUXs8Zg8AgHJmAC4kOjrauP322w3DMAyr1WokJycbnp6exujRo23H/f39jby8PNs5//znP42WLVsaVqvVVpeXl2fUqFHDWLVqlWEYhtGgQQNjypQptuPnzp0zGjZsaHsvwzCM7t27G0888YRhGIaRlpZmSDKSk5NLHOeXX35pSDJOnDhhqzt79qxRs2ZNY+PGjXZthw8fbgwYMMAwDMMYO3as0aZNG7vjY8aMKdbXX0kylixZcsHjU6dONTp37mx7nZCQYLi7uxsHDx601f3nP/8x3NzcjMOHDxuGYRjNmjUzFixYYNfPxIkTjfDwcMMwDGP//v2GJGPbtm0XfF8AleP66683YmNjba8LCwuNa665xkhKSiqx/T333GP8/e9/t6sLDw83HnrooVK/56lTpwxJxqlTpy5v0Lgorm/54xqXL65v+eMal6/yur4suYfLWbZsmWrXrq1z587JarXq/vvvV2Jiou14SEiI3X3z33//vfbs2SNvb2+7fs6ePau9e/fq1KlTOnz4sMLCwmzHqlWrpmuvvfaCG2SlpqbK3d1d3bt3L/W49+zZozNnzuiWW26xq8/Pz1fHjh0lSbt377Ybh3T+mdZltWjRIr3++uvau3evcnJyVFBQUGzpVaNGjXTNNdfYvY/ValVaWpq8vb21d+9eDR8+XCNHjrS1KSgo4N5YwAHExcUpOjpa1157ra6//nrNmDFDubm5Gjp0qKTzK4yuueYaJSUlSZKeeOIJde/eXdOmTVPfvn21cOFCbd68We+++26p39PT01MJCQkV9mg+V8P1LX9c4/LF9S1/XOPyVV7Xl0APl9OzZ0+9/fbb8vDwUGBgYLHd7WvVqmX3OicnR507d9b8+fOL9XX11Vdf1hhq1KhR5nNycnIkScuXL7cL0pJM/Q9DSkqKBg4cqPHjxysqKkq+vr5auHChpk2bVuaxzp49u9gXDO7u7qaNFUD5uPfee3X06FHFx8crMzNToaGhWrlypW3ju/T0dLt7AG+88UYtWLBAL7zwgp577jn97W9/09KlS9WuXbtSv6enp6fdl6swF9e3/HGNyxfXt/xxjctXeV1fAj1cTq1atdS8efNSt+/UqZMWLVokPz+/C24Q0qBBA23atEndunWTdH4mesuWLerUqVOJ7UNCQmS1WvXVV18pIiKi2PGiFQKFhYW2ujZt2sjT01Pp6ekXnNlv3bq1PvvsM7u6b7/99tIf8k82btyo4OBgPf/887a6X375pVi79PR0HTp0SIGBgbb3cXNzU8uWLeXv76/AwEDt27dPAwcOLNP7A6gaYmNjFRsbW+KxdevWFau7++67dffdd5fzqAAAwJ+xKR5wCQMHDlT9+vV1++236+uvv9b+/fu1bt06Pf744zp48KCk88tNJ0+erKVLl+rHH3/Uo48+qpMnT16wz8aNGys6OlrDhg3T0qVLbX1+9NFHks4/g9pisWjZsmU6evSocnJy5O3trdGjR2vUqFH64IMPtHfvXm3dulVvvPGGbaO5hx9+WD///LOefvpppaWlacGCBZo3b16ZPu/f/vY3paena+HChdq7d69ef/31Ejf48/LyUnR0tL7//nt9/fXXevzxx3XPPffYNsEaP368kpKS9Prrr+unn37S9u3bNXfuXE2fPr1M4wEAAABQMgI9cAk1a9bU+vXr1ahRI915551q3bq1hg8frrNnz9pm7J966ikNGjRI0dHRCg8Pl7e3t+64446L9vv222/rH//4hx599FG1atVKI0eOVG5uriTpmmuu0fjx4/Xss8/K39/fNks2ceJEjRs3TklJSWrdurV69+6t5cuXq0mTJpLO39e+ePFiLV26VB06dNCsWbM0adKkMn3e2267TaNGjVJsbKxCQ0O1ceNGjRs3rli75s2b684779Stt96qyMhItW/fXm+99Zbt+IgRI/Tee+9p7ty5CgkJUffu3TVv3jzbWAEAAABcGYtxoV27AAAAAABAlcUMPQAAAAAADohADwAAyt3MmTPVuHFjeXl5KSwsTN99991F23/88cdq1aqVvLy8FBISohUrVlTQSB1XWa7x7Nmz1bVrV9WtW1d169ZVRETEJf8/Qdl/jossXLhQFotF/fv3L98BOriyXt+TJ08qJiZGDRo0kKenp1q0aMF/Ky6hrNd4xowZatmypWrUqKGgoCCNGjVKZ8+eraDROpb169erX79+CgwMlMVi0dKlSy95zrp169SpUyd5enqqefPmZd77SiLQAwCAcrZo0SLFxcUpISFBW7duVYcOHRQVFaUjR46U2H7jxo0aMGCAhg8frm3btql///7q37+/duzYUcEjdxxlvcbr1q3TgAED9OWXXyolJUVBQUGKjIzUr7/+WsEjdxxlvcZFDhw4oNGjR6tr164VNFLHVNbrm5+fr1tuuUUHDhzQJ598orS0NM2ePbvYo33xh7Je4wULFujZZ59VQkKCdu/erffff1+LFi3Sc889V8Ejdwy5ubnq0KGDZs6cWar2+/fvV9++fdWzZ0+lpqbqySef1IgRI7Rq1aqyvbEBAABQjq6//nojJibG9rqwsNAIDAw0kpKSSmx/zz33GH379rWrCwsLMx566KFyHacjK+s1/quCggLD29vb+OCDD8priA7vcq5xQUGBceONNxrvvfeeER0dbdx+++0VMFLHVNbr+/bbbxtNmzY18vPzK2qIDq+s1zgmJsa4+eab7eri4uKMLl26lOs4nYEkY8mSJRdt88wzzxht27a1q7v33nuNqKioMr0XM/QAAKDc5Ofna8uWLYqIiLDVubm5KSIiQikpKSWek5KSYtdekqKioi7Y3tVdzjX+qzNnzujcuXOqV69eeQ3ToV3uNZ4wYYL8/Pw0fPjwihimw7qc6/vZZ58pPDxcMTEx8vf3V7t27TRp0iQVFhZW1LAdyuVc4xtvvFFbtmyxLcvft2+fVqxYoVtvvbVCxuzszPpdV83MQQEAAPzZsWPHVFhYKH9/f7t6f39//fjjjyWek5mZWWL7zMzMchunI7uca/xXY8aMUWBgYLE/LnHe5Vzjb775Ru+//75SU1MrYISO7XKu7759+/TFF19o4MCBWrFihfbs2aNHH31U586dU0JCQkUM26FczjW+//77dezYMd10000yDEMFBQV6+OGHWXJvkgv9rsvOztbvv/+uGjVqlKofZugBAABc2OTJk7Vw4UItWbJEXl5elT0cp3D69GkNGjRIs2fPVv369St7OE7JarXKz89P7777rjp37qx7771Xzz//vGbNmlXZQ3Ma69at06RJk/TWW29p69at+vTTT7V8+XJNnDixsoeGP2GGHgAAlJv69evL3d1dWVlZdvVZWVkKCAgo8ZyAgIAytXd1l3ONi7zyyiuaPHmy1qxZo/bt25fnMB1aWa/x3r17deDAAfXr189WZ7VaJUnVqlVTWlqamjVrVr6DdiCX8zPcoEEDVa9eXe7u7ra61q1bKzMzU/n5+fLw8CjXMTuay7nG48aN06BBgzRixAhJUkhIiHJzc/Xggw/q+eefl5sbc8NX4kK/63x8fEo9Oy8xQw8AAMqRh4eHOnfurLVr19rqrFar1q5dq/Dw8BLPCQ8Pt2svScnJyRds7+ou5xpL0pQpUzRx4kStXLlS1157bUUM1WGV9Rq3atVK27dvV2pqqq3cdttttt2sg4KCKnL4Vd7l/Ax36dJFe/bssX1RIkk//fSTGjRoQJgvweVc4zNnzhQL7UVfoJzf9w1XwrTfdWXbrw8AAKBsFi5caHh6ehrz5s0zdu3aZTz44INGnTp1jMzMTMMwDGPQoEHGs88+a2u/YcMGo1q1asYrr7xi7N6920hISDCqV69ubN++vbI+QpVX1ms8efJkw8PDw/jkk0+Mw4cP28rp06cr6yNUeWW9xn/FLvcXV9brm56ebnh7exuxsbFGWlqasWzZMsPPz8948cUXK+sjVHllvcYJCQmGt7e38e9//9vYt2+fsXr1aqNZs2bGPffcU1kfoUo7ffq0sW3bNmPbtm2GJGP69OnGtm3bjF9++cUwDMN49tlnjUGDBtna79u3z6hZs6bx9NNPG7t37zZmzpxpuLu7GytXrizT+xLoAQBAuXvjjTeMRo0aGR4eHsb1119vfPvtt7Zj3bt3N6Kjo+3af/TRR0aLFi0MDw8Po23btsby5csreMSOpyzXODg42JBUrCQkJFT8wB1IWX+O/4xAf2llvb4bN240wsLCDE9PT6Np06bGSy+9ZBQUFFTwqB1LWa7xuXPnjMTERKNZs2aGl5eXERQUZDz66KPGiRMnKn7gDuDLL78s8b+rRdc0Ojra6N69e7FzQkNDDQ8PD6Np06bG3Llzy/y+FsNgvQQAAAAAAI6Ge+gBAAAAAHBABHoAAAAAABwQgR4AAAAAAAdEoAcAAAAAwAER6AEAAAAAcEAEegAAAAAAHBCBHgAAAAAAB0SgBwAAAADAARHoAQAAAABwQAR6AAAAAAAcEIEeAAAAAAAH9P+WaZHK8rAZ8AAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from sklearn.metrics import ConfusionMatrixDisplay\n", + "\n", + "\n", + "num_models = len(results_classification)\n", + "num_rows = (num_models // 2) + (num_models % 2) # Количество строк для подграфиков\n", + "_, ax = plt.subplots(num_rows, 2, figsize=(12, 10), sharex=False, sharey=False)\n", + "\n", + "for index, (name, metrics) in enumerate(results_classification.items()):\n", + " c_matrix = metrics[\"Confusion_matrix\"]\n", + " disp = ConfusionMatrixDisplay(\n", + " confusion_matrix=c_matrix, display_labels=[\"No\", \"Yes\"]\n", + " ).plot(ax=ax.flat[index])\n", + " disp.ax_.set_title(name)\n", + "\n", + "# Корректировка расположения графиков\n", + "plt.subplots_adjust(top=1, bottom=0, hspace=0.4, wspace=0.1)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 AccuracyF1 Score
KNN0.8718520.908253
LogisticRegression0.8612200.903238
RandomForestClassifier0.8021820.874801
\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "# Формируем таблицу метрик классификации\n", + "clf_metrics = pd.DataFrame.from_dict(results_classification, orient=\"index\")[[\"Accuracy\", \"F1 Score\"]]\n", + "\n", + "# Визуализация результатов с помощью стилизации\n", + "styled_metrics_clf = (\n", + " clf_metrics.sort_values(by=\"F1 Score\", ascending=False) # Сортировка по F1 Score\n", + " .style.background_gradient(cmap=\"viridis\", low=0, high=1, subset=[\"F1 Score\", \"Accuracy\"]) # Стилизация столбцов\n", + " .background_gradient(cmap=\"plasma\", low=0.3, high=1, subset=[\"Accuracy\"])\n", + ")\n", + "\n", + "styled_metrics_clf" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "В итоге KNN и LogisticRegression выдали точность в 90% что я считаю весьма неплохо. RandomForestClassifier близко, но не так хорошо" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "laba", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.6" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}