From f143115f43448e8921fc5aefbf7bd1324ce94fa4 Mon Sep 17 00:00:00 2001 From: "a.puchkina" Date: Fri, 6 Dec 2024 22:30:14 +0400 Subject: [PATCH 1/4] =?UTF-8?q?4=20=D0=BB=D0=B0=D0=B1=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + lab_4/lab4.ipynb | 1197 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1200 insertions(+) create mode 100644 lab_4/lab4.ipynb diff --git a/.gitignore b/.gitignore index 207d123..8b52d1a 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ ipython_config.py # Remove previous ipynb_checkpoints # git rm -r .ipynb_checkpoints/ +# virtual +aimenv/ +static/ \ No newline at end of file diff --git a/lab_4/lab4.ipynb b/lab_4/lab4.ipynb new file mode 100644 index 0000000..2af2575 --- /dev/null +++ b/lab_4/lab4.ipynb @@ -0,0 +1,1197 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Начало лабораторной работы" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Index(['Unnamed: 0', 'Name', 'Rating', 'Spec_score', 'No_of_sim', 'Ram',\n", + " 'Battery', 'Display', 'Camera', 'External_Memory', 'Android_version',\n", + " 'Price', 'company', 'Inbuilt_memory', 'fast_charging',\n", + " 'Screen_resolution', 'Processor', 'Processor_name'],\n", + " dtype='object')\n", + "Index(['Unnamed: 0', 'Name', 'Brand', 'Model', 'Battery capacity (mAh)',\n", + " 'Screen size (inches)', 'Touchscreen', 'Resolution x', 'Resolution y',\n", + " 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera',\n", + " 'Front camera', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS',\n", + " 'Number of SIMs', '3G', '4G/ LTE', 'Price'],\n", + " dtype='object')\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "df1 = pd.read_csv(\"..//static//csv//mobile phone price prediction.csv\")\n", + "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", + "print(df1.columns)\n", + "print(df.columns)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Бизнес-цели:\n", + "1. Прогнозирование цен на мобильные телефоны: \n", + "\n", + "Цель: Разработать точную модель машинного обучения для прогнозирования цен на мобильные телефоны на основе характеристик.\n", + "\n", + "Применение:\n", + "Оптимизация ценообразования для производителей и продавцов.\n", + "Помощь потребителям в принятии обоснованных решений при покупке.\n", + "\n", + "2. Оптимизация характеристик продукта:\n", + "\n", + "Цель: Определить оптимальный набор характеристик для мобильных телефонов, максимизирующий ценность для потребителей при заданном бюджете.\n", + "\n", + "Применение:\n", + "Разработка новых моделей мобильных телефонов.\n", + "Улучшение существующих моделей." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1. Прогнозирование цен на мобильные телефоны " + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Среднее значение поля 'Price': 11465.825607064018\n", + " Name Brand Model \\\n", + "0 OnePlus 7T Pro McLaren Edition OnePlus 7T Pro McLaren Edition \n", + "1 Realme X2 Pro Realme X2 Pro \n", + "2 iPhone 11 Pro Max Apple iPhone 11 Pro Max \n", + "3 iPhone 11 Apple iPhone 11 \n", + "4 LG G8X ThinQ LG G8X ThinQ \n", + "5 OnePlus 7T OnePlus 7T \n", + "6 OnePlus 7T Pro OnePlus 7T Pro \n", + "7 Samsung Galaxy Note 10+ Samsung Galaxy Note 10+ \n", + "8 Asus ROG Phone 2 Asus ROG Phone 2 \n", + "9 Xiaomi Redmi K20 Pro Xiaomi Redmi K20 Pro \n", + "10 Oppo K3 Oppo K3 \n", + "11 Realme X Realme X \n", + "12 Xiaomi Redmi K20 Xiaomi Redmi K20 \n", + "13 OnePlus 7 Pro OnePlus 7 Pro \n", + "14 Oppo Reno 10x Zoom Oppo Reno 10x Zoom \n", + "15 Realme 3 Pro Realme 3 Pro \n", + "16 Huawei P30 Pro Huawei P30 Pro \n", + "17 Redmi Note 7 Pro Xiaomi Redmi Note 7 Pro \n", + "18 Huawei Mate 20 Pro Huawei Mate 20 Pro \n", + "19 LG V40 ThinQ LG V40 ThinQ \n", + "\n", + " Battery capacity (mAh) Screen size (inches) Touchscreen Resolution x \\\n", + "0 4085 6.67 Yes 1440 \n", + "1 4000 6.50 Yes 1080 \n", + "2 3969 6.50 Yes 1242 \n", + "3 3110 6.10 Yes 828 \n", + "4 4000 6.40 Yes 1080 \n", + "5 3800 6.55 Yes 1080 \n", + "6 4085 6.67 Yes 1440 \n", + "7 4300 6.80 Yes 1440 \n", + "8 6000 6.59 Yes 1080 \n", + "9 4000 6.39 Yes 1080 \n", + "10 3765 6.50 Yes 1080 \n", + "11 3765 6.53 Yes 1080 \n", + "12 4000 6.39 Yes 1080 \n", + "13 4000 6.67 Yes 1440 \n", + "14 4065 6.60 Yes 1080 \n", + "15 4045 6.30 Yes 1080 \n", + "16 4200 6.47 Yes 1080 \n", + "17 4000 6.30 Yes 1080 \n", + "18 4200 6.39 Yes 1440 \n", + "19 3300 6.40 Yes 1440 \n", + "\n", + " Resolution y Processor RAM (MB) ... Operating system Wi-Fi \\\n", + "0 3120 8 12000 ... Android Yes \n", + "1 2400 8 6000 ... Android Yes \n", + "2 2688 6 4000 ... iOS Yes \n", + "3 1792 6 4000 ... iOS Yes \n", + "4 2340 8 6000 ... Android Yes \n", + "5 2400 8 8000 ... Android Yes \n", + "6 3120 8 8000 ... Android Yes \n", + "7 3040 8 12000 ... Android Yes \n", + "8 2340 8 8000 ... Android Yes \n", + "9 2340 8 6000 ... Android Yes \n", + "10 2340 8 6000 ... Android Yes \n", + "11 2340 8 4000 ... Android Yes \n", + "12 2340 8 6000 ... Android Yes \n", + "13 3120 8 6000 ... Android Yes \n", + "14 2340 8 6000 ... Android Yes \n", + "15 2340 8 4000 ... Android Yes \n", + "16 2340 8 8000 ... Android Yes \n", + "17 2340 8 4000 ... Android Yes \n", + "18 3120 8 6000 ... Android Yes \n", + "19 3120 8 6000 ... Android Yes \n", + "\n", + " Bluetooth GPS Number of SIMs 3G 4G/ LTE Price above_average_price \\\n", + "0 Yes Yes 2 Yes Yes 58998 1 \n", + "1 Yes Yes 2 Yes Yes 27999 1 \n", + "2 Yes Yes 2 Yes Yes 106900 1 \n", + "3 Yes Yes 2 Yes Yes 62900 1 \n", + "4 Yes Yes 1 No No 49990 1 \n", + "5 Yes No 2 Yes Yes 34930 1 \n", + "6 Yes Yes 2 Yes Yes 52990 1 \n", + "7 Yes Yes 2 Yes Yes 79699 1 \n", + "8 Yes Yes 1 Yes Yes 37999 1 \n", + "9 Yes Yes 2 No No 23190 1 \n", + "10 Yes Yes 2 Yes Yes 23990 1 \n", + "11 Yes Yes 2 Yes Yes 14999 1 \n", + "12 Yes Yes 2 Yes Yes 19282 1 \n", + "13 Yes Yes 2 Yes Yes 39995 1 \n", + "14 Yes Yes 2 Yes Yes 36990 1 \n", + "15 Yes Yes 2 Yes Yes 13999 1 \n", + "16 Yes No 2 Yes Yes 54280 1 \n", + "17 Yes Yes 2 Yes Yes 9799 0 \n", + "18 Yes Yes 2 Yes Yes 63990 1 \n", + "19 Yes Yes 2 Yes Yes 29999 1 \n", + "\n", + " price_volatility \n", + "0 174496 \n", + "1 174496 \n", + "2 174496 \n", + "3 174496 \n", + "4 174496 \n", + "5 174496 \n", + "6 174496 \n", + "7 174496 \n", + "8 174496 \n", + "9 174496 \n", + "10 174496 \n", + "11 174496 \n", + "12 174496 \n", + "13 174496 \n", + "14 174496 \n", + "15 174496 \n", + "16 174496 \n", + "17 174496 \n", + "18 174496 \n", + "19 174496 \n", + "\n", + "[20 rows x 23 columns]\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "# Загружаем набор данных\n", + "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", + "\n", + "# Удаление пустого столбца по имени\n", + "df = df.drop('Unnamed: 0', axis=1)\n", + "\n", + "# Устанавливаем случайное состояние\n", + "random_state = 42\n", + "\n", + "# Рассчитываем среднее значение цены\n", + "average_price = df['Price'].mean()\n", + "print(f\"Среднее значение поля 'Price': {average_price}\")\n", + "\n", + "# Создаем новую переменную, указывающую, превышает ли цена среднюю\n", + "df['above_average_price'] = (df['Price'] > average_price).astype(int)\n", + "\n", + "# Рассчитываем волатильность (разницу между максимальной и минимальной ценой)\n", + "df['price_volatility'] = df['Price'].max() - df['Price'].min()\n", + "\n", + "# Выводим первые строки измененной таблицы для проверки\n", + "print(df.head(20))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Оптимизация характеристик продукта " + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Средняя цена для 'Brand':\n", + "Brand\n", + "10.or 5999.000000\n", + "Acer 6470.000000\n", + "Alcatel 9201.600000\n", + "Apple 45510.470588\n", + "Aqua 4599.000000\n", + " ... \n", + "Zopo 6027.916667\n", + "Zuk 29124.000000\n", + "iBall 4051.000000\n", + "iVoomi 4018.875000\n", + "mPhone 6949.000000\n", + "Name: Price, Length: 76, dtype: float64\n", + "\n", + "Средняя цена для 'Battery capacity (mAh)':\n", + "Battery capacity (mAh)\n", + "1010 3499.000000\n", + "1050 4790.000000\n", + "1200 3396.000000\n", + "1250 2498.500000\n", + "1300 3338.333333\n", + " ... \n", + "5000 13542.530612\n", + "5020 23900.000000\n", + "5100 16999.000000\n", + "5300 8999.000000\n", + "6000 19832.333333\n", + "Name: Price, Length: 165, dtype: float64\n", + "\n", + "Средняя цена для 'Screen size (inches)':\n", + "Screen size (inches)\n", + "2.40 1249.000000\n", + "2.44 6999.000000\n", + "2.45 2999.000000\n", + "2.60 5555.000000\n", + "2.80 5345.000000\n", + " ... \n", + "6.70 58896.428571\n", + "6.80 79699.000000\n", + "6.90 92999.000000\n", + "7.00 6199.000000\n", + "7.30 164999.000000\n", + "Name: Price, Length: 80, dtype: float64\n", + "\n", + "Средняя цена для 'Touchscreen':\n", + "Touchscreen\n", + "No 5255.411765\n", + "Yes 11544.497019\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для 'Resolution x':\n", + "Resolution x\n", + "240 3819.888889\n", + "320 2499.000000\n", + "360 5797.500000\n", + "400 2860.500000\n", + "480 4128.602459\n", + "540 7445.848485\n", + "560 15990.000000\n", + "600 4829.000000\n", + "640 7697.200000\n", + "720 7619.360684\n", + "750 25999.000000\n", + "768 8872.000000\n", + "800 2190.000000\n", + "828 54199.500000\n", + "850 4115.000000\n", + "854 4415.666667\n", + "1024 6199.000000\n", + "1080 17165.865952\n", + "1125 75632.666667\n", + "1176 77299.000000\n", + "1242 88449.500000\n", + "1280 7144.333333\n", + "1440 34240.461538\n", + "1520 7935.000000\n", + "1536 164999.000000\n", + "1600 29950.000000\n", + "1880 20800.000000\n", + "2160 45500.000000\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для 'Resolution y':\n", + "Resolution y\n", + "320 3811.125000\n", + "480 4264.818182\n", + "485 3299.000000\n", + "584 4499.000000\n", + "600 6199.000000\n", + "640 4095.000000\n", + "720 8539.900000\n", + "800 4189.321429\n", + "854 4087.901316\n", + "960 6921.651163\n", + "1080 7583.800000\n", + "1136 12749.000000\n", + "1280 7449.136674\n", + "1290 14990.000000\n", + "1334 25999.000000\n", + "1440 6930.808824\n", + "1480 13596.166667\n", + "1498 4490.000000\n", + "1500 9083.125000\n", + "1520 8139.425000\n", + "1544 10010.000000\n", + "1548 8499.000000\n", + "1560 9135.750000\n", + "1580 9950.000000\n", + "1600 9476.111111\n", + "1620 21492.000000\n", + "1792 54199.500000\n", + "1820 6498.000000\n", + "1920 14698.088496\n", + "2152 164999.000000\n", + "2160 17465.194444\n", + "2220 20531.333333\n", + "2240 49990.000000\n", + "2244 18000.000000\n", + "2246 16177.200000\n", + "2248 39990.000000\n", + "2270 8961.000000\n", + "2280 19073.190476\n", + "2310 25120.000000\n", + "2316 29999.000000\n", + "2340 19768.017241\n", + "2400 32131.083333\n", + "2436 75632.666667\n", + "2520 11844.500000\n", + "2560 26501.476190\n", + "2636 174990.000000\n", + "2688 88449.500000\n", + "2880 34993.250000\n", + "2960 38425.714286\n", + "3040 81799.500000\n", + "3120 45710.000000\n", + "3200 77999.000000\n", + "3840 45500.000000\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для 'Processor':\n", + "Processor\n", + "1 7861.095238\n", + "2 7929.444444\n", + "4 7209.401171\n", + "6 39365.400000\n", + "8 16193.927434\n", + "10 8542.000000\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для 'RAM (MB)':\n", + "RAM (MB)\n", + "64 4249.000000\n", + "256 2625.625000\n", + "289 3190.000000\n", + "384 5555.000000\n", + "512 3419.847222\n", + "768 4749.500000\n", + "1000 5747.082153\n", + "2000 8645.608187\n", + "3000 11587.829787\n", + "4000 17741.965000\n", + "6000 28291.587302\n", + "8000 45080.586207\n", + "12000 99173.750000\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для 'Internal storage (GB)':\n", + "Internal storage (GB)\n", + "0.064 3499.000000\n", + "0.128 4999.000000\n", + "0.160 5555.000000\n", + "0.512 3390.444444\n", + "1.000 5197.000000\n", + "2.000 2399.000000\n", + "3.000 3190.000000\n", + "4.000 4513.032258\n", + "8.000 5311.654206\n", + "16.000 8379.403341\n", + "32.000 12089.644366\n", + "64.000 21208.814607\n", + "128.000 29477.043478\n", + "256.000 68682.777778\n", + "512.000 164999.000000\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для 'Rear camera':\n", + "Rear camera\n", + "0.0 4193.500000\n", + "0.3 3054.666667\n", + "2.0 3000.804878\n", + "3.0 4329.333333\n", + "3.2 3506.727273\n", + "5.0 4413.183486\n", + "8.0 6658.109966\n", + "8.7 8999.000000\n", + "10.0 10499.250000\n", + "12.0 28533.950980\n", + "12.2 29162.500000\n", + "12.3 30569.250000\n", + "13.0 9531.776018\n", + "13.1 32490.000000\n", + "13.2 7496.333333\n", + "15.0 88719.000000\n", + "16.0 17923.896825\n", + "18.0 19999.000000\n", + "19.0 39095.000000\n", + "20.0 23739.777778\n", + "20.7 35718.600000\n", + "21.0 14513.900000\n", + "21.5 6999.000000\n", + "23.0 31966.090909\n", + "24.0 18587.250000\n", + "25.0 13980.000000\n", + "32.0 19589.000000\n", + "40.0 61389.750000\n", + "41.0 10990.000000\n", + "48.0 24205.615385\n", + "64.0 19332.333333\n", + "108.0 92999.000000\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для 'Front camera':\n", + "Front camera\n", + "0.0 6799.333333\n", + "0.3 4398.430233\n", + "0.9 19999.000000\n", + "1.1 18745.000000\n", + "1.2 18579.333333\n", + "1.3 5640.352941\n", + "1.5 18748.000000\n", + "1.6 15833.000000\n", + "1.9 11246.750000\n", + "2.0 6711.995122\n", + "2.1 24839.666667\n", + "2.2 35823.333333\n", + "2.4 5061.333333\n", + "3.0 8500.000000\n", + "3.2 4660.900000\n", + "3.7 28925.000000\n", + "4.0 13519.285714\n", + "5.0 8347.064655\n", + "7.0 49061.625000\n", + "8.0 13894.422222\n", + "10.0 105114.166667\n", + "12.0 41929.500000\n", + "13.0 11380.436364\n", + "16.0 17646.113402\n", + "20.0 13498.520000\n", + "24.0 21860.562500\n", + "25.0 19182.692308\n", + "32.0 23749.782609\n", + "40.0 92999.000000\n", + "48.0 27999.000000\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для 'Operating system':\n", + "Operating system\n", + "Android 10989.947652\n", + "BlackBerry 10509.600000\n", + "Cyanogen 9173.600000\n", + "Sailfish 4799.000000\n", + "Tizen 4459.666667\n", + "Windows 16706.684211\n", + "iOS 45510.470588\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для 'Wi-Fi':\n", + "Wi-Fi\n", + "No 6334.375000\n", + "Yes 11496.211695\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для 'Bluetooth':\n", + "Bluetooth\n", + "No 7794.466667\n", + "Yes 11506.800595\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для 'GPS':\n", + "GPS\n", + "No 8316.148148\n", + "Yes 11737.740208\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для 'Number of SIMs':\n", + "Number of SIMs\n", + "1 16479.718062\n", + "2 10465.580018\n", + "3 4590.000000\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для '3G':\n", + "3G\n", + "No 11616.882759\n", + "Yes 11447.783361\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для '4G/ LTE':\n", + "4G/ LTE\n", + "No 7922.270893\n", + "Yes 12680.858696\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для комбинации 'Brand' и 'Operating system':\n", + "Brand Operating system\n", + "10.or Android 5999.000000\n", + "Acer Android 6470.000000\n", + "Alcatel Android 9201.600000\n", + "Apple iOS 45510.470588\n", + "Aqua Android 4599.000000\n", + " ... \n", + "Zopo Android 6027.916667\n", + "Zuk Android 29124.000000\n", + "iBall Android 4051.000000\n", + "iVoomi Android 4018.875000\n", + "mPhone Android 6949.000000\n", + "Name: Price, Length: 85, dtype: float64\n", + "\n", + "Средняя цена для комбинации 'RAM (MB)' и 'Internal storage (GB)':\n", + "RAM (MB) Internal storage (GB)\n", + "64 0.064 3499.000000\n", + " 0.128 4999.000000\n", + "256 0.512 2287.857143\n", + " 8.000 4990.000000\n", + "289 3.000 3190.000000\n", + "384 0.160 5555.000000\n", + "512 0.512 7249.500000\n", + " 2.000 2399.000000\n", + " 4.000 3222.244444\n", + " 8.000 3513.750000\n", + "768 4.000 6500.000000\n", + " 8.000 2999.000000\n", + "1000 1.000 5197.000000\n", + " 4.000 8019.187500\n", + " 8.000 5398.572464\n", + " 16.000 6772.263158\n", + " 32.000 6997.000000\n", + "2000 8.000 6458.736842\n", + " 16.000 8518.889273\n", + " 32.000 10155.272727\n", + " 64.000 36999.000000\n", + "3000 16.000 9082.082192\n", + " 32.000 11742.751269\n", + " 64.000 24287.833333\n", + "4000 32.000 14827.288462\n", + " 64.000 19201.702290\n", + " 128.000 15408.882353\n", + "6000 64.000 26554.636364\n", + " 128.000 29692.000000\n", + " 256.000 44999.000000\n", + "8000 64.000 54990.000000\n", + " 128.000 37177.181818\n", + " 256.000 72408.166667\n", + "12000 128.000 92999.000000\n", + " 256.000 69348.500000\n", + " 512.000 164999.000000\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для комбинации 'Screen size (inches)' и 'Battery capacity (mAh)':\n", + "Screen size (inches) Battery capacity (mAh)\n", + "2.40 2000 1249.0\n", + "2.44 1450 6999.0\n", + "2.45 1500 2999.0\n", + "2.60 1350 5555.0\n", + "2.80 1200 3190.0\n", + " ... \n", + "6.70 4500 40259.0\n", + "6.80 4300 79699.0\n", + "6.90 5000 92999.0\n", + "7.00 3450 6199.0\n", + "7.30 4380 164999.0\n", + "Name: Price, Length: 431, dtype: float64\n", + "\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "# Загружаем набор данных\n", + "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", + "\n", + "# Удаление пустого столбца по имени\n", + "df = df.drop('Unnamed: 0', axis=1)\n", + "\n", + "# Устанавливаем случайное состояние\n", + "random_state = 42\n", + "\n", + "# Рассчитываем среднюю цену для каждого значения каждого признака (Model уберем, у всех разная)\n", + "for column in ['Brand', 'Battery capacity (mAh)', 'Screen size (inches)', 'Touchscreen', \n", + " 'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', \n", + " 'Rear camera', 'Front camera', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', \n", + " 'Number of SIMs', '3G', '4G/ LTE']:\n", + " print(f\"Средняя цена для '{column}':\")\n", + " print(df.groupby(column)['Price'].mean())\n", + " print()\n", + "\n", + "# Рассчитываем среднюю цену для комбинаций признаков\n", + "# для комбинации 'Brand' и 'Operating system'\n", + "print(\"Средняя цена для комбинации 'Brand' и 'Operating system':\")\n", + "print(df.groupby(['Brand', 'Operating system'])['Price'].mean())\n", + "print()\n", + "\n", + "# Рассчитываем среднюю цену для комбинации 'RAM (MB)' и 'Internal storage (GB)'\n", + "print(\"Средняя цена для комбинации 'RAM (MB)' и 'Internal storage (GB)':\")\n", + "print(df.groupby(['RAM (MB)', 'Internal storage (GB)'])['Price'].mean())\n", + "print()\n", + "\n", + "# Рассчитываем среднюю цену для комбинации 'Screen size (inches)' и 'Battery capacity (mAh)'\n", + "print(\"Средняя цена для комбинации 'Screen size (inches)' и 'Battery capacity (mAh)':\")\n", + "print(df.groupby(['Screen size (inches)', 'Battery capacity (mAh)'])['Price'].mean())\n", + "print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Выбор ориентира для каждой задачи:\n", + "\n", + "1. Прогнозирование цен на мобильные телефоны:\n", + "Ориентир:\n", + "\n", + "R² (коэффициент детерминации): 0.75 - 0.85\n", + "\n", + "MAE (средняя абсолютная ошибка): 5000 - 10000 рублей\n", + "\n", + "RMSE (среднеквадратичная ошибка): 10000 - 20000 рублей\n", + "\n", + "Объяснение:\n", + "\n", + "R²: Значение 0.75 - 0.85 будет означать, что модель объясняет 75-85% вариации цен на мобильные телефоны, что является хорошим результатом для задачи регрессии.\n", + "\n", + "MAE: Значение 5000 - 10000 рублей будет означать, что в среднем модель ошибается на 5000 - 10000 рублей при прогнозировании цен на мобильные телефоны. Учитывая диапазон цен от 9000 до 150000 рублей, этот ориентир является разумным.\n", + "\n", + "RMSE: Значение 10000 - 20000 рублей будет означать, что среднеквадратичная ошибка модели составляет 10000 - 20000 рублей.\n", + "\n", + "2. Оптимизация характеристик продукта:\n", + "Ориентир:\n", + "\n", + "Увеличение прибыли компании: 5% - 10%\n", + "\n", + "Сохранение конкурентоспособных тарифов:\n", + "\n", + "Средняя цена мобильных телефонов не должна увеличиваться более чем на 5% по сравнению с текущими тарифами.\n", + "\n", + "Доля клиентов, считающих цены высокими, не должна увеличиваться более чем на 2%.\n", + "\n", + "Объяснение:\n", + "\n", + "Увеличение прибыли компании: \n", + "\n", + "Цель оптимизации характеристик продукта - максимизировать прибыль компании. Ориентир в 5% - 10% увеличения прибыли является реалистичным и достижимым.\n", + "\n", + "Сохранение конкурентоспособных тарифов: \n", + "\n", + "Важно, чтобы оптимизация характеристик продукта не привела к значительному увеличению цен для клиентов. Ориентир в 5% увеличения средней цены мобильных телефонов и 2% увеличения доли клиентов, считающих цены высокими, позволяет сохранить конкурентоспособность компании." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAE: 5424.128251450574\n", + "MSE: 143399695.59118932\n", + "RMSE: 11974.961193723733\n", + "R²: 0.4559750691933513\n", + "Ориентиры для прогнозирования цены мобильных устройств не достигнуты.\n", + "Средняя цена для 'Battery capacity (mAh)':\n", + "Battery capacity (mAh)\n", + "1010 3499.000000\n", + "1050 4790.000000\n", + "1200 3396.000000\n", + "1250 2498.500000\n", + "1300 3338.333333\n", + " ... \n", + "5000 13542.530612\n", + "5020 23900.000000\n", + "5100 16999.000000\n", + "5300 8999.000000\n", + "6000 19832.333333\n", + "Name: Price, Length: 165, dtype: float64\n", + "\n", + "Средняя цена для 'Screen size (inches)':\n", + "Screen size (inches)\n", + "2.40 1249.000000\n", + "2.44 6999.000000\n", + "2.45 2999.000000\n", + "2.60 5555.000000\n", + "2.80 5345.000000\n", + " ... \n", + "6.70 58896.428571\n", + "6.80 79699.000000\n", + "6.90 92999.000000\n", + "7.00 6199.000000\n", + "7.30 164999.000000\n", + "Name: Price, Length: 80, dtype: float64\n", + "\n", + "Средняя цена для 'RAM (MB)':\n", + "RAM (MB)\n", + "64 4249.000000\n", + "256 2625.625000\n", + "289 3190.000000\n", + "384 5555.000000\n", + "512 3419.847222\n", + "768 4749.500000\n", + "1000 5747.082153\n", + "2000 8645.608187\n", + "3000 11587.829787\n", + "4000 17741.965000\n", + "6000 28291.587302\n", + "8000 45080.586207\n", + "12000 99173.750000\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для 'Internal storage (GB)':\n", + "Internal storage (GB)\n", + "0.064 3499.000000\n", + "0.128 4999.000000\n", + "0.160 5555.000000\n", + "0.512 3390.444444\n", + "1.000 5197.000000\n", + "2.000 2399.000000\n", + "3.000 3190.000000\n", + "4.000 4513.032258\n", + "8.000 5311.654206\n", + "16.000 8379.403341\n", + "32.000 12089.644366\n", + "64.000 21208.814607\n", + "128.000 29477.043478\n", + "256.000 68682.777778\n", + "512.000 164999.000000\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для 'Rear camera':\n", + "Rear camera\n", + "0.0 4193.500000\n", + "0.3 3054.666667\n", + "2.0 3000.804878\n", + "3.0 4329.333333\n", + "3.2 3506.727273\n", + "5.0 4413.183486\n", + "8.0 6658.109966\n", + "8.7 8999.000000\n", + "10.0 10499.250000\n", + "12.0 28533.950980\n", + "12.2 29162.500000\n", + "12.3 30569.250000\n", + "13.0 9531.776018\n", + "13.1 32490.000000\n", + "13.2 7496.333333\n", + "15.0 88719.000000\n", + "16.0 17923.896825\n", + "18.0 19999.000000\n", + "19.0 39095.000000\n", + "20.0 23739.777778\n", + "20.7 35718.600000\n", + "21.0 14513.900000\n", + "21.5 6999.000000\n", + "23.0 31966.090909\n", + "24.0 18587.250000\n", + "25.0 13980.000000\n", + "32.0 19589.000000\n", + "40.0 61389.750000\n", + "41.0 10990.000000\n", + "48.0 24205.615385\n", + "64.0 19332.333333\n", + "108.0 92999.000000\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для 'Front camera':\n", + "Front camera\n", + "0.0 6799.333333\n", + "0.3 4398.430233\n", + "0.9 19999.000000\n", + "1.1 18745.000000\n", + "1.2 18579.333333\n", + "1.3 5640.352941\n", + "1.5 18748.000000\n", + "1.6 15833.000000\n", + "1.9 11246.750000\n", + "2.0 6711.995122\n", + "2.1 24839.666667\n", + "2.2 35823.333333\n", + "2.4 5061.333333\n", + "3.0 8500.000000\n", + "3.2 4660.900000\n", + "3.7 28925.000000\n", + "4.0 13519.285714\n", + "5.0 8347.064655\n", + "7.0 49061.625000\n", + "8.0 13894.422222\n", + "10.0 105114.166667\n", + "12.0 41929.500000\n", + "13.0 11380.436364\n", + "16.0 17646.113402\n", + "20.0 13498.520000\n", + "24.0 21860.562500\n", + "25.0 19182.692308\n", + "32.0 23749.782609\n", + "40.0 92999.000000\n", + "48.0 27999.000000\n", + "Name: Price, dtype: float64\n", + "\n", + "Средняя цена для комбинации 'Battery capacity (mAh)' и 'RAM (MB)':\n", + "Battery capacity (mAh) RAM (MB)\n", + "1010 64 3499.0\n", + "1050 1000 4790.0\n", + "1200 64 4999.0\n", + " 289 3190.0\n", + " 512 1999.0\n", + " ... \n", + "5020 3000 23900.0\n", + "5100 3000 16999.0\n", + "5300 4000 8999.0\n", + "6000 4000 10749.0\n", + " 8000 37999.0\n", + "Name: Price, Length: 323, dtype: float64\n", + "\n", + "Средняя цена для комбинации 'Screen size (inches)' и 'Internal storage (GB)':\n", + "Screen size (inches) Internal storage (GB)\n", + "2.40 4.000 1249.0\n", + "2.44 0.512 6999.0\n", + "2.45 4.000 2999.0\n", + "2.60 0.160 5555.0\n", + "2.80 0.512 7500.0\n", + " ... \n", + "6.70 256.000 174990.0\n", + "6.80 256.000 79699.0\n", + "6.90 128.000 92999.0\n", + "7.00 8.000 6199.0\n", + "7.30 512.000 164999.0\n", + "Name: Price, Length: 177, dtype: float64\n", + "\n", + "Средняя цена для комбинации 'Rear camera' и 'Front camera':\n", + "Rear camera Front camera\n", + "0.0 0.0 4193.500000\n", + "0.3 0.3 3054.666667\n", + "2.0 0.0 4396.000000\n", + " 0.3 2940.937500\n", + " 1.3 2240.000000\n", + " ... \n", + "48.0 48.0 27999.000000\n", + "64.0 16.0 21499.000000\n", + " 20.0 14999.000000\n", + " 32.0 21499.000000\n", + "108.0 40.0 92999.000000\n", + "Name: Price, Length: 126, dtype: float64\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n", + "\n", + "# Загружаем набор данных\n", + "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", + "\n", + "# Удаление пустого столбца по имени\n", + "df = df.drop('Unnamed: 0', axis=1)\n", + "\n", + "# Преобразуем категориальные переменные в числовые\n", + "df = pd.get_dummies(df, columns=['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE'], drop_first=True)\n", + "\n", + "# Разделяем данные на признаки (X) и целевую переменную (y)\n", + "X = df.drop('Price', axis=1)\n", + "y = df['Price']\n", + "\n", + "# Разделяем данные на обучающую и тестовую выборки\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", + "\n", + "# Стандартизируем признаки\n", + "scaler = StandardScaler()\n", + "X_train = scaler.fit_transform(X_train)\n", + "X_test = scaler.transform(X_test)\n", + "\n", + "# Обучаем модель линейной регрессии\n", + "model = LinearRegression()\n", + "model.fit(X_train, y_train)\n", + "\n", + "# Делаем предсказания на тестовой выборке\n", + "y_pred = model.predict(X_test)\n", + "\n", + "# Оцениваем качество модели\n", + "mae = mean_absolute_error(y_test, y_pred)\n", + "mse = mean_squared_error(y_test, y_pred)\n", + "rmse = mean_squared_error(y_test, y_pred, squared=False)\n", + "r2 = r2_score(y_test, y_pred)\n", + "\n", + "print(f\"MAE: {mae}\")\n", + "print(f\"MSE: {mse}\")\n", + "print(f\"RMSE: {rmse}\")\n", + "print(f\"R²: {r2}\")\n", + "\n", + "# Проверяем, достигнуты ли ориентиры\n", + "if r2 >= 0.75 and mae <= 10000 and rmse <= 20000:\n", + " print(\"Ориентиры для прогнозирования цены мобильных устройств достигнуты!\")\n", + "else:\n", + " print(\"Ориентиры для прогнозирования цены мобильных устройств не достигнуты.\")\n", + "\n", + "# Оптимизация тарифной сетки\n", + "# Убедитесь, что столбцы существуют\n", + "columns_to_group = ['Battery capacity (mAh)', 'Screen size (inches)', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera']\n", + "\n", + "# Рассчитываем среднюю цену для каждого значения каждого признака\n", + "for column in columns_to_group:\n", + " print(f\"Средняя цена для '{column}':\")\n", + " print(df.groupby(column)['Price'].mean())\n", + " print()\n", + "\n", + "# Рассчитываем среднюю цену для комбинаций признаков\n", + "# Например, для комбинации 'Battery capacity (mAh)' и 'RAM (MB)'\n", + "print(\"Средняя цена для комбинации 'Battery capacity (mAh)' и 'RAM (MB)':\")\n", + "print(df.groupby(['Battery capacity (mAh)', 'RAM (MB)'])['Price'].mean())\n", + "print()\n", + "\n", + "# Рассчитываем среднюю цену для комбинации 'Screen size (inches)' и 'Internal storage (GB)'\n", + "print(\"Средняя цена для комбинации 'Screen size (inches)' и 'Internal storage (GB)':\")\n", + "print(df.groupby(['Screen size (inches)', 'Internal storage (GB)'])['Price'].mean())\n", + "print()\n", + "\n", + "# Рассчитываем среднюю цену для комбинации 'Rear camera' и 'Front camera'\n", + "print(\"Средняя цена для комбинации 'Rear camera' и 'Front camera':\")\n", + "print(df.groupby(['Rear camera', 'Front camera'])['Price'].mean())\n", + "print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Анализ применимости алгоритмов обучения с учителем для решения поставленных задач:\n", + "\n", + "1. Прогнозирование стоимости страховых взносов: Задача: Регрессия\n", + "\n", + "Свойства алгоритмов:\n", + "\n", + "Линейная регрессия: Применимость: Хорошо подходит для задач, где зависимость между признаками и целевой переменной линейна. Преимущества: Проста в реализации, интерпретируема. Недостатки: Может плохо работать, если зависимость нелинейна.\n", + "\n", + "Деревья решений (регрессия): Применимость: Подходит для задач с нелинейными зависимостями. Преимущества: Может обрабатывать категориальные признаки, не требует масштабирования данных. Недостатки: Подвержены переобучению, могут давать нестабильные результаты.\n", + "\n", + "Случайный лес (регрессия): Применимость: Хорошо подходит для задач с нелинейными зависимостями и большим количеством признаков. Преимущества: Устойчив к переобучению, может обрабатывать категориальные признаки. Недостатки: Менее интерпретируем, чем линейная регрессия.\n", + "\n", + "Градиентный бустинг (регрессия): Применимость: Подходит для задач с нелинейными зависимостями и сложными взаимосвязями между признаками. Преимущества: Может достигать высокой точности, устойчив к переобучению. Недостатки: Сложнее в настройке, чем случайный лес, менее интерпретируем.\n", + "\n", + "Нейронные сети (регрессия): Применимость: Подходит для задач с очень сложными зависимостями и большим количеством данных. Преимущества: Может моделировать очень сложные зависимости. Недостатки: Требует большого количества данных, сложнее в настройке и интерпретации.\n", + "\n", + "#### Вывод:\n", + "\n", + "Линейная регрессия: Может быть хорошим выбором для начала, особенно если зависимость между признаками и целевой переменной линейна.\n", + "\n", + "Деревья решений и случайный лес: Подходят для задач с нелинейными зависимостями.\n", + "\n", + "Градиентный бустинг: Может давать более высокую точность, чем случайный лес, но требует больше времени на настройку.\n", + "\n", + "Нейронные сети: Могут быть излишними для этой задачи, если данных недостаточно много.\n", + "\n", + "2. Оптимизация тарифной сетки: Задача: Классификация (группировка клиентов по группам риска)\n", + "\n", + "Свойства алгоритмов:\n", + "\n", + "Логистическая регрессия: Применимость: Хорошо подходит для задач бинарной классификации, где зависимость между признаками и целевой переменной линейна. Преимущества: Проста в реализации, интерпретируема. Недостатки: Может плохо работать, если зависимость нелинейна.\n", + "\n", + "Деревья решений (классификация): Применимость: Подходит для задач с нелинейными зависимостями. Преимущества: Может обрабатывать категориальные признаки, не требует масштабирования данных. Недостатки: Подвержены переобучению, могут давать нестабильные результаты.\n", + "\n", + "Случайный лес (классификация): Применимость: Хорошо подходит для задач с нелинейными зависимостями и большим количеством признаков. Преимущества: Устойчив к переобучению, может обрабатывать категориальные признаки. Недостатки: Менее интерпретируем, чем линейная регрессия.\n", + "\n", + "Градиентный бустинг (классификация): Применимость: Подходит для задач с нелинейными зависимостями и сложными взаимосвязями между признаками. Преимущества: Может достигать высокой точности, устойчив к переобучению. Недостатки: Сложнее в настройке, чем случайный лес, менее интерпретируем.\n", + "\n", + "Нейронные сети (классификация): Применимость: Подходит для задач с очень сложными зависимостями и большим количеством данных. Преимущества: Может моделировать очень сложные зависимости. Недостатки: Требует большого количества данных, сложнее в настройке и интерпретации.\n", + "\n", + "#### Вывод:\n", + "\n", + "Логистическая регрессия: Может быть хорошим выбором для начала, особенно если зависимость между признаками и целевой переменной линейна.\n", + "\n", + "Деревья решений и случайный лес: Подходят для задач с нелинейными зависимостями.\n", + "\n", + "Градиентный бустинг: Может давать более высокую точность, чем случайный лес, но требует больше времени на настройку.\n", + "\n", + "Нейронные сети: Могут быть излишними для этой задачи, если данных недостаточно много.\n", + "\n", + "1. Прогнозирование стоимости страховых взносов: Выбранные модели:\n", + "\n", + "Линейная регрессия\n", + "\n", + "Случайный лес (регрессия)\n", + "\n", + "Градиентный бустинг (регрессия)\n", + "\n", + "2. Оптимизация тарифной сетки: Выбранные модели:\n", + "\n", + "Логистическая регрессия\n", + "\n", + "Случайный лес (классификация)\n", + "\n", + "Градиентный бустинг (классификация)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "could not convert string to float: '9.0 (Pie)'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[19], line 39\u001b[0m\n\u001b[0;32m 37\u001b[0m \u001b[38;5;66;03m# Стандартизируем признаки для задачи регрессии\u001b[39;00m\n\u001b[0;32m 38\u001b[0m scaler_reg \u001b[38;5;241m=\u001b[39m StandardScaler()\n\u001b[1;32m---> 39\u001b[0m X_train_reg \u001b[38;5;241m=\u001b[39m \u001b[43mscaler_reg\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit_transform\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX_train_reg\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 40\u001b[0m X_test_reg \u001b[38;5;241m=\u001b[39m scaler_reg\u001b[38;5;241m.\u001b[39mtransform(X_test_reg)\n\u001b[0;32m 42\u001b[0m \u001b[38;5;66;03m# Список моделей для задачи регрессии\u001b[39;00m\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\utils\\_set_output.py:316\u001b[0m, in \u001b[0;36m_wrap_method_output..wrapped\u001b[1;34m(self, X, *args, **kwargs)\u001b[0m\n\u001b[0;32m 314\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(f)\n\u001b[0;32m 315\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapped\u001b[39m(\u001b[38;5;28mself\u001b[39m, X, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m--> 316\u001b[0m data_to_wrap \u001b[38;5;241m=\u001b[39m \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 317\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(data_to_wrap, \u001b[38;5;28mtuple\u001b[39m):\n\u001b[0;32m 318\u001b[0m \u001b[38;5;66;03m# only wrap the first output for cross decomposition\u001b[39;00m\n\u001b[0;32m 319\u001b[0m return_tuple \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m 320\u001b[0m _wrap_data_with_container(method, data_to_wrap[\u001b[38;5;241m0\u001b[39m], X, \u001b[38;5;28mself\u001b[39m),\n\u001b[0;32m 321\u001b[0m \u001b[38;5;241m*\u001b[39mdata_to_wrap[\u001b[38;5;241m1\u001b[39m:],\n\u001b[0;32m 322\u001b[0m )\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1098\u001b[0m, in \u001b[0;36mTransformerMixin.fit_transform\u001b[1;34m(self, X, y, **fit_params)\u001b[0m\n\u001b[0;32m 1083\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[0;32m 1084\u001b[0m (\n\u001b[0;32m 1085\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThis object (\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m) has a `transform`\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1093\u001b[0m \u001b[38;5;167;01mUserWarning\u001b[39;00m,\n\u001b[0;32m 1094\u001b[0m )\n\u001b[0;32m 1096\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m y \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 1097\u001b[0m \u001b[38;5;66;03m# fit method of arity 1 (unsupervised transformation)\u001b[39;00m\n\u001b[1;32m-> 1098\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mfit_params\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mtransform(X)\n\u001b[0;32m 1099\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 1100\u001b[0m \u001b[38;5;66;03m# fit method of arity 2 (supervised transformation)\u001b[39;00m\n\u001b[0;32m 1101\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfit(X, y, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mfit_params)\u001b[38;5;241m.\u001b[39mtransform(X)\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\preprocessing\\_data.py:878\u001b[0m, in \u001b[0;36mStandardScaler.fit\u001b[1;34m(self, X, y, sample_weight)\u001b[0m\n\u001b[0;32m 876\u001b[0m \u001b[38;5;66;03m# Reset internal state before fitting\u001b[39;00m\n\u001b[0;32m 877\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_reset()\n\u001b[1;32m--> 878\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpartial_fit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msample_weight\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473\u001b[0m, in \u001b[0;36m_fit_context..decorator..wrapper\u001b[1;34m(estimator, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1466\u001b[0m estimator\u001b[38;5;241m.\u001b[39m_validate_params()\n\u001b[0;32m 1468\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m config_context(\n\u001b[0;32m 1469\u001b[0m skip_parameter_validation\u001b[38;5;241m=\u001b[39m(\n\u001b[0;32m 1470\u001b[0m prefer_skip_nested_validation \u001b[38;5;129;01mor\u001b[39;00m global_skip_validation\n\u001b[0;32m 1471\u001b[0m )\n\u001b[0;32m 1472\u001b[0m ):\n\u001b[1;32m-> 1473\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfit_method\u001b[49m\u001b[43m(\u001b[49m\u001b[43mestimator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\preprocessing\\_data.py:914\u001b[0m, in \u001b[0;36mStandardScaler.partial_fit\u001b[1;34m(self, X, y, sample_weight)\u001b[0m\n\u001b[0;32m 882\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Online computation of mean and std on X for later scaling.\u001b[39;00m\n\u001b[0;32m 883\u001b[0m \n\u001b[0;32m 884\u001b[0m \u001b[38;5;124;03mAll of X is processed as a single batch. This is intended for cases\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 911\u001b[0m \u001b[38;5;124;03m Fitted scaler.\u001b[39;00m\n\u001b[0;32m 912\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 913\u001b[0m first_call \u001b[38;5;241m=\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mn_samples_seen_\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m--> 914\u001b[0m X \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_validate_data\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 915\u001b[0m \u001b[43m \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 916\u001b[0m \u001b[43m \u001b[49m\u001b[43maccept_sparse\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcsr\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcsc\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 917\u001b[0m \u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mFLOAT_DTYPES\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 918\u001b[0m \u001b[43m \u001b[49m\u001b[43mforce_all_finite\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mallow-nan\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 919\u001b[0m \u001b[43m \u001b[49m\u001b[43mreset\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfirst_call\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 920\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 921\u001b[0m n_features \u001b[38;5;241m=\u001b[39m X\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m1\u001b[39m]\n\u001b[0;32m 923\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m sample_weight \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\base.py:633\u001b[0m, in \u001b[0;36mBaseEstimator._validate_data\u001b[1;34m(self, X, y, reset, validate_separately, cast_to_ndarray, **check_params)\u001b[0m\n\u001b[0;32m 631\u001b[0m out \u001b[38;5;241m=\u001b[39m X, y\n\u001b[0;32m 632\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m no_val_X \u001b[38;5;129;01mand\u001b[39;00m no_val_y:\n\u001b[1;32m--> 633\u001b[0m out \u001b[38;5;241m=\u001b[39m \u001b[43mcheck_array\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minput_name\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mX\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcheck_params\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 634\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m no_val_X \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m no_val_y:\n\u001b[0;32m 635\u001b[0m out \u001b[38;5;241m=\u001b[39m _check_y(y, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mcheck_params)\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:929\u001b[0m, in \u001b[0;36mcheck_array\u001b[1;34m(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_writeable, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator, input_name)\u001b[0m\n\u001b[0;32m 924\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m pandas_requires_conversion:\n\u001b[0;32m 925\u001b[0m \u001b[38;5;66;03m# pandas dataframe requires conversion earlier to handle extension dtypes with\u001b[39;00m\n\u001b[0;32m 926\u001b[0m \u001b[38;5;66;03m# nans\u001b[39;00m\n\u001b[0;32m 927\u001b[0m \u001b[38;5;66;03m# Use the original dtype for conversion if dtype is None\u001b[39;00m\n\u001b[0;32m 928\u001b[0m new_dtype \u001b[38;5;241m=\u001b[39m dtype_orig \u001b[38;5;28;01mif\u001b[39;00m dtype \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m dtype\n\u001b[1;32m--> 929\u001b[0m array \u001b[38;5;241m=\u001b[39m \u001b[43marray\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mastype\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnew_dtype\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 930\u001b[0m \u001b[38;5;66;03m# Since we converted here, we do not need to convert again later\u001b[39;00m\n\u001b[0;32m 931\u001b[0m dtype \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\pandas\\core\\generic.py:6643\u001b[0m, in \u001b[0;36mNDFrame.astype\u001b[1;34m(self, dtype, copy, errors)\u001b[0m\n\u001b[0;32m 6637\u001b[0m results \u001b[38;5;241m=\u001b[39m [\n\u001b[0;32m 6638\u001b[0m ser\u001b[38;5;241m.\u001b[39mastype(dtype, copy\u001b[38;5;241m=\u001b[39mcopy, errors\u001b[38;5;241m=\u001b[39merrors) \u001b[38;5;28;01mfor\u001b[39;00m _, ser \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mitems()\n\u001b[0;32m 6639\u001b[0m ]\n\u001b[0;32m 6641\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 6642\u001b[0m \u001b[38;5;66;03m# else, only a single dtype is given\u001b[39;00m\n\u001b[1;32m-> 6643\u001b[0m new_data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_mgr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mastype\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43merrors\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 6644\u001b[0m res \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_constructor_from_mgr(new_data, axes\u001b[38;5;241m=\u001b[39mnew_data\u001b[38;5;241m.\u001b[39maxes)\n\u001b[0;32m 6645\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m res\u001b[38;5;241m.\u001b[39m__finalize__(\u001b[38;5;28mself\u001b[39m, method\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mastype\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\pandas\\core\\internals\\managers.py:430\u001b[0m, in \u001b[0;36mBaseBlockManager.astype\u001b[1;34m(self, dtype, copy, errors)\u001b[0m\n\u001b[0;32m 427\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m using_copy_on_write():\n\u001b[0;32m 428\u001b[0m copy \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m--> 430\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mapply\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 431\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mastype\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 432\u001b[0m \u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 433\u001b[0m \u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 434\u001b[0m \u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43merrors\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 435\u001b[0m \u001b[43m \u001b[49m\u001b[43musing_cow\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43musing_copy_on_write\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 436\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\pandas\\core\\internals\\managers.py:363\u001b[0m, in \u001b[0;36mBaseBlockManager.apply\u001b[1;34m(self, f, align_keys, **kwargs)\u001b[0m\n\u001b[0;32m 361\u001b[0m applied \u001b[38;5;241m=\u001b[39m b\u001b[38;5;241m.\u001b[39mapply(f, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 362\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 363\u001b[0m applied \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mf\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 364\u001b[0m result_blocks \u001b[38;5;241m=\u001b[39m extend_blocks(applied, result_blocks)\n\u001b[0;32m 366\u001b[0m out \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtype\u001b[39m(\u001b[38;5;28mself\u001b[39m)\u001b[38;5;241m.\u001b[39mfrom_blocks(result_blocks, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maxes)\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\pandas\\core\\internals\\blocks.py:758\u001b[0m, in \u001b[0;36mBlock.astype\u001b[1;34m(self, dtype, copy, errors, using_cow, squeeze)\u001b[0m\n\u001b[0;32m 755\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCan not squeeze with more than one column.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 756\u001b[0m values \u001b[38;5;241m=\u001b[39m values[\u001b[38;5;241m0\u001b[39m, :] \u001b[38;5;66;03m# type: ignore[call-overload]\u001b[39;00m\n\u001b[1;32m--> 758\u001b[0m new_values \u001b[38;5;241m=\u001b[39m \u001b[43mastype_array_safe\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalues\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43merrors\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 760\u001b[0m new_values \u001b[38;5;241m=\u001b[39m maybe_coerce_values(new_values)\n\u001b[0;32m 762\u001b[0m refs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\pandas\\core\\dtypes\\astype.py:237\u001b[0m, in \u001b[0;36mastype_array_safe\u001b[1;34m(values, dtype, copy, errors)\u001b[0m\n\u001b[0;32m 234\u001b[0m dtype \u001b[38;5;241m=\u001b[39m dtype\u001b[38;5;241m.\u001b[39mnumpy_dtype\n\u001b[0;32m 236\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 237\u001b[0m new_values \u001b[38;5;241m=\u001b[39m \u001b[43mastype_array\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalues\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 238\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (\u001b[38;5;167;01mValueError\u001b[39;00m, \u001b[38;5;167;01mTypeError\u001b[39;00m):\n\u001b[0;32m 239\u001b[0m \u001b[38;5;66;03m# e.g. _astype_nansafe can fail on object-dtype of strings\u001b[39;00m\n\u001b[0;32m 240\u001b[0m \u001b[38;5;66;03m# trying to convert to float\u001b[39;00m\n\u001b[0;32m 241\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m errors \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mignore\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\pandas\\core\\dtypes\\astype.py:182\u001b[0m, in \u001b[0;36mastype_array\u001b[1;34m(values, dtype, copy)\u001b[0m\n\u001b[0;32m 179\u001b[0m values \u001b[38;5;241m=\u001b[39m values\u001b[38;5;241m.\u001b[39mastype(dtype, copy\u001b[38;5;241m=\u001b[39mcopy)\n\u001b[0;32m 181\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 182\u001b[0m values \u001b[38;5;241m=\u001b[39m \u001b[43m_astype_nansafe\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalues\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 184\u001b[0m \u001b[38;5;66;03m# in pandas we don't store numpy str dtypes, so convert to object\u001b[39;00m\n\u001b[0;32m 185\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(dtype, np\u001b[38;5;241m.\u001b[39mdtype) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28missubclass\u001b[39m(values\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mtype, \u001b[38;5;28mstr\u001b[39m):\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\pandas\\core\\dtypes\\astype.py:133\u001b[0m, in \u001b[0;36m_astype_nansafe\u001b[1;34m(arr, dtype, copy, skipna)\u001b[0m\n\u001b[0;32m 129\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(msg)\n\u001b[0;32m 131\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m copy \u001b[38;5;129;01mor\u001b[39;00m arr\u001b[38;5;241m.\u001b[39mdtype \u001b[38;5;241m==\u001b[39m \u001b[38;5;28mobject\u001b[39m \u001b[38;5;129;01mor\u001b[39;00m dtype \u001b[38;5;241m==\u001b[39m \u001b[38;5;28mobject\u001b[39m:\n\u001b[0;32m 132\u001b[0m \u001b[38;5;66;03m# Explicit copy, or required since NumPy can't view from / to object.\u001b[39;00m\n\u001b[1;32m--> 133\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43marr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mastype\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[0;32m 135\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m arr\u001b[38;5;241m.\u001b[39mastype(dtype, copy\u001b[38;5;241m=\u001b[39mcopy)\n", + "\u001b[1;31mValueError\u001b[0m: could not convert string to float: '9.0 (Pie)'" + ] + } + ], + "source": [ + "import pandas as pd\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.linear_model import LinearRegression, LogisticRegression\n", + "from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n", + "from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier\n", + "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score, accuracy_score\n", + "import re\n", + "\n", + "# Загружаем набор данных\n", + "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", + "\n", + "# Удаление пустого столбца по имени\n", + "df = df.drop('Unnamed: 0', axis=1)\n", + "\n", + "# Извлечение числовых значений из столбца Battery\n", + "df['Battery'] = df['Battery'].apply(lambda x: int(re.search(r'\\d+', x).group()) if re.search(r'\\d+', x) else None)\n", + "df['Ram'] = df['Ram'].apply(lambda x: int(re.search(r'\\d+', x).group()) if re.search(r'\\d+', x) else None)\n", + "df['Camera'] = df['Camera'].apply(lambda x: int(re.search(r'\\d+', x).group()) if re.search(r'\\d+', x) else None)\n", + "df['Display'] = df['Display'].apply(lambda x: int(re.search(r'\\d+', x).group()) if re.search(r'\\d+', x) else None)\n", + "\n", + "# Преобразуем категориальные переменные в числовые\n", + "# Предположим, что 'company' и 'Processor_name' являются категориальными\n", + "df = pd.get_dummies(df, columns=['company', 'Processor_name'], drop_first=True)\n", + "\n", + "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n", + "X_reg = df.drop('Price', axis=1)\n", + "y_reg = df['Price']\n", + "\n", + "# Разделяем данные на обучающую и тестовую выборки для задачи регрессии\n", + "X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.2, random_state=42)\n", + "\n", + "# Стандартизируем признаки для задачи регрессии\n", + "scaler_reg = StandardScaler()\n", + "X_train_reg = scaler_reg.fit_transform(X_train_reg)\n", + "X_test_reg = scaler_reg.transform(X_test_reg)\n", + "\n", + "# Список моделей для задачи регрессии\n", + "models_reg = {\n", + " \"Linear Regression\": LinearRegression(),\n", + " \"Random Forest Regression\": RandomForestRegressor(),\n", + " \"Gradient Boosting Regression\": GradientBoostingRegressor()\n", + "}\n", + "\n", + "# Обучаем и оцениваем модели для задачи регрессии\n", + "print(\"Результаты для задачи регрессии:\")\n", + "for name, model in models_reg.items():\n", + " model.fit(X_train_reg, y_train_reg)\n", + " y_pred_reg = model.predict(X_test_reg)\n", + " mae = mean_absolute_error(y_test_reg, y_pred_reg)\n", + " mse = mean_squared_error(y_test_reg, y_pred_reg)\n", + " rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)\n", + " r2 = r2_score(y_test_reg, y_pred_reg)\n", + " print(f\"Model: {name}\")\n", + " print(f\"MAE: {mae}\")\n", + " print(f\"MSE: {mse}\")\n", + " print(f\"RMSE: {rmse}\")\n", + " print(f\"R²: {r2}\")\n", + " print()\n", + "\n", + "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n", + "# Предположим, что мы классифицируем устройства по рейтингу выше среднего\n", + "X_class = df.drop('Rating', axis=1)\n", + "y_class = (df['Rating'] > df['Rating'].mean()).astype(int)\n", + "\n", + "# Разделяем данные на обучающую и тестовую выборки для задачи классификации\n", + "X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.2, random_state=42)\n", + "\n", + "# Стандартизируем признаки для задачи классификации\n", + "scaler_class = StandardScaler()\n", + "X_train_class = scaler_class.fit_transform(X_train_class)\n", + "X_test_class = scaler_class.transform(X_test_class)\n", + "\n", + "# Список моделей для задачи классификации\n", + "models_class = {\n", + " \"Logistic Regression\": LogisticRegression(),\n", + " \"Random Forest Classification\": RandomForestClassifier(),\n", + " \"Gradient Boosting Classification\": GradientBoostingClassifier()\n", + "}\n", + "\n", + "# Обучаем и оцениваем модели для задачи классификации\n", + "print(\"Результаты для задачи классификации:\")\n", + "for name, model in models_class.items():\n", + " model.fit(X_train_class, y_train_class)\n", + " y_pred_class = model.predict(X_test_class)\n", + " accuracy = accuracy_score(y_test_class, y_pred_class)\n", + " print(f\"Model: {name}\")\n", + " print(f\"Accuracy: {accuracy}\")\n", + " print()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "aimenv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 98aa97904bae8d416c17366392de34665dd8922d Mon Sep 17 00:00:00 2001 From: "a.puchkina" Date: Sun, 8 Dec 2024 23:25:41 +0400 Subject: [PATCH 2/4] =?UTF-8?q?=D0=BB=D1=8F=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab_4/lab4.ipynb | 1188 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1141 insertions(+), 47 deletions(-) diff --git a/lab_4/lab4.ipynb b/lab_4/lab4.ipynb index 2af2575..45a40d5 100644 --- a/lab_4/lab4.ipynb +++ b/lab_4/lab4.ipynb @@ -9,18 +9,13 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Index(['Unnamed: 0', 'Name', 'Rating', 'Spec_score', 'No_of_sim', 'Ram',\n", - " 'Battery', 'Display', 'Camera', 'External_Memory', 'Android_version',\n", - " 'Price', 'company', 'Inbuilt_memory', 'fast_charging',\n", - " 'Screen_resolution', 'Processor', 'Processor_name'],\n", - " dtype='object')\n", "Index(['Unnamed: 0', 'Name', 'Brand', 'Model', 'Battery capacity (mAh)',\n", " 'Screen size (inches)', 'Touchscreen', 'Resolution x', 'Resolution y',\n", " 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera',\n", @@ -32,9 +27,7 @@ ], "source": [ "import pandas as pd\n", - "df1 = pd.read_csv(\"..//static//csv//mobile phone price prediction.csv\")\n", "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", - "print(df1.columns)\n", "print(df.columns)" ] }, @@ -69,7 +62,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -226,7 +219,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -695,7 +688,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -1051,32 +1044,84 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [ { - "ename": "ValueError", - "evalue": "could not convert string to float: '9.0 (Pie)'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[19], line 39\u001b[0m\n\u001b[0;32m 37\u001b[0m \u001b[38;5;66;03m# Стандартизируем признаки для задачи регрессии\u001b[39;00m\n\u001b[0;32m 38\u001b[0m scaler_reg \u001b[38;5;241m=\u001b[39m StandardScaler()\n\u001b[1;32m---> 39\u001b[0m X_train_reg \u001b[38;5;241m=\u001b[39m \u001b[43mscaler_reg\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit_transform\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX_train_reg\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 40\u001b[0m X_test_reg \u001b[38;5;241m=\u001b[39m scaler_reg\u001b[38;5;241m.\u001b[39mtransform(X_test_reg)\n\u001b[0;32m 42\u001b[0m \u001b[38;5;66;03m# Список моделей для задачи регрессии\u001b[39;00m\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\utils\\_set_output.py:316\u001b[0m, in \u001b[0;36m_wrap_method_output..wrapped\u001b[1;34m(self, X, *args, **kwargs)\u001b[0m\n\u001b[0;32m 314\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(f)\n\u001b[0;32m 315\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapped\u001b[39m(\u001b[38;5;28mself\u001b[39m, X, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m--> 316\u001b[0m data_to_wrap \u001b[38;5;241m=\u001b[39m \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 317\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(data_to_wrap, \u001b[38;5;28mtuple\u001b[39m):\n\u001b[0;32m 318\u001b[0m \u001b[38;5;66;03m# only wrap the first output for cross decomposition\u001b[39;00m\n\u001b[0;32m 319\u001b[0m return_tuple \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m 320\u001b[0m _wrap_data_with_container(method, data_to_wrap[\u001b[38;5;241m0\u001b[39m], X, \u001b[38;5;28mself\u001b[39m),\n\u001b[0;32m 321\u001b[0m \u001b[38;5;241m*\u001b[39mdata_to_wrap[\u001b[38;5;241m1\u001b[39m:],\n\u001b[0;32m 322\u001b[0m )\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1098\u001b[0m, in \u001b[0;36mTransformerMixin.fit_transform\u001b[1;34m(self, X, y, **fit_params)\u001b[0m\n\u001b[0;32m 1083\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[0;32m 1084\u001b[0m (\n\u001b[0;32m 1085\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThis object (\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m) has a `transform`\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1093\u001b[0m \u001b[38;5;167;01mUserWarning\u001b[39;00m,\n\u001b[0;32m 1094\u001b[0m )\n\u001b[0;32m 1096\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m y \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 1097\u001b[0m \u001b[38;5;66;03m# fit method of arity 1 (unsupervised transformation)\u001b[39;00m\n\u001b[1;32m-> 1098\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mfit_params\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mtransform(X)\n\u001b[0;32m 1099\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 1100\u001b[0m \u001b[38;5;66;03m# fit method of arity 2 (supervised transformation)\u001b[39;00m\n\u001b[0;32m 1101\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfit(X, y, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mfit_params)\u001b[38;5;241m.\u001b[39mtransform(X)\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\preprocessing\\_data.py:878\u001b[0m, in \u001b[0;36mStandardScaler.fit\u001b[1;34m(self, X, y, sample_weight)\u001b[0m\n\u001b[0;32m 876\u001b[0m \u001b[38;5;66;03m# Reset internal state before fitting\u001b[39;00m\n\u001b[0;32m 877\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_reset()\n\u001b[1;32m--> 878\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpartial_fit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msample_weight\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473\u001b[0m, in \u001b[0;36m_fit_context..decorator..wrapper\u001b[1;34m(estimator, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1466\u001b[0m estimator\u001b[38;5;241m.\u001b[39m_validate_params()\n\u001b[0;32m 1468\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m config_context(\n\u001b[0;32m 1469\u001b[0m skip_parameter_validation\u001b[38;5;241m=\u001b[39m(\n\u001b[0;32m 1470\u001b[0m prefer_skip_nested_validation \u001b[38;5;129;01mor\u001b[39;00m global_skip_validation\n\u001b[0;32m 1471\u001b[0m )\n\u001b[0;32m 1472\u001b[0m ):\n\u001b[1;32m-> 1473\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfit_method\u001b[49m\u001b[43m(\u001b[49m\u001b[43mestimator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\preprocessing\\_data.py:914\u001b[0m, in \u001b[0;36mStandardScaler.partial_fit\u001b[1;34m(self, X, y, sample_weight)\u001b[0m\n\u001b[0;32m 882\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Online computation of mean and std on X for later scaling.\u001b[39;00m\n\u001b[0;32m 883\u001b[0m \n\u001b[0;32m 884\u001b[0m \u001b[38;5;124;03mAll of X is processed as a single batch. This is intended for cases\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 911\u001b[0m \u001b[38;5;124;03m Fitted scaler.\u001b[39;00m\n\u001b[0;32m 912\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 913\u001b[0m first_call \u001b[38;5;241m=\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mn_samples_seen_\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m--> 914\u001b[0m X \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_validate_data\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 915\u001b[0m \u001b[43m \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 916\u001b[0m \u001b[43m \u001b[49m\u001b[43maccept_sparse\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcsr\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcsc\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 917\u001b[0m \u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mFLOAT_DTYPES\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 918\u001b[0m \u001b[43m \u001b[49m\u001b[43mforce_all_finite\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mallow-nan\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 919\u001b[0m \u001b[43m \u001b[49m\u001b[43mreset\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfirst_call\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 920\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 921\u001b[0m n_features \u001b[38;5;241m=\u001b[39m X\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m1\u001b[39m]\n\u001b[0;32m 923\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m sample_weight \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\base.py:633\u001b[0m, in \u001b[0;36mBaseEstimator._validate_data\u001b[1;34m(self, X, y, reset, validate_separately, cast_to_ndarray, **check_params)\u001b[0m\n\u001b[0;32m 631\u001b[0m out \u001b[38;5;241m=\u001b[39m X, y\n\u001b[0;32m 632\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m no_val_X \u001b[38;5;129;01mand\u001b[39;00m no_val_y:\n\u001b[1;32m--> 633\u001b[0m out \u001b[38;5;241m=\u001b[39m \u001b[43mcheck_array\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minput_name\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mX\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcheck_params\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 634\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m no_val_X \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m no_val_y:\n\u001b[0;32m 635\u001b[0m out \u001b[38;5;241m=\u001b[39m _check_y(y, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mcheck_params)\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\utils\\validation.py:929\u001b[0m, in \u001b[0;36mcheck_array\u001b[1;34m(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_writeable, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator, input_name)\u001b[0m\n\u001b[0;32m 924\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m pandas_requires_conversion:\n\u001b[0;32m 925\u001b[0m \u001b[38;5;66;03m# pandas dataframe requires conversion earlier to handle extension dtypes with\u001b[39;00m\n\u001b[0;32m 926\u001b[0m \u001b[38;5;66;03m# nans\u001b[39;00m\n\u001b[0;32m 927\u001b[0m \u001b[38;5;66;03m# Use the original dtype for conversion if dtype is None\u001b[39;00m\n\u001b[0;32m 928\u001b[0m new_dtype \u001b[38;5;241m=\u001b[39m dtype_orig \u001b[38;5;28;01mif\u001b[39;00m dtype \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m dtype\n\u001b[1;32m--> 929\u001b[0m array \u001b[38;5;241m=\u001b[39m \u001b[43marray\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mastype\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnew_dtype\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 930\u001b[0m \u001b[38;5;66;03m# Since we converted here, we do not need to convert again later\u001b[39;00m\n\u001b[0;32m 931\u001b[0m dtype \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\pandas\\core\\generic.py:6643\u001b[0m, in \u001b[0;36mNDFrame.astype\u001b[1;34m(self, dtype, copy, errors)\u001b[0m\n\u001b[0;32m 6637\u001b[0m results \u001b[38;5;241m=\u001b[39m [\n\u001b[0;32m 6638\u001b[0m ser\u001b[38;5;241m.\u001b[39mastype(dtype, copy\u001b[38;5;241m=\u001b[39mcopy, errors\u001b[38;5;241m=\u001b[39merrors) \u001b[38;5;28;01mfor\u001b[39;00m _, ser \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mitems()\n\u001b[0;32m 6639\u001b[0m ]\n\u001b[0;32m 6641\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 6642\u001b[0m \u001b[38;5;66;03m# else, only a single dtype is given\u001b[39;00m\n\u001b[1;32m-> 6643\u001b[0m new_data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_mgr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mastype\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43merrors\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 6644\u001b[0m res \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_constructor_from_mgr(new_data, axes\u001b[38;5;241m=\u001b[39mnew_data\u001b[38;5;241m.\u001b[39maxes)\n\u001b[0;32m 6645\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m res\u001b[38;5;241m.\u001b[39m__finalize__(\u001b[38;5;28mself\u001b[39m, method\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mastype\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\pandas\\core\\internals\\managers.py:430\u001b[0m, in \u001b[0;36mBaseBlockManager.astype\u001b[1;34m(self, dtype, copy, errors)\u001b[0m\n\u001b[0;32m 427\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m using_copy_on_write():\n\u001b[0;32m 428\u001b[0m copy \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m--> 430\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mapply\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 431\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mastype\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 432\u001b[0m \u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 433\u001b[0m \u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 434\u001b[0m \u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43merrors\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 435\u001b[0m \u001b[43m \u001b[49m\u001b[43musing_cow\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43musing_copy_on_write\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 436\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\pandas\\core\\internals\\managers.py:363\u001b[0m, in \u001b[0;36mBaseBlockManager.apply\u001b[1;34m(self, f, align_keys, **kwargs)\u001b[0m\n\u001b[0;32m 361\u001b[0m applied \u001b[38;5;241m=\u001b[39m b\u001b[38;5;241m.\u001b[39mapply(f, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 362\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 363\u001b[0m applied \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mf\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 364\u001b[0m result_blocks \u001b[38;5;241m=\u001b[39m extend_blocks(applied, result_blocks)\n\u001b[0;32m 366\u001b[0m out \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtype\u001b[39m(\u001b[38;5;28mself\u001b[39m)\u001b[38;5;241m.\u001b[39mfrom_blocks(result_blocks, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maxes)\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\pandas\\core\\internals\\blocks.py:758\u001b[0m, in \u001b[0;36mBlock.astype\u001b[1;34m(self, dtype, copy, errors, using_cow, squeeze)\u001b[0m\n\u001b[0;32m 755\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCan not squeeze with more than one column.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 756\u001b[0m values \u001b[38;5;241m=\u001b[39m values[\u001b[38;5;241m0\u001b[39m, :] \u001b[38;5;66;03m# type: ignore[call-overload]\u001b[39;00m\n\u001b[1;32m--> 758\u001b[0m new_values \u001b[38;5;241m=\u001b[39m \u001b[43mastype_array_safe\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalues\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43merrors\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 760\u001b[0m new_values \u001b[38;5;241m=\u001b[39m maybe_coerce_values(new_values)\n\u001b[0;32m 762\u001b[0m refs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\pandas\\core\\dtypes\\astype.py:237\u001b[0m, in \u001b[0;36mastype_array_safe\u001b[1;34m(values, dtype, copy, errors)\u001b[0m\n\u001b[0;32m 234\u001b[0m dtype \u001b[38;5;241m=\u001b[39m dtype\u001b[38;5;241m.\u001b[39mnumpy_dtype\n\u001b[0;32m 236\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 237\u001b[0m new_values \u001b[38;5;241m=\u001b[39m \u001b[43mastype_array\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalues\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 238\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (\u001b[38;5;167;01mValueError\u001b[39;00m, \u001b[38;5;167;01mTypeError\u001b[39;00m):\n\u001b[0;32m 239\u001b[0m \u001b[38;5;66;03m# e.g. _astype_nansafe can fail on object-dtype of strings\u001b[39;00m\n\u001b[0;32m 240\u001b[0m \u001b[38;5;66;03m# trying to convert to float\u001b[39;00m\n\u001b[0;32m 241\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m errors \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mignore\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\pandas\\core\\dtypes\\astype.py:182\u001b[0m, in \u001b[0;36mastype_array\u001b[1;34m(values, dtype, copy)\u001b[0m\n\u001b[0;32m 179\u001b[0m values \u001b[38;5;241m=\u001b[39m values\u001b[38;5;241m.\u001b[39mastype(dtype, copy\u001b[38;5;241m=\u001b[39mcopy)\n\u001b[0;32m 181\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 182\u001b[0m values \u001b[38;5;241m=\u001b[39m \u001b[43m_astype_nansafe\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalues\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 184\u001b[0m \u001b[38;5;66;03m# in pandas we don't store numpy str dtypes, so convert to object\u001b[39;00m\n\u001b[0;32m 185\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(dtype, np\u001b[38;5;241m.\u001b[39mdtype) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28missubclass\u001b[39m(values\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mtype, \u001b[38;5;28mstr\u001b[39m):\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\pandas\\core\\dtypes\\astype.py:133\u001b[0m, in \u001b[0;36m_astype_nansafe\u001b[1;34m(arr, dtype, copy, skipna)\u001b[0m\n\u001b[0;32m 129\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(msg)\n\u001b[0;32m 131\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m copy \u001b[38;5;129;01mor\u001b[39;00m arr\u001b[38;5;241m.\u001b[39mdtype \u001b[38;5;241m==\u001b[39m \u001b[38;5;28mobject\u001b[39m \u001b[38;5;129;01mor\u001b[39;00m dtype \u001b[38;5;241m==\u001b[39m \u001b[38;5;28mobject\u001b[39m:\n\u001b[0;32m 132\u001b[0m \u001b[38;5;66;03m# Explicit copy, or required since NumPy can't view from / to object.\u001b[39;00m\n\u001b[1;32m--> 133\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43marr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mastype\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[0;32m 135\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m arr\u001b[38;5;241m.\u001b[39mastype(dtype, copy\u001b[38;5;241m=\u001b[39mcopy)\n", - "\u001b[1;31mValueError\u001b[0m: could not convert string to float: '9.0 (Pie)'" + "name": "stdout", + "output_type": "stream", + "text": [ + "Результаты для задачи регрессии:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: Linear Regression\n", + "MAE: 5424.128251450574\n", + "MSE: 143399695.59118932\n", + "RMSE: 11974.961193723733\n", + "R²: 0.4559750691933513\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: Random Forest Regression\n", + "MAE: 4022.856102941176\n", + "MSE: 107013897.40805219\n", + "RMSE: 10344.752167551052\n", + "R²: 0.5940142836932047\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: Gradient Boosting Regression\n", + "MAE: 4136.035916841655\n", + "MSE: 90628419.64103268\n", + "RMSE: 9519.895988981849\n", + "R²: 0.656176956854307\n", + "\n", + "Результаты для задачи классификации:\n", + "Model: Logistic Regression\n", + "Accuracy: 0.8137254901960784\n", + "\n", + "Model: Random Forest Classification\n", + "Accuracy: 0.8627450980392157\n", + "\n", + "Model: Gradient Boosting Classification\n", + "Accuracy: 0.8578431372549019\n", + "\n" ] } ], @@ -1088,7 +1133,6 @@ "from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n", "from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier\n", "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score, accuracy_score\n", - "import re\n", "\n", "# Загружаем набор данных\n", "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", @@ -1096,15 +1140,16 @@ "# Удаление пустого столбца по имени\n", "df = df.drop('Unnamed: 0', axis=1)\n", "\n", - "# Извлечение числовых значений из столбца Battery\n", - "df['Battery'] = df['Battery'].apply(lambda x: int(re.search(r'\\d+', x).group()) if re.search(r'\\d+', x) else None)\n", - "df['Ram'] = df['Ram'].apply(lambda x: int(re.search(r'\\d+', x).group()) if re.search(r'\\d+', x) else None)\n", - "df['Camera'] = df['Camera'].apply(lambda x: int(re.search(r'\\d+', x).group()) if re.search(r'\\d+', x) else None)\n", - "df['Display'] = df['Display'].apply(lambda x: int(re.search(r'\\d+', x).group()) if re.search(r'\\d+', x) else None)\n", - "\n", "# Преобразуем категориальные переменные в числовые\n", - "# Предположим, что 'company' и 'Processor_name' являются категориальными\n", - "df = pd.get_dummies(df, columns=['company', 'Processor_name'], drop_first=True)\n", + "df = pd.get_dummies(df, columns=['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE'], drop_first=True)\n", + "\n", + "# Убеждаемся, что все столбцы, которые должны быть числовыми, действительно являются числовыми\n", + "numeric_columns = ['Battery capacity (mAh)', 'Screen size (inches)', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera', 'Price']\n", + "for column in numeric_columns:\n", + " df[column] = pd.to_numeric(df[column], errors='coerce')\n", + "\n", + "# Удаляем строки с пропущенными значениями, которые могли возникнуть при преобразовании\n", + "df.dropna(subset=numeric_columns, inplace=True)\n", "\n", "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n", "X_reg = df.drop('Price', axis=1)\n", @@ -1142,12 +1187,11 @@ " print()\n", "\n", "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n", - "# Предположим, что мы классифицируем устройства по рейтингу выше среднего\n", - "X_class = df.drop('Rating', axis=1)\n", - "y_class = (df['Rating'] > df['Rating'].mean()).astype(int)\n", + "X_class = df.drop('Price', axis=1)\n", + "y_class = (df['Price'] > df['Price'].mean()).astype(int)\n", "\n", "# Разделяем данные на обучающую и тестовую выборки для задачи классификации\n", - "X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.2, random_state=42)\n", + "X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.3, random_state=42)\n", "\n", "# Стандартизируем признаки для задачи классификации\n", "scaler_class = StandardScaler()\n", @@ -1171,6 +1215,1056 @@ " print(f\"Accuracy: {accuracy}\")\n", " print()" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. Прогнозирование стоимости мобильных телефонов: \n", + "\n", + "Конвейер для задачи регрессии:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Результаты для задачи регрессии:\n", + "Model: Linear Regression\n", + "MAE: 4695.532622690401\n", + "MSE: 65643669.229680344\n", + "RMSE: 8102.078080941972\n", + "R²: 0.6878208068254403\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", + " warnings.warn(\n", + "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: Random Forest Regression\n", + "MAE: 4002.1279166666664\n", + "MSE: 88540074.860938\n", + "RMSE: 9409.573574872455\n", + "R²: 0.578933209278842\n", + "\n", + "Model: Gradient Boosting Regression\n", + "MAE: 4080.6847402556627\n", + "MSE: 75338600.25148971\n", + "RMSE: 8679.781117717757\n", + "R²: 0.6417149784982356\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "from sklearn.model_selection import train_test_split, GridSearchCV\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.preprocessing import OneHotEncoder\n", + "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n", + "\n", + "# Загружаем набор данных\n", + "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", + "\n", + "# Удаление пустого столбца по имени\n", + "df = df.drop('Unnamed: 0', axis=1)\n", + "\n", + "# Определяем категориальные и числовые столбцы\n", + "categorical_cols = ['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE']\n", + "numerical_cols = ['Battery capacity (mAh)', 'Screen size (inches)', 'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera', 'Number of SIMs']\n", + "\n", + "# Создаем преобразователь для категориальных и числовых столбцов\n", + "preprocessor = ColumnTransformer(\n", + " transformers=[\n", + " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_cols),\n", + " ('num', StandardScaler(), numerical_cols)\n", + " ])\n", + "\n", + "# Список моделей для задачи регрессии\n", + "models_reg = {\n", + " \"Linear Regression\": LinearRegression(),\n", + " \"Random Forest Regression\": RandomForestRegressor(),\n", + " \"Gradient Boosting Regression\": GradientBoostingRegressor()\n", + "}\n", + "\n", + "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n", + "X_reg = df[categorical_cols + numerical_cols]\n", + "y_reg = df['Price']\n", + "\n", + "# Разделяем данные на обучающую и тестовую выборки для задачи регрессии\n", + "X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.3, random_state=42)\n", + "\n", + "# Обучаем и оцениваем модели для задачи регрессии\n", + "print(\"Результаты для задачи регрессии:\")\n", + "for name, model in models_reg.items():\n", + " pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('model', model)\n", + " ])\n", + " pipeline.fit(X_train_reg, y_train_reg)\n", + " y_pred_reg = pipeline.predict(X_test_reg)\n", + " mae = mean_absolute_error(y_test_reg, y_pred_reg)\n", + " mse = mean_squared_error(y_test_reg, y_pred_reg)\n", + " rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)\n", + " r2 = r2_score(y_test_reg, y_pred_reg)\n", + " print(f\"Model: {name}\")\n", + " print(f\"MAE: {mae}\")\n", + " print(f\"MSE: {mse}\")\n", + " print(f\"RMSE: {rmse}\")\n", + " print(f\"R²: {r2}\")\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2. Оптимизация тарифной сетки:\n", + "\n", + " Конвейер для задачи классификации:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Результаты для задачи классификации:\n", + "Model: Logistic Regression\n", + "Accuracy: 0.8713235294117647\n", + "\n", + "Model: Random Forest Classification\n", + "Accuracy: 0.8786764705882353\n", + "\n", + "Model: Gradient Boosting Classification\n", + "Accuracy: 0.8676470588235294\n", + "\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "from sklearn.model_selection import train_test_split, GridSearchCV\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.preprocessing import OneHotEncoder\n", + "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n", + "\n", + "# Загружаем набор данных\n", + "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", + "\n", + "# Удаление пустого столбца по имени\n", + "df = df.drop('Unnamed: 0', axis=1)\n", + "\n", + "# Определяем категориальные и числовые столбцы\n", + "categorical_cols = ['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE']\n", + "numerical_cols = ['Battery capacity (mAh)', 'Screen size (inches)', 'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera', 'Number of SIMs']\n", + "\n", + "# Создаем преобразователь для категориальных и числовых столбцов\n", + "preprocessor = ColumnTransformer(\n", + " transformers=[\n", + " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_cols),\n", + " ('num', StandardScaler(), numerical_cols)\n", + " ])\n", + "\n", + "# Список моделей для задачи классификации\n", + "models_class = {\n", + " \"Logistic Regression\": LogisticRegression(),\n", + " \"Random Forest Classification\": RandomForestClassifier(),\n", + " \"Gradient Boosting Classification\": GradientBoostingClassifier()\n", + "}\n", + "\n", + "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n", + "X_class = df[categorical_cols + numerical_cols]\n", + "y_class = (df['Price'] > df['Price'].mean()).astype(int)\n", + "\n", + "# Разделяем данные на обучающую и тестовую выборки для задачи классификации\n", + "X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.2, random_state=42)\n", + "\n", + "# Обучаем и оцениваем модели для задачи классификации\n", + "print(\"Результаты для задачи классификации:\")\n", + "for name, model in models_class.items():\n", + " pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('model', model)\n", + " ])\n", + " pipeline.fit(X_train_class, y_train_class)\n", + " y_pred_class = pipeline.predict(X_test_class)\n", + " accuracy = accuracy_score(y_test_class, y_pred_class)\n", + " print(f\"Model: {name}\")\n", + " print(f\"Accuracy: {accuracy}\")\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. Прогнозирование стоимости страховых взносов:\n", + "\n", + "Настройка гиперпараметров для задачи регрессии:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Результаты для задачи регрессии:\n", + "Model: Linear Regression\n", + "Best Parameters: {}\n", + "MAE: 4695.532622690401\n", + "MSE: 65643669.229680344\n", + "RMSE: 8102.078080941972\n", + "R²: 0.6878208068254403\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "from sklearn.model_selection import train_test_split, GridSearchCV\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.preprocessing import OneHotEncoder\n", + "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n", + "\n", + "# Загружаем набор данных\n", + "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", + "\n", + "# Удаление пустого столбца по имени\n", + "df = df.drop('Unnamed: 0', axis=1)\n", + "\n", + "# Определяем категориальные и числовые столбцы\n", + "categorical_cols = ['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE']\n", + "numerical_cols = ['Battery capacity (mAh)', 'Screen size (inches)', 'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera', 'Number of SIMs']\n", + "\n", + "# Создаем преобразователь для категориальных и числовых столбцов\n", + "preprocessor = ColumnTransformer(\n", + " transformers=[\n", + " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_cols),\n", + " ('num', StandardScaler(), numerical_cols)\n", + " ])\n", + "\n", + "# Список моделей и их гиперпараметров для задачи регрессии\n", + "models_reg = {\n", + " \"Linear Regression\": (LinearRegression(), {}),\n", + " \"Random Forest Regression\": (RandomForestRegressor(), {\n", + " 'model__n_estimators': [100, 200],\n", + " 'model__max_depth': [None, 10, 20]\n", + " }),\n", + " \"Gradient Boosting Regression\": (GradientBoostingRegressor(), {\n", + " 'model__n_estimators': [100, 200],\n", + " 'model__learning_rate': [0.01, 0.1],\n", + " 'model__max_depth': [3, 5]\n", + " })\n", + "}\n", + "\n", + "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n", + "X_reg = df[categorical_cols + numerical_cols]\n", + "y_reg = df['Price']\n", + "\n", + "# Разделяем данные на обучающую и тестовую выборки для задачи регрессии\n", + "X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.3, random_state=42)\n", + "\n", + "# Обучаем и оцениваем модели для задачи регрессии\n", + "print(\"Результаты для задачи регрессии:\")\n", + "for name, (model, params) in models_reg.items():\n", + " pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('model', model)\n", + " ])\n", + " grid_search = GridSearchCV(pipeline, params, cv=5, scoring='neg_mean_absolute_error')\n", + " grid_search.fit(X_train_reg, y_train_reg)\n", + " best_model = grid_search.best_estimator_\n", + " y_pred_reg = best_model.predict(X_test_reg)\n", + " mae = mean_absolute_error(y_test_reg, y_pred_reg)\n", + " mse = mean_squared_error(y_test_reg, y_pred_reg)\n", + " rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)\n", + " r2 = r2_score(y_test_reg, y_pred_reg)\n", + " print(f\"Model: {name}\")\n", + " print(f\"Best Parameters: {grid_search.best_params_}\")\n", + " print(f\"MAE: {mae}\")\n", + " print(f\"MSE: {mse}\")\n", + " print(f\"RMSE: {rmse}\")\n", + " print(f\"R²: {r2}\")\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2. Оптимизация тарифной сетки:\n", + "\n", + "Настройка гиперпараметров для задачи классификации:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Результаты для задачи классификации:\n", + "Model: Logistic Regression\n", + "Best Parameters: {'model__C': 1, 'model__solver': 'lbfgs'}\n", + "Accuracy: 0.8713235294117647\n", + "\n", + "Model: Random Forest Classification\n", + "Best Parameters: {'model__max_depth': None, 'model__n_estimators': 200}\n", + "Accuracy: 0.8676470588235294\n", + "\n", + "Model: Gradient Boosting Classification\n", + "Best Parameters: {'model__learning_rate': 0.1, 'model__max_depth': 5, 'model__n_estimators': 200}\n", + "Accuracy: 0.8602941176470589\n", + "\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "from sklearn.model_selection import train_test_split, GridSearchCV\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.preprocessing import OneHotEncoder\n", + "from sklearn.metrics import accuracy_score\n", + "\n", + "# Загружаем набор данных\n", + "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", + "\n", + "# Удаление пустого столбца по имени\n", + "df = df.drop('Unnamed: 0', axis=1)\n", + "\n", + "# Определяем категориальные и числовые столбцы\n", + "categorical_cols = ['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE']\n", + "numerical_cols = ['Battery capacity (mAh)', 'Screen size (inches)', 'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera', 'Number of SIMs']\n", + "\n", + "# Создаем преобразователь для категориальных и числовых столбцов\n", + "preprocessor = ColumnTransformer(\n", + " transformers=[\n", + " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_cols),\n", + " ('num', StandardScaler(), numerical_cols)\n", + " ])\n", + "\n", + "# Список моделей и их гиперпараметров для задачи классификации\n", + "models_class = {\n", + " \"Logistic Regression\": (LogisticRegression(), {\n", + " 'model__C': [0.1, 1, 10],\n", + " 'model__solver': ['liblinear', 'lbfgs']\n", + " }),\n", + " \"Random Forest Classification\": (RandomForestClassifier(), {\n", + " 'model__n_estimators': [100, 200],\n", + " 'model__max_depth': [None, 10, 20]\n", + " }),\n", + " \"Gradient Boosting Classification\": (GradientBoostingClassifier(), {\n", + " 'model__n_estimators': [100, 200],\n", + " 'model__learning_rate': [0.01, 0.1],\n", + " 'model__max_depth': [3, 5]\n", + " })\n", + "}\n", + "\n", + "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n", + "X_class = df[categorical_cols + numerical_cols]\n", + "y_class = (df['Price'] > df['Price'].mean()).astype(int)\n", + "\n", + "# Разделяем данные на обучающую и тестовую выборки для задачи классификации\n", + "X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.2, random_state=42)\n", + "\n", + "# Обучаем и оцениваем модели для задачи классификации\n", + "print(\"Результаты для задачи классификации:\")\n", + "for name, (model, params) in models_class.items():\n", + " pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('model', model)\n", + " ])\n", + " grid_search = GridSearchCV(pipeline, params, cv=5, scoring='accuracy')\n", + " grid_search.fit(X_train_class, y_train_class)\n", + " best_model = grid_search.best_estimator_\n", + " y_pred_class = best_model.predict(X_test_class)\n", + " accuracy = accuracy_score(y_test_class, y_pred_class)\n", + " print(f\"Model: {name}\")\n", + " print(f\"Best Parameters: {grid_search.best_params_}\")\n", + " print(f\"Accuracy: {accuracy}\")\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. Прогнозирование стоимости страховых взносов: Задача: Регрессия\n", + "\n", + "Выбор метрик:\n", + "\n", + "MAE (Mean Absolute Error): Средняя абсолютная ошибка. Показывает среднее отклонение предсказанных значений от фактических. Эта метрика легко интерпретируется, так как она измеряется в тех же единицах, что и целевая переменная (доллары).\n", + "\n", + "MSE (Mean Squared Error): Среднеквадратичная ошибка. Показывает среднее квадратичное отклонение предсказанных значений от фактических. Эта метрика чувствительна к выбросам, так как ошибки возводятся в квадрат.\n", + "\n", + "RMSE (Root Mean Squared Error): Квадратный корень из среднеквадратичной ошибки. Показывает среднее отклонение предсказанных значений от фактических в тех же единицах, что и целевая переменная. Эта метрика также чувствительна к выбросам, но легче интерпретируется, чем MSE.\n", + "\n", + "R² (R-squared): Коэффициент детерминации. Показывает, какую долю дисперсии целевой переменной объясняет модель. Значение R² близкое к 1 указывает на хорошее качество модели.\n", + "\n", + "Обоснование:\n", + "\n", + "MAE: Хорошо подходит для задач, где важно понимать среднее отклонение предсказаний от фактических значений.\n", + "\n", + "MSE и RMSE: Полезны для задач, где важно минимизировать влияние выбросов, так как они возводят ошибки в квадрат.\n", + "\n", + "R²: Позволяет оценить, насколько хорошо модель объясняет вариацию целевой переменной.\n", + "\n", + "2. Оптимизация тарифной сетки: Задача: Классификация\n", + "\n", + "Выбор метрик:\n", + "\n", + "Accuracy: Доля правильных предсказаний среди всех предсказаний. Эта метрика показывает общую точность модели.\n", + "\n", + "Precision: Доля правильных положительных предсказаний среди всех положительных предсказаний. Эта метрика важна, если важно минимизировать количество ложноположительных результатов.\n", + "\n", + "Recall (Sensitivity): Доля правильных положительных предсказаний среди всех фактических положительных случаев. Эта метрика важна, если важно минимизировать количество ложноотрицательных результатов.\n", + "\n", + "F1-score: Гармоническое среднее между precision и recall. Эта метрика показывает баланс между precision и recall.\n", + "\n", + "Обоснование:\n", + "\n", + "Accuracy: Хорошо подходит для задач, где классы сбалансированы.\n", + "\n", + "Precision и Recall: Важны для задач, где важно минимизировать ошибки определенного типа (ложноположительные или ложноотрицательные).\n", + "\n", + "F1-score: Позволяет оценить баланс между precision и recall." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Результаты для задачи регрессии:\n", + "Model: Linear Regression\n", + "Best Parameters: {}\n", + "MAE: 4808.184185261903\n", + "MSE: 77191075.38529098\n", + "RMSE: 8785.845171939407\n", + "R²: 0.7071551004885543\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", + " warnings.warn(\n", + "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: Random Forest Regression\n", + "Best Parameters: {'model__max_depth': None, 'model__n_estimators': 100}\n", + "MAE: 3931.812022058823\n", + "MSE: 99133452.49149376\n", + "RMSE: 9956.578352601548\n", + "R²: 0.6239108499500701\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: Gradient Boosting Regression\n", + "Best Parameters: {'model__learning_rate': 0.1, 'model__max_depth': 5, 'model__n_estimators': 200}\n", + "MAE: 3741.1262483893015\n", + "MSE: 76106789.83221506\n", + "RMSE: 8723.920553983458\n", + "R²: 0.711268626466102\n", + "\n", + "Результаты для задачи классификации:\n", + "Model: Logistic Regression\n", + "Best Parameters: {'model__C': 1, 'model__solver': 'lbfgs'}\n", + "Accuracy: 0.8713235294117647\n", + "Precision: 0.8035714285714286\n", + "Recall: 0.6521739130434783\n", + "F1-score: 0.72\n", + "\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: Random Forest Classification\n", + "Best Parameters: {'model__max_depth': 20, 'model__n_estimators': 200}\n", + "Accuracy: 0.8676470588235294\n", + "Precision: 0.851063829787234\n", + "Recall: 0.5797101449275363\n", + "F1-score: 0.6896551724137931\n", + "\n" + ] + }, + { + "data": { + "image/png": "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6tV6Xet57/OYMWPg4+MDY2PjQltMZ82ahcjISLRq1QqffPIJypUrh2XLliEzM7NInwv0f173tJLX6fLly2LYsGGiWrVqwsTERFhaWgovLy+xZMkSrUWrsrOzxYwZM4Sbm5soX768cHFxeenCVi96cbpiYdOmhHi2YFX9+vWFiYmJqFOnjvj555/zTRvdt2+f6NGjh3B2dhYmJibC2dlZ9OvXT1y+fDnfa7w4tXLv3r3Cy8tLmJmZCZVKJbp161bogkMvTkstbOGZFz0/bbQwhU0bHT9+vHBychJmZmbCy8tLREVFFTjdc9u2bZqFhp4/z7yFrQryfD0pKSnC1dVVNGnSRGRnZ2sdFxwcLIyMjPItYvOiwn7f9+/fF0OGDBG2trbCxMREeHh45Ps9vOwa0Pf1hBAiPDxc6334999/RceOHYWFhYWwtbUVw4YNE+fOnct3TRT2uypoMbVHjx6JQYMGaRa2GjRoUKELW0m5zgqL6WW/2+fpsrDVkydPRHBwsHB2dhbly5cXtWrVeunCVgW5f/++GDlypHBxcRHly5cXjo6OokOHDmL58uWaY5YtWybatGkjKlWqJJRKpahRo4aYOHGiSE5O1qpr5syZonLlysLIyEjnKaR5nwP29vaiXLlyws7OTnTr1k1s27ZNc0xBnwO3b98W77//vrC2thZWVlbigw8+EHfv3tWaOpmZmSkmTpwoGjZsqFnYqWHDhuL777/X1HP16lURGBgoatSoIUxNTYWNjY1o37692Lt3r1acRZ02muf3338X77zzjuZaatGihfjll180+3W91nNycsTo0aOFnZ2dUCgUOi1s5ePjIywsLESFChVE+/btxbFjxwqM+eTJk1rleYvfHThwQND/KITgqBIiIiKS5o0cQ0FERESvFxMKIiIikowJBREREUnGhIKIiIgkY0JBREREkjGhICIiIsneyIWt5KZWq3H37l1YWlrKuiw0EREVPyEEnjx5Amdn53w39pNTRkYGsrKyZKnLxMQk311YSzsmFDq4e/cu13YnIjJwt27dKrabmmVkZMDMshKQI8+t3h0dHXHt2jWDSiqYUOggbwldE3d/KIx1v202kSG5eXB+SYdAVCyepKSgpptLsSyNnycrKwvISYfS3R+Q+nciNwv3/l2NrKwsJhRvmrxuDoWxCRMKemPxhkj0pnstXdblTCX/nRAK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REQy4SwPIiIikqwsd3kwoSAiIpJJWW6h4BgKIiIikowtFERERDIpyy0UTCiIiIhkUpbHULDLg4iIiCRjCwUREZFMFJChywOG2UTBhIKIiEgm7PIgIiIikoAtFERERDLhLA8iIiKSjF0eRERERBKwhYKIiEgm7PIgIiIiycpylwcTCiIiIpmU5RYKjqEgIiIiydhCQUREJBcZujwMdKFMJhRERERyYZcHERERkQRsoSAiIpIJZ3kQERGRZOzyICIiIpKALRREREQyYZcHERERScYuDyIiIiIJ2EJBREQkk7LcQsGEgoiISCYcQ0FERESSleUWCo6hICIiMmCHDx9Gt27d4OzsDIVCga1bt2r2ZWdnIyQkBB4eHjA3N4ezszMGDx6Mu3fvatVRrVo1TTKUt82ZM0evOJhQEBERySSvy0Pqpo+0tDQ0bNgQ3333Xb596enpOHPmDKZOnYozZ85g8+bNiI2NRffu3fMdGxoaioSEBM02evRoveJglwcREZFMSqLLw9fXF76+vgXus7KyQmRkpFbZt99+ixYtWuDmzZuoWrWqptzS0hKOjo76B/x/2EJBRERUCqWkpGhtmZmZstSbnJwMhUIBa2trrfI5c+agUqVKaNy4MebNm4ecnBy96mULBRERkUwUkGGWx//938XFRat82rRpmD59uqS6MzIyEBISgn79+kGlUmnKx4wZgyZNmsDGxgbHjh3DlClTkJCQgK+//lrnuplQEBERycRIoYCRxIwi7/m3bt3S+qOvVCol1ZudnY0+ffpACIGlS5dq7Rs3bpzm5wYNGsDExAQfffQRwsLCdH5ddnkQERGVQiqVSmuTklDkJRM3btxAZGSkVqJSEE9PT+Tk5OD69es6vwZbKIiIiGRSGhe2yksmrly5ggMHDqBSpUqvfE50dDSMjIxgb2+v8+swoSAiIpJJSczySE1NRVxcnObxtWvXEB0dDRsbGzg5OaF37944c+YMduzYgdzcXNy7dw8AYGNjAxMTE0RFReHEiRNo3749LC0tERUVheDgYAwcOBAVK1bUOQ4mFERERDIxUjzbpNahj1OnTqF9+/aax3njIfz9/TF9+nT8/vvvAIBGjRppPe/AgQNo164dlEol1q9fj+nTpyMzMxNubm4IDg7WGlehCyYUREREBqxdu3YQQhS6/2X7AKBJkyY4fvy45DiYUBAREclF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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: Gradient Boosting Classification\n", + "Best Parameters: {'model__learning_rate': 0.1, 'model__max_depth': 5, 'model__n_estimators': 200}\n", + "Accuracy: 0.8676470588235294\n", + "Precision: 0.8113207547169812\n", + "Recall: 0.6231884057971014\n", + "F1-score: 0.7049180327868853\n", + "\n" + ] + }, + { + "data": { + "image/png": "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lytXDg4ODvnKk5OTsWrVKmzYsAHvv/8+AGD16tWoU6cOTp8+jXfffVe/QF/BHgoiIqJS6NV7SmVmZhZY7/r163BycoKbmxv69euHW7duAQDOnz+P7OxseHt7q+vWrl0bVatWRWRkpOTxMqEgIiKSiJRTKJydnTXuKxUWFpbveC1atMCaNWuwb98+LF26FHFxcWjdujWePXuG+/fvQy6Xw8rKSuM59vb2uH//vuTnziEPIiIiqUh46e3bt29rLBst6JYQfn5+6n83aNAALVq0gIuLC3755ReYmprqGYhu2ENBRERUCimVSo1Nm3tMWVlZoWbNmoiJiYGDgwOysrKQlJSkUefBgwcFzrnQFxMKIiIiiZTEKo+XpaamIjY2Fo6OjmjatCnKly+PQ4cOqfdfu3YNt27dQsuWLaU4XQ0c8iAiIpLI217lMWHCBHTp0gUuLi64d+8epk+fDmNjY/Tp0weWlpYYPHgwxo0bB2trayiVSowePRotW7aUfIUHwISCiIjIYN25cwd9+vRBYmIibG1t0apVK5w+fRq2trYAgAULFsDIyAg9evRAZmYmfH198f3337+h1aJhQkFERCQRCedkamXjxo2v3W9iYoIlS5ZgyZIl+gWlBSYUREREUnnbGUUpwkmZREREpDf2UBAREUlE31UaeW0YIiYUREREEimJe3mUFkwoiIiIJFKGp1BwDgURERHpjz0UREREUinDXRRMKIiIiCRSlidlcsiDiIiI9MYeCiIiIolwlQcRERHprQxPoeCQBxEREemPPRRERERSKcNdFEwoiIiIJMJVHkRERER6YA8FERGRRLjKg4iIiPRWhqdQMKEgIiKSTBnOKDiHgoiIiPTGHgoiIiKJlOVVHkwoiIiIpCLBpEwDzSc45EFERET6Yw8FERGRRMrwnEwmFERERJIpwxkFhzyIiIhIb+yhICIikghXeRAREZHeyvKltznkQURERHpjDwUREZFEyvCcTCYUREREkinDGQUTCiIiIomU5UmZnENBREREemMPBRERkURkkGCVhySRvH1MKIiIiCRShqdQcMiDiIiI9MceCiIiIomU5QtbMaEgIiKSTNkd9OCQBxEREemNPRREREQSKctDHuyhICIikohMok1bYWFheOedd2BhYQE7Ozt0794d165d06jTrl07yGQyjW348OF6nWdBmFAQEREZqGPHjmHkyJE4ffo0IiIikJ2dDR8fH6SlpWnUGzp0KBISEtTb3LlzJY+FQx5EREQSedtDHvv27dN4vGbNGtjZ2eH8+fNo06aNurxChQpwcHDQL7A3YA8FERGRRGQS/QcAKSkpGltmZuYbj5+cnAwAsLa21ihfv349KlWqhHr16mHKlClIT0+X/NzZQ0FERCQVCVeNOjs7axRPnz4dISEhhT5NpVLh008/haenJ+rVq6cu79u3L1xcXODk5ITLly9j0qRJuHbtGrZu3apnoJqYUBAREZVCt2/fhlKpVD9WKBSvrT9y5Ej89ddfOHHihEb5sGHD1P+uX78+HB0d0b59e8TGxsLd3V2yeJlQEBERSUTKy1oplUqNhOJ1Ro0ahV27duH48eOoUqXKa+u2aNECABATE8OEgoiIqDR625MyhRAYPXo0tm3bhqNHj8LV1fWNz4mKigIAODo6FjHCgjGhICIiMlAjR47Ehg0bsGPHDlhYWOD+/fsAAEtLS5iamiI2NhYbNmxAp06dYGNjg8uXLyM4OBht2rRBgwYNJI2FCQUREZFEXl6loU8b2lq6dCmAFxevetnq1asRGBgIuVyOgwcPYuHChUhLS4OzszN69OiBL7/8Uq8YC8KEgoiISCpv+d5gQojX7nd2dsaxY8f0DEg7vA4FERER6Y09FERERBIpuzcvZ0JBREQkGd5tlIiIiEgP7KEgIiKSjP6rPAx10IMJBRERkUQ45EFERESkByYUREREpDcOeRAREUmkLA95MKEgIiKSyNu+9HZpwiEPIiIi0ht7KIiIiCTCIQ8iIiLSW1m+9DaHPIiIiEhv7KEgIiKSShnuomBCQUREJBGu8iAiIiLSA3soiIiIJMJVHkRERKS3MjyFggkFERGRZMpwRsE5FERERKQ39lAQERFJpCyv8mBCQUREJBFOyqTXEkIAAFKfPSvhSIiKT2paVkmHQFQs0lJffHbnfZYXp5SUlFLRRklgQqGFZ/9LJJrVcyvhSIiIqKiePXsGS0vLYmlbLpfDwcEBNVydJWnPwcEBcrlckrbeFpl4GymbgVOpVLh37x4sLCwgM9S+KAOSkpICZ2dn3L59G0qlsqTDIZIcf8bfLiEEnj17BicnJxgZFd9ahIyMDGRlSdPTJ5fLYWJiIklbbwt7KLRgZGSEKlWqlHQYZY5SqeSHLf2r8Wf87SmunomXmZiYGFwSICUuGyUiIiK9MaEgIiIivTGhoFJHoVBg+vTpUCgUJR0KUbHgzzj9G3FSJhEREemNPRRERESkNyYUREREpDcmFERERKQ3JhRERESkNyYUVKwCAwPRvXv3kg6DSHKBgYGQyWQYPnx4vn0jR46ETCZDYGDg2w+MqIQwoSAiKiJnZ2ds3LgRz58/V5dlZGRgw4YNqFq1apHbFUIgJydHihCJ3homFFRi/vrrL/j5+cHc3Bz29vYYMGAAHj9+rN6/efNm1K9fH6amprCxsYG3tzfS0tIAAEePHkXz5s1hZmYGKysreHp64ubNmyV1KlRGNWnSBM7Ozti6dau6bOvWrahatSoaN26sLsvMzMSYMWNgZ2cHExMTtGrVCmfPnlXvP3r0KGQyGfbu3YumTZtCoVDgxIkTUKlUCAsLg6urK0xNTdGwYUNs3rz5rZ4jkbaYUFCJSEpKwvvvv4/GjRvj3Llz2LdvHx48eIBevXoBABISEtCnTx8EBQUhOjoaR48ehb+/v/qbW/fu3dG2bVtcvnwZkZGRGDZsGG/cRiUiKCgIq1evVj/+8ccfMWjQII06EydOxJYtWxAeHo4LFy6gevXq8PX1xZMnTzTqTZ48GXPmzEF0dDQaNGiAsLAwrF27FsuWLcOVK1cQHByM/v3749ixY2/l3Ih0IoiKUUBAgOjWrVu+8pkzZwofHx+Nstu3bwsA4tq1a+L8+fMCgIiPj8/33MTERAFAHD16tLjCJnqjvJ/thw8fCoVCIeLj40V8fLwwMTERjx49Et26dRMBAQEiNTVVlC9fXqxfv1793KysLOHk5CTmzp0rhBDiyJEjAoDYvn27uk5GRoaoUKGCOHXqlMZxBw8eLPr06fN2TpJIB7zbKJWIS5cu4ciRIzA3N8+3LzY2Fj4+Pmjfvj3q168PX19f+Pj4oGfPnqhYsSKsra0RGBgIX19fdOjQAd7e3ujVqxccHR1L4EyorLO1tUXnzp2xZs0aCCHQuXNnVKpUSb0/NjYW2dnZ8PT0VJeVL18ezZs3R3R0tEZbzZo1U/87JiYG6enp6NChg0adrKwsjeEUotKCCQWViNTUVHTp0gX//e9/8+1zdHSEsbExIiIicOrUKRw4cACLFy/GF198gTNnzsDV1RWrV6/GmDFjsG/fPmzatAlffvklIiIi8O6775bA2VBZFxQUhFGjRgEAlixZUuR2zMzM1P9OTU0FAOzevRuVK1fWqMd7gFBpxDkUVCKaNGmCK1euoFq1aqhevbrGlvehKpPJ4OnpiRkzZuDixYuQy+XYtm2buo3GjRtjypQpOHXqFOrVq4cNGzaU1OlQGdexY0dkZWUhOzsbvr6+Gvvc3d0hl8tx8uRJdVl2djbOnj0LDw+PQtv08PCAQqHArVu38v2OODs7F9u5EBUVeyio2CUnJyMqKkqjbNiwYVixYgX69OmDiRMnwtraGjExMdi4cSNWrlyJc+fO4dChQ/Dx8YGdnR3OnDmDR48eoU6dOoiLi8MPP/yArl27wsnJCdeuXcP169cxcODAkjlBKvOMjY3VwxfGxsYa+8zMzDBixAh89tlnsLa2RtWqVTF37lykp6dj8ODBhbZpYWGBCRMmIDg4GCqVCq1atUJycjJOnjwJpVKJgICAYj0nIl0xoaBid/To0XxjvoMHD8bJkycxadIk+Pj4IDMzEy4uLujYsSOMjIygVCpx/PhxLFy4ECkpKXBxccH8+fPh5+eHBw8e4OrVqwgPD0diYiIcHR0xcuRIfPzxxyV0hkSAUqksdN+cOXOgUqkwYMAAPHv2DM2aNcP+/ftRsWLF17Y5c+ZM2NraIiwsDDdu3ICVlRWaNGmCzz//XOrwifTG25cTERGR3jiHgoiIiPTGhIKIiIj0xoSCiIiI9MaEgoiIiPTGhIKIiIj0xoSCiIiI9MaEgoiIiPTGhILIQAQGBqJ79+7qx+3atcOnn3761uM4evQoZDIZkpKSCq0jk8mwfft2rdsMCQlBo0aN9IorPj4eMpks31VZiejtYEJBpIfAwEDIZDLIZDLI5XJUr14doaGhyMnJKfZjb926FTNnztSqrjZJABGRPnjpbSI9dezYEatXr0ZmZib27NmDkSNHonz58pgyZUq+ullZWZDL5ZIc19raWpJ2iIikwB4KIj0pFAo4ODjAxcUFI0aMgLe3N3777TcA/z9MMWvWLDg5OaFWrVoAgNu3b6NXr16wsrKCtbU1unXrhvj4eHWbubm5GDduHKysrGBjY4OJEyfi1avkvzrkkZmZiUmTJsHZ2RkKhQLVq1fHqlWrEB8fDy8vLwBAxYoVIZPJEBgYCABQqVQICwuDq6srTE1N0bBhQ2zevFnjOHv27EHNmjVhamoKLy8vjTi1NWnSJNSsWRMVKlSAm5sbpk6diuzs7Hz1li9fDmdnZ1SoUAG9evVCcnKyxv6VK1eiTp06MDExQe3atfH999/rHAsRFQ8mFEQSMzU1RVZWlvrxoUOHcO3aNURERGDXrl3qW1xbWFjg999/x8mTJ2Fubq6+BTYAzJ8/H2vWrMGPP/6IEydO4MmTJxq3bi/IwIED8fPPP2PRokWIjo7G8uXLYW5uDmdnZ2zZsgUAcO3aNSQkJODbb78FAISFhWHt2rVYtmwZrly5guDgYPTv3x/Hjh0D8CLx8ff3R5cuXRAVFYUhQ4Zg8uTJOr8mFhYWWLNmDf7++298++23WLFiBRYsWKBRJyYmBr/88gt27tyJffv24eLFi/jkk0/U+9evX49p06Zh1qxZiI6OxuzZszF16lSEh4frHA8RFQNBREUWEBAgunXrJoQQQqVSiYiICKFQKMSECRPU++3t7UVmZqb6OevWrRO1atUSKpVKXZaZmSlMTU3F/v37hRBCODo6irlz56r3Z2dniypVqqiPJYQQbdu2FWPHjhVCCHHt2jUBQERERBQY55EjRwQA8fTpU3VZRkaGqFChgjh16pRG3cGDB4s+ffoIIYSYMmWK8PDw0Ng/adKkfG29CoDYtm1bofvnzZsnmjZtqn48ffp0YWxsLO7cuaMu27t3rzAyMhIJCQlCCCHc3d3Fhg0bNNqZOXOmaNmypRBCiLi4OAFAXLx4sdDjElHx4RwKIj3t2rUL5ubmyM7OhkqlQt++fRESEqLeX79+fY15E5cuXUJMTAwsLCw02snIyEBsbCySk5ORkJCAFi1aqPeVK1cOzZo1yzfskScqKgrGxsZo27at1nHHxMQgPT0dHTp00CjPyspS324+OjpaIw4AaNmypdbHyLNp0yYsWrQIsbGxSE1NRU5OTr7bfVetWhWVK1fWOI5KpcK1a9dgYWGB2NhYDB48GEOHDlXXycnJgaWlpc7xEJH0mFAQ6cnLywtLly6FXC6Hk5MTypXT/LUyMzPTeJyamoqmTZti/fr1+dqytbUtUgympqY6Pyc1NRUAsHv3bo0/5MCLeSFSiYyMRL9+/TBjxgz4+vrC0tISGzduxPz583WOdcWKFfkSHGNjY8liJaKiY0JBpCczMzNUr15d6/pNmjTBpk2bYGdnl+9beh5HR0ecOXMGbdq0AfDim/j58+fRpEmTAuvXr18fKpUKx44dg7e3d779eT0kubm56jIPDw8oFArcunWr0J6NOnXqqCeY5jl9+vSbT/Ilp06dgouLC7744gt12c2bN/PVu3XrFu7duwcnJyf1cYyMjFCrVi3Y29vDyckJN27cQL9+/XQ6PhG9HZyUSfSW9evXD5UqVUK3bt3w+++/Iy4uDkePHsWYMWNw584dAMDYsWMxZ84cbN++HVevXsUnn3zy2mtIVKtWDQEBAQgKCsL27dvVbf7yyy8AABcXF8hkMuzatQuPHj1CamoqLCwsMGHCBAQHByM8PByxsbG4cOECFi9erJ7oOHz4cFy/fh2fffYZrl27hg0bNmDNmjU6nW+NGjVw69YtbNy4EbGxsVi0aFGBE0xNTEwQEBCAS5cu4ffff8eYMWPQq1cvODg4AABmzJiBsLAwLFq0CP/88w/+/PNPrF69Gt98841O8RBR8WBCQfSWVahQAcePH0fVqlXh7++POnXqYPDgwcjIyFD3WIwfPx4DBgxAQEAAWrZsCQsLC3z44YevbXfp0qXo2bMnPvnkE9SuXRtDhw5FWloaAKBy5cqYMWMGJk+eDHt7e4waNQoAMHPmTEydOhVhYWGoU6cOOnbsiN27d8PV1RXAi3kNW7Zswfbt29GwYUMsW7YMs2fP1ul8u3btiuDgYIwaNQqNGjXCqVOnMHXq1Hz1qlevDn9/f3Tq1Ak+Pj5o0KCBxrLQIUOGYOXKlVi9ejXq16+Ptm3bYs2aNepYiahkyURhs7yIiIiItMQeCiIiItIbEwoiIiLSGxMKIiIi0hsTCiIiItIbEwoiIiLSGxMKIiIi0hsTCiIiItIbEwoiIiLSGxMKIiIi0hsTCiIiItIbEwoiIiLSGxMKIiIi0tv/AYgD6L5BAUnsAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "from sklearn.model_selection import train_test_split, GridSearchCV\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.linear_model import LinearRegression, LogisticRegression\n", + "from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n", + "from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.preprocessing import OneHotEncoder\n", + "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score, accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, ConfusionMatrixDisplay\n", + "\n", + "# Загружаем набор данных\n", + "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", + "\n", + "# Удаление пустого столбца по имени\n", + "df = df.drop('Unnamed: 0', axis=1)\n", + "\n", + "# Определяем категориальные и числовые столбцы\n", + "categorical_cols = ['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE']\n", + "numerical_cols = ['Battery capacity (mAh)', 'Screen size (inches)', 'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera', 'Number of SIMs']\n", + "\n", + "# Создаем преобразователь для категориальных и числовых столбцов\n", + "preprocessor = ColumnTransformer(\n", + " transformers=[\n", + " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_cols),\n", + " ('num', StandardScaler(), numerical_cols)\n", + " ])\n", + "\n", + "# Список моделей и их гиперпараметров для задачи регрессии\n", + "models_reg = {\n", + " \"Linear Regression\": (LinearRegression(), {}),\n", + " \"Random Forest Regression\": (RandomForestRegressor(), {\n", + " 'model__n_estimators': [100, 200],\n", + " 'model__max_depth': [None, 10, 20]\n", + " }),\n", + " \"Gradient Boosting Regression\": (GradientBoostingRegressor(), {\n", + " 'model__n_estimators': [100, 200],\n", + " 'model__learning_rate': [0.01, 0.1],\n", + " 'model__max_depth': [3, 5]\n", + " })\n", + "}\n", + "\n", + "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n", + "X_reg = df[categorical_cols + numerical_cols]\n", + "y_reg = df['Price']\n", + "\n", + "# Разделяем данные на обучающую и тестовую выборки для задачи регрессии\n", + "X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.2, random_state=42)\n", + "\n", + "# Обучаем и оцениваем модели для задачи регрессии\n", + "print(\"Результаты для задачи регрессии:\")\n", + "for name, (model, params) in models_reg.items():\n", + " pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('model', model)\n", + " ])\n", + " grid_search = GridSearchCV(pipeline, params, cv=5, scoring='neg_mean_absolute_error')\n", + " grid_search.fit(X_train_reg, y_train_reg)\n", + " best_model = grid_search.best_estimator_\n", + " y_pred_reg = best_model.predict(X_test_reg)\n", + " mae = mean_absolute_error(y_test_reg, y_pred_reg)\n", + " mse = mean_squared_error(y_test_reg, y_pred_reg)\n", + " rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)\n", + " r2 = r2_score(y_test_reg, y_pred_reg)\n", + " print(f\"Model: {name}\")\n", + " print(f\"Best Parameters: {grid_search.best_params_}\")\n", + " print(f\"MAE: {mae}\")\n", + " print(f\"MSE: {mse}\")\n", + " print(f\"RMSE: {rmse}\")\n", + " print(f\"R²: {r2}\")\n", + " print()\n", + "\n", + "# Список моделей и их гиперпараметров для задачи классификации\n", + "models_class = {\n", + " \"Logistic Regression\": (LogisticRegression(), {\n", + " 'model__C': [0.1, 1, 10],\n", + " 'model__solver': ['liblinear', 'lbfgs']\n", + " }),\n", + " \"Random Forest Classification\": (RandomForestClassifier(), {\n", + " 'model__n_estimators': [100, 200],\n", + " 'model__max_depth': [None, 10, 20]\n", + " }),\n", + " \"Gradient Boosting Classification\": (GradientBoostingClassifier(), {\n", + " 'model__n_estimators': [100, 200],\n", + " 'model__learning_rate': [0.01, 0.1],\n", + " 'model__max_depth': [3, 5]\n", + " })\n", + "}\n", + "\n", + "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n", + "X_class = df[categorical_cols + numerical_cols]\n", + "y_class = (df['Price'] > df['Price'].mean()).astype(int)\n", + "\n", + "# Разделяем данные на обучающую и тестовую выборки для задачи классификации\n", + "X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.2, random_state=42)\n", + "\n", + "# Обучаем и оцениваем модели для задачи классификации\n", + "print(\"Результаты для задачи классификации:\")\n", + "for name, (model, params) in models_class.items():\n", + " pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('model', model)\n", + " ])\n", + " grid_search = GridSearchCV(pipeline, params, cv=5, scoring='accuracy')\n", + " grid_search.fit(X_train_class, y_train_class)\n", + " best_model = grid_search.best_estimator_\n", + " y_pred_class = best_model.predict(X_test_class)\n", + " accuracy = accuracy_score(y_test_class, y_pred_class)\n", + " precision = precision_score(y_test_class, y_pred_class)\n", + " recall = recall_score(y_test_class, y_pred_class)\n", + " f1 = f1_score(y_test_class, y_pred_class)\n", + " print(f\"Model: {name}\")\n", + " print(f\"Best Parameters: {grid_search.best_params_}\")\n", + " print(f\"Accuracy: {accuracy}\")\n", + " print(f\"Precision: {precision}\")\n", + " print(f\"Recall: {recall}\")\n", + " print(f\"F1-score: {f1}\")\n", + " print()\n", + "\n", + " # Визуализация матрицы ошибок\n", + " cm = confusion_matrix(y_test_class, y_pred_class)\n", + " disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['Less', 'More'])\n", + " disp.plot(cmap=plt.cm.Blues)\n", + " plt.title(f'Confusion Matrix for {name}')\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Давайте проанализируем полученные значения метрик и определим, являются ли они нормальными или их можно улучшить.\n", + "\n", + "### Оценка смещения и дисперсии для задачи регрессии:\n", + "#### Вывод для задачи регрессии:\n", + "\n", + "- Random Forest Regression демонстрирует наилучшие результаты по метрикам MAE и R², что указывает на высокую точность и стабильность модели.\n", + "- Linear Regression и Gradient Boosting Regression также показывают хорошие результаты, но уступают случайному лесу.\n", + "\n", + "#### Вывод для задачи классификации:\n", + "- Random Forest Classification демонстрирует наилучшие результаты по всем метрикам (Accuracy, Precision, Recall, F1-score), что указывает на высокую точность и стабильность модели.\n", + "- Logistic Regression и Gradient Boosting Classification также показывают хорошие результаты, но уступают случайному лесу.\n", + "\n", + "Для оценки смещения (bias) и дисперсии (variance) моделей можно использовать метод перекрестной проверки (cross-validation). Этот метод позволяет оценить, насколько хорошо модель обобщается на новых данных.\n", + "\n", + "Оценка смещения и дисперсии для задачи регрессии: Для задачи регрессии мы будем использовать метрики MAE (Mean Absolute Error) и R² (R-squared) для оценки смещения и дисперсии.\n", + "\n", + "Оценка смещения и дисперсии для задачи классификации: Для задачи классификации мы будем использовать метрики Accuracy, Precision, Recall и F1-score для оценки смещения и дисперсии.\n", + "\n", + "Пример кода для оценки смещения и дисперсии:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Оценка смещения и дисперсии для задачи регрессии:\n", + "Model: Linear Regression\n", + "MAE (Cross-Validation): Mean = 5393.4164031476985, Std = 2364.7028993279946\n", + "R² (Cross-Validation): Mean = 0.31163924349046784, Std = 0.20066100088089248\n", + "\n", + "Model: Random Forest Regression\n", + "MAE (Cross-Validation): Mean = 4632.622847297591, Std = 2958.2113579489355\n", + "R² (Cross-Validation): Mean = 0.37197535985326297, Std = 0.11953059546045496\n", + "\n", + "Model: Gradient Boosting Regression\n", + "MAE (Cross-Validation): Mean = 4705.057344875317, Std = 2676.698617934764\n", + "R² (Cross-Validation): Mean = 0.30094204368967814, Std = 0.29605037554256863\n", + "\n", + "Оценка смещения и дисперсии для задачи классификации:\n", + "Model: Logistic Regression\n", + "Accuracy (Cross-Validation): Mean = 0.8373806164532234, Std = 0.04588247503012167\n", + "Precision (Cross-Validation): Mean = 0.7753980572437796, Std = 0.128244461080632\n", + "Recall (Cross-Validation): Mean = 0.663888888888889, Std = 0.22281171811283865\n", + "F1-score (Cross-Validation): Mean = 0.6730794905263655, Std = 0.09462791851118425\n", + "\n", + "Model: Random Forest Classification\n", + "Accuracy (Cross-Validation): Mean = 0.835177447362709, Std = 0.04406396622710083\n", + "Precision (Cross-Validation): Mean = 0.807362406312931, Std = 0.11894947251838416\n", + "Recall (Cross-Validation): Mean = 0.6194444444444445, Std = 0.2382420182487952\n", + "F1-score (Cross-Validation): Mean = 0.6475067867122541, Std = 0.10752644539783694\n", + "\n", + "Model: Gradient Boosting Classification\n", + "Accuracy (Cross-Validation): Mean = 0.8469530062947689, Std = 0.03006931461001492\n", + "Precision (Cross-Validation): Mean = 0.8072507504934535, Std = 0.11323561235031351\n", + "Recall (Cross-Validation): Mean = 0.6250380517503805, Std = 0.23296204577560678\n", + "F1-score (Cross-Validation): Mean = 0.661152357410075, Std = 0.1082825984327667\n", + "\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "from sklearn.model_selection import cross_val_score\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.linear_model import LinearRegression, LogisticRegression\n", + "from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n", + "from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.preprocessing import OneHotEncoder\n", + "\n", + "# Загружаем набор данных\n", + "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", + "\n", + "# Удаление пустого столбца по имени\n", + "df = df.drop('Unnamed: 0', axis=1)\n", + "\n", + "# Определяем категориальные и числовые столбцы\n", + "categorical_cols = ['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE']\n", + "numerical_cols = ['Battery capacity (mAh)', 'Screen size (inches)', 'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera', 'Number of SIMs']\n", + "\n", + "# Создаем преобразователь для категориальных и числовых столбцов\n", + "preprocessor = ColumnTransformer(\n", + " transformers=[\n", + " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_cols),\n", + " ('num', StandardScaler(), numerical_cols)\n", + " ])\n", + "\n", + "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n", + "X_reg = df[categorical_cols + numerical_cols]\n", + "y_reg = df['Price']\n", + "\n", + "# Список моделей для задачи регрессии\n", + "models_reg = {\n", + " \"Linear Regression\": LinearRegression(),\n", + " \"Random Forest Regression\": RandomForestRegressor(),\n", + " \"Gradient Boosting Regression\": GradientBoostingRegressor()\n", + "}\n", + "\n", + "# Оценка смещения и дисперсии для задачи регрессии\n", + "print(\"Оценка смещения и дисперсии для задачи регрессии:\")\n", + "for name, model in models_reg.items():\n", + " pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('model', model)\n", + " ])\n", + " mae_scores = -cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='neg_mean_absolute_error')\n", + " r2_scores = cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='r2')\n", + " print(f\"Model: {name}\")\n", + " print(f\"MAE (Cross-Validation): Mean = {mae_scores.mean()}, Std = {mae_scores.std()}\")\n", + " print(f\"R² (Cross-Validation): Mean = {r2_scores.mean()}, Std = {r2_scores.std()}\")\n", + " print()\n", + "\n", + "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n", + "X_class = df[categorical_cols + numerical_cols]\n", + "y_class = (df['Price'] > df['Price'].mean()).astype(int)\n", + "\n", + "# Список моделей для задачи классификации\n", + "models_class = {\n", + " \"Logistic Regression\": LogisticRegression(),\n", + " \"Random Forest Classification\": RandomForestClassifier(),\n", + " \"Gradient Boosting Classification\": GradientBoostingClassifier()\n", + "}\n", + "\n", + "# Оценка смещения и дисперсии для задачи классификации\n", + "print(\"Оценка смещения и дисперсии для задачи классификации:\")\n", + "for name, model in models_class.items():\n", + " pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('model', model)\n", + " ])\n", + " accuracy_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='accuracy')\n", + " precision_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='precision')\n", + " recall_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='recall')\n", + " f1_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='f1')\n", + " print(f\"Model: {name}\")\n", + " print(f\"Accuracy (Cross-Validation): Mean = {accuracy_scores.mean()}, Std = {accuracy_scores.std()}\")\n", + " print(f\"Precision (Cross-Validation): Mean = {precision_scores.mean()}, Std = {precision_scores.std()}\")\n", + " print(f\"Recall (Cross-Validation): Mean = {recall_scores.mean()}, Std = {recall_scores.std()}\")\n", + " print(f\"F1-score (Cross-Validation): Mean = {f1_scores.mean()}, Std = {f1_scores.std()}\")\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABJoAAAJOCAYAAAD/Fm2FAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACdRklEQVR4nOzde3yO9ePH8fc2O889xx0wtqiY02rCopC1OUSKnBkJYRWryLdySikK5VxCB4pOKuQ0h76yUqRvEVEOHWxOcTNss12/Pzx2/dy2sXFtN9vr+Xh4uO/r+lzX9bmufXbd19735/pcLoZhGAIAAAAAAACukauzKwAAAAAAAIDigaAJAAAAAAAAliBoAgAAAAAAgCUImgAAAAAAAGAJgiYAAAAAAABYgqAJAAAAAAAAliBoAgAAAAAAgCUImgAAAAAAAGAJgiYAAAAAAABYgqAJN7w+ffrIz8+vSLe5f/9+ubi4aMGCBUW63eJsyZIlKleunE6fPu3squSpcePGGj58eL7Lnz59Wo888oiCgoLk4uKioUOHFl7lYHJxcdGYMWOcXY0icy3now0bNsjFxUUbNmywvF4AcL0qyOfEli1b5OHhoQMHDlhej9mzZ6tq1apKS0vL9zLvvfeeatasKXd3d5UpU8byOiGnPn36KDQ01NnVKFLNmzdX8+bNr2rZ0NBQ9enTx9L64MZD0FSMLFiwQC4uLnJxcdGmTZtyzDcMQyEhIXJxcdF9993nhBoWXGZmpipVqiQXFxd99dVXzq6OJc6cOaMxY8YUyh922T//3P49+uijlm/PKpmZmRo9erQee+wxh9AwNDRULi4uio6OznW5t956y9y/H374Idcyw4cPl4uLi7p06ZLr/Ow/0vP69/LLL5tlR4wYoRkzZig5OTlf+/XSSy9pwYIFGjRokN577z316tUrX8tdrezjlf3P19dXDRs21Lvvvluo28UFY8aMkYuLi1xdXfXnn3/mmG+32+Xt7S0XFxfFx8c7oYYAiouLr/lcXFxUqlQpVa5cWX369NHff//t7OoVK88++6y6deumatWqmdOaN2/ucPy9vb1Vr149TZ06VVlZWQ7L9+rVS02bNlWjRo3UrFkz/frrr+a8Pn36KD09XXPmzMlXXXbt2qU+ffqoevXqeuutt/Tmm29as5N5yP5cy/7n7u6u0NBQPf744zpx4kShbhuO16jjx4/PtUyPHj3k4uJS5F+6A1dSytkVgPW8vLy0aNEiNW3a1GH6xo0b9ddff8nT09NJNSu4devW6dChQwoNDdXChQvVunVrZ1fpmp05c0Zjx46VpKv+puBy7r33XvXu3TvH9FtuucXybVnlyy+/1O7duzVgwIAc87y8vLR+/XolJycrKCjIYd7ChQvl5eWlc+fO5bpewzD0wQcfKDQ0VF9++aVOnTql0qVL51q2W7duatOmTY7pt912m/n6/vvvl81m08yZMzVu3Lgr7te6devUuHFjjR49+oplrRIREaEnn3xSknTo0CHNnTtXcXFxSktLU//+/YusHs509uxZlSrlvI83T09PffDBBzl6v3366adOqhGA4mrcuHEKCwvTuXPn9O2332rBggXatGmTfvnlF3l5eTm7eje87du3a+3atdq8eXOOeVWqVNGECRMkSUePHtWiRYs0bNgwHTlyRC+++KJZ7vnnnzevwYYOHarBgwdr/fr1ki5c48TFxWny5Ml67LHH5OLictn6bNiwQVlZWXr99ddVo0YNq3bzimbNmiU/Pz+lpqYqMTFR06ZN07Zt23L9Yrs4euutt3IEiEXJy8tLH3zwgZ577jmH6ampqfr888/5Xcd1iR5NxVCbNm300Ucf6fz58w7TFy1apMjIyBx/rF/P3n//fd1+++0aNmyYli5dqtTUVGdX6bp3yy23qGfPnjn+NWzY8LLLnTlzJtfp58+fV3p6+jXV6Uo/t/nz56tJkyaqXLlyjnlNmjSRn5+fFi9e7DD9r7/+0n//+1+1bds2z/Vu2LBBf/31l+bNm6fz589f9g/922+/PdfjVrt2bbOMq6urOnXqpHfffVeGYVx2nyTp8OHDlnZrz8/PonLlymbdn376aW3atEl+fn6aMmWKZfXIL2f9vnp5eTk1aGrTpo0++OCDHNMXLVp02fYKAAXVunVr9ezZU4888ojmzp2rp556Sr///ru++OILZ1etUOR1rVJY5s+fr6pVq6px48Y55vn7+5uft0OHDtXXX3+tatWqadq0acrMzDTLXfxFn2EYcnV1/POrc+fOOnDggBk+Xc7hw4clydJri/wc006dOqlnz54aOHCglixZoi5duuibb77Rli1bLKtHfmRlZeX55WJhcnd3d+oX9W3atNHOnTv1008/OUz//PPPlZ6ernvvvddJNQPyRtBUDHXr1k3Hjh3TmjVrzGnp6en6+OOP1b1791yXycrK0tSpU1W7dm15eXkpMDBQAwcO1L///utQ7vPPP1fbtm1VqVIleXp6qnr16nrhhRccPlClCz116tSpo507d6pFixby8fFR5cqVNXHixHzvx9mzZ/XZZ5+pa9eu6ty5s86ePavPP/88z/J//PGHYmNj5evrq0qVKmncuHE5woAPP/xQkZGRKl26tGw2m+rWravXX389x3oeeughlStXTj4+PmrcuLGWL19+xfrmdS/zxfd179+/XxUrVpQkjR071uwOe/E4Abt27VKnTp1Urlw5eXl5qUGDBpZfMGb/fLZu3aq7775bPj4++s9//mN20X311Vc1depUVa9eXZ6entq5c6ekCz107rrrLvn6+qpMmTK6//77HbqAS//fzXrnzp3q3r27ypYtm6N33cXOnTunlStX5nl7nJeXlx588EEtWrTIYfoHH3ygsmXLKjY2Ns91L1y4UOHh4WrRooWio6O1cOHC/B6iPN177706cOCAtm/fnmeZ7HFv9u3bp+XLl5s/5/3790u6cKHYr18/BQYGysvLS/Xr19c777zjsI4r/Szyq2LFiqpZs6Z+//13h+n5/Z3PysrSmDFjVKlSJfn4+KhFixbauXNnjvvvs2/j2LhxowYPHqyAgABVqVLFnP/VV1+Zbad06dJq27atduzY4bCt5ORk9e3bV1WqVJGnp6eCg4N1//33m8dNkn744QfFxsaqQoUK8vb2VlhYmB5++GGH9eQ29saPP/6o1q1by2azyc/PTy1bttS3337rUCZ7H7755hslJCSoYsWK8vX11QMPPKAjR47k95Cre/fu2r59u3bt2uWwb+vWrcvzHJyfNiFJJ06cUJ8+feTv768yZcooLi4uz9sXrvZcsmfPHnXs2FFBQUHy8vJSlSpV1LVrV508eTJ/BwCA09x1112SlOOcn5v8nHMNw9D48eNVpUoV8zNgx44dOT4Dsj/7L5V9Xr14nQW9lrz0WkWS0tLSNHr0aNWoUUOenp4KCQnR8OHDc4x1lJaWpmHDhqlixYoqXbq02rdvr7/++uuKxybb0qVLdc8991yxp5F04Xrljjvu0KlTp8xA6GKJiYmaO3euwy35khQZGaly5cpd9hpXunB7fHYP6YoVK+b4rJs5c6Zq164tT09PVapUSUOGDMnx+XC5Y1oQebWz7777Tq1atZK/v798fHzUrFkzffPNNzmW37Bhgxo0aCAvLy9Vr15dc+bMybUNZd9qvnDhQnPfVq5cKUn6+++/9fDDDyswMFCenp6qXbu25s2bl2Nb06ZNU+3ateXj46OyZcuqQYMGDteUp06d0tChQxUaGipPT08FBATo3nvv1bZt28wyuY3RlJqaqieffFIhISHy9PTUrbfeqldffTXH3x7Z+7B06VLVqVPHrGv2fuRHVFSUwsLCclwLL1y4UK1atVK5cuVyXS4/bUKS3nzzTVWvXl3e3t5q2LCh/vvf/+a6vvz+3l0qIyNDY8eO1c033ywvLy+VL19eTZs2dfhbFcUPt84VQ6GhoYqKitIHH3xg3mr21Vdf6eTJk+rataveeOONHMsMHDhQCxYsUN++ffX4449r3759mj59un788Ud98803cnd3l3ThgsHPz08JCQny8/PTunXrNGrUKNntdk2aNMlhnf/++69atWqlBx98UJ07d9bHH3+sESNGqG7duvm6Be6LL77Q6dOn1bVrVwUFBal58+ZauHBhrn+oZWZmqlWrVmrcuLEmTpyolStXavTo0Tp//rx5i9OaNWvUrVs3tWzZUq+88ook6ddff9U333yjJ554QpKUkpKiO++8U2fOnNHjjz+u8uXL65133lH79u318ccf64EHHijATyKnihUratasWRo0aJAeeOABPfjgg5KkevXqSZJ27Nhh9ux55pln5OvrqyVLlqhDhw765JNP8rX9c+fO6ejRozmm22w2eXh4mO+PHTum1q1bq2vXrurZs6cCAwPNefPnz9e5c+c0YMAAeXp6qly5clq7dq1at26tm266SWPGjNHZs2c1bdo0NWnSRNu2bcvxAfzQQw/p5ptv1ksvvXTZ3j9bt25Venq6br/99jzLdO/eXTExMfr9999VvXp1SRd6h3Tq1Mlsm5dKS0vTJ598Yt5G1q1bN/Xt2zfXW/CkC9/o5XbcypQp49A7JjIyUpL0zTffONxWd7FatWrpvffe07Bhw1SlShWzDhUrVtTZs2fVvHlz7d27V/Hx8QoLC9NHH32kPn366MSJE2ZbzJbbz6Igzp8/r7/++ktly5Z1mJ7f3/mRI0dq4sSJateunWJjY/XTTz8pNjY2z28UBw8erIoVK2rUqFFmj6b33ntPcXFxio2N1SuvvKIzZ85o1qxZatq0qX788Uez7XTs2FE7duzQY489ptDQUB0+fFhr1qzRwYMHzfcxMTGqWLGinnnmGZUpU0b79++/4i1pO3bs0F133SWbzabhw4fL3d1dc+bMUfPmzbVx40Y1atTIofxjjz2msmXLavTo0dq/f7+mTp2q+Pj4HL3q8nL33XerSpUqWrRokXn+Wbx4sfz8/HLt0ZTfNmEYhu6//35t2rRJjz76qGrVqqXPPvtMcXFxue7z1ZxL0tPTFRsbq7S0ND322GMKCgrS33//rWXLlunEiRPy9/fP1zEA4BzZgc6l5/zcXOmcK0mjRo3S+PHj1aZNG7Vp00bbtm1TTEzMNfV0Lsi1ZG7XKllZWWrfvr02bdqkAQMGqFatWvr55581ZcoU/fbbb1q6dKm5/COPPKL3339f3bt315133ql169blu2fp33//rYMHD172+uRS2V8SXdrj6Pvvv1fnzp01f/583XHHHTmWu/3223MNZC42depUvfvuu/rss8/MW9myrx/HjBmjsWPHKjo6WoMGDdLu3bs1a9Ysff/99w6f6dLlr/8Ksp+SYztbt26dWrdurcjISI0ePVqurq6aP3++7rnnHv33v/81e9b/+OOPatWqlYKDgzV27FhlZmZq3Lhx5hexl1q3bp2WLFmi+Ph4VahQQaGhoUpJSVHjxo3NEKdixYr66quv1K9fP9ntdvPhK2+99ZYef/xxderUSU888YTOnTun//3vf/ruu+/MvyceffRRffzxx4qPj1d4eLiOHTumTZs26ddff83zZ28Yhtq3b6/169erX79+ioiI0KpVq/T000/r77//ztGLfNOmTfr00081ePBglS5dWm+88YY6duyogwcPqnz58vk65t26ddP777+vl19+WS4uLjp69KhWr16t9957L9fQKr9t4u2339bAgQN15513aujQofrjjz/Uvn17lStXTiEhIeb6CvJ7l1tdJkyYoEceeUQNGzaU3W7XDz/8oG3bttEbqzgzUGzMnz/fkGR8//33xvTp043SpUsbZ86cMQzDMB566CGjRYsWhmEYRrVq1Yy2bduay/33v/81JBkLFy50WN/KlStzTM9e38UGDhxo+Pj4GOfOnTOnNWvWzJBkvPvuu+a0tLQ0IygoyOjYsWO+9ue+++4zmjRpYr5/8803jVKlShmHDx92KBcXF2dIMh577DFzWlZWltG2bVvD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XXG567+8fPLJJ7LZbDpy5IjeeOMN7du3zyEwzP6sz+1W7mwnT57UuXPndPbs2VyfmJfXU/Quva44cuSITpw4oTfffFNvvvlmrstkt4ERI0Zo7dq1atiwoWrUqKGYmBh1795dTZo0MctOnDhRcXFxCgkJUWRkpNq0aaPevXvn+LviYgcOHFClSpVyPMk4r2u5S68rpAvXFgW5rpAuXAu/9tprGjZsmDZv3pzn+Fr5bRN5/Y67u7vn2P/8/t7lZty4cbr//vt1yy23qE6dOmrVqpV69epl3vqJ4omgqRjr3r27+vfvr+TkZLVu3TrPJ1RkZWUpICAgz54e2SeUEydOqFmzZrLZbBo3bpyqV68uLy8vbdu2TSNGjMjx2M+LezVc7EqBgiSzLhd/EFzsjz/+uOwHQG4CAgK0fft2rVq1Sl999ZW++uorzZ8/X71798510N2CcnFxyXXfLh3cMi/Zx++pp57Kc4BrKx9le/EFQkHmWbH+i2Xfm/7vv/9e9hvYRo0aqXr16ho6dKj27duXZ+8Q6cK3LmlpaXrttdf02muv5Zi/cOFCjR07Nl/1y82JEydUoUKFq16+IAr6s6hQoYIZmMXGxqpmzZq677779PrrryshIUFS/n/nrahvdrt+7733ch0b6+Lxr4YOHap27dpp6dKlWrVqlZ5//nlNmDBB69at02233SYXFxd9/PHH+vbbb/Xll19q1apVevjhh/Xaa6/p22+/zRHAXK1rOXddrHv37po1a5ZKly6tLl265AiSCsu1nktee+019enTR59//rlWr16txx9/XBMmTNC33357xV4SAIpWw4YN1aBBA0kXes40bdpU3bt31+7du+Xn56fNmzfn6NG8b98+hYaGXvGcWxB5BSSXXgMV9Foyt8/ArKws1a1bV5MnT851mxePK3MtLr4+yY2vr6/DF1RNmjTR7bffrv/85z+5jod6Of/++698fHwsuf66kqvZxt13321e97Rr105169ZVjx49tHXrVrm6upo/t0mTJikiIiLXdfj5+V3VE+Pyuq7o2bNnnsFWdoBRq1Yt7d69W8uWLdPKlSv1ySefaObMmRo1apR5Hdi5c2fddddd+uyzz7R69WpNmjRJr7zyij799NN8jSmbH1ZdV3Tr1k0jR45U//79Vb58ecXExFhRvXy5lt+7u+++W7///rt5XTF37lxNmTJFs2fP1iOPPFJYVYaTETQVYw888IAGDhyob7/99rKD2FavXl1r165VkyZNLvvhs2HDBh07dkyffvqp7r77bnP6vn37LK33vn37tHnzZsXHx6tZs2YO87KystSrVy8tWrRIzz33nMP0P/74w6GXym+//SZJDoNUe3h4qF27dmrXrp2ysrI0ePBgzZkzR88//7xq1KihatWqaffu3TnqlN2Vu1q1annWu2zZsrl2gb30W428LsaygzN3d/d896wpKtn7ndexqVChgkNvpoKoWbOmpAs/97p16162bLdu3TR+/HjVqlUrzwsZ6UKQVKdOHfPpLBebM2eOFi1adNVB099//6309HTzW6uCqlatmv73v/8pKyvLIXjITxu7Gm3btlWzZs300ksvaeDAgfL19c3373x2Xfbu3evwjeKxY8fy/S1c9jfJAQEB+WrX1atX15NPPqknn3xSe/bsUUREhF577TW9//77ZpnGjRurcePGevHFF7Vo0SL16NFDH374Ya4XKxUrVpSPj0+ebdfV1dWyP0ou1b17d40aNUqHDh3Se++9l2e5/LaJatWqKTExUadPn3YI1S7dNyvOJXXr1lXdunX13HPPafPmzWrSpIlmz56t8ePHX9X6ABQ+Nzc3TZgwQS1atND06dP1zDPPqH79+jmGDLg49L/cOTf73LNnzx6HL/eOHDmS4zMgu4fTiRMnHL7YvPQayIpryerVq+unn35Sy5YtL9sDqFq1amZvo4t7duT2eZCbi69P8qNevXrq2bOn5syZo6eeeirXXix52bdv3zVdV0gX9uvin1N6err27dtn+TWln5+fRo8erb59+2rJkiXq2rWr+Vlvs9kuu72AgAB5eXk59DbPltu03GQ/QTAzMzNf++br66suXbqoS5cuSk9P14MPPqgXX3xRI0eONHufBQcHa/DgwRo8eLAOHz6s22+/XS+++GKeQVO1atW0du1anTp1yqFXU2Fdy2WrWrWqmjRpog0bNmjQoEEOX9ZdWj/pym3i4t/xi3tdZ2RkaN++fapfv745Lb+/d3kpV66c+vbtq759++r06dO6++67NWbMGIKmYowxmooxPz8/zZo1S2PGjFG7du3yLNe5c2dlZmbqhRdeyDHv/Pnz5mMws9P4i9P39PR0zZw509J6Z/eyGD58uDp16uTwr3PnzmrWrFmuPTGmT59uvjYMQ9OnT5e7u7tatmwp6f/vtc/m6upqfuOR/VjONm3aaMuWLUpKSjLLpaam6s0331RoaGiu4/Vkq169unbt2uXwGPSffvopx1NEsu+lvvTxogEBAWrevLnmzJmjQ4cO5Vh/QR6vbrXg4GBFRETonXfecaj3L7/8otWrV6tNmzZXve7IyEh5eHjohx9+uGLZRx55RKNHj861l1K2P//8U19//bU6d+6co/106tRJffv21d69e/Xdd99dVX23bt0qSbrzzjuvavk2bdooOTnZIfw9f/68pk2bJj8/vxzhqhVGjBihY8eO6a233pKU/9/5li1bqlSpUpo1a5ZDmYt/164kNjZWNptNL730Uq7jKmW36zNnzuT4prN69eoqXbq0+fv577//5vj2LztwzOvRum5uboqJidHnn3/u8HjtlJQULVq0SE2bNjVv37Na9erVNXXqVE2YMMF82k5u8tsm2rRpo/Pnzzv8PDIzMzVt2jSH9V3LucRut+v8+fMO0+rWrStXV9crPr4YgPM1b95cDRs21NSpU3Xu3DmVLVtW0dHRDv+8vLzydc6Njo6Wu7u7pk2b5nDunTp1ao7tZgcNX3/9tTktNTU1R49xK64lO3furL///tv8TLvY2bNnzSeeZocEl/Yuyq3+ualcubJCQkLydX2Sbfjw4crIyMiz10detm3bdtXXFdHR0fLw8NAbb7zhcFzffvttnTx5Mt9P2SuIHj16qEqVKuZTnCMjI1W9enW9+uqrOn36dI7y2Z87bm5uio6O1tKlSx3GRNq7d2+OcY3y4ubmpo4dO+qTTz7RL7/8kue2pJzX/h4eHgoPD5dhGMrIyFBmZmaO2zUDAgJUqVKly37mtWnTRpmZmTmuh6ZMmSIXFxfLekLlZvz48Ro9evRlx8vMb5to0KCBKlasqNmzZzs8SXLBggU5/k7J7+9dbi79Ofj5+alGjRpcVxRz9Ggq5i53r3S2Zs2aaeDAgZowYYK2b9+umJgYubu7a8+ePfroo4/0+uuvq1OnTrrzzjtVtmxZxcXF6fHHH5eLi4vee++9Anf7vJKFCxcqIiIiz14G7du312OPPaZt27aZjx318vLSypUrFRcXp0aNGumrr77S8uXL9Z///Me8DeiRRx7R8ePHdc8996hKlSo6cOCApk2bpoiICPNbpGeeeUYffPCBWrdurccff1zlypXTO++8o337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mjIzM/X8888rLCxM3t7eql69ul544QUZhmGWMQxDo0aNUnBwsLy9vRUdHa09e/Y4rOf48ePq0aOHbDabypQpo379+un06dMOZf73v//prrvukpeXl0JCQjRx4sQi2UcAAAAAAICSwqlB0yuvvKJZs2Zp+vTp+vXXX/XKK69o4sSJmjZtmllm4sSJeuONNzR79mx999138vX1VWxsrM6dO2eW6dGjh3bs2KE1a9Zo2bJl+vrrrzVgwABzvt1uV0xMjKpVq6atW7dq0qRJGjNmjN58880i3V8AAAAAAIDizMW4uPtQEbvvvvsUGBiot99+25zWsWNHeXt76/3335dhGKpUqZKefPJJPfXUU5KkkydPKjAwUAsWLFDXrl3166+/Kjw8XN9//70aNGggSVq5cqXatGmjv/76S5UqVdKsWbP07LPPKjk5WR4eHpKkZ555RkuXLtWuXbuuWE+73S5/f3+dPHmSQS4BALgO8VntPBx7AACub0X9We3UHk133nmnEhMT9dtvv0mSfvrpJ23atEmtW7eWJO3bt0/JycmKjo42l/H391ejRo2UlJQkSUpKSlKZMmXMkEmSoqOj5erqqu+++84sc/fdd5shkyTFxsZq9+7d+vfffwt9PwEAAAAAAEqCUs7c+DPPPCO73a6aNWvKzc1NmZmZevHFF9WjRw9JUnJysiQpMDDQYbnAwEBzXnJysgICAhzmlypVSuXKlXMoExYWlmMd2fPKli3rMC8tLU1paWnme7vdLknKyMhQRkbGNe0zAACwHp/PAAAA1wenBk1LlizRwoULtWjRItWuXVvbt2/X0KFDValSJcXFxTmtXhMmTNDYsWNzTF+9erV8fHycUCMAAHA5Z86ccXYVAAAAICcHTU8//bSeeeYZde3aVZJUt25dHThwQBMmTFBcXJyCgoIkSSkpKQoODjaXS0lJUUREhCQpKChIhw8fdljv+fPndfz4cXP5oKAgpaSkOJTJfp9d5mIjR45UQkKC+d5utyskJEQxMTGMPQAAwHUou/cxpBkzZmjSpElKTk5W/fr1NW3aNDVs2DDP8idOnNCzzz6rTz/9VMePH1e1atU0depUtWnTpghrDQAAigunBk1nzpyRq6vjMFFubm7KysqSJIWFhSkoKEiJiYlmsGS32/Xdd99p0KBBkqSoqCidOHFCW7duVWRkpCRp3bp1ysrK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XnMlvv/+e82ZM0f16tVzmD5s2DB9+eWX+uijj7Rx40b9888/evDBB835mZmZatu2rdLT07V582a98847WrBggUaNGmWW2bdvn9q2basWLVpo+/btGjp0qB555BGtWrXqmusNAABwLdLT0zVy5Eg1aNBAd955pxk0zZ8/X2FhYZo6daqGDRvm3EoCAAAUQIGCpsaNG+utt97SoUOHNHDgQH344YeqVKmSsrKytGbNGp06darAFTh9+rR69Oiht956S2XLljWnnzx5Um+//bYmT56se+65R5GRkZo/f742b96sb7/9VpK0evVq7dy5U++//74iIiLUunVrvfDCC5oxY4bS09MlXeiGHhYWptdee021atVSfHy8OnXqpClTphS4rgAAAFZ6/vnnNWvWLIWGhmr//v166KGHNGDAAE2ZMkWTJ0/W/v37NWLEiAKvd8aMGQoNDZWXl5caNWqkLVu25Fn2008/VYMGDVSmTBn5+voqIiJC77333rXsFgAAKMGu6qlzvr6+evjhh/Xwww9r9+7devvtt/Xyyy/rmWee0b333qsvvvgi3+saMmSI2rZtq+joaI0fP96cvnXrVmVkZCg6OtqcVrNmTVWtWlVJSUlq3LixkpKSVLduXQUGBpplYmNjNWjQIO3YsUO33XabkpKSHNaRXebiW/QulZaWprS0NPO93W6XJGVkZCgjIyPf+5ZfLkam5eu83rko0+F1STwGkgqlPRVEST3utL8LnNn+Suoxp+1dUBhtz9nn06v10Ucf6d1331X79u31yy+/qF69ejp//rx++uknubi4XNU6Fy9erISEBHPMp6lTpyo2Nla7d+9WQEBAjvLlypXTs88+q5o1a8rDw0PLli1T3759FRAQoNjY2GvdRQAAUMJcVdB0sVtvvVUTJ07UhAkTtGzZMs2bNy/fy3744Yfatm2bvv/++xzzkpOT5eHhoTJlyjhMDwwMVHJyslnm4pApe372vMuVsdvtOnv2rLy9vXNse8KECRo7dmyO6atXr5aPj/WPly2JIy+cO3fOfB16dq+8DC8n1sZ5Vqxw7iObS2Lbk2h/2ZzZ/mh7tD2rnTlz5sqFrkN//fWXIiMjJUl16tSRp6enhg0bdtUhkyRNnjxZ/fv3V9++fSVd6N29fPlyzZs3T88880yO8s2bN3d4/8QTT+idd97Rpk2bCJoAAECBFSho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WAIAAAAAAMC1c2qPph9++EEtWrQw32eHP3FxcVqwYIGGDx+u1NRUDRgwQCdOnFDTpk21cuVKeXl5mcssXLhQ8fHxatmypVxdXdWxY0e98cYb5nx/f3+tXr1aQ4YMUWRkpCpUqKBRo0ZpwIABRbejAAAAAAAAJYBTg6bmzZvLMIw857u4uGjcuHEaN25cnmXKlSunRYsWXXY79erV03//+9+rricAAAAAAACuzKm3zgEAAAAAAKD4IGgCAAAAAACAJQiaAAAAAAAAYAmCJgAAAAAAAFiCoAkAAAAAAACWIGgCAAAAAACAJQiaAAAAAAAAYAmCJgAAAAAAAFiCoAkAAAAAAACWIGgCAAAAAACAJQiaAAAAAAAAYAmCJgAAAAAAAFiCoAkAAAAAAACWIGgCAAAAAACAJQiaAAAAAAAAYAmCJgAAAAAAAFiCoAkAAAAAAACWIGgCAAAAAACAJQiaAAD/196dR1VV7v8DfzMeBoUAFdAULBIwRdDUC1bYFUWzrpZDqeWQV72phDl+NZfDcuxaaplZWmpdh2vmWJqiXisXmvOUMsiQQ4KmeE0sAeH9+8Mf+3IEZegwJO/XWmctz56eZ+/n8+z98dmcvUVERERERCxCA00iIiIiIiIiImIRGmgSERERERERERGL0ECTiIiIiIiIiIhYhAaaRERERERERETEIjTQJCIiIiIiIiIiFqGBJhERERERERERsQjbyq6AiIiIiIiIiDxYfr16Gb9m/FLi5bOzbhn//jk5DvYmh1KV5+JeGy4edUq1jpQPDTSJiIiIiIiIiEXt3bIGMSs+KNO6H4zsXep1OrwyHB37RpWpPLEsDTSJiIiIiIiIiEWFdX4JTUL/WmHlubjXrrCy5P400CQiIiIiIiIiFuXiUUc/Zaum9DBwERERERERERGxCA00iYiIiIiIiIiIRWigSURERERERERELEIDTSIiIiIiIiIiYhEaaBIREREREREREYvQQJOIiIiIiIiIiFiEBppERERERERERMQiNNAkIiIiIiIiIiIWoYEmERERERERERGxCA00iYiIiIiIiIiIRWigSURERERERERELEIDTSIiIiIiIiIiYhEaaBIREREREREREYvQQJOIiIiIiIiIiFiEBppERERERERERMQiNNAkIiIiIiIiIiIWoYEmERERERERERGxCA00iYiIiIiIiIiI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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABJoAAASlCAYAAADgRbP+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzde3zO9f/H8ee182bmuM1pX3PKIZock1MhC5HkEHIsFVZqHSVmSvt2IB2UyKkivg7JFwmLDogSUjlL5DCnNIbZ4f37w2/Xd5ddm43Pdu3wuN9ubna9r8/h9bn2vq7rvefnZDPGGAEAAAAAAAA3yM3VBQAAAAAAAKBwIGgCAAAAAACAJQiaAAAAAAAAYAmCJgAAAAAAAFiCoAkAAAAAAACWIGgCAAAAAACAJQiaAAAAAAAAYAmCJgAAAAAAAFiCoAkAAAAAAACWIGgCCqm9e/eqffv2KlGihGw2m5YsWeLqkuwGDhyo0NBQl61/1qxZstlsOnjwoEP7G2+8oapVq8rd3V3169eXJIWGhmrgwIF5XuPYsWNls9nyfL2udCP94o477tAdd9xhaT0AgBt3PZ/t69atk81m07p163KlpmtxNh7IDw4ePCibzaZZs2a5rAZn4yJnY87Mxlp5wWazaezYsXm+Xle5kX7h6vcaCi+CJuRr77//vmw2m5o2berqUgqcAQMGaMeOHRo/frw++eQTNWrUKNfXGR8fr+joaIWFhcnf31++vr6qW7eunn/+eR09ejTX138jVq1apeeee07NmzfXzJkz9eqrr+b6Oi9cuKCxY8fmuy93m80mm82mhx9+2Onzo0aNsk9z6tSpPK4OAJCVtD/w0/75+PjopptuUkREhOLi4lxdXr7nivGAdOUP/m7duqlcuXLy8vJSUFCQOnfurMWLF+fJ+m+EK8acK1asyHdhUtpOQjc3Nx0+fDjD8/Hx8fL19ZXNZlNERIQLKgTyjoerCwCyMmfOHIWGhmrz5s3at2+fqlev7uqSCoSLFy9q48aNGjVqVJ59kR04cEDt2rXToUOH1KNHDz3yyCPy8vLSL7/8ounTp+vzzz/Xnj178qSWa+nXr58eeOABeXt729u+/vprubm5afr06fLy8rK37969W25uuZPJX7hwQdHR0ZKU4Wicl156SS+88EKurDc7fHx8tGjRIr3//vsOr4ckffbZZ/Lx8dGlS5dcVB0A4FrGjRunKlWq6NKlS/r+++/1wQcfaMWKFfr111/l5+eXZ3VMmzZNqampOZqnVatWunjxYobvn7yQ2XggN0VFRWncuHGqUaOGHn30UVWuXFmnT5/WihUrdP/992vOnDnq06dPntRyLVePizIbczoba1lpxYoVmjx5stOw6eLFi/LwcN2fud7e3vrss8/03HPPObQXhNAQsApHNCHf+uOPP7RhwwZNnDhRgYGBmjNnjqtLylRCQoKrS3Bw8uRJSVLJkiUtW2ZW25icnKxu3bopLi5O69at02effabhw4dryJAhevfdd3XgwAH16NHDslpulLu7u3x8fBxOTTtx4oR8fX0zDCq9vb3l6emZ1yXKw8NDPj4+eb7eNHfffbfi4+P15ZdfOrRv2LBBf/zxhzp16uSiygAA2dGhQwc9+OCDevjhhzVr1iw9+eST+uOPP/TFF19kOk9ujGc8PT1zHDa4ubnJx8cn13b0ZCWz8cD1Msbo4sWLmT6/cOFCjRs3Tt27d9dvv/2m6OhoDR48WM8++6zWrl2rlStXKiAgwJJarHD1uCizMaezsVZe8fHxcWnQ1LFjR3322WcZ2ufOncv4CUUGQRPyrTlz5qhUqVLq1KmTunfvnmnQdPbsWT311FMKDQ2Vt7e3KlWqpP79+zuc0nPp0iWNHTtWN910k3x8fFS+fHl169ZN+/fvl5T5+cnOznkeOHCg/P39tX//fnXs2FHFixdX3759JUnfffedevTooX/961/y9vZWSEiInnrqKacDjF27dqlnz54KDAyUr6+vatasqVGjRkmS1q5dK5vNps8//zzDfHPnzpXNZtPGjRudvh5jx45V5cqVJUnPPvusbDabw7URtm7dqg4dOiggIED+/v5q27atfvjhB4dlpB12/80332jYsGEKCgpSpUqVnK5PkhYtWqTt27dr1KhRatGiRYbnAwICNH78+Eznl6Q333xTt99+u8qUKSNfX181bNhQCxcuzDDd6tWr1aJFC5UsWVL+/v6qWbOmXnzxRYdp3n33Xd18883y8/NTqVKl1KhRI82dOzfD9qVdN8Bms2nmzJlKSEiwn2qQ9jt3di2Ca/W5y5cva8yYMWrYsKFKlCihYsWKqWXLllq7dq19GQcPHlRgYKAkKTo62r7etD1zzq7RlJycrJdfflnVqlWTt7e3QkND9eKLLyox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RpJp0aKFSU5OznJdxhhz6623mhIlSlxzujQDBgwwlStXdmi7+rW7fPmyqVu3rmnTpo297a233jKSzMmTJzNd9r333mtuvvnmLNeftn1//PGHQ03FihXLMG3lypXNgAED7I+z0+eSk5NNYmKiw3N///23CQ4ONoMHD7a3nTx50khy+vuMiooy6T+it23bZiSZhx9+2GG6Z555xkgyX3/9tUPNksy3335rbztx4oTx9vY2Tz/9dIZ1XU2SGT58uDlz5ozx8vIyn3zyiTHGmOXLlxubzWYOHjxory/td3H58mUTFBRk6tatay5evGhf1rJly4wkM2bMGHtb/fr1Tfny5R369qpVq4wkh37x3XffGUlmzpw5DvWtXLkyQ3vr1q1N69at7Y+z0w8AoDBK+45bs2aNOXnypDl8+LCZN2+eKVOmjPH19TV//fWXMSbz8Ux2P3vPnj1rihcvbpo2berwuW+M43jm6u/8ESNGmICAgCzHF1ePy3LyHZO2XePGjXNY5q233moaNmyY6TrTz3/1eOB6voNXrlx5zXV98cUXRpJ56623rjmtMc7Hpc7Gnp999lmGcUCJEiXM8OHDM1321q1bjSSzYMGCLGu4elyU2Zjz6rFWdvtLdsfSw4cPdxgnpXf12Cqn49927do51PTUU08Zd3d3h3GLM+nHRs8884ypXr26/bnGjRubQYMG2etL/7uYNGmSkWQ+/fRTe9vly5dNs2bNjL+/v4mPjzfGGLNkyRIjybz++uv26ZKTk03Lli0z9Iu2bduaevXqmUuXLtnbUlNTze23325q1Khhb7v6vZbdfgBcC6fOIV+aM2eOgoODdeedd0q6cghsr169NG/ePIfDnhctWqSwsDCnqXzaHpxFixapbNmyevzxxzOd5no42yPm6+tr/zkhIUGnTp3S7bffLmOMtm7dKunKuezffvutBg8erH/961+Z1tO/f38lJiY6nD42f/58JScn68EHH8xxvSkpKVq1apW6du2qqlWr2tvLly+vPn366Pvvv1d8fLzDPEOGDJG7u/s1lx0fH3/de+LSpH/t/v77b/3zzz9q2bKlwyHdaXsrv/jii0wvLFqyZEn99ddf+vHHH2+onsxkp8+5u7vbr+2QmpqqM2fOKDk5WY0aNXLYnpxYsWKFJCkyMtKh/emnn5YkLV++3KG9Tp06atmypf1xYGCgatasqQMHDmR7naVKldLdd99tv87A3Llzdfvtt9sPk0/vp59+0okTJzRs2DCHa0t16tRJtWrVstd37Ngxbdu2TQMGDHDYK3bXXXepTp06DstcsGCBSpQoobvuukunTp2y/2vYsKH8/f0dTkW8Wm73AwDI79q1a6fAwECFhITogQcekL+/vz7//HNVrFjRYbqrxzPZ/exdvXq1zp07pxdeeCHDNQWzGl+VLFlSCQkJWr16dba3JbvfMek99thjDo9btmyZo+/A9HL6HVylShWFh4dfc7lp464bGUOlHz9dunRJp06d0m233SZJGcZQmzZtyvQuwGnfyV999ZUuXLhw3fVkJrv9JTtj6Zy4nvHvI4884lBTy5YtlZKSoj///DPb6+3Tp4/27dunH3/80f5/Zkf5rVixQuXKlVPv3r3tbZ6ennriiSd0/vx5ffPNN/bpPDw8HN6z7u7uGf7GOXPmjL7++mv17NlT586ds7+HT58+rfDwcO3du9fpZQ2k3O8HKDoImpDvpKSkaN68ebrzzjv1xx9/aN++fdq3b5+aNm2quLg4xcbG2qfdv39/pteKST9NzZo1Lb0ooIeHh9PTfA4dOqSBAweqdOnS9msCtG7dWpLs5zWnDXKuVXetWrXUuHFjh2tTzZkzR7fddtt13X3v5MmTunDhgtPDt2vXrq3U1NQMt2KtUqVKtpYdEBCgc+fO5bim9JYtW6bbbrtNPj4+Kl26tP3UsvTng/fq1UvNmzfXww8/rODgYD3wwAP6z3/+4xA6Pf/88/L391eTJk1Uo0YNDR8+3OHUuhuVnT4nSbNnz9Ytt9wiHx8flSlTRoGBgVq+fPl1n9/+559/ys3NLcPvvly5cipZsmSGwc/VIaZ0JTjKzrWN0uvTp49Wr16tQ4cOacmSJZkOktLW76x/1apVy/582v81atTIMN3V8+7du1f//POPgoKCFBgY6PDv/PnzOnHiRKZ153Y/AID8bvLkyVq9erXWrl2r33//XQcOHMgQfjgbz2T3szftVLzsfCemN2zYMN10003q0KGDKlWqpMGDB2vlypVZzpPd75g0Pj4+9usgprme78D068/Jd3BOxk+SbmgMdebMGY0YMULBwcHy9fVVYGCgff3pxxyvv/66fv31V4WEhKhJkyYaO3asQ/BWpUoVRUZG6qOPPlLZsmUVHh6uyZMnW3Zdnuz2l+yMpXPiesa/V4+hSpUqJUk56j+33nqratWqpblz52rOnDkqV66c/TppV/vzzz9Vo0aNDBe/r127tv35tP/Lly+f4fTEq7dt3759MsZo9OjRGd7DUVFRkpTpGCq3+wGKDq7RhHzn66+/1rFjxzRv3jzNmzcvw/Nz5sxR+/btLV1nZnveMrtopLe3d4Yvg5SUFN111106c+aMnn/+edWqVUvFihXTkSNHNHDgwBzf2le6clTTiBEj9NdffykxMVE//PCD3nvvvRwv53ql36uUlVq1amnr1q06fPiwQkJCcrye7777Tl26dFGrVq30/vvvq3z58vL09NTMmTMdLhDp6+urb7/9VmvXrtXy5cu1cuVKzZ8/X23atNGqVavk7u6u2rVra/fu3Vq2bJlWrlypRYsW6f3339eYMWMUHR2d49qux6effqqBAweqa9euevbZZxUUFCR3d3fFxMTYB1rXK7tH4WV2JJoxJkfr69Kli7y9vTVgwAAlJiaqZ8+eOZr/RqSmpiooKCjTGwFc/UdEevmhHwCAKzVp0kSNGjXKchpn45kb+ezNjqCgIG3btk1fffWVvvzyS3355ZeaOXOm+vfv7/Tix9cjO0djX4/sfgfnZPwkSTt27Ljumnr27KkNGzbo2WefVf369eXv76/U1FTdfffdDmPPnj17qmXLlvr888+1atUqvfHGG3rttde0ePFidejQQZI0YcIEDRw4UF988YVWrVqlJ554QjExMfrhhx+yvCmMVXJjLH09rBpD9enTRx988IGKFy+uXr165dldFNNep2eeeSbTI+uy2mnt6n6AwoGgCfnOnDlzFBQUZL+bRHqLFy/W559/rilTpsjX11fVqlXTr7/+muXyqlWrpk2bNikpKSnTCwen7am4+q4NOTlEdseOHdqzZ49mz56t/v3729uvPjQ87bDda9UtSQ888IAiIyP12Wef6eLFi/L09FSvXr2yXVN6gYGB8vPz0+7duzM8t2vXLrm5uV1XSCRJnTt31meffaZPP/1UI0eOzPH8ixYtko+Pj7766iuHWyDPnDkzw7Rubm5q27at2rZtq4kTJ+rVV1/VqFGjtHbtWrVr106SVKxYMfXq1Uu9evXS5cuX1a1bN40fP14jR47McLh2TmWnzy1cuFBVq1bV4sWLHQalaXuR0uTk1M3KlSsrNTVVe/fute/hkqS4uDidPXvW6elsVvD19VXXrl316aefqkOHDipbtmym9UlXLoB69R673bt3259P+3/v3r0ZlnF136xWrZrWrFmj5s2bZ3vQnl5u9gMAKKyy+9mbdjOVX3/9NcdHWnt5ealz587q3LmzUlNTNWzYMH344YcaPXq002Vl9zsmt+TWd/BNN92kmjVr6osvvtDbb7+d5YW0nfn7778VGxur6OhojRkzxt7u7DtWunK62LBhwzRs2DCdOHFCDRo00Pjx4+1BkyTVq1dP9erV00svvaQNGzaoefPmmjJlil555ZXr2sY02ekv2R1LS9kfQ+Xm+Pda+vTpozFjxujYsWNZXrS8cuXK+uWXX5SamuoQRqXdtS79GCo2NtZ+k5Y0V29b2t8anp6e9rFxTuVWP0DRwalzyFcuXryoxYsX65577lH37t0z/IuIiNC5c+fsdzm7//77tX37dqe3Rk/b63D//ffr1KlTTo8ESpumcuXKcnd317fffuvw/Pvvv5/t2tP2fqTf22GMcbhdr3TlC69Vq1aaMWOGDh065LSeNGXLllWHDh306aefas6cObr77rsz/UM/O/W1b99eX3zxhcOtZuPi4jR37ly1aNHCfgh3TnXv3l316tXT+PHjtXHjxgzPnzt3TqNGjcqyNpvN5nAE2cGDB7VkyRKH6c6cOZNh3vr160uS/fbCV9/O18vLS3Xq1JExRklJSdndpExlp8856wubNm3K8Nqk3d0ns9vSptexY0dJ0qRJkxzaJ06cKElO72JilWeeeUZRUVEaPXp0ptM0atRIQUFBmjJlisOtnr/88kvt3LnTXl/58uVVv359zZ492+Ew7NWrV+v33393WGbPnj2VkpKil19+OcP6kpOTs3zdcrsfAEBhld3P3vbt26t48eKKiYnJcCfSrI78uPrz2c3NzX7H1fTfH+ll9zsmt+Tmd3B0dLROnz6thx9+WMnJyRmeX7VqlZYtW+Z0XmfjDWd1pqSkZDj1KSgoSBUqVLC/nvHx8RnWX69ePbm5uWX6e8mJ7PSX7I6lpSs7k6Rrj6Fyc/x7LdWqVdOkSZMUExOjJk2aZDpdx44ddfz4cYe72iUnJ+vdd9+Vv7+//dTBjh07Kjk5WR988IF9upSUFL377rsOywsKCtIdd9yhDz/8UMeOHcuwvpMnT2ZaS273AxQdHNGEfGXp0qU6d+6cunTp4vT52267TYGBgZozZ4569eqlZ599VgsXLlSPHj00ePBgNWzYUGfOnNHSpUs1ZcoUhYWFqX///vr4448VGRmpzZs3q2XLlkpISNCaNWs0bNgw3XvvvSpRooR69Oihd999VzabTdWqVdOyZcuyvAbM1WrVqqVq1arpmWee0ZEjRxQQEKBFixY5PZ/7nXfeUYsWLdSgQQM98sgjqlKlig4ePKjly5dr27ZtDtP2799f3bt3lySng76ceOWVV7R69Wq1aNFCw4YNk4eHhz788EMlJibq9ddfv+7lenp6avHixWrXrp1atWqlnj17qnnz5vL09NRvv/2muXPnqlSpUho/frzT+Tt16qSJEyfq7rvvVp8+fXTixAlNnjxZ1atX1y+//GKfbty4cfr222/VqVMnVa5cWSdOnND777+vSpUqqUWLFpKuDGTKlSun5s2bKzg4WDt37tR7772nTp063fAFyyVlq8/dc889Wrx4se677z516tRJf/zxh6ZMmaI6dero/Pnz9mX5+vqqTp06mj9/vm666SaVLl1adevWdXr9grCwMA0YMEBTp07V2bNn1bp1a23evFmzZ89W165d7RfOzw1hYWEKCwvLchpPT0+99tprGjRokFq3bq3evXvbbz0dGhqqp556yj5tTEyMOnXqpBYtWmjw4ME6c+aM3n33Xd18880Or0/r1q316KOPKiYmRtu2bVP79u3l6empvXv3asGCBXr77bft742r5XY/AIDCKrufvQEBAXrrrbf08MMPq3HjxurTp49KlSql7du368KFC5meBvfwww/rzJkzatOmjSpVqqQ///xT7777rurXr+9wtFB6OfmOyQ25+R3cq1cv7dixQ+PHj9fWrVvVu3dvVa5cWadPn9bKlSsVGxvrcBmB9AICAtSqVSu9/vrrSkpKUsWKFbVq1Sr98ccfDtOdO3dOlSpVUvfu3RUWFiZ/f3+tWbNGP/74oyZMmCDpyqUrIiIi1KNHD910001KTk7WJ598Ind3d91///3XvX3pa71Wf8nJWLphw4aSpCeeeELh4eFyd3fXAw884HTduTX+zY4RI0Zcc5pHHnlEH374oQYOHKgtW7YoNDRUCxcu1Pr16zVp0iT7uKVz585q3ry5XnjhBR08eFB16tTR4sWLnV4/afLkyWrRooXq1aunIUOGqGrVqoqLi9PGjRv1119/afv27U5rye1+gCIk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dnV5AAAANyzHhyC9+eabatWqlSpXrqxbb71VkrRt2zYFBwfrk08+sbxAAACAwmLRokVauHCh7rjjDntbx44d5evrq549e+qDDz5wXXEAAAAWyHHQVLFiRf3yyy+aM2eOtm/fLl9fXw0aNEi9e/fOcIteAAAA/M+FCxcUHBycoT0oKIhT5wAAQKFwXRdVKlasmB555BGrawEAACjUmjVrpqioKH388cfy8fGRJF28eFHR0dFq1qyZi6sDAAC4cdd99e7ff/9dhw4d0uXLlx3au3TpcsNFAQAAFEZvv/22wsPDValSJYWFhUmStm/fLh8fH3311Vcurg4AAODG5ThoOnDggO677z7t2LFDNptNxhhJks1mkySlpKRYWyEAAEAhUbduXe3du1dz5szRrl27JEm9e/dW37595evr6+LqAAAAblyOg6YRI0aoSpUqio2NVZUqVbR582adPn1aTz/9tN58883cqBEAAKDQ8PPz05AhQ1xdBgAAQK7IcdC0ceNGff311ypbtqzc3Nzk5uamFi1aKCYmRk888YS2bt2aG3UCAAAUSEuXLlWHDh3k6emppUuXZjktlyAAAAAFXY6DppSUFBUvXlySVLZsWR09elQ1a9ZU5cqVtXv3bssLBAAAKMi6du2q48ePKygoSF27ds10OpvNxiUIAABAgZfjoKlu3bravn27qlSpoqZNm+r111+Xl5eXpk6dqqpVq+ZGjQAAAAVWamqq058BAAAKoxwHTS+99JISEhIkSePGjdM999yjli1bqkyZMpo/f77lBQIAABRmZ8+eVcmSJV1dBgAAgCXccjpDeHi4unXrJkmqXr26du3apVOnTunEiRNq06aN5QUCAAAUFq+99prDjrkePXqodOnSqlixorZv3+7CygAAAKyRo6ApKSlJHh4e+vXXXx3aS5cuLZvNZmlhAAAAhc2UKVMUEhIiSVq9erXWrFmjlStXqkOHDnr22WddXB0AAMCNy9Gpc56envrXv/7FhSoBAACuw/Hjx+1B07Jly9SzZ0+1b99eoaGhatq0qYurAwAAuHE5PnVu1KhRevHFF3XmzJncqAcAAKDQKlWqlA4fPixJWrlypdq1aydJMsawIw8AABQKOb4Y+Hvvvad9+/apQoUKqly5sooVK+bw/M8//2xZcQAAAIVJt27d1KdPH9WoUUOnT59Whw4dJElbt25V9erVXVwdAADAjctx0NS1a9dcKAMAAKDwe+uttxQaGqrDhw/r9ddfl7+/vyTp2LFjGjZsmIurAwAAuHE5DpqioqJyow4AAIBCz9PTU88880yG9qeeesoF1QAAAFgvx0ETAAAAsm/p0qXq0KGDPD09tXTp0iyn7dKlSx5VBQAAkDtyHDS5ubnJZrNl+jwXsgQAAPifrl276vjx4woKCsryEgQ2m41xFAAAKPByHDR9/vnnDo+TkpK0detWzZ49W9HR0ZYVBgAAUBikpqY6/RkAAKAwynHQdO+992Zo6969u26++WbNnz9fDz30kCWFAQAAAAAAoGBxs2pBt912m2JjY61aHAAAQKHzxBNP6J133snQ/t577+nJJ5/M+4IAAAAsZknQdPHiRb3zzjuqWLGiFYsDAAAolBYtWqTmzZtnaL/99tu1cOFCF1QEAABgrRyfOleqVCmHi4EbY3Tu3Dn5+fnp008/tbQ4AACAwuT06dMqUaJEhvaAgACdOnXKBRUBAABYK8dB01tvveUQNLm5uSkwMFBNmzZVqVKlLC0OAACgMKlevbpWrlypiIgIh/Yvv/xSVatWdVFVAAAA1slx0DRw4MBcKAMAAKDwi4yMVEREhE6ePKk2bdpIkmJjYzVhwgRNmjTJtcUBAABYIMdB08yZM+Xv768ePXo4tC9YsEAXLlzQgAEDLCsOAACgMBk8eLASExM1fvx4vfzyy5Kk0NBQffDBB+rfv7+LqwMAALhxOb4YeExMjMqWLZuhPSgoSK+++qolRQEAABRWQ4cO1V9//aW4uDjFx8frwIEDhEwAAKDQyHHQdOjQIVWpUiVDe+XKlXXo0CFLigIAACiskpOTtWbNGi1evFjGGEnS0aNHdf78eRdXBgAAcONyfOpcUFCQfvnlF4WGhjq0b9++XWXKlLGqLgAAgELnzz//1N13361Dhw4pMTFRd911l4oXL67XXntNiYmJmjJliqtLBAAAuCE5PqKpd+/eeuKJJ7R27VqlpKQoJSVFX3/9tUaMGKEHHnggN2oEAAAoFEaMGKFGjRrp77//lq+vr739vvvuU2xsrAsrAwAAsEaOj2h6+eWXdfDgQbVt21YeHldmT01NVf/+/blGEwAAQBa+++47bdiwQV5eXg7toaGhOnLkiIuqAgAAsE6OgyYvLy/Nnz9fr7zyirZt2yZfX1/Vq1dPlStXzo36AAAACo3U1FSlpKRkaP/rr79UvHhxF1QEAABgrRwHTWlq1KihGjVqWFkLAABAoda+fXtNmjRJU6dOlSTZbDadP39eUVFR6tixo4urAwAAuHE5vkbT/fffr9deey1D++uvv64ePXpYUhQAAEBh9Oabb2r9+vWqU6eOLl26pD59+thPm3M2vgIAAChocnxE07fffquxY8dmaO/QoYMmTJhgRU0AAACFUkhIiLZv36758+dr+/btOn/+vB566CH17dvX4eLgAAAABVWOg6bz589nuIClJHl6eio+Pt6SogAAAAqbpKQk1apVS8uWLVPfvn3Vt29fV5cEAABguRyfOlevXj3Nnz8/Q/u8efNUp04dS4oCAAAobDw9PXXp0iVXlwEAAJCrcnxE0+jRo9WtWzft379fbdq0kSTFxsZq7ty5WrhwoeUFAgAAFBbDhw/Xa6+9po8++kgeHtd9TxYAAIB8K8cjnM6dO2vJkiV69dVXtXDhQvn6+iosLExff/21SpcunRs1AgAAFAo//vijYmNjtWrVKtWrV0/FihVzeH7x4sUuqgwAAMAa17UrrVOnTurUqZMkKT4+Xp999pmeeeYZbdmyRSkpKZYWCAAAUFiULFlS999/v6vLAAAAyDXXfcz2t99+q+nTp2vRokWqUKGCunXrpsmTJ1tZGwAAQKGQmpqqN954Q3v27NHly5fVpk0bjR07ljvNAQCAQidHQdPx48c1a9YsTZ8+XfHx8erZs6cSExO1ZMkSLgQOAACQifHjx2vs2LFq166dfH199c477+jkyZOaMWOGq0sDAACwVLbvOte5c2fVrFlTv/zyiyZNmqSjR4/q3Xffzc3aAAAACoWPP/5Y77//vr766istWbJE//3vfzVnzhylpqa6ujQAAABLZfuIpi+//FJPPPGEhg4dqho1auRmTQAAAIXKoUOH1LFjR/vjdu3ayWaz6ejRo6pUqZILKwMAALBWto9o+v7773Xu3Dk1bNhQTZs21XvvvadTp07lZm0AAACFQnJysnx8fBzaPD09lZSU5KKKAAAAcke2j2i67bbbdNttt2nSpEmaP3++ZsyYocjISKWmpmr16tUKCQlR8eLFc7NWAACAAskYo4EDB8rb29vedunSJT322GMqVqyYvW3x4sWuKA8AAMAy2T6iKU2xYsU0ePBgff/999qxY4eefvpp/fvf/1ZQUJC6dOmSGzUCAAAUaAMGDFBQUJBKlChh//fggw+qQoUKDm0AAAAFXY7uOne1mjVr6vXXX1dMTIz++9//XvedUyZPnqw33nhDx48fV1hYmN599101adLkmvPNmzdPvXv31r333qslS5Zc17oBAABy28yZM11dAgAAQJ7I8RFNzri7u6tr165aunRpjuedP3++IiMjFRUVpZ9//llhYWEKDw/XiRMnspzv4MGDeuaZZ9SyZcvrLRsAAAAAAAAWsiRouhETJ07UkCFDNGjQINWpU0dTpkyRn59flkdHpaSkqG/fvoqOjlbVqlXzsFoAAAAAAABk5oZOnbtRly9f1pYtWzRy5Eh7m5ubm9q1a6eNGzdmOt+4ceMUFBSkhx56SN99912W60hMTFRiYqL9cXx8vCQpKSkpV+70YjMpli8TBYMr7xxEvyu6XH3HKvpe0ZUbfc/V/RkAAAA3zqVB06lTp5SSkqLg4GCH9uDgYO3atcvpPN9//72mT5+ubdu2ZWsdMTExio6OztC+atUq+fn55bjma6li+RJRUKxYscdl66bfFV2u7HcSfa8oy42+d+HCBcuXCQAAgLzl0qApp86dO6d+/fpp2rRpKlu2bLbmGTlypCIjI+2P4+PjFRISovbt2ysgIMDyGiev3Wf5MlEwDL+zusvWTb8rulzZ7yT6XlGWG30v7ahjAAAAFFwuDZrKli0rd3d3xcXFObTHxcWpXLlyGabfv3+/Dh48qM6dO9vbUlNTJUkeHh7avXu3qlWr5jCPt7e3vL29MyzL09NTnp6eVmyGA2Nzt3yZKBhyoz9lF/2u6HJlv5Poe0VZbvQ9V/dnAAAA3DiXXgzcy8tLDRs2VGxsrL0tNTVVsbGxatasWYbpa9WqpR07dmjbtm32f126dNGdd96pbdu2KSQkJC/LBwAAAAAAQDouP3UuMjJSAwYMUKNGjdSkSRNNmjRJCQkJGjRokCSpf//+qlixomJiYuTj46O6des6zF+yZElJytAOAAAAAACAvOXyoKlXr146efKkxowZo+PHj6t+/fpauXKl/QLhhw4dkpubSw+8AgAAAAAAQDa4PGiSpIiICEVERDh9bt26dVnOO2vWLOsLAgAAAAAAQI5xqBAAAAAAAAAsQdAEAAAAAAAASxA0AQAAFECTJ09WaGiofHx81LRpU23evDlb882bN082m01du3bN3QIBAECRRNAEAABQwMyfP1+RkZGKiorSzz//rLCwMIWHh+vEiRNZznfw4EE988wzatmyZR5VCgAAipp8cTFwAAAAZN/EiRM1ZMgQDRo0SJI0ZcoULV++XDNmzNALL7zgdJ6UlBT17dtX0dHR+u6773T27Nks15GYmKjExET74/j4eElSUlKSkpKSrNmQ/2czKZYuDwWH1X0pp+h7RRd9D66SG33P1f35agRNAAAABcjly5e1ZcsWjRw50t7m5uamdu3aaePGjZnON27cOAUFBemhhx7Sd999d831xMTEKDo6OkP7qlWr5Ofnd33FZ6KKpUtDQbJixR6Xrp++V3TR9+AqudH3Lly4YPkybwRBEwAAQAFy6tQppaSkKDg42KE9ODhYu3btcjrP999/r+nTp2vbtm3ZXs/IkSMVGRlpfxwfH6+QkBC1b99eAQEB11V7Ziav3Wfp8lBwDL+zukvXT98ruuh7cJXc6HtpRx3nFwRNAAAAhdi5c+fUr18/TZs2TWXLls32fN7e3vL29s7Q7unpKU9PTytLlLG5W7o8FBxW96Wcou8VXfQ9uEpu9D1X9+erETQBAAAUIGXLlpW7u7vi4uIc2uPi4lSuXLkM0+/fv18HDx5U586d7W2pqamSJA8PD+3evVvVqlXL3aIBAECRwV3nAAAAChAvLy81bNhQsbGx9rbU1FTFxsaqWbNmGaavVauWduzYoW3bttn/denSRXfeeae2bdumkJCQvCwfAAAUchzRBAAAUMBERkZqwIABatSokZo0aaJJkyYpISHBfhe6/v37q2LFioqJiZGPj4/q1q3rMH/JkiUlKUM7AADAjSJoAgAAKGB69eqlkydPasyYMTp+/Ljq16+vlStX2i8QfujQIbm5ceA6AADIewRNAAAABVBERIQiIiKcPrdu3bos5501a5b1BQEAAIhrNAEAAAAAAMAiBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALEHQBAAAAAAAAEsQNAEAAAAAAMASBE0AAAAAAACwBEETAAAAAAAALJEvgqbJkycrNDRUPj4+atq0qTZv3pzptNOmTVPLli1VqlQplSpVSu3atctyegAAAAAAAOQNlwdN8+fPV2RkpKKiovTzzz8rLCxM4eHhOnHihNPp161bp969e2vt2rXauHGjQkJC1L59ex05ciSPKwcAAAAAAEB6Hq4uYOLEiRoyZIgGDRokSZoyZYqWL1+uGTNm6IUXXsgw/Zw5cxwef/TRR1q0aJFiY2PVv3//DNMnJiYqMTHR/jg+Pl6SlJSUpKSkJCs3RZJkMymWLxMFQ270p+yi3xVdrux3En2vKMuNvufq/gwAAIAb59Kg6fLly9qyZYtGjhxpb3Nzc1O7du20cePGbC3jwoULSkpKUunSpZ0+HxMTo+jo6Aztq1atkp+f3/UVnoUqli8RBcWKFXtctm76XdHlyn4n0feKstzoexcuXLB8mQAAAMhbLg2aTp06pZSUFAUHBzu0BwcHa9euXdlaxvPPP68KFSqoXbt2Tp8fOXKkIiMj7Y/j4+Ptp9sFBARcf/GZmLx2n+XLRMEw/M7qLls3/a7ocmW/k+h7RVlu9L20o44BAABQcLn81Lkb8e9//1vz5s3TunXr5OPj43Qab29veXt7Z2j39PSUp6en5TUZm7vly0TBkBv9Kbvod0WXK/udRN8rynKj77m6PwMAAODGufRi4GXLlpW7u7vi4uIc2uPi4lSuXLks533zzTf173//W6tWrdItt9ySm2UCAADkO9y1FwAA5EcuDZq8vLzUsGFDxcbG2ttSU1MVGxurZs2aZTrf66+/rpdfflkrV65Uo0aN8qJUAACAfIO79gIAgPzKpUGTJEVGRmratGmaPXu2du7cqaFDhyohIcF+F7r+/fs7XCz8tdde0+jRozVjxgyFhobq+PHjOn78uM6fP++qTQAAAMhT6e/aW6dOHU2ZMkV+fn6aMWOG0+nnzJmjYcOGqX79+qpVq5Y++ugj+849AAAAK7n8Gk29evXSyZMnNWbMGB0/flz169fXypUr7RcIP3TokNzc/peHffDBB7p8+bK6d+/usJyoqCiNHTs2L0sHAADIc3lx115JSkxMVGJiov1x2sXak5KSlJSUdJ3VO2czKZYuDwWH1X0pp+h7RRd9D66SG33P1f35ai4PmiQpIiJCERERTp9bt26dw+ODBw/mfkEAAAD5VF7ctVeSYmJiFB0dnaF91apV8vPzy1nR11DF0qWhIFmxYo9L10/fK7roe3CV3Oh7Fy5csHyZNyJfBE0AAADIG9m5a68kjRw5UpGRkfbH8fHx9ms7BQQEWFrT5LX7LF0eCo7hd1Z36frpe0UXfQ+ukht9L+2o4/yCoAkAAKAAseKuvWvWrLnmXXu9vb3l7e2dod3T01Oenp45LzwLxuZu6fJQcFjdl3KKvld00ffgKrnR91zdn6/m8ouBAwAAIPu4ay8AAMjPOKIJAACggImMjNSAAQPUqFEjNWnSRJMmTcpw196KFSsqJiZG0pW79o4ZM0Zz586137VXkvz9/eXv7++y7QAAAIUPQRMAAEABw117AQBAfkXQBAAAUABx114AAJAfcY0mAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWCJfBE2TJ09WaGiofHx81LRpU23evDnL6RcsWKBatWrJx8dH9erV04oVK/KoUgAAgPyB8RMAAMiPXB40zZ8/X5GRkYqKitLPP/+ssLAwhYeH68SJE06n37Bhg3r37q2HHnpIW7duVdeuXdW1a1f9+uuveVw5AACAazB+AgAA+ZXLg6aJEydqyJAhGjRokOrUqaMpU6bIz89PM2bMcDr922+/rbvvvlvPPvusateurZdfflkNGjTQe++9l8eVAwAAuAbjJwAAkF95uHLlly9f1pYtWzRy5Eh7m5ubm9q1a6eNGzc6nWfjxo2KjIx0aAsPD9eSJUucTp+YmKjExET743/++UeSdObMGSUlJd3gFjhZ3/l/LF8mCobTp0+7bN30u6LLlf1Oou8VZbnR986dOydJMsZYvuzCJC/GT1LejqH4LCm6+B6Dq9D34CpFYQzl0qDp1KlTSklJUXBwsEN7cHCwdu3a5XSe48ePO53++PHjTqePiYlRdHR0hvYqVapcZ9WAcyOvPQlgOfodXCU3+965c+dUokSJXFxDwZYX4yeJMRTyBt9jcBX6HlylKIyhXBo05YWRI0c67MFLTU3VmTNnVKZMGdlsNhdWVrjEx8crJCREhw8fVkBAgKvLQRFC34Or0PesZ4zRuXPnVKFCBVeXAjGGyit8lsAV6HdwFfpe7shvYyiXBk1ly5aVu7u74uLiHNrj4uJUrlw5p/OUK1cuR9N7e3vL29vboa1kyZLXXzSyFBAQwAcGXIK+B1eh71krP+yFy+/yYvwkMYbKa3yWwBXod3AV+p718tMYyqUXA/fy8lLDhg0VGxtrb0tNTVVsbKyaNWvmdJ5mzZo5TC9Jq1evznR6AACAwoTxEwAAyM9cfupcZGSkBgwYoEaNGqlJkyaaNGmSEhISNGjQIElS//79VbFiRcXExEiSRowYodatW2vChAnq1KmT5s2bp59++klTp0515WYAAADkGcZPAAAgv3J50NSrVy+dPHlSY8aM0fHjx1W/fn2tXLnSfsHKQ4cOyc3tfwde3X777Zo7d65eeuklvfjii6pRo4aWLFmiunXrumoToCuH10dFRWU4xB7IbfQ9uAp9D67E+Knw4LMErkC/g6vQ94oGm8kv978DAAAAAABAgebSazQBAAAAAACg8CBoAgAAAAAAgCUImgAAAAAAAGAJgqYCJDQ0VJMmTbru+WfNmqWSJUtaVk9hcqOvbV6z2WxasmSJq8solPLqtV23bp1sNpvOnj1rb1uyZImqV68ud3d3Pfnkk3nynh04cKDKli2rJ598UpJ0xx132H/G/4wdO1b169d3dRl2efWZdfDgQdlsNm3bts3etn79etWrV0+enp7q2rWr076cGwYOHKiuXbvm6jpQODF+yj0FbfwkMYbKTUVpDJX2nZQ2bmL85Bzjp232tiI3fjKwxIABA8y9996bq+s4ceKESUhIyNa0lStXNm+99ZZD24ULF0xcXNx1r3/mzJlGkpFkbDabKVeunOnZs6f5888/r3uZ+UVOXltjrvy+014LDw8PExoaap599llz8eLFXKzyfySZzz//PE/WlV767U7/b+/evXleS/qasvveO3bsmImIiDBVqlQxXl5eplKlSuaee+4xa9assU+TV69tYmKiOXbsmElNTbW3lSlTxjRs2NCEhoYab29vExQUZBo3bmzef//9HPXPzKxdu9ZIMn///be9bcCAAaZDhw4mPj7eGGPM6dOn7T9bJbu/o6v7V+nSpU14eLjZvn27pfVci7M+cO7cOXPq1Kk8Wf8///xjXnzxRVOzZk3j7e1tgoODTdu2bc2iRYvs/cXZZ3xuSE5ONseOHTNJSUn2tiZNmpgHH3zQHD582Pz9999O+/KN+OOPP4wks3XrVof2s2fPOvRdFA6Mnwq2nI6fjGEMxRjqxl39vXPs2DHj6+trSpYsaby9vU1gYKC57bbbzGuvvWbJ+MmYjGOotNcubdzE+InxU3qMn4zxyO0gC9YJDAy8ofl9fX3l6+t7Q8sICAjQ7t27ZYzRH3/8oWHDhqlHjx7atGnTDS33WpKSkuTp6Zlry7+e1/buu+/WzJkzlZSUpC1btmjAgAGy2Wx67bXXcqHC/CNtu9O73r55+fJleXl5WVHWNR08eFDNmzdXyZIl9cYbb6hevXpKSkrSV199peHDh2vXrl15UkcaLy8vlStXzv54x44dOn36tIoVK2avz9vbWzt27NDUqVNVsWJFdenSxemybvT9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ip5//vkMdYSHh6tUqVL68ccftWDBAq1Zs0YREREO03399dc6evSovv32W02cOFFRUVG65557VKpUKW3atEmPPfaYHn30Uf3111+Z/s6zkp1+nra9Xl5eWr9+vaZMmaKzZ8+qTZs2uvXWW/XTTz9p5cqViouLU8+ePSVJx44dU+/evTV48GDt3LlT69atU7du3WSM0TPPPKOePXvq7rvvtvf122+/PUNtZ86c0cqVKzV8+HAVK1Ysw/NZ7eEoXry4Zs2apd9//11vv/22pk2bprfeesv+fN++fVWpUiX9+OOP2rJli1544QX73rHhw4crMTFR3377rXbs2KHXXnvN6V6dmjVrymazSbrSV51th81ms79npSt7J0aNGqWnnnpKgwcPVmpqqkqUKKHXX39d69at0+jRo7Vt2zaFh4dLkkJCQtSvXz9J0rvvvqtvvvlGDRo00Oeff56hntWrV+unn37S0qVL1aFDB509e1aenp7asmWLevTooQkTJighIUFvvvmmHnnkEXl4eGjXrl2qVq2avv32Wx06dEjPPPOMJGX7d+TM+fPn9emnn6p69eoqU6aMpOz197ffflsTJkzQm2++qV9++UXh4eHq0qWL9u7dKynrz4off/xRkjRz5kwdO3bM/tiZtWvXav/+/Vq7dq1mz56tWbNmadasWfbn+/fvr6NHj2rdunVatGiRpk6dqhMnTmS6vNTUVM2bN099+/ZVhQoVMjzv7+8vDw/nByK7ubnpnXfe0W+//abZs2fr66+/1nPPPWd/Pqu+OHr0aP3+++/68ssvtXPnTn3wwQcqW7ZshnWEhITo2LFjCggI0KRJk3Ts2LEMn4uStG3bNrVt21Z16tTRxo0b9f3336tz585KSUmRdOV3GBkZqZ9++kmxsbFyc3PTfffdp9TUVEmyf0auWbNGx44d0+LFi51u83PPPadFixZp9uzZ+vnnn1W9enWFh4frzJkzDtONGjVKEyZM0E8//SQPDw8NHjzY6fKQ/zB+Kpzjp3PnzunYsWNatmyZli1bpjVr1ig2Ntbh6BzGUIyhsjOGOnPmjH766Sc9/fTTkpyPodLGV8uXL5cknT59WuPGjdOyZct07733KjU1VZUqVdLQoUM1ffp0TZgwQUlJSfrpp580cOBASdKCBQvs616xYoX69OmT6ff5wIED9dNPP6lly5a6+eabFRYWpqCgIHXr1k133323jh8/rgsXLmjlypVyc3NT/fr1FRgYqFatWjF++n+MnwrJ+ClHsRQyldVeirRzRdMn6pMnTzb+/v4mJSXFxMfHG09PT7NgwQL782fPnjV+fn6Z7pGbMGGCuemmmxzS3/Scpb5X71Fr1qyZ6du3b7a3Me0aA2mpu/4/LX3iiSfs07Rt29aebKf55JNPTPny5Y0xV5JYDw8Pc+zYMfvzme2RmzRpksNyqlWrlmFv1ssvv2yaNWtmjDHm8ccfN23atHF6nmtOXq9Vq1YZd3d3c+jQIfvzv/32m5FkT3vDwsLsr4W3t7f9ugs1atTI9PUzxphOnTqZp59+2v64devWpkWLFg7TNG7c2Dz//PPGGGO++uor4+Hh4ZDOf/nllw6v19SpU02pUqUc9jItX77cuLm52fciDhgwwFSuXNmkpKTYp6lZs6Zp2bKl/XFycrIpVqyY+eyzzzKtf8CAAcbd3d0UK1bM/q979+7GmGv387TtTb/H0pgrv8P27ds7tB0+fNhIMrt37zZbtmwxkszBgwczrela569v2rTJSDKLFy/Ocjpjrn19gTfeeMM0bNjQ/rh48eJm1qxZTqetV6+eGTt2rNPn0u/F+OGHH5zurfL397f3s+eee87+npVknnzyyWtuS48ePYwk+56ZMmXKOOw5SUpKMpUqVXI4oqlJkyZGklm/fr35888/jbu7u9mxY4fx9fU1//nPf4wxxtSpU8dIMvv27bN/LowdO9YEBwcbY6783tN+NiZn1xhI378kmfLly5stW7bYp8lOf69QoYIZP368w7IbN25shg0bZozJ+rPCGOd9wNkeucqVK5vk5GR7W48ePUyvXr2MMVeOPJBk3zNrjDF79+41kjLdIxcXF2ckmYkTJ2byCv3PtfbsLViwwJQpU8b+OKu+2LlzZzNo0CCnzzk7379EiRL2oySMyXjdit69e5vmzZtfcxvSnDx50kgyO3bsyHSdxjj2o/PnzxtPT08zZ84c+/OXL182FSpUMK+//rpDXemvH7J8+XIjKc+uBYNrY/x0RVEZP0VFRRl3d3f7Z33aGEqSWbhwYaavoTGMoRhD/U/a53vae+CTTz5xGEOVKVPG3reee+45Y8yV9212x0/Dhw83bdq0sY+hypcvbx599FH7d13a+OnqI5rSrpW0aNEi4+7ubo4cOWJOnTplH0O1bdvWdOrUyUgyr732mn0slTZuYvzE+KkwjZ84oikP7Ny5U82aNbMn6pLUvHlznT9/Xn/99ZcOHDigpKQkh71hJUqUUM2aNTNdZo8ePXTx4kVVrVpVQ4YM0eeff67k5OQc1ZWWmuZE8eLFtW3bNv3000+aMGGCGjRoYN/bJknbt2/XuHHj7Ofj+vv7a8iQITp27JguXLig3bt3KyQkxOF81Mz2AjZq1Mj+c0JCgvbv36+HHnrIYdmvvPKK9u/fL+nKHoRt27apZs2aeuKJJ7Rq1Sr7/Dl5vXbu3KmQkBCFhITY2+rUqaOSJUtq586d9rZixYpp27Zt2rRpkwYMGKAmTZo4LDMlJUUvv/yy6tWrp9KlS8vf319fffVVhnOlb7nlFofH5cuXt6f2abWkT+ebNWuWod6wsDCHvUzNmzdXamqqdu/ebW+7+eab5eb2v7d8cHCww15Jd3d3lSlTJss9BpJ05513atu2bfZ/77zzjr2OrPp5moYNGzosb/v27Vq7dq3D77VWrVqSrpzLHBYWprZt26pevXrq0aOHpk2bpr///jvLGq9mjMnR9OnNnz9fzZs3V7ly5eTv76+XXnrJ4XcYGRmphx9+WO3atdO///1ve3+UpCeeeEKvvPKKmjdvrqioKP3yyy85Wvfo0aPl7++vm2++WYmJiQ7v2fTvjzTPP/+8SpYsKXd3d9lsNi1YsECSdOjQIf3zzz86ffq0w/QeHh4ZlnPhwgXZbDY1bdpUO3bsUEpKim677TYlJibqwQcflL+/v3bv3i13d3dVq1ZNkuTn56dbbrnF3nfS9+GcSt+/Nm/erPDwcHXo0EF//vmnpGv39/j4eB09elTNmzd3WG7z5s3t79+sPity4uabb7YfjSA5bvfu3bvl4eGhBg0a2J+vXr26SpUqlenybqSfrlmzRm3btlXFihVVvHhx9evXT6dPn9aFCxckZd0Xhw4dqnnz5ql+/fp67rnntGHDhuuuQ7r2d8vevXvVu3dvVa1aVQEBAfa9oTm5jsT+/fuVlJTk8Hv29PRUkyZNHD6nJcfP2PLly0vSdfdP5C3GT4Vz/OTv72//rN+0aZMaN24sf39/3X///fZpGEMxhrqRMdTmzZsVHR0td3d3JSYmSpL97l/Oxk+TJ09W7dq15e3tLTc3N02ePFnr1q2TJP322286duyYateubZ/e2fhJunKElYeHhzw8PJSSkqKbbrpJlStXto+hvvnmG504cUJ+fn4KCgqSn5+fqlWrZu+3jJ8YPxWm8RNBUwEVEhKi3bt36/3335evr6+GDRumVq1aKSkpKdvLuJ4LW7q5ual69eqqXbu2IiMjddttt2no0KH258+fP6/o6GiHL9EdO3Zo79698vHxydG60n8Qnj9/XpI0bdo0h2X/+uuv+uGHHyRJDRo00B9//KGXX35ZFy9eVM+ePdW9e3dJ1rxeV3N3d1f16tUVFhamGTNm2P+YT/PGG2/o7bff1vPPP6+1a9faT2O6fPmyw3KuvgihzWazHwJpJWfruZ51FytWTNWrV7f/S/vgya6rD7s+f/68Onfu7PB73bZtm/bu3atWrVrJ3d1dq1ev1pdffqk6dero3XffVc2aNfXHH39ke501atSQzWbL8cUqN27cqL59+6pjx45atmyZtm7dqlGjRjn8DseOHavffvtNnTp10tdff606derYT0d7+OGHdeDAAfXr1087duxQo0aN9O6772ZYT/Xq1R0Gl2mCgoLk7u5uf6+mf89e/TrOmjVLr7/+umrUqKGpU6dq5cqV6tixoyRl6HPZdf78ebm7u2vLli2qWbOmHnvsMW3btk3jx4+Xn5+ffTpPT0/ZbDb7F336n3Mqff9q3LixPvroIyUkJGjatGnXtTxnsvqsyAmr37uBgYEqWbJkjvvpwYMHdc899+iWW27RokWLtGXLFk2ePFnS/373WfXFtIHoU089paNHj6pt27b2Q/evx7W+Wzp37qwzZ85o2rRp2rRpk/1iyNfbT68l/e8p7X2WG5+xKBgYP7l+/OTm5mb/rA8LC9MDDzygxMRETZ8+3T4NY6jM50+vqI+hqlatKpvNZj+1K317cHCwQ1va+/bq13DevHl65plndPjwYbVp00Zz5sxRz5497X/EX893U0JCgn38lBbMPPbYY9q5c6f69u1r7ztp/6eNmxg/XR/GT/lz/ETQlAdq166tjRs3OnxwrF+/XsWLF1elSpVUtWpVeXp6OpzL+s8//2jPnj1ZLtfX11edO3fWO++8o3Xr1mnjxo3asWOHpCt3Y0g7nzMzt9xyi2JjY29gy65cB2D+/Pn26yE0aNBAu3fvdvgSTfvn5uammjVr6vDhw4qLi7MvI6tzeNMEBwerQoUKOnDgQIblVqlSxT5dQECAevXqpWnTpmn+/PlatGiR/XzTrF6v9GrXrq3Dhw/r8OHD9rbff/9dZ8+eVZ06dZzW5+bmpnbt2umff/7RxYsXJV35Hd9777168MEHFRYWpqpVq17zd5pZLemvE5E2MEw/zfbt25WQkGBvW79+vf31zivX6ueZadCggX777TeFhoZm+N2mDQZsNpuaN2+u6Ohobd26VV5eXvaBSHb6eunSpRUeHq7Jkyc7vE5pzp4963S+DRs2qHLlyho1apQaNWqkGjVq2PcMpXfTTTfpqaee0qpVq9StWzeHO8qEhIToscce0+LFi/X00087/cIvU6aM7rzzTkmy9x9nsnrPfvnll5KuXGPkoYceUnh4uEOtJUqUsJ+nn/Z6JScna8uWLQ7L8fPzkzFGmzZt0q233qqUlBTt3btXBw8eVMuWLVW9enUFBwc77Nm9luz8jjJjs9nk5uZmf12u1d8DAgJUoUIFrV+/3mE569evd3j/ZvVZ4enped31pqlZs6aSk5O1detWe9u+ffuy3JPs5uamBx54QHPmzNHRo0czPH/+/HmnRxJs2bJFqampmjBhgm677TbddNNNTufPqi8GBgZqwIAB+vTTTzVp0iRNnTo1p5tsl1U/PX36tHbv3q2XXnpJbdu2Ve3atTO8JmnXacnqd1CtWjX7dUrSJCUl6ccff8z0cxoFD+Onwj9+kq589pUoUUIvvfQSYyjGUDkaQ5UuXVp33XWXPvrooyy3Qcp49Fua9evXq169ekpISNDUqVPVu3dvnT592v59W7x4cZUvX97e/1JSUpyOn9LqSU5Ols1mU0pKik6cOKFSpUo5jKFycgcwxk9XMH4qmOMngiYL/fPPPxn2KBw+fFjDhg3T4cOH9fjjj2vXrl364osvFBUVpcjISLm5ual48eIaMGCAnn32Wa1du1a//fabHnroIbm5uTk9ykG6cvTC9OnT9euvv+rAgQP69NNP5evrq8qVK0uSQkND9e233+rIkSM6deqU02VERUXps88+U1RUlHbu3Gm/wFlOhISE6L777tOYMWMkSWPGjNHHH3+s6Oho/fbbb9q5c6fmzZunl156SZJ01113qVq1ahowYIB++eUXrV+/3v5cZtuaJjo6WjExMXrnnXe0Z88e7dixQzNnztTEiROl/2Pv/uNrrv//j9/PZjv7wfyabcwyvwphqzFvP0K1KCXqHSKGSoUVrZT1w0xYpTfeSQ3vpHelfOiXdyRavN+JN0X66ffPwsYSY9hme37/8N15O87Gxms7tt2ul8sudp7n9ePxOnuec57u53WeL0lTp07V+++/ry1btmjbtm1auHChQkJCVKNGjYs+XueKiYlRq1atdN9992njxo1av369YmNj1aVLl0JPky0QEREhSY4kvGnTplqxYoXWrFmjzZs36+GHH3YaIBZHTEyMrr76ag0ePFg//PCDvv76a5fJP++77z75+Pho8ODB+vnnn7Vy5Uo9+uijGjRokMunOaXpYv28KCNHjtSRI0fUv39/ffvtt9q5c6e++OILDR06VHl5eVq3bp0mT56s7777Tvv27dNHH32kw4cPO05hDg8P148//qitW7cqIyOjyE9ZZ86cqby8PEVHR+vDDz/U9u3btXnzZr366qsup9IXaNq0qfbt26cPPvhAO3fu1Kuvvuo0efapU6cUFxenVatWae/evfrmm2/07bffOmobPXq0vvjiC+3evVsbN27UypUrnU69Ptcrr7wiSXrkkUe0YMECbd68WQcPHlROTo62bNkiT09Px3NWkn777Ten52xB/4uPj1dqaqr69evncgrsQw89JOnsc2nNmjUaNmyYywDR19fX8RWJQ4cOqUePHurbt6+qV6+u1q1ba/369frss89K9Gl2cf9GkpSdna20tDSlpaVp8+bNevTRRx2f2ErF6+9jxozRSy+9pAULFmjr1q0aO3asNm3apFGjRkm68GtFQb2pqalKS0sr8VcMCjRr1kwxMTF66KGHtH79en3//fd66KGH5Ovre8HXukmTJiksLEzt2rXTP//5T/3666/avn275s6dq+uuu85xdsK5mjRpotzcXM2YMUO7du3SO++8o5SUFKdlLtQXx40bp08//VQ7duzQL7/8os8++6zIflocCQkJ+vbbbzVixAj9+OOP2rJli9544w1lZGSoZs2aql27tmbPnq0dO3boq6++Unx8vNP6QUFB8vX1dUxqe+6ZogX8/f01fPhwjRkzRsuWLdOvv/6qYcOG6eTJk3rggQcuuXa4B+Onyj1+ks5+yOHp6ckYijFUicdQr7/+uiNE+Oqrr7R582Zt3bpVa9asUX5+vuMrWomJiZKk999/3+l527RpU23ZskVVqlRRUlKS4uLitHbtWqf+NmrUKM2fP1+SNHv2bN1///2FBmw1atRQr1699MILL+iWW27Rvffeq5iYGAUFBalevXpKTk7WDz/8UOTf83yMnxg/levxU7Fnc8IFFUz+dv7PAw88YIy5tMvzRkdHm7FjxzqWOXfyso8//ti0a9fOBAQEGH9/f/OXv/zFacKutWvXmtatWzsmwjOm8MvrfvjhhyYyMtJ4e3ubwMBAc/fddxd5jIWtX7AvSWbdunXGGGOWLVtmOnToYHx9fU1AQICJjo42s2fPdixfcHleb29v06xZM/Ovf/3LSDLLli0zxhQ9kZkxxrz33nuOemvWrGk6d+7smJxw9uzZJjIy0vj7+5uAgABz8803m40bNxbr8Srp5XkjIiJMQECAU23Tpk0zNWrUMHXq1DEnTpwwf/zxh+nVq5epWrWqCQoKMs8995yJjY11mtTv/EswG2NMr169zODBgx23t27dajp16mS8vb3N1VdfbZYtW+Yy2V5xL817rsL2fbEJ8qy4NO/5+zTm7OWH77rrLlOjRg3j6+trmjVrZkaPHm3y8/PNr7/+arp37+64BOfVV19tZsyY4Vj30KFD5pZbbnFMnF3UpV+NOXu51JEjR5oGDRoYb29vExoaau68806ndc5/bMeMGWNq165tqlatavr162emTZvmeB5kZ2ebe++913HZ53r16pm4uDjHRHlxcXGmcePGxm63mzp16phBgwaZjIwMY4zrBIB//vmnkWTuuusu07BhQ+Pl5WV8fHyMp6enmTJlisnKyjLGnH3OSjJVqlRxes6ePn3adO7c2dhsNiPJBAcHm7/+9a9Oz6Xc3Fzzl7/8xbFMixYtTGxsrNNk4F26dDEPP/yw49K8Pj4+pnHjxqZ+/frGy8vL1K1b11x//fWmatWqxpj/vS58/PHHjteac38vyd/o/NfRatWqmbZt27pMEFucy/OOHz/ehIaGGi8vL5fL817otcKYs5ctb9KkialSpcpFL897roLJQAscOHDA3HbbbcZut5sGDRqY+fPnm6CgIJOSklLo8Rc4evSoGTt2rGnatKnx9vY2wcHBJiYmxnz88ceOCTjPf65OnTrV1K1b1/j6+pru3bubf/7zn07960J98YUXXjDNmzc3vr6+platWqZXr15m165dxphLm8zSmLOvBR06dDB2u93UqFHDdO/e3XH/ihUrTPPmzY3dbjetW7c2q1atcnnezZkzx4SFhRkPD48iL8976tQp8+ijj5rAwMALXp733Lq+//57I8ns3r37gn8DlB3GT5Vr/JSYmGhq1qzp9FyeNm2aadCggUlOTmYMxRjqksZQBRNI161b13h5eZmqVauaRo0aGR8fH8f4qaC+8PBwp+ft6dOnzZAhQ4yfn5/x8PAwHh4epl69eqZhw4aO51Nubq4ZNWqUsdvtjjFU48aNXSYDHzVqlDly5IgZNGiQCQgIMFWqVDG+vr6O8dNdd91lJkyY4HgfLXgsCsZNjJ/OYvxUMcZPNmMuY/YslJqsrCyFhobqb3/7W4X/dPabb75Rp06dtGPHDsfkwgBQ0fz+++8KCwtzTDwJwHqMnwCgYmH8VD5VcXcBOOv777/Xli1bFB0drWPHjmnChAmSpF69erm5Mut9/PHHqlq1qpo2baodO3Zo1KhR6tixI4MkABXKV199pRMnTqhVq1Y6ePCgnnrqKYWHh6tz587uLg2oMBg/MX4CULEwfqoYCJquIK+88oq2bt0qb29vRUVF6euvv1ZgYKC7y7Lc8ePH9fTTT2vfvn0KDAxUTEyM/va3v7m7LACwVG5urp555hnt2rVL1apVU4cOHfTee++5XG0FwOVh/AQAFQfjp4qBr84BAAAAAADAElx1DgAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJoAAAAAAABgCYImAAAAAAAAWIKgCQAAAAAAAJYgaAIAAAAAAIAlCJqAMmSz2TR+/HjH7Xnz5slms2nPnj0XXXfZsmWKjIyUj4+PbDabjh49Wmp1llR4eLiGDBnitv0PGTJE4eHhTm0nTpzQgw8+qJCQENlsNo0ePVp79uyRzWbTvHnzyrzGrl27qmvXrmW+X3e6nH5x/nMFAIDS9O2336pDhw7y9/eXzWbTpk2b3F2Sg7vHEOPHj5fNZnNqO3PmjJ566imFhYXJw8NDvXv3luS+9+/CxoIV3eX0C3eP3VHxETShwigIbQp+qlSpotDQUA0ZMkT79+93d3mX5Y8//lDfvn3l6+urmTNn6p133pG/v3+p73fnzp16+OGH1ahRI/n4+CggIEAdO3bU3//+d506darU9385Jk+erHnz5mn48OF65513NGjQoFLf56+//qrx48cXKzgsK6tWrXI8J959991Cl+nYsaNsNptatmxZxtUBAErD+WOic3/Gjh3rWG758uV64IEH1LJlS3l6ela6/6gXyM3NVZ8+fXTkyBFNmzZN77zzjho0aFDq+01PT9eTTz6pZs2ayc/PT/7+/oqKitLEiROvqA8UCzN37lxNmTJF99xzj95++209/vjjpb7PAwcOaPz48VdUCFjwIabNZtPEiRMLXea+++6TzWZT1apVy7g6wH2quLsAwGoTJkxQw4YNdfr0af33v//VvHnztHr1av3888/y8fFxd3mX5Ntvv9Xx48f1wgsvKCYmpkz2uWTJEvXp00d2u12xsbFq2bKlcnJytHr1ao0ZM0a//PKLZs+eXSa1XMycOXOUn5/v1PbVV1/pL3/5ixITEx1txhidOnVKXl5epVLHr7/+qqSkJHXt2tVlsL58+fJS2Wdx+fj4aP78+Ro4cKBT+549e7RmzZpy+9wAABStYEx0rnM/VJg/f74WLFig66+/XvXq1Svr8q4YO3fu1N69ezVnzhw9+OCDZbLPb7/9Vj169NCJEyc0cOBARUVFSZK+++47vfjii/rPf/7j9rFDgeeee84poJTOjrNCQ0M1bdo0p/ZTp06pSpXS+S/mgQMHlJSUpPDwcEVGRjrdV9hYsCz5+Pjo/fff13PPPefUnpWVpU8//ZRxFiodgiZUOLfddpvatGkjSXrwwQcVGBiol156SYsXL1bfvn3dXN2lOXTokCSpRo0alm0zKyuryLOidu/erXvvvVcNGjTQV199pbp16zruGzlypHbs2KElS5ZYVsvlKiw4OnTokFq0aOHUZrPZ3PZG7+3t7Zb9FujRo4cWL16sjIwMBQYGOtrnz5+v4OBgNW3aVH/++acbKwQAWO3cMVFhJk+erDlz5sjLy0t33HGHfv755zKszhoXGs8UV1mPs44ePaq77rpLnp6e+v7779WsWTOn+ydNmqQ5c+ZYVsvlqlKlikt4dOjQoUIfL3eNs0rrQ8Ti6tGjhz766CP98MMPioiIcLR/+umnysnJ0a233qqvvvrKjRUCZYuvzqHCu+GGGySd/bTqXFu2bNE999yjWrVqycfHR23atNHixYtd1j969Kgef/xxhYeHy263q379+oqNjVVGRoYkKScnR+PGjVNUVJSqV68uf39/3XDDDVq5cqUl9Xft2lWDBw+WJLVt21Y2m83pO9ULFy5UVFSUfH19FRgYqIEDB7p8VXDIkCGqWrWqdu7cqR49eqhatWq67777itznyy+/rBMnTujNN990CpkKNGnSRKNGjSpy/SNHjujJJ59Uq1atVLVqVQUEBOi2227TDz/84LLsjBkzdO2118rPz081a9ZUmzZtNH/+fMf9x48f1+jRox2Pf1BQkG655RZt3LjR6fgKziAq+KrY7t27tWTJEsfpzHv27ClyjqYtW7aob9++qlOnjnx9fXXNNdfo2Wefddy/d+9ejRgxQtdcc418fX1Vu3Zt9enTx+krcvPmzVOfPn0kSTfeeKNjv6tWrZJU+PfoDx06pAceeEDBwcHy8fFRRESE3n77badlCmp+5ZVXNHv2bDVu3Fh2u11t27bVt99+W+Tf4Hy9evWS3W7XwoULndrnz5+vvn37ytPT02WdM2fO6IUXXnDsMzw8XM8884yys7OdljPGaOLEiapfv778/Px044036pdffim0jqNHj2r06NEKCwuT3W5XkyZN9NJLL130U8ji9AMAQMnUq1fvsv6DXtzX5nXr1qlHjx6qWbOm/P391bp1a/397393Wuarr77SDTfcIH9/f9WoUUO9evXS5s2bnZYpmCvo119/1YABA1SzZk116tTJcf+7777rGBPVqlVL9957r3777bcLHsOQIUPUpUsXSVKfPn1ks9mc3q+tqOt8s2bN0v79+zV16lSXkEmSgoODXc6MOVdJxp4ffPCBoqKiVK1aNQUEBKhVq1ZOj31ubq6SkpLUtGlT+fj4qHbt2urUqZNWrFjhcnzS/8YlK1eu1C+//OIy3ilsjqb9+/frgQceUL169WS329WwYUMNHz5cOTk5koo3bly1apXatm0rSRo6dKhjvwVjusLmaMrKytITTzzhGHNcc801euWVV2SMcVrOZrMpLi5On3zyiVq2bCm73a5rr71Wy5YtK/JvcL727durYcOGTmNYSXrvvfd06623qlatWoWu9/rrr+vaa6+V3W5XvXr1NHLkyEK/NlkwBvT19VV0dLS+/vrrQreXnZ2txMRENWnSRHa7XWFhYXrqqadcxm7nK04/AEqCM5pQ4RWEATVr1nS0/fLLL+rYsaNCQ0M1duxY+fv76//+7//Uu3dvffjhh7rrrrsknZ1Q+oYbbtDmzZt1//336/rrr1dGRoYWL16s33//XYGBgcrMzNQ//vEP9e/fX8OGDdPx48f15ptvqnv37lq/fr3Lqb0l9eyzz+qaa67R7NmzHafAN27cWNLZcGPo0KFq27atkpOTlZ6err///e/65ptv9P333zt90nTmzBl1795dnTp10iuvvCI/P78i9/mvf/1LjRo1UocOHS6p5l27dumTTz5Rnz591LBhQ6Wnp2vWrFnq0qWLfv31V8fp+XPmzNFjjz2me+65R6NGjdLp06f1448/at26dRowYIAk6ZFHHtGiRYsUFxenFi1a6I8//tDq1au1efNmXX/99S77bt68ud555x09/vjjql+/vp544glJUp06dXT48GGX5X/88UfdcMMN8vLy0kMPPaTw8HDt3LlT//rXvzRp0iRJZ09vX7Nmje69917Vr19fe/bs0RtvvKGuXbvq119/lZ+fnzp37qzHHntMr776qp555hk1b97cUU9hTp06pa5du2rHjh2Ki4tTw4YNtXDhQg0ZMkRHjx51CfLmz5+v48eP6+GHH5bNZtPLL7+su+++W7t27SrWfxL8/PzUq1cvvf/++xo+fLgk6YcfftAvv/yif/zjH/rxxx9d1nnwwQf19ttv65577tETTzyhdevWKTk5WZs3b9bHH3/sWG7cuHGaOHGievTooR49emjjxo3q1q2bYwBZ4OTJk+rSpYv279+vhx9+WFdddZXWrFmjhIQEHTx4UNOnTy+y/pL2AwCAdOzYMccHYwXOPav1chXntXnFihW64447VLduXY0aNUohISHavHmzPvvsM8d73ZdffqnbbrtNjRo10vjx43Xq1CnNmDFDHTt21MaNG10ChD59+qhp06aaPHmyIzSYNGmSnn/+efXt21cPPvigDh8+rBkzZqhz584uY6JzPfzwwwoNDdXkyZP12GOPqW3btgoODrasrsIsXrxYvr6+uueeey7hUVexx54rVqxQ//79dfPNN+ull16SJG3evFnffPON47EfP368kpOT9eCDDyo6OlqZmZn67rvvtHHjRt1yyy0u+65Tp47eeecdTZo0SSdOnFBycrKkosc7Bw4cUHR0tI4ePaqHHnpIzZo10/79+7Vo0SKdPHlS3t7exRo3Nm/eXBMmTNC4ceP00EMPOT5ILmqsaozRnXfeqZUrV+qBBx5QZGSkvvjiC40ZM0b79+93+crf6tWr9dFHH2nEiBGqVq2aXn31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fv75Z4WFhSk6Olrjx48v0Zv+hRRs52J/41OnTmncuHGO7/gXHM/Ro0cv+W+8d+9eNW3a1GlwIf3v1PPz/37nB2EFoVNJJvD28vJSnz59NH/+fP3nP//Rb7/95viKYmH1eXh4qEmTJk7tISEhqlGjhqO+gn+bNm3qtFydOnWcgjFJ2r59u5YtW+byvCu4kmLB864wpdkPAKCiio6OVkxMjNNPSeXl5SktLc3pp+Cr0Rd7bS6YH/NC77MXGs80b95cGRkZysrKcmo//0p627dvlzFGTZs2dXmP2bx58wXfX0qzrqIEBARc1jhLKt7Yc8SIEbr66qt12223qX79+rr//vtdvsI1YcIEHT16VFdffbVatWqlMWPGFPp1+ktx+PBhZWZmXnScVdxxY0ns3btX9erVcwn0ijvOks6OtUp6oZQBAwZo4cKF2rFjh9asWXPBcZbk2r+8vb3VqFGji46zvLy81KhRI6e27du365dffnF5Dlx99dWSLjzOKs1+gMqJOZpQ4URHRzs+Nendu7c6deqkAQMGaOvWrapatapj0uEnn3xS3bt3L3Qb5//n+kLeffddDRkyRL1799aYMWMUFBQkT09PJScnu0xA7k7nflp0IQEBAapXr95lXXlm8uTJev7553X//ffrhRdeUK1ateTh4aHRo0c7TfrcvHlzbd26VZ999pmWLVumDz/8UK+//rrGjRunpKQkSVLfvn11ww036OOPP9by5cs1ZcoUvfTSS/roo4902223XXKNJfHoo4/qrbfe0ujRo9W+fXtVr15dNptN9957b5ldSrewybolXXAOiMIMGDBAKSkpGj9+vCIiIlyuzHe+c89Sulz5+fm65ZZb9NRTTxV6f8FAqDBXQj8AgMrot99+cwlQVq5cqa5du7rttfncM42ls+8vNptNn3/+eaHvl1WrVi21Wi5UV1GaNWumTZs2KScn55KuSlvcsWdQUJA2bdqkL774Qp9//rk+//xzvfXWW4qNjXVcfKRz587auXOnPv30Uy1fvlz/+Mc/NG3aNKWkpOjBBx8scW2XorjjxtJk1Tirf//+SkhI0LBhw1S7dm1169bNivKKJT8/X61atdLUqVMLvf/c+ZzOdyX0A1QsBE2o0AredG+88Ua99tprGjt2rCP99/Lyuugne40bN75o4LJo0SI1atRIH330kdN/ygvOjiotDRo0kCRt3brVcUpsga1btzruvxR33HGHZs+erbVr16p9+/YlXn/RokW68cYb9eabbzq1Hz161GUSUn9/f/Xr10/9+vVTTk6O7r77bk2aNEkJCQmOrwTWrVtXI0aM0IgRI3To0CFdf/31mjRp0mUPYgv6QnH+xoMHD9bf/vY3R9vp06ddrgpSklCmQYMG+vHHH5Wfn+8UAG7ZssVxf2no1KmTrrrqKq1atcoxMWhR9eXn52v79u1OE3ymp6fr6NGjjvoK/t2+fbvTJ2uHDx92+RSwcePGOnHixCV9oi6VXj8AABQtJCTE5atX516+/UKvzQVfRfr555+LfO0/dzxzvi1btigwMFD+/v4XrLFx48Yyxqhhw4YX/NCiJKyoqyg9e/bU2rVr9eGHHxb5FfYLKcnY09vbWz179lTPnj2Vn5+vESNGaNasWXr++ecdH6zWqlVLQ4cO1dChQ3XixAl17txZ48ePv+yAoU6dOgoICCjWOKs448aSjrO+/PJLHT9+3OmsptIeZ1111VXq2LGjVq1apeHDh6tKlcL/u31u/zp3/JSTk6Pdu3c7ni/njrPOHe/n5uZq9+7dTs/Fxo0b64cfftDNN998SR8UllY/QOXEV+dQ4XXt2lXR0dGaPn26Tp8+raCgIHXt2lWzZs3SwYMHXZY/98pkf/3rX/XDDz84XWGrQMEnHAWfgJz7ice6deu0du1aqw/FSZs2bRQUFKSUlBSnS5Z+/vnn2rx5s26//fZL3vZTTz0lf39/Pfjgg0pPT3e5f+fOnS6XJT6Xp6enyydACxcudMx9VeCPP/5wuu3t7a0WLVrIGKPc3Fzl5eW5nDIdFBSkevXqXfQyrcVRp04dde7cWXPnztW+ffuc7ju3/sKOZ8aMGcrLy3NqKxhwFnZZ2vP16NFDaWlpWrBggaPtzJkzmjFjhqpWreq41LLVbDabXn31VSUmJmrQoEEXrE+Sy5XgCj4lK+hfMTEx8vLy0owZM5weo8KuINe3b1+tXbtWX3zxhct9R48e1ZkzZwqtpbT7AQCgaD4+Pi5fv6tZs2axXpuvv/56NWzYUNOnT3d5byx4z6hbt64iIyP19ttvOy3z888/a/ny5Y73owu5++675enpqaSkJJf3a2OMy3ijOKyoqyiPPPKI6tatqyeeeELbtm1zuf/QoUOaOHFikesXd+x5/nF7eHiodevWkuT4G52/TNWqVdWkSRNL3l89PDzUu3dv/etf/9J3333ncv+5Y+nijBtLOs7Ky8vTa6+95tQ+bdo02Wy2Uv2QauLEiUpMTNSjjz5a5DIxMTHy9vbWq6++6nTsb775po4dO+YYZ7Vp00Z16tRRSkqK09V8582b5/I49O3bV/v379ecOXNc9nfq1CmXr3qeqzT7ASonzmhCpTBmzBj16dNH8+bN0yOPPKKZM2eqU6dOatWqlYYNG6ZGjRopPT1da9eu1e+//64ffvjBsd6iRYvUp08f3X///YqKitKRI0e0ePFipaSkKCIiQnfccYc++ugj3XXXXbr99tu1e/dupaSkqEWLFjpx4kSpHZOXl5deeuklDR06VF26dFH//v2Vnp6uv//97woPD9fjjz9+ydtu3Lix5s+fr379+ql58+aKjY1Vy5YtlZOTozVr1mjhwoUaMmRIkevfcccdmjBhgoYOHaoOHTrop59+0nvvvefyXfJu3bopJCREHTt2VHBwsDZv3qzXXntNt99+u6pVq6ajR4+qfv36uueeexQREaGqVavqyy+/1Lfffut0dtHlePXVV9WpUyddf/31euihh9SwYUPt2bNHS5Ys0aZNmxzH884776h69epq0aKF1q5dqy+//NLlcreRkZHy9PTUSy+9pGPHjslut+umm25SUFCQy34feughzZo1S0OGDNGGDRsUHh6uRYsW6ZtvvtH06dMva5LQi+nVq5d69ep1wWUiIiI0ePBgzZ49W0ePHlWXLl20fv16vf322+rdu7duvPFGSWfDuieffFLJycm644471KNHD33//ff6/PPPXc5eGzNmjBYvXqw77rhDQ4YMUVRUlLKysvTTTz9p0aJF2rNnT6GX3T5+/Hip9wMAqIx+/PFHLV68WNLZOSyPHTvmCDgiIiLUs2fPItctzmuzh4eH3njjDfXs2VORkZEaOnSo6tatqy1btuiXX35xfPAwZcoU3XbbbWrfvr0eeOABnTp1SjNmzFD16tU1fvz4ix5H48aNNXHiRCUkJGjPnj3q3bu3qlWrpt27d+vjjz/WQw89pCeffLLEj8/l1lWUmjVr6uOPP1aPHj0UGRmpgQMHKioqSpK0ceNGvf/++xc8o7y4Y88HH3xQR44c0U033aT69etr7969mjFjhiIjIx1nK7do0UJdu3ZVVFSUatWqpe+++06LFi1SXFzcJR/fuSZPnqzly5erS5cueuihh9S8eXMdPHhQCxcu1OrVq1WjRo1ijxsbN26sGjVqKCUlRdWqVZO/v7/atWtX6NxYPXv21I033qhnn31We/bsUUREhJYvX65PP/1Uo0ePdpr422pdunS56AeGderUUUJCgpKSknTrrbfqzjvv1NatW/X666+rbdu2GjhwoKSz4/2JEyfq4Ycf1k033aR+/fpp9+7deuutt1wen0GDBun//u//9Mgjj2jlypXq2LGj8vLytGXLFv3f//2fvvjii0InZZdKvx+gEirTa9wBpajgUr6FXT41Ly/PNG7c2DRu3NhxidedO3ea2NhYExISYry8vExoaKi54447zKJFi5zW/eOPP0xcXJwJDQ013t7epn79+mbw4MEmIyPDGHP20qyTJ082DRo0MHa73Vx33XXms88+c7nMqjGul3wtqHn37t2XfGwLFiww1113nbHb7aZWrVrmvvvuM7///rvTMudfUrW4tm3bZoYNG2bCw8ONt7e3qVatmunYsaOZMWOGOX36tGO58y+Revr0afPEE0+YunXrGl9fX9OxY0ezdu1al8vzzpo1y3Tu3NnUrl3b2O1207hxYzNmzBhz7NgxY4wx2dnZZsyYMSYiIsJUq1bN+Pv7m4iICPP666+7HN/5j3WDBg1cLtNacAna8y+L+/PPP5u77rrL1KhRw/j4+JhrrrnGPP/88477//zzTzN06FATGBhoqlatarp37262bNnictzGGDNnzhzTqFEj4+npaSSZlStXGmNcL01sjDHp6emO7Xp7e5tWrVq51HbuZXPPd35/KkxRl2w+X2GXKc7NzTVJSUmmYcOGxsvLy4SFhZmEhASnv70xZ59fSUlJjr93165dzc8//1zo43P8+HGTkJBgmjRpYry9vU1gYKDp0KGDeeWVV0xOTk6hx1bcfgAAOOtC44bClivs5/zX7/OV5LV59erV5pZbbnEs17p1a5fLxn/55ZemY8eOxtfX1wQEBJiePXuaX3/91WmZxMREI8kcPny40Jo+/PBD06lTJ+Pv72/8/f1Ns2bNzMiRI83WrVsveCwXeq+0oq6iHDhwwDz++OPm6quvNj4+PsbPz89ERUWZSZMmOcZCxriOIYo79ly0aJHp1q2bCQoKMt7e3uaqq64yDz/8sDl48KBjmYkTJ5ro6GhTo0YN4+vra5o1a2Ym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LuUQAAAALuiSgqaJEycqJSVFc+bMcZp0qmPHjtq4caNlxQEAAFQkQ4cOVd++fdWyZUvZbDbFxMRIktatW6dmzZq5uToAAIDLd0lzNG3dulWdO3d2aa9evbqOHj16uTUBAABUSOPHj1fLli3122+/qU+fPo6runl6emrs2LFurg4AAODyXVLQFBISoh07dig8PNypffXq1WrUqJEVdQEAAFRI99xzjyTp999/V35+vjw8PDR48GA3VwUAAGCNS/rq3LBhwzRq1CitW7dONptNBw4c0HvvvacnnnhCw4cPt7pGAACACqdFixbas2ePu8sAAACw1CWd0TR27Fjl5+fr5ptv1smTJ9W5c2fZ7XaNGTNGDz74oNU1ooxl/nFImUcOF3v5nOzTjt/379wsb7tPifYXUKuOAmoHlWgdAADKO2OMu0sAAACw3CUFTTabTc8++6zGjBmjHTt26MSJE2rRooVmzZqlhg0bKi0tzeo6UYbWLFmg5e++dknrvhY/oMTrdBsYp1tjH72k/QEAAAAAgCtHiYKm7OxsjR8/XitWrHCcwdS7d2+99dZbuuuuu+Tp6anHH3+8tGpFGelwez+1bH9Tme0voFadMtsXAABXimeeeUa1atVydxkAAACWKlHQNG7cOM2aNUsxMTFas2aN+vTpo6FDh+q///2v/va3v6lPnz7y9PQsrVpRRgJqB/FVNgAASllCQoK7SwAAALBciSYDX7hwof75z39q0aJFWr58ufLy8nTmzBn98MMPuvfeewmZAAAALsFvv/2m+++/391lAAAAXLYSBU2///67oqKiJEktW7aU3W7X448/LpvNVirFAQAAVAZHjhzR22+/7e4yAAAALluJvjqXl5cnb2/v/61cpYqqVq1qeVEAAAAVyeLFiy94/65du8qoEgAAgNJVoqDJGKMhQ4bIbrdLkk6fPq1HHnlE/v7+Tst99NFH1lUIAABQzvXu3Vs2m03GmCKX4QxxAABQEZToq3ODBw9WUFCQqlevrurVq2vgwIGqV6+e43bBDwAAAP6nbt26+uijj5Sfn1/oz8aNG91dIgAAgCVKdEbTW2+9VVp1AAAAVFhRUVHasGGDevXqVej9FzvbCQAAoLwoUdAEAACAkhszZoyysrKKvL9JkyZauXJlGVYEAABQOgiaAAAASlloaKgaNmxY5P3+/v7q0qVLGVYEAABQ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dzc//PCDpfVcTGF94Pjx4yYjI6NM9n/s2DHzzDPPmGuuucbY7XYTHBxsbr75ZvPhhx86+kthr/Gl4cyZM+bgwYMmNzfX0RYdHW0GDhxofvvtN/Pnn38W2pcvx+7du40k8/333zu1Hz161KnvomJg/FS+lXT8ZAxjKMZQl+/8952DBw8aX19fU6NGDWO3202dOnXMX/7yF/PSSy9ZMn4yxnUMVfDYFYybGD8xfjoX4ydjqpR2kAXr1KlT57LW9/X1la+v72VtIyAgQFu3bpUxRrt379aIESPUp08frVu37rK2ezG5ubny8vIqte1fymN766236q233lJubq42bNigwYMHy2az6aWXXiqFCq8cBcd9rkvtmzk5OfL29rairIvas2ePOnbsqBo1amjKlClq1aqVcnNz9cUXX2jkyJHasmVLmdRRwNvbWyEhIY7bP/30k/744w/5+/s76rPb7frpp580e/ZshYaG6s477yx0W5f7/PD29la1atUkSbVq1brk7Vjh3P6Vlpam5557TnfccYf27dvn1rqqVq2qqlWrlvp+jh49qk6dOunYsWOaOHGi2rZtqypVqujf//63nnrqKd10001lemaFp6enUz+VpJ07d+qRRx5R/fr1HW3nL1MaqlevXur7QMXE+OnKGj9JjKHOxRiq5M4dQ+3atUsdOnTQqVOnNGbMGN17771O46dmzZqV2vhJcv+4qQDjJ8ZPRXHb+KnMo60K6mKJ86pVq0zbtm2Nt7e3CQkJMU8//bRTwpmZmWkGDBhg/Pz8TEhIiJk6darp0qWLGTVqlGOZcxPY/Px8k5iYaMLCwoy3t7epW7euefTRR40xxnTp0sXl0xJjzn6iVr16dae6Fi9ebNq0aWPsdrupXbu26d27d5HHUNj6r776qpFkjh075mj75JNPzHXXXWfsdrtp2LChGT9+vNOxbt682XTs2NHY7XbTvHlzs2LFCqcEvCCN/eCDD0znzp2N3W43b731ljHGmDlz5phmzZoZu91urrnmGjNz5kzHdrOzs83IkSNNSEiIsdvt5qqrrjKTJ0++6ON1/mNrjDF79+41d955p/H39zfVqlUzffr0MWlpaY77IyIiTEBAgPnnP/9pGjRoYAICAkz9+vVNRESEY5mMjAxz7733mnr16hlfX1/TsmVLM3/+fKfHr0uXLubRRx81Y8aMMTVr1jTBwcEmMTHRaZlt27aZG264wfF4LV++3OUTgx9//NHceOONxsfHx9SqVcsMGzbMHD9+3HF/Qf+cNGmSCQoKMtWrVzdJSUkmNzfXPPnkk6ZmzZomNDTUzJ071/UPf47L7eddunQxI0eONKNGjTK1a9c2Xbt2NcYY89NPP5lbb73V+Pv7m6CgIDNw4EBz+PBhx3oLFy40LVu2dBzfzTffbE6cOGESExNd+vrKlSsLre22224zoaGh5sSJEy73nZvyn//YPvXUU6Zp06bG19fXNGzY0Dz33HMmJyfHcf+mTZtM165dTdWqVU21atXM9ddfb7799ltjjDF79uwxd9xxh6lRo4bx8/MzLVq0MEuWLDHGOH8yVvD7+cdx7nOu4NOOxYsXOz4F9vLyMp6eniYxMdGcOXPGdO7c2Xh7extJxtPT01x//fWOT+ELnlfn/lx77bUmNjbW1K5d2/Fa06VLF/Pwww+bQYMGmRo1ahgfHx8THh5ugoKCjJ+fn4mOjjZPP/20qV69ulm2bJkJCQkxkkxUVJRp0qSJ8ff3N927dzcHDhwwxpgS/Y0K619ff/21kWQOHTrkaLtYf8/LyzNJSUkmNDTUeHt7m4iICPP555877r/Qa0WDBg2cam3QoIHjOM59fhfUOmXKFBMSEmJq1aplRowY4dQ3Dhw4YHr06OF4DN97772LfpI2fPhw4+/vb/bv3+9y3/Hjxx3Pp/O387e//c20bNnS+Pn5mfr165vhw4c7PSYX6otHjhwxAwYMMIGBgcbHx8c0adLE8Vpw7qdjhfWht956q9Az5VavXm26dOni+IS5W7du5siRI8YYYz7//HPTsWNHU716dVOrVi1z++23mx07djjWPX8fXbp0cXrMC5w+fdo8+uijpk6dOsZut5uOHTua9evXO+4vqOvLL780UVFRxtfX17Rv395s2bKlyMcfZY/xU+UaPyUmJpqaNWua66+/3jF+6tevn7nzzjvNdddd51iOMRRjqOKOodq2bXvBMdS5Z4tIMldddZXx8PAwksw111xjzpw5Y+6//34TGBhobDabsdlsplq1aqZ///6OMdSOHTtc9tG4cWPTq1cvx+tNwb9HjhwxgwYNMtWrVzdVqlQxdrvd+Pr6mujoaKe64uPjjYeHh7Hb7cbf39/4+fkxfvr/GD9VjPETczSVgf3796tHjx5q27atfvjhB73xxht68803NXHiRMcy8fHx+uabb7R48WKtWLFCX3/9tTZu3FjkNj/88ENNmzZNs2bN0vbt2/XJJ5+oVatWkqSPPvpI9evX14QJE3Tw4EEdPHiw0G0sWbJEd911l3r06KHvv/9eqampio6OLvZxHTp0SB9//LE8PT3l6ekpSfr6668VGxurUaNG6ddff9WsWbM0b948TZo0SZKUl5en3r17y8/PT+vWrdPs2bP17LPPFrr9sWPHatSoUdq8ebO6d++u9957T+PGjdOkSZO0efNmTZ48Wc8//7zefvttSdKrr76qxYsX6//+7/+0detWvffeewoPD7/o43W+/Px89erVS0eOHNG///1vrVixQrt27VK/fv2clsvKytInn3yizz77TK+++qoOHDigw4cPO+4/ffq0oqKitGTJEv3888966KGHNGjQIK1fv95pO2+//bb8/f21bt06vfzyy5owYYJWrFjhqOXuu++Wt7e31q1bp5SUFD399NMudXTv3l01a9bUt99+q4ULF+rLL79UXFyc03JfffWVDhw4oP/85z+aOnWqEhMTdccdd6hmzZpat26dHnnkET388MP6/fffi/ybX0hx+nnB8Xp7e+ubb75RSkqKjh49qptuuknXXXedvvvuOy1btkzp6enq27evJOngwYPq37+/7r//fm3evFmrVq3S3XffLWOMnnzySfXt21e33nqro6936NDBpbYjR45o2bJlGjlypPz9/V3uv9AnHNWqVdO8efP066+/6u9//7vmzJmj/9femQdFdeRx/DsXODBcohBQCuUULMCg4oFiRXBZdQ2lidcSxGi8b4zorgeicV0P1GCRpCAmnlHXRSq7uOIJMYsEAUERh5FDhUSMEaMJaJDjt3+w0+HJcBk22Zjfp2pK5r03/fp1/7rf1/51/3rnzp3ifGhoKHr27ImsrCzk5ORg1apVwju2YMEC1NTU4MKFC8jPz8eWLVsMenXc3d0hk8kANNqqoeeQyWSizQKN3onVq1dj2bJlmDFjBhoaGmBhYYGtW7ciLS0Na9euRV5eHoKDgwEADg4OCAsLAwDs3r0bn332GXx9fZGUlNQsP2fOnEF2djb+8Y9/YPTo0Xj48CFUKhVycnIwceJExMTEoLq6Gtu3b8fs2bOhVCpRWFgIZ2dnXLhwAWVlZXj77bcBoN11ZIiqqiocPHgQLi4usLa2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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.model_selection import cross_val_score\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.linear_model import LinearRegression, LogisticRegression\n", + "from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n", + "from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.preprocessing import OneHotEncoder\n", + "\n", + "# Загружаем набор данных\n", + "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", + "\n", + "# Удаление пустого столбца по имени\n", + "df = df.drop('Unnamed: 0', axis=1)\n", + "\n", + "# Определяем категориальные и числовые столбцы\n", + "categorical_cols = ['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE']\n", + "numerical_cols = ['Battery capacity (mAh)', 'Screen size (inches)', 'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera', 'Number of SIMs']\n", + "\n", + "# Создаем преобразователь для категориальных и числовых столбцов\n", + "preprocessor = ColumnTransformer(\n", + " transformers=[\n", + " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_cols),\n", + " ('num', StandardScaler(), numerical_cols)\n", + " ])\n", + "\n", + "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n", + "X_reg = df[categorical_cols + numerical_cols]\n", + "y_reg = df['Price']\n", + "\n", + "# Список моделей для задачи регрессии\n", + "models_reg = {\n", + " \"Linear Regression\": LinearRegression(),\n", + " \"Random Forest Regression\": RandomForestRegressor(),\n", + " \"Gradient Boosting Regression\": GradientBoostingRegressor()\n", + "}\n", + "\n", + "# Оценка смещения и дисперсии для задачи регрессии\n", + "mae_means = []\n", + "mae_stds = []\n", + "r2_means = []\n", + "r2_stds = []\n", + "\n", + "for name, model in models_reg.items():\n", + " pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('model', model)\n", + " ])\n", + " mae_scores = -cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='neg_mean_absolute_error')\n", + " r2_scores = cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='r2')\n", + " mae_means.append(mae_scores.mean())\n", + " mae_stds.append(mae_scores.std())\n", + " r2_means.append(r2_scores.mean())\n", + " r2_stds.append(r2_scores.std())\n", + "\n", + "# Визуализация результатов для задачи регрессии\n", + "fig, ax = plt.subplots(1, 2, figsize=(12, 6))\n", + "\n", + "ax[0].bar(models_reg.keys(), mae_means, yerr=mae_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n", + "ax[0].set_ylabel('MAE')\n", + "ax[0].set_title('Mean Absolute Error (MAE) for Regression Models')\n", + "ax[0].yaxis.grid(True)\n", + "\n", + "ax[1].bar(models_reg.keys(), r2_means, yerr=r2_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n", + "ax[1].set_ylabel('R²')\n", + "ax[1].set_title('R-squared (R²) for Regression Models')\n", + "ax[1].yaxis.grid(True)\n", + "\n", + "plt.tight_layout()\n", + "plt.show()\n", + "\n", + "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n", + "X_class = df[categorical_cols + numerical_cols]\n", + "y_class = (df['Price'] > df['Price'].mean()).astype(int)\n", + "\n", + "# Список моделей для задачи классификации\n", + "models_class = {\n", + " \"Logistic Regression\": LogisticRegression(),\n", + " \"Random Forest Classification\": RandomForestClassifier(),\n", + " \"Gradient Boosting Classification\": GradientBoostingClassifier()\n", + "}\n", + "\n", + "# Оценка смещения и дисперсии для задачи классификации\n", + "accuracy_means = []\n", + "accuracy_stds = []\n", + "precision_means = []\n", + "precision_stds = []\n", + "recall_means = []\n", + "recall_stds = []\n", + "f1_means = []\n", + "f1_stds = []\n", + "\n", + "for name, model in models_class.items():\n", + " pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('model', model)\n", + " ])\n", + " accuracy_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='accuracy')\n", + " precision_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='precision')\n", + " recall_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='recall')\n", + " f1_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='f1')\n", + " accuracy_means.append(accuracy_scores.mean())\n", + " accuracy_stds.append(accuracy_scores.std())\n", + " precision_means.append(precision_scores.mean())\n", + " precision_stds.append(precision_scores.std())\n", + " recall_means.append(recall_scores.mean())\n", + " recall_stds.append(recall_scores.std())\n", + " f1_means.append(f1_scores.mean())\n", + " f1_stds.append(f1_scores.std())\n", + "\n", + "# Визуализация результатов для задачи классификации\n", + "fig, ax = plt.subplots(2, 2, figsize=(12, 12))\n", + "\n", + "ax[0, 0].bar(models_class.keys(), accuracy_means, yerr=accuracy_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n", + "ax[0, 0].set_ylabel('Accuracy')\n", + "ax[0, 0].set_title('Accuracy for Classification Models')\n", + "ax[0, 0].yaxis.grid(True)\n", + "\n", + "ax[0, 1].bar(models_class.keys(), precision_means, yerr=precision_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n", + "ax[0, 1].set_ylabel('Precision')\n", + "ax[0, 1].set_title('Precision for Classification Models')\n", + "ax[0, 1].yaxis.grid(True)\n", + "\n", + "ax[1, 0].bar(models_class.keys(), recall_means, yerr=recall_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n", + "ax[1, 0].set_ylabel('Recall')\n", + "ax[1, 0].set_title('Recall for Classification Models')\n", + "ax[1, 0].yaxis.grid(True)\n", + "\n", + "ax[1, 1].bar(models_class.keys(), f1_means, yerr=f1_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n", + "ax[1, 1].set_ylabel('F1-score')\n", + "ax[1, 1].set_title('F1-score for Classification Models')\n", + "ax[1, 1].yaxis.grid(True)\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] } ], "metadata": { From 8480d8559c306afeadd9a47a3d7b07595e0ca7a8 Mon Sep 17 00:00:00 2001 From: "a.puchkina" Date: Thu, 12 Dec 2024 15:54:39 +0400 Subject: [PATCH 3/4] =?UTF-8?q?=D0=BB=D0=B0=D0=B1=D0=B04!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab_4/lab4.ipynb | 2776 +++++++++++++--------------------------------- 1 file changed, 768 insertions(+), 2008 deletions(-) diff --git a/lab_4/lab4.ipynb b/lab_4/lab4.ipynb index 45a40d5..61ff186 100644 --- a/lab_4/lab4.ipynb +++ b/lab_4/lab4.ipynb @@ -23,41 +23,396 @@ " 'Number of SIMs', '3G', '4G/ LTE', 'Price'],\n", " dtype='object')\n" ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0NameBrandModelBattery capacity (mAh)Screen size (inches)TouchscreenResolution xResolution yProcessor...Rear cameraFront cameraOperating systemWi-FiBluetoothGPSNumber of SIMs3G4G/ LTEPrice
00OnePlus 7T Pro McLaren EditionOnePlus7T Pro McLaren Edition40856.67Yes144031208...48.016.0AndroidYesYesYes2YesYes58998
11Realme X2 ProRealmeX2 Pro40006.50Yes108024008...64.016.0AndroidYesYesYes2YesYes27999
22iPhone 11 Pro MaxAppleiPhone 11 Pro Max39696.50Yes124226886...12.012.0iOSYesYesYes2YesYes106900
33iPhone 11AppleiPhone 1131106.10Yes82817926...12.012.0iOSYesYesYes2YesYes62900
44LG G8X ThinQLGG8X ThinQ40006.40Yes108023408...12.032.0AndroidYesYesYes1NoNo49990
55OnePlus 7TOnePlus7T38006.55Yes108024008...48.016.0AndroidYesYesNo2YesYes34930
66OnePlus 7T ProOnePlus7T Pro40856.67Yes144031208...48.016.0AndroidYesYesYes2YesYes52990
77Samsung Galaxy Note 10+SamsungGalaxy Note 10+43006.80Yes144030408...12.010.0AndroidYesYesYes2YesYes79699
88Asus ROG Phone 2AsusROG Phone 260006.59Yes108023408...48.024.0AndroidYesYesYes1YesYes37999
99Xiaomi Redmi K20 ProXiaomiRedmi K20 Pro40006.39Yes108023408...48.020.0AndroidYesYesYes2NoNo23190
\n", + "

10 rows × 22 columns

\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 Name Brand \\\n", + "0 0 OnePlus 7T Pro McLaren Edition OnePlus \n", + "1 1 Realme X2 Pro Realme \n", + "2 2 iPhone 11 Pro Max Apple \n", + "3 3 iPhone 11 Apple \n", + "4 4 LG G8X ThinQ LG \n", + "5 5 OnePlus 7T OnePlus \n", + "6 6 OnePlus 7T Pro OnePlus \n", + "7 7 Samsung Galaxy Note 10+ Samsung \n", + "8 8 Asus ROG Phone 2 Asus \n", + "9 9 Xiaomi Redmi K20 Pro Xiaomi \n", + "\n", + " Model Battery capacity (mAh) Screen size (inches) \\\n", + "0 7T Pro McLaren Edition 4085 6.67 \n", + "1 X2 Pro 4000 6.50 \n", + "2 iPhone 11 Pro Max 3969 6.50 \n", + "3 iPhone 11 3110 6.10 \n", + "4 G8X ThinQ 4000 6.40 \n", + "5 7T 3800 6.55 \n", + "6 7T Pro 4085 6.67 \n", + "7 Galaxy Note 10+ 4300 6.80 \n", + "8 ROG Phone 2 6000 6.59 \n", + "9 Redmi K20 Pro 4000 6.39 \n", + "\n", + " Touchscreen Resolution x Resolution y Processor ... Rear camera \\\n", + "0 Yes 1440 3120 8 ... 48.0 \n", + "1 Yes 1080 2400 8 ... 64.0 \n", + "2 Yes 1242 2688 6 ... 12.0 \n", + "3 Yes 828 1792 6 ... 12.0 \n", + "4 Yes 1080 2340 8 ... 12.0 \n", + "5 Yes 1080 2400 8 ... 48.0 \n", + "6 Yes 1440 3120 8 ... 48.0 \n", + "7 Yes 1440 3040 8 ... 12.0 \n", + "8 Yes 1080 2340 8 ... 48.0 \n", + "9 Yes 1080 2340 8 ... 48.0 \n", + "\n", + " Front camera Operating system Wi-Fi Bluetooth GPS Number of SIMs 3G \\\n", + "0 16.0 Android Yes Yes Yes 2 Yes \n", + "1 16.0 Android Yes Yes Yes 2 Yes \n", + "2 12.0 iOS Yes Yes Yes 2 Yes \n", + "3 12.0 iOS Yes Yes Yes 2 Yes \n", + "4 32.0 Android Yes Yes Yes 1 No \n", + "5 16.0 Android Yes Yes No 2 Yes \n", + "6 16.0 Android Yes Yes Yes 2 Yes \n", + "7 10.0 Android Yes Yes Yes 2 Yes \n", + "8 24.0 Android Yes Yes Yes 1 Yes \n", + "9 20.0 Android Yes Yes Yes 2 No \n", + "\n", + " 4G/ LTE Price \n", + "0 Yes 58998 \n", + "1 Yes 27999 \n", + "2 Yes 106900 \n", + "3 Yes 62900 \n", + "4 No 49990 \n", + "5 Yes 34930 \n", + "6 Yes 52990 \n", + "7 Yes 79699 \n", + "8 Yes 37999 \n", + "9 No 23190 \n", + "\n", + "[10 rows x 22 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ "import pandas as pd\n", "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", - "print(df.columns)" + "print(df.columns)\n", + "display(df.head(10))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Бизнес-цели:\n", - "1. Прогнозирование цен на мобильные телефоны: \n", + "## Регрессия\n", "\n", - "Цель: Разработать точную модель машинного обучения для прогнозирования цен на мобильные телефоны на основе характеристик.\n", + "Цель: Разработать модель регрессии, которая будет предсказывать цену мобильного телефона на основе его технических характеристик и функциональных особенностей.\n", "\n", "Применение:\n", - "Оптимизация ценообразования для производителей и продавцов.\n", - "Помощь потребителям в принятии обоснованных решений при покупке.\n", "\n", - "2. Оптимизация характеристик продукта:\n", + "Производители и продавцы мобильных телефонов: Модель может помочь в установлении справедливой цены для новых моделей, основываясь на их технических характеристиках, что может быть полезно для ценообразования и конкуренции на рынке.\n", "\n", - "Цель: Определить оптимальный набор характеристик для мобильных телефонов, максимизирующий ценность для потребителей при заданном бюджете.\n", + "Потребители: Модель может помочь пользователям принимать более обоснованные решения при покупке, сравнивая цены и характеристики различных моделей.\n", "\n", - "Применение:\n", - "Разработка новых моделей мобильных телефонов.\n", - "Улучшение существующих моделей." + "Рыночные аналитики: Модель может быть использована для анализа тенденций на рынке мобильных телефонов, выявления факторов, влияющих на цену, и прогнозирования будущих изменений.\n", + "\n", + "Исследования в области технологий: Модель может помочь в изучении влияния различных технических характеристик на цену и популярность моделей." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### 1. Прогнозирование цен на мобильные телефоны " + "#### Удаление выбросов" ] }, { @@ -69,123 +424,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "Среднее значение поля 'Price': 11465.825607064018\n", - " Name Brand Model \\\n", - "0 OnePlus 7T Pro McLaren Edition OnePlus 7T Pro McLaren Edition \n", - "1 Realme X2 Pro Realme X2 Pro \n", - "2 iPhone 11 Pro Max Apple iPhone 11 Pro Max \n", - "3 iPhone 11 Apple iPhone 11 \n", - "4 LG G8X ThinQ LG G8X ThinQ \n", - "5 OnePlus 7T OnePlus 7T \n", - "6 OnePlus 7T Pro OnePlus 7T Pro \n", - "7 Samsung Galaxy Note 10+ Samsung Galaxy Note 10+ \n", - "8 Asus ROG Phone 2 Asus ROG Phone 2 \n", - "9 Xiaomi Redmi K20 Pro Xiaomi Redmi K20 Pro \n", - "10 Oppo K3 Oppo K3 \n", - "11 Realme X Realme X \n", - "12 Xiaomi Redmi K20 Xiaomi Redmi K20 \n", - "13 OnePlus 7 Pro OnePlus 7 Pro \n", - "14 Oppo Reno 10x Zoom Oppo Reno 10x Zoom \n", - "15 Realme 3 Pro Realme 3 Pro \n", - "16 Huawei P30 Pro Huawei P30 Pro \n", - "17 Redmi Note 7 Pro Xiaomi Redmi Note 7 Pro \n", - "18 Huawei Mate 20 Pro Huawei Mate 20 Pro \n", - "19 LG V40 ThinQ LG V40 ThinQ \n", - "\n", - " Battery capacity (mAh) Screen size (inches) Touchscreen Resolution x \\\n", - "0 4085 6.67 Yes 1440 \n", - "1 4000 6.50 Yes 1080 \n", - "2 3969 6.50 Yes 1242 \n", - "3 3110 6.10 Yes 828 \n", - "4 4000 6.40 Yes 1080 \n", - "5 3800 6.55 Yes 1080 \n", - "6 4085 6.67 Yes 1440 \n", - "7 4300 6.80 Yes 1440 \n", - "8 6000 6.59 Yes 1080 \n", - "9 4000 6.39 Yes 1080 \n", - "10 3765 6.50 Yes 1080 \n", - "11 3765 6.53 Yes 1080 \n", - "12 4000 6.39 Yes 1080 \n", - "13 4000 6.67 Yes 1440 \n", - "14 4065 6.60 Yes 1080 \n", - "15 4045 6.30 Yes 1080 \n", - "16 4200 6.47 Yes 1080 \n", - "17 4000 6.30 Yes 1080 \n", - "18 4200 6.39 Yes 1440 \n", - "19 3300 6.40 Yes 1440 \n", - "\n", - " Resolution y Processor RAM (MB) ... Operating system Wi-Fi \\\n", - "0 3120 8 12000 ... Android Yes \n", - "1 2400 8 6000 ... Android Yes \n", - "2 2688 6 4000 ... iOS Yes \n", - "3 1792 6 4000 ... iOS Yes \n", - "4 2340 8 6000 ... Android Yes \n", - "5 2400 8 8000 ... Android Yes \n", - "6 3120 8 8000 ... Android Yes \n", - "7 3040 8 12000 ... Android Yes \n", - "8 2340 8 8000 ... Android Yes \n", - "9 2340 8 6000 ... Android Yes \n", - "10 2340 8 6000 ... Android Yes \n", - "11 2340 8 4000 ... Android Yes \n", - "12 2340 8 6000 ... Android Yes \n", - "13 3120 8 6000 ... Android Yes \n", - "14 2340 8 6000 ... Android Yes \n", - "15 2340 8 4000 ... Android Yes \n", - "16 2340 8 8000 ... Android Yes \n", - "17 2340 8 4000 ... Android Yes \n", - "18 3120 8 6000 ... Android Yes \n", - "19 3120 8 6000 ... Android Yes \n", - "\n", - " Bluetooth GPS Number of SIMs 3G 4G/ LTE Price above_average_price \\\n", - "0 Yes Yes 2 Yes Yes 58998 1 \n", - "1 Yes Yes 2 Yes Yes 27999 1 \n", - "2 Yes Yes 2 Yes Yes 106900 1 \n", - "3 Yes Yes 2 Yes Yes 62900 1 \n", - "4 Yes Yes 1 No No 49990 1 \n", - "5 Yes No 2 Yes Yes 34930 1 \n", - "6 Yes Yes 2 Yes Yes 52990 1 \n", - "7 Yes Yes 2 Yes Yes 79699 1 \n", - "8 Yes Yes 1 Yes Yes 37999 1 \n", - "9 Yes Yes 2 No No 23190 1 \n", - "10 Yes Yes 2 Yes Yes 23990 1 \n", - "11 Yes Yes 2 Yes Yes 14999 1 \n", - "12 Yes Yes 2 Yes Yes 19282 1 \n", - "13 Yes Yes 2 Yes Yes 39995 1 \n", - "14 Yes Yes 2 Yes Yes 36990 1 \n", - "15 Yes Yes 2 Yes Yes 13999 1 \n", - "16 Yes No 2 Yes Yes 54280 1 \n", - "17 Yes Yes 2 Yes Yes 9799 0 \n", - "18 Yes Yes 2 Yes Yes 63990 1 \n", - "19 Yes Yes 2 Yes Yes 29999 1 \n", - "\n", - " price_volatility \n", - "0 174496 \n", - "1 174496 \n", - "2 174496 \n", - "3 174496 \n", - "4 174496 \n", - "5 174496 \n", - "6 174496 \n", - "7 174496 \n", - "8 174496 \n", - "9 174496 \n", - "10 174496 \n", - "11 174496 \n", - "12 174496 \n", - "13 174496 \n", - "14 174496 \n", - "15 174496 \n", - "16 174496 \n", - "17 174496 \n", - "18 174496 \n", - "19 174496 \n", - "\n", - "[20 rows x 23 columns]\n" + "Размер данных до удаления выбросов: (1359, 21)\n", + "Размер данных после удаления выбросов: (1256, 21)\n" ] } ], "source": [ "import pandas as pd\n", + "from scipy import stats\n", "\n", "# Загружаем набор данных\n", "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", @@ -193,28 +439,34 @@ "# Удаление пустого столбца по имени\n", "df = df.drop('Unnamed: 0', axis=1)\n", "\n", - "# Устанавливаем случайное состояние\n", - "random_state = 42\n", + "# Выбор числовых признаков для анализа выбросов\n", + "numeric_features = [\n", + " 'Battery capacity (mAh)', 'Screen size (inches)', 'Resolution x', \n", + " 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', \n", + " 'Rear camera', 'Front camera', 'Number of SIMs', 'Price'\n", + "]\n", "\n", - "# Рассчитываем среднее значение цены\n", - "average_price = df['Price'].mean()\n", - "print(f\"Среднее значение поля 'Price': {average_price}\")\n", + "# Вычисление Z-оценок для числовых признаков\n", + "z_scores = stats.zscore(df[numeric_features])\n", "\n", - "# Создаем новую переменную, указывающую, превышает ли цена среднюю\n", - "df['above_average_price'] = (df['Price'] > average_price).astype(int)\n", + "# Определение порога для выбросов\n", + "threshold = 3\n", "\n", - "# Рассчитываем волатильность (разницу между максимальной и минимальной ценой)\n", - "df['price_volatility'] = df['Price'].max() - df['Price'].min()\n", + "# Вывод размеров данных до удаления выбросов\n", + "print(\"Размер данных до удаления выбросов:\", df.shape)\n", "\n", - "# Выводим первые строки измененной таблицы для проверки\n", - "print(df.head(20))" + "# Удаление строк, содержащих выбросы\n", + "df = df[(z_scores < threshold).all(axis=1)]\n", + "\n", + "# Вывод размеров данных после удаления выбросов\n", + "print(\"Размер данных после удаления выбросов:\", df.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### 2. Оптимизация характеристик продукта " + "#### Подготовка данных и оценка базовой модели" ] }, { @@ -226,464 +478,50 @@ "name": "stdout", "output_type": "stream", "text": [ - "Средняя цена для 'Brand':\n", - "Brand\n", - "10.or 5999.000000\n", - "Acer 6470.000000\n", - "Alcatel 9201.600000\n", - "Apple 45510.470588\n", - "Aqua 4599.000000\n", - " ... \n", - "Zopo 6027.916667\n", - "Zuk 29124.000000\n", - "iBall 4051.000000\n", - "iVoomi 4018.875000\n", - "mPhone 6949.000000\n", - "Name: Price, Length: 76, dtype: float64\n", - "\n", - "Средняя цена для 'Battery capacity (mAh)':\n", - "Battery capacity (mAh)\n", - "1010 3499.000000\n", - "1050 4790.000000\n", - "1200 3396.000000\n", - "1250 2498.500000\n", - "1300 3338.333333\n", - " ... \n", - "5000 13542.530612\n", - "5020 23900.000000\n", - "5100 16999.000000\n", - "5300 8999.000000\n", - "6000 19832.333333\n", - "Name: Price, Length: 165, dtype: float64\n", - "\n", - "Средняя цена для 'Screen size (inches)':\n", - "Screen size (inches)\n", - "2.40 1249.000000\n", - "2.44 6999.000000\n", - "2.45 2999.000000\n", - "2.60 5555.000000\n", - "2.80 5345.000000\n", - " ... \n", - "6.70 58896.428571\n", - "6.80 79699.000000\n", - "6.90 92999.000000\n", - "7.00 6199.000000\n", - "7.30 164999.000000\n", - "Name: Price, Length: 80, dtype: float64\n", - "\n", - "Средняя цена для 'Touchscreen':\n", - "Touchscreen\n", - "No 5255.411765\n", - "Yes 11544.497019\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для 'Resolution x':\n", - "Resolution x\n", - "240 3819.888889\n", - "320 2499.000000\n", - "360 5797.500000\n", - "400 2860.500000\n", - "480 4128.602459\n", - "540 7445.848485\n", - "560 15990.000000\n", - "600 4829.000000\n", - "640 7697.200000\n", - "720 7619.360684\n", - "750 25999.000000\n", - "768 8872.000000\n", - "800 2190.000000\n", - "828 54199.500000\n", - "850 4115.000000\n", - "854 4415.666667\n", - "1024 6199.000000\n", - "1080 17165.865952\n", - "1125 75632.666667\n", - "1176 77299.000000\n", - "1242 88449.500000\n", - "1280 7144.333333\n", - "1440 34240.461538\n", - "1520 7935.000000\n", - "1536 164999.000000\n", - "1600 29950.000000\n", - "1880 20800.000000\n", - "2160 45500.000000\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для 'Resolution y':\n", - "Resolution y\n", - "320 3811.125000\n", - "480 4264.818182\n", - "485 3299.000000\n", - "584 4499.000000\n", - "600 6199.000000\n", - "640 4095.000000\n", - "720 8539.900000\n", - "800 4189.321429\n", - "854 4087.901316\n", - "960 6921.651163\n", - "1080 7583.800000\n", - "1136 12749.000000\n", - "1280 7449.136674\n", - "1290 14990.000000\n", - "1334 25999.000000\n", - "1440 6930.808824\n", - "1480 13596.166667\n", - "1498 4490.000000\n", - "1500 9083.125000\n", - "1520 8139.425000\n", - "1544 10010.000000\n", - "1548 8499.000000\n", - "1560 9135.750000\n", - "1580 9950.000000\n", - "1600 9476.111111\n", - "1620 21492.000000\n", - "1792 54199.500000\n", - "1820 6498.000000\n", - "1920 14698.088496\n", - "2152 164999.000000\n", - "2160 17465.194444\n", - "2220 20531.333333\n", - "2240 49990.000000\n", - "2244 18000.000000\n", - "2246 16177.200000\n", - "2248 39990.000000\n", - "2270 8961.000000\n", - "2280 19073.190476\n", - "2310 25120.000000\n", - "2316 29999.000000\n", - "2340 19768.017241\n", - "2400 32131.083333\n", - "2436 75632.666667\n", - "2520 11844.500000\n", - "2560 26501.476190\n", - "2636 174990.000000\n", - "2688 88449.500000\n", - "2880 34993.250000\n", - "2960 38425.714286\n", - "3040 81799.500000\n", - "3120 45710.000000\n", - "3200 77999.000000\n", - "3840 45500.000000\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для 'Processor':\n", - "Processor\n", - "1 7861.095238\n", - "2 7929.444444\n", - "4 7209.401171\n", - "6 39365.400000\n", - "8 16193.927434\n", - "10 8542.000000\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для 'RAM (MB)':\n", - "RAM (MB)\n", - "64 4249.000000\n", - "256 2625.625000\n", - "289 3190.000000\n", - "384 5555.000000\n", - "512 3419.847222\n", - "768 4749.500000\n", - "1000 5747.082153\n", - "2000 8645.608187\n", - "3000 11587.829787\n", - "4000 17741.965000\n", - "6000 28291.587302\n", - "8000 45080.586207\n", - "12000 99173.750000\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для 'Internal storage (GB)':\n", - "Internal storage (GB)\n", - "0.064 3499.000000\n", - "0.128 4999.000000\n", - "0.160 5555.000000\n", - "0.512 3390.444444\n", - "1.000 5197.000000\n", - "2.000 2399.000000\n", - "3.000 3190.000000\n", - "4.000 4513.032258\n", - "8.000 5311.654206\n", - "16.000 8379.403341\n", - "32.000 12089.644366\n", - "64.000 21208.814607\n", - "128.000 29477.043478\n", - "256.000 68682.777778\n", - "512.000 164999.000000\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для 'Rear camera':\n", - "Rear camera\n", - "0.0 4193.500000\n", - "0.3 3054.666667\n", - "2.0 3000.804878\n", - "3.0 4329.333333\n", - "3.2 3506.727273\n", - "5.0 4413.183486\n", - "8.0 6658.109966\n", - "8.7 8999.000000\n", - "10.0 10499.250000\n", - "12.0 28533.950980\n", - "12.2 29162.500000\n", - "12.3 30569.250000\n", - "13.0 9531.776018\n", - "13.1 32490.000000\n", - "13.2 7496.333333\n", - "15.0 88719.000000\n", - "16.0 17923.896825\n", - "18.0 19999.000000\n", - "19.0 39095.000000\n", - "20.0 23739.777778\n", - "20.7 35718.600000\n", - "21.0 14513.900000\n", - "21.5 6999.000000\n", - "23.0 31966.090909\n", - "24.0 18587.250000\n", - "25.0 13980.000000\n", - "32.0 19589.000000\n", - "40.0 61389.750000\n", - "41.0 10990.000000\n", - "48.0 24205.615385\n", - "64.0 19332.333333\n", - "108.0 92999.000000\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для 'Front camera':\n", - "Front camera\n", - "0.0 6799.333333\n", - "0.3 4398.430233\n", - "0.9 19999.000000\n", - "1.1 18745.000000\n", - "1.2 18579.333333\n", - "1.3 5640.352941\n", - "1.5 18748.000000\n", - "1.6 15833.000000\n", - "1.9 11246.750000\n", - "2.0 6711.995122\n", - "2.1 24839.666667\n", - "2.2 35823.333333\n", - "2.4 5061.333333\n", - "3.0 8500.000000\n", - "3.2 4660.900000\n", - "3.7 28925.000000\n", - "4.0 13519.285714\n", - "5.0 8347.064655\n", - "7.0 49061.625000\n", - "8.0 13894.422222\n", - "10.0 105114.166667\n", - "12.0 41929.500000\n", - "13.0 11380.436364\n", - "16.0 17646.113402\n", - "20.0 13498.520000\n", - "24.0 21860.562500\n", - "25.0 19182.692308\n", - "32.0 23749.782609\n", - "40.0 92999.000000\n", - "48.0 27999.000000\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для 'Operating system':\n", - "Operating system\n", - "Android 10989.947652\n", - "BlackBerry 10509.600000\n", - "Cyanogen 9173.600000\n", - "Sailfish 4799.000000\n", - "Tizen 4459.666667\n", - "Windows 16706.684211\n", - "iOS 45510.470588\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для 'Wi-Fi':\n", - "Wi-Fi\n", - "No 6334.375000\n", - "Yes 11496.211695\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для 'Bluetooth':\n", - "Bluetooth\n", - "No 7794.466667\n", - "Yes 11506.800595\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для 'GPS':\n", - "GPS\n", - "No 8316.148148\n", - "Yes 11737.740208\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для 'Number of SIMs':\n", - "Number of SIMs\n", - "1 16479.718062\n", - "2 10465.580018\n", - "3 4590.000000\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для '3G':\n", - "3G\n", - "No 11616.882759\n", - "Yes 11447.783361\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для '4G/ LTE':\n", - "4G/ LTE\n", - "No 7922.270893\n", - "Yes 12680.858696\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для комбинации 'Brand' и 'Operating system':\n", - "Brand Operating system\n", - "10.or Android 5999.000000\n", - "Acer Android 6470.000000\n", - "Alcatel Android 9201.600000\n", - "Apple iOS 45510.470588\n", - "Aqua Android 4599.000000\n", - " ... \n", - "Zopo Android 6027.916667\n", - "Zuk Android 29124.000000\n", - "iBall Android 4051.000000\n", - "iVoomi Android 4018.875000\n", - "mPhone Android 6949.000000\n", - "Name: Price, Length: 85, dtype: float64\n", - "\n", - "Средняя цена для комбинации 'RAM (MB)' и 'Internal storage (GB)':\n", - "RAM (MB) Internal storage (GB)\n", - "64 0.064 3499.000000\n", - " 0.128 4999.000000\n", - "256 0.512 2287.857143\n", - " 8.000 4990.000000\n", - "289 3.000 3190.000000\n", - "384 0.160 5555.000000\n", - "512 0.512 7249.500000\n", - " 2.000 2399.000000\n", - " 4.000 3222.244444\n", - " 8.000 3513.750000\n", - "768 4.000 6500.000000\n", - " 8.000 2999.000000\n", - "1000 1.000 5197.000000\n", - " 4.000 8019.187500\n", - " 8.000 5398.572464\n", - " 16.000 6772.263158\n", - " 32.000 6997.000000\n", - "2000 8.000 6458.736842\n", - " 16.000 8518.889273\n", - " 32.000 10155.272727\n", - " 64.000 36999.000000\n", - "3000 16.000 9082.082192\n", - " 32.000 11742.751269\n", - " 64.000 24287.833333\n", - "4000 32.000 14827.288462\n", - " 64.000 19201.702290\n", - " 128.000 15408.882353\n", - "6000 64.000 26554.636364\n", - " 128.000 29692.000000\n", - " 256.000 44999.000000\n", - "8000 64.000 54990.000000\n", - " 128.000 37177.181818\n", - " 256.000 72408.166667\n", - "12000 128.000 92999.000000\n", - " 256.000 69348.500000\n", - " 512.000 164999.000000\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для комбинации 'Screen size (inches)' и 'Battery capacity (mAh)':\n", - "Screen size (inches) Battery capacity (mAh)\n", - "2.40 2000 1249.0\n", - "2.44 1450 6999.0\n", - "2.45 1500 2999.0\n", - "2.60 1350 5555.0\n", - "2.80 1200 3190.0\n", - " ... \n", - "6.70 4500 40259.0\n", - "6.80 4300 79699.0\n", - "6.90 5000 92999.0\n", - "7.00 3450 6199.0\n", - "7.30 4380 164999.0\n", - "Name: Price, Length: 431, dtype: float64\n", - "\n" + "Размер обучающей выборки: (1004, 18)\n", + "Размер тестовой выборки: (252, 18)\n", + "Baseline MAE: 4662.689511794094\n", + "Baseline MSE: 50560680.710365206\n", + "Baseline R²: -0.001378207894705552\n" ] } ], "source": [ "import pandas as pd\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n", "\n", - "# Загружаем набор данных\n", - "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", "\n", - "# Удаление пустого столбца по имени\n", - "df = df.drop('Unnamed: 0', axis=1)\n", + "# Выбор признаков и целевой переменной\n", + "features = [\n", + " 'Brand', 'Battery capacity (mAh)',\n", + " 'Screen size (inches)', 'Touchscreen', 'Resolution x', 'Resolution y',\n", + " 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera',\n", + " 'Front camera', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS',\n", + " 'Number of SIMs', '3G', '4G/ LTE'\n", + "]\n", + "target = 'Price'\n", "\n", - "# Устанавливаем случайное состояние\n", - "random_state = 42\n", + "global X_train, X_test, y_train, y_test\n", + "X_train, X_test, y_train, y_test = train_test_split(df[features], df[target], test_size=0.2, random_state=42)\n", "\n", - "# Рассчитываем среднюю цену для каждого значения каждого признака (Model уберем, у всех разная)\n", - "for column in ['Brand', 'Battery capacity (mAh)', 'Screen size (inches)', 'Touchscreen', \n", - " 'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', \n", - " 'Rear camera', 'Front camera', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', \n", - " 'Number of SIMs', '3G', '4G/ LTE']:\n", - " print(f\"Средняя цена для '{column}':\")\n", - " print(df.groupby(column)['Price'].mean())\n", - " print()\n", + "print(\"Размер обучающей выборки:\", X_train.shape)\n", + "print(\"Размер тестовой выборки:\", X_test.shape)\n", "\n", - "# Рассчитываем среднюю цену для комбинаций признаков\n", - "# для комбинации 'Brand' и 'Operating system'\n", - "print(\"Средняя цена для комбинации 'Brand' и 'Operating system':\")\n", - "print(df.groupby(['Brand', 'Operating system'])['Price'].mean())\n", - "print()\n", + "# Базовые предсказания (среднее значение целевой переменной)\n", + "baseline_predictions = [y_train.mean()] * len(y_test)\n", "\n", - "# Рассчитываем среднюю цену для комбинации 'RAM (MB)' и 'Internal storage (GB)'\n", - "print(\"Средняя цена для комбинации 'RAM (MB)' и 'Internal storage (GB)':\")\n", - "print(df.groupby(['RAM (MB)', 'Internal storage (GB)'])['Price'].mean())\n", - "print()\n", - "\n", - "# Рассчитываем среднюю цену для комбинации 'Screen size (inches)' и 'Battery capacity (mAh)'\n", - "print(\"Средняя цена для комбинации 'Screen size (inches)' и 'Battery capacity (mAh)':\")\n", - "print(df.groupby(['Screen size (inches)', 'Battery capacity (mAh)'])['Price'].mean())\n", - "print()" + "# Оценка базовой модели\n", + "print('Baseline MAE:', mean_absolute_error(y_test, baseline_predictions))\n", + "print('Baseline MSE:', mean_squared_error(y_test, baseline_predictions))\n", + "print('Baseline R²:', r2_score(y_test, baseline_predictions))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Выбор ориентира для каждой задачи:\n", - "\n", - "1. Прогнозирование цен на мобильные телефоны:\n", - "Ориентир:\n", - "\n", - "R² (коэффициент детерминации): 0.75 - 0.85\n", - "\n", - "MAE (средняя абсолютная ошибка): 5000 - 10000 рублей\n", - "\n", - "RMSE (среднеквадратичная ошибка): 10000 - 20000 рублей\n", - "\n", - "Объяснение:\n", - "\n", - "R²: Значение 0.75 - 0.85 будет означать, что модель объясняет 75-85% вариации цен на мобильные телефоны, что является хорошим результатом для задачи регрессии.\n", - "\n", - "MAE: Значение 5000 - 10000 рублей будет означать, что в среднем модель ошибается на 5000 - 10000 рублей при прогнозировании цен на мобильные телефоны. Учитывая диапазон цен от 9000 до 150000 рублей, этот ориентир является разумным.\n", - "\n", - "RMSE: Значение 10000 - 20000 рублей будет означать, что среднеквадратичная ошибка модели составляет 10000 - 20000 рублей.\n", - "\n", - "2. Оптимизация характеристик продукта:\n", - "Ориентир:\n", - "\n", - "Увеличение прибыли компании: 5% - 10%\n", - "\n", - "Сохранение конкурентоспособных тарифов:\n", - "\n", - "Средняя цена мобильных телефонов не должна увеличиваться более чем на 5% по сравнению с текущими тарифами.\n", - "\n", - "Доля клиентов, считающих цены высокими, не должна увеличиваться более чем на 2%.\n", - "\n", - "Объяснение:\n", - "\n", - "Увеличение прибыли компании: \n", - "\n", - "Цель оптимизации характеристик продукта - максимизировать прибыль компании. Ориентир в 5% - 10% увеличения прибыли является реалистичным и достижимым.\n", - "\n", - "Сохранение конкурентоспособных тарифов: \n", - "\n", - "Важно, чтобы оптимизация характеристик продукта не привела к значительному увеличению цен для клиентов. Ориентир в 5% увеличения средней цены мобильных телефонов и 2% увеличения доли клиентов, считающих цены высокими, позволяет сохранить конкурентоспособность компании." + "#### Обучение и оценка моделей" ] }, { @@ -695,351 +533,142 @@ "name": "stdout", "output_type": "stream", "text": [ - "MAE: 5424.128251450574\n", - "MSE: 143399695.59118932\n", - "RMSE: 11974.961193723733\n", - "R²: 0.4559750691933513\n", - "Ориентиры для прогнозирования цены мобильных устройств не достигнуты.\n", - "Средняя цена для 'Battery capacity (mAh)':\n", - "Battery capacity (mAh)\n", - "1010 3499.000000\n", - "1050 4790.000000\n", - "1200 3396.000000\n", - "1250 2498.500000\n", - "1300 3338.333333\n", - " ... \n", - "5000 13542.530612\n", - "5020 23900.000000\n", - "5100 16999.000000\n", - "5300 8999.000000\n", - "6000 19832.333333\n", - "Name: Price, Length: 165, dtype: float64\n", - "\n", - "Средняя цена для 'Screen size (inches)':\n", - "Screen size (inches)\n", - "2.40 1249.000000\n", - "2.44 6999.000000\n", - "2.45 2999.000000\n", - "2.60 5555.000000\n", - "2.80 5345.000000\n", - " ... \n", - "6.70 58896.428571\n", - "6.80 79699.000000\n", - "6.90 92999.000000\n", - "7.00 6199.000000\n", - "7.30 164999.000000\n", - "Name: Price, Length: 80, dtype: float64\n", - "\n", - "Средняя цена для 'RAM (MB)':\n", - "RAM (MB)\n", - "64 4249.000000\n", - "256 2625.625000\n", - "289 3190.000000\n", - "384 5555.000000\n", - "512 3419.847222\n", - "768 4749.500000\n", - "1000 5747.082153\n", - "2000 8645.608187\n", - "3000 11587.829787\n", - "4000 17741.965000\n", - "6000 28291.587302\n", - "8000 45080.586207\n", - "12000 99173.750000\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для 'Internal storage (GB)':\n", - "Internal storage (GB)\n", - "0.064 3499.000000\n", - "0.128 4999.000000\n", - "0.160 5555.000000\n", - "0.512 3390.444444\n", - "1.000 5197.000000\n", - "2.000 2399.000000\n", - "3.000 3190.000000\n", - "4.000 4513.032258\n", - "8.000 5311.654206\n", - "16.000 8379.403341\n", - "32.000 12089.644366\n", - "64.000 21208.814607\n", - "128.000 29477.043478\n", - "256.000 68682.777778\n", - "512.000 164999.000000\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для 'Rear camera':\n", - "Rear camera\n", - "0.0 4193.500000\n", - "0.3 3054.666667\n", - "2.0 3000.804878\n", - "3.0 4329.333333\n", - "3.2 3506.727273\n", - "5.0 4413.183486\n", - "8.0 6658.109966\n", - "8.7 8999.000000\n", - "10.0 10499.250000\n", - "12.0 28533.950980\n", - "12.2 29162.500000\n", - "12.3 30569.250000\n", - "13.0 9531.776018\n", - "13.1 32490.000000\n", - "13.2 7496.333333\n", - "15.0 88719.000000\n", - "16.0 17923.896825\n", - "18.0 19999.000000\n", - "19.0 39095.000000\n", - "20.0 23739.777778\n", - "20.7 35718.600000\n", - "21.0 14513.900000\n", - "21.5 6999.000000\n", - "23.0 31966.090909\n", - "24.0 18587.250000\n", - "25.0 13980.000000\n", - "32.0 19589.000000\n", - "40.0 61389.750000\n", - "41.0 10990.000000\n", - "48.0 24205.615385\n", - "64.0 19332.333333\n", - "108.0 92999.000000\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для 'Front camera':\n", - "Front camera\n", - "0.0 6799.333333\n", - "0.3 4398.430233\n", - "0.9 19999.000000\n", - "1.1 18745.000000\n", - "1.2 18579.333333\n", - "1.3 5640.352941\n", - "1.5 18748.000000\n", - "1.6 15833.000000\n", - "1.9 11246.750000\n", - "2.0 6711.995122\n", - "2.1 24839.666667\n", - "2.2 35823.333333\n", - "2.4 5061.333333\n", - "3.0 8500.000000\n", - "3.2 4660.900000\n", - "3.7 28925.000000\n", - "4.0 13519.285714\n", - "5.0 8347.064655\n", - "7.0 49061.625000\n", - "8.0 13894.422222\n", - "10.0 105114.166667\n", - "12.0 41929.500000\n", - "13.0 11380.436364\n", - "16.0 17646.113402\n", - "20.0 13498.520000\n", - "24.0 21860.562500\n", - "25.0 19182.692308\n", - "32.0 23749.782609\n", - "40.0 92999.000000\n", - "48.0 27999.000000\n", - "Name: Price, dtype: float64\n", - "\n", - "Средняя цена для комбинации 'Battery capacity (mAh)' и 'RAM (MB)':\n", - "Battery capacity (mAh) RAM (MB)\n", - "1010 64 3499.0\n", - "1050 1000 4790.0\n", - "1200 64 4999.0\n", - " 289 3190.0\n", - " 512 1999.0\n", - " ... \n", - "5020 3000 23900.0\n", - "5100 3000 16999.0\n", - "5300 4000 8999.0\n", - "6000 4000 10749.0\n", - " 8000 37999.0\n", - "Name: Price, Length: 323, dtype: float64\n", - "\n", - "Средняя цена для комбинации 'Screen size (inches)' и 'Internal storage (GB)':\n", - "Screen size (inches) Internal storage (GB)\n", - "2.40 4.000 1249.0\n", - "2.44 0.512 6999.0\n", - "2.45 4.000 2999.0\n", - "2.60 0.160 5555.0\n", - "2.80 0.512 7500.0\n", - " ... \n", - "6.70 256.000 174990.0\n", - "6.80 256.000 79699.0\n", - "6.90 128.000 92999.0\n", - "7.00 8.000 6199.0\n", - "7.30 512.000 164999.0\n", - "Name: Price, Length: 177, dtype: float64\n", - "\n", - "Средняя цена для комбинации 'Rear camera' и 'Front camera':\n", - "Rear camera Front camera\n", - "0.0 0.0 4193.500000\n", - "0.3 0.3 3054.666667\n", - "2.0 0.0 4396.000000\n", - " 0.3 2940.937500\n", - " 1.3 2240.000000\n", - " ... \n", - "48.0 48.0 27999.000000\n", - "64.0 16.0 21499.000000\n", - " 20.0 14999.000000\n", - " 32.0 21499.000000\n", - "108.0 40.0 92999.000000\n", - "Name: Price, Length: 126, dtype: float64\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", - " warnings.warn(\n" + "Model: Linear Regression trained.\n", + "MAE: 3251.7122571814075\n", + "MSE: 25623200.493888523\n", + "R²: 0.4925203887566195\n", + "--------------------------------------------------\n", + "Model: Decision Tree trained.\n", + "MAE: 4112.809523809524\n", + "MSE: 56543100.29960317\n", + "R²: -0.11986285887206449\n", + "--------------------------------------------------\n", + "Model: Gradient Boosting trained.\n", + "MAE: 2793.2991365668017\n", + "MSE: 23739724.17710429\n", + "R²: 0.5298235285129411\n", + "--------------------------------------------------\n" ] } ], "source": [ "import pandas as pd\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.preprocessing import StandardScaler\n", + "from scipy import stats\n", + "from sklearn.model_selection import train_test_split, RandomizedSearchCV\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\n", + "from sklearn.tree import DecisionTreeRegressor\n", + "from sklearn.ensemble import GradientBoostingRegressor\n", "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n", "\n", - "# Загружаем набор данных\n", - "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", + "# Выбор признаков и целевой переменной\n", + "categorical_features = [\n", + " 'Brand', 'Touchscreen', 'Operating system', 'Wi-Fi', \n", + " 'Bluetooth', 'GPS', '3G', '4G/ LTE'\n", + "]\n", + "numeric_features = [\n", + " 'Battery capacity (mAh)', 'Screen size (inches)', 'Resolution x', \n", + " 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', \n", + " 'Front camera', 'Number of SIMs'\n", + "]\n", + "target = 'Price'\n", "\n", - "# Удаление пустого столбца по имени\n", - "df = df.drop('Unnamed: 0', axis=1)\n", + "# Препроцессор для обработки числовых и категориальных признаков\n", + "preprocessor = ColumnTransformer(\n", + " transformers=[\n", + " ('num', StandardScaler(), numeric_features), # Масштабирование числовых признаков\n", + " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features) # Однократная кодировка категориальных признаков\n", + " ]\n", + ")\n", "\n", - "# Преобразуем категориальные переменные в числовые\n", - "df = pd.get_dummies(df, columns=['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE'], drop_first=True)\n", + "# Создание пайплайнов для моделей\n", + "pipeline_linear_regression = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('regressor', LinearRegression())\n", + "])\n", "\n", - "# Разделяем данные на признаки (X) и целевую переменную (y)\n", - "X = df.drop('Price', axis=1)\n", - "y = df['Price']\n", + "pipeline_decision_tree = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('regressor', DecisionTreeRegressor(random_state=42))\n", + "])\n", "\n", - "# Разделяем данные на обучающую и тестовую выборки\n", - "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", + "pipeline_gradient_boosting = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('regressor', GradientBoostingRegressor(random_state=42))\n", + "])\n", "\n", - "# Стандартизируем признаки\n", - "scaler = StandardScaler()\n", - "X_train = scaler.fit_transform(X_train)\n", - "X_test = scaler.transform(X_test)\n", + "# Список моделей для сравнения\n", + "pipelines = [\n", + " ('Linear Regression', pipeline_linear_regression),\n", + " ('Decision Tree', pipeline_decision_tree),\n", + " ('Gradient Boosting', pipeline_gradient_boosting)\n", + "]\n", "\n", - "# Обучаем модель линейной регрессии\n", - "model = LinearRegression()\n", - "model.fit(X_train, y_train)\n", - "\n", - "# Делаем предсказания на тестовой выборке\n", - "y_pred = model.predict(X_test)\n", - "\n", - "# Оцениваем качество модели\n", - "mae = mean_absolute_error(y_test, y_pred)\n", - "mse = mean_squared_error(y_test, y_pred)\n", - "rmse = mean_squared_error(y_test, y_pred, squared=False)\n", - "r2 = r2_score(y_test, y_pred)\n", - "\n", - "print(f\"MAE: {mae}\")\n", - "print(f\"MSE: {mse}\")\n", - "print(f\"RMSE: {rmse}\")\n", - "print(f\"R²: {r2}\")\n", - "\n", - "# Проверяем, достигнуты ли ориентиры\n", - "if r2 >= 0.75 and mae <= 10000 and rmse <= 20000:\n", - " print(\"Ориентиры для прогнозирования цены мобильных устройств достигнуты!\")\n", - "else:\n", - " print(\"Ориентиры для прогнозирования цены мобильных устройств не достигнуты.\")\n", - "\n", - "# Оптимизация тарифной сетки\n", - "# Убедитесь, что столбцы существуют\n", - "columns_to_group = ['Battery capacity (mAh)', 'Screen size (inches)', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera']\n", - "\n", - "# Рассчитываем среднюю цену для каждого значения каждого признака\n", - "for column in columns_to_group:\n", - " print(f\"Средняя цена для '{column}':\")\n", - " print(df.groupby(column)['Price'].mean())\n", - " print()\n", - "\n", - "# Рассчитываем среднюю цену для комбинаций признаков\n", - "# Например, для комбинации 'Battery capacity (mAh)' и 'RAM (MB)'\n", - "print(\"Средняя цена для комбинации 'Battery capacity (mAh)' и 'RAM (MB)':\")\n", - "print(df.groupby(['Battery capacity (mAh)', 'RAM (MB)'])['Price'].mean())\n", - "print()\n", - "\n", - "# Рассчитываем среднюю цену для комбинации 'Screen size (inches)' и 'Internal storage (GB)'\n", - "print(\"Средняя цена для комбинации 'Screen size (inches)' и 'Internal storage (GB)':\")\n", - "print(df.groupby(['Screen size (inches)', 'Internal storage (GB)'])['Price'].mean())\n", - "print()\n", - "\n", - "# Рассчитываем среднюю цену для комбинации 'Rear camera' и 'Front camera'\n", - "print(\"Средняя цена для комбинации 'Rear camera' и 'Front camera':\")\n", - "print(df.groupby(['Rear camera', 'Front camera'])['Price'].mean())\n", - "print()" + "# Обучение моделей и вывод результатов\n", + "for name, pipeline in pipelines:\n", + " pipeline.fit(X_train, y_train)\n", + " predictions = pipeline.predict(X_test)\n", + " print(f\"Model: {name} trained.\")\n", + " print(f\"MAE: {mean_absolute_error(y_test, predictions)}\")\n", + " print(f\"MSE: {mean_squared_error(y_test, predictions)}\")\n", + " print(f\"R²: {r2_score(y_test, predictions)}\")\n", + " print(\"-\" * 50)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Анализ применимости алгоритмов обучения с учителем для решения поставленных задач:\n", + "Линейная регрессия улучшила качество предсказаний по сравнению с базовой моделью, но показала меньшую эффективность, чем градиентный бустинг\n", "\n", - "1. Прогнозирование стоимости страховых взносов: Задача: Регрессия\n", + "* MAE уменьшился на 1410.98 (30% улучшение).\n", "\n", - "Свойства алгоритмов:\n", + "* MSE уменьшился на 24937480.22 (49% улучшение).\n", "\n", - "Линейная регрессия: Применимость: Хорошо подходит для задач, где зависимость между признаками и целевой переменной линейна. Преимущества: Проста в реализации, интерпретируема. Недостатки: Может плохо работать, если зависимость нелинейна.\n", + "* R² стал положительным (0.4925), что означает, что модель объясняет 49.25% изменчивости цены.\n", "\n", - "Деревья решений (регрессия): Применимость: Подходит для задач с нелинейными зависимостями. Преимущества: Может обрабатывать категориальные признаки, не требует масштабирования данных. Недостатки: Подвержены переобучению, могут давать нестабильные результаты.\n", + "Дерево решений оказалось наименее эффективным среди всех моделей, показав худшие результаты даже по сравнению с базовой моделью.\n", "\n", - "Случайный лес (регрессия): Применимость: Хорошо подходит для задач с нелинейными зависимостями и большим количеством признаков. Преимущества: Устойчив к переобучению, может обрабатывать категориальные признаки. Недостатки: Менее интерпретируем, чем линейная регрессия.\n", + "* MAE увеличился на 450.12 (9.6% ухудшение).\n", "\n", - "Градиентный бустинг (регрессия): Применимость: Подходит для задач с нелинейными зависимостями и сложными взаимосвязями между признаками. Преимущества: Может достигать высокой точности, устойчив к переобучению. Недостатки: Сложнее в настройке, чем случайный лес, менее интерпретируем.\n", + "* MSE увеличился на 5982419.59 (11.8% ухудшение).\n", "\n", - "Нейронные сети (регрессия): Применимость: Подходит для задач с очень сложными зависимостями и большим количеством данных. Преимущества: Может моделировать очень сложные зависимости. Недостатки: Требует большого количества данных, сложнее в настройке и интерпретации.\n", + "* R² стал еще ниже (-0.1199), что указывает на то, что модель работает хуже, чем базовая.\n", "\n", - "#### Вывод:\n", + "Градиентный бустинг показал лучшие результаты среди всех моделей:\n", "\n", - "Линейная регрессия: Может быть хорошим выбором для начала, особенно если зависимость между признаками и целевой переменной линейна.\n", + "* MAE уменьшился на 1869.39 (40% улучшение) по сравнению с базовой моделью.\n", "\n", - "Деревья решений и случайный лес: Подходят для задач с нелинейными зависимостями.\n", + "* MSE уменьшился на 26820956.53 (53% улучшение) по сравнению с базовой моделью.\n", "\n", - "Градиентный бустинг: Может давать более высокую точность, чем случайный лес, но требует больше времени на настройку.\n", + "* R² достиг 0.5298, что означает, что модель объясняет 52.98% изменчивости цены.\n", "\n", - "Нейронные сети: Могут быть излишними для этой задачи, если данных недостаточно много.\n", + "Таким образом, градиентный бустинг является наиболее подходящей моделью для предсказания цены мобильных телефонов на основе выбранных признаков." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Классификация \n", "\n", - "2. Оптимизация тарифной сетки: Задача: Классификация (группировка клиентов по группам риска)\n", + "Цель: Целью классификации является разработка модели, которая будет предсказывать категорию цены мобильного телефона на основе его технических характеристик и функциональных особенностей.\n", "\n", - "Свойства алгоритмов:\n", + "Применение классификации:\n", "\n", - "Логистическая регрессия: Применимость: Хорошо подходит для задач бинарной классификации, где зависимость между признаками и целевой переменной линейна. Преимущества: Проста в реализации, интерпретируема. Недостатки: Может плохо работать, если зависимость нелинейна.\n", + "1. Рыночная аналитика:\n", "\n", - "Деревья решений (классификация): Применимость: Подходит для задач с нелинейными зависимостями. Преимущества: Может обрабатывать категориальные признаки, не требует масштабирования данных. Недостатки: Подвержены переобучению, могут давать нестабильные результаты.\n", + "* Помогает производителям и продавцам телефонов определять целевую аудиторию для конкретных моделей.\n", "\n", - "Случайный лес (классификация): Применимость: Хорошо подходит для задач с нелинейными зависимостями и большим количеством признаков. Преимущества: Устойчив к переобучению, может обрабатывать категориальные признаки. Недостатки: Менее интерпретируем, чем линейная регрессия.\n", + "* Позволяет анализировать конкуренцию в разных ценовых сегментах.\n", "\n", - "Градиентный бустинг (классификация): Применимость: Подходит для задач с нелинейными зависимостями и сложными взаимосвязями между признаками. Преимущества: Может достигать высокой точности, устойчив к переобучению. Недостатки: Сложнее в настройке, чем случайный лес, менее интерпретируем.\n", + "2. Потребительские рекомендации:\n", "\n", - "Нейронные сети (классификация): Применимость: Подходит для задач с очень сложными зависимостями и большим количеством данных. Преимущества: Может моделировать очень сложные зависимости. Недостатки: Требует большого количества данных, сложнее в настройке и интерпретации.\n", + "* Помогает пользователям выбирать телефоны, соответствующие их бюджету и требованиям.\n", "\n", - "#### Вывод:\n", - "\n", - "Логистическая регрессия: Может быть хорошим выбором для начала, особенно если зависимость между признаками и целевой переменной линейна.\n", - "\n", - "Деревья решений и случайный лес: Подходят для задач с нелинейными зависимостями.\n", - "\n", - "Градиентный бустинг: Может давать более высокую точность, чем случайный лес, но требует больше времени на настройку.\n", - "\n", - "Нейронные сети: Могут быть излишними для этой задачи, если данных недостаточно много.\n", - "\n", - "1. Прогнозирование стоимости страховых взносов: Выбранные модели:\n", - "\n", - "Линейная регрессия\n", - "\n", - "Случайный лес (регрессия)\n", - "\n", - "Градиентный бустинг (регрессия)\n", - "\n", - "2. Оптимизация тарифной сетки: Выбранные модели:\n", - "\n", - "Логистическая регрессия\n", - "\n", - "Случайный лес (классификация)\n", - "\n", - "Градиентный бустинг (классификация)" + "* Упрощает процесс сравнения телефонов в рамках одной ценовой категории." ] }, { @@ -1051,178 +680,30 @@ "name": "stdout", "output_type": "stream", "text": [ - "Результаты для задачи регрессии:\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", - " warnings.warn(\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: Linear Regression\n", - "MAE: 5424.128251450574\n", - "MSE: 143399695.59118932\n", - "RMSE: 11974.961193723733\n", - "R²: 0.4559750691933513\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", - " warnings.warn(\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: Random Forest Regression\n", - "MAE: 4022.856102941176\n", - "MSE: 107013897.40805219\n", - "RMSE: 10344.752167551052\n", - "R²: 0.5940142836932047\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", - " warnings.warn(\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: Gradient Boosting Regression\n", - "MAE: 4136.035916841655\n", - "MSE: 90628419.64103268\n", - "RMSE: 9519.895988981849\n", - "R²: 0.656176956854307\n", - "\n", - "Результаты для задачи классификации:\n", - "Model: Logistic Regression\n", - "Accuracy: 0.8137254901960784\n", - "\n", - "Model: Random Forest Classification\n", - "Accuracy: 0.8627450980392157\n", - "\n", - "Model: Gradient Boosting Classification\n", - "Accuracy: 0.8578431372549019\n", - "\n" + "Размер обучающей выборки: (1004, 18)\n", + "Размер тестовой выборки: (252, 18)\n" ] } ], "source": [ "import pandas as pd\n", "from sklearn.model_selection import train_test_split\n", - "from sklearn.preprocessing import StandardScaler\n", - "from sklearn.linear_model import LinearRegression, LogisticRegression\n", - "from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n", - "from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier\n", - "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score, accuracy_score\n", "\n", - "# Загружаем набор данных\n", - "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", + "# Выбор признаков и целевой переменной\n", + "features = [\n", + " 'Brand', 'Battery capacity (mAh)',\n", + " 'Screen size (inches)', 'Touchscreen', 'Resolution x', 'Resolution y',\n", + " 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera',\n", + " 'Front camera', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS',\n", + " 'Number of SIMs', '3G', '4G/ LTE'\n", + "]\n", + "target = 'Price'\n", "\n", - "# Удаление пустого столбца по имени\n", - "df = df.drop('Unnamed: 0', axis=1)\n", + "# Разделение данных на обучающую и тестовую выборки\n", + "X_train, X_test, y_train, y_test = train_test_split(df[features], df[target], test_size=0.2, random_state=42)\n", "\n", - "# Преобразуем категориальные переменные в числовые\n", - "df = pd.get_dummies(df, columns=['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE'], drop_first=True)\n", - "\n", - "# Убеждаемся, что все столбцы, которые должны быть числовыми, действительно являются числовыми\n", - "numeric_columns = ['Battery capacity (mAh)', 'Screen size (inches)', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera', 'Price']\n", - "for column in numeric_columns:\n", - " df[column] = pd.to_numeric(df[column], errors='coerce')\n", - "\n", - "# Удаляем строки с пропущенными значениями, которые могли возникнуть при преобразовании\n", - "df.dropna(subset=numeric_columns, inplace=True)\n", - "\n", - "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n", - "X_reg = df.drop('Price', axis=1)\n", - "y_reg = df['Price']\n", - "\n", - "# Разделяем данные на обучающую и тестовую выборки для задачи регрессии\n", - "X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.2, random_state=42)\n", - "\n", - "# Стандартизируем признаки для задачи регрессии\n", - "scaler_reg = StandardScaler()\n", - "X_train_reg = scaler_reg.fit_transform(X_train_reg)\n", - "X_test_reg = scaler_reg.transform(X_test_reg)\n", - "\n", - "# Список моделей для задачи регрессии\n", - "models_reg = {\n", - " \"Linear Regression\": LinearRegression(),\n", - " \"Random Forest Regression\": RandomForestRegressor(),\n", - " \"Gradient Boosting Regression\": GradientBoostingRegressor()\n", - "}\n", - "\n", - "# Обучаем и оцениваем модели для задачи регрессии\n", - "print(\"Результаты для задачи регрессии:\")\n", - "for name, model in models_reg.items():\n", - " model.fit(X_train_reg, y_train_reg)\n", - " y_pred_reg = model.predict(X_test_reg)\n", - " mae = mean_absolute_error(y_test_reg, y_pred_reg)\n", - " mse = mean_squared_error(y_test_reg, y_pred_reg)\n", - " rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)\n", - " r2 = r2_score(y_test_reg, y_pred_reg)\n", - " print(f\"Model: {name}\")\n", - " print(f\"MAE: {mae}\")\n", - " print(f\"MSE: {mse}\")\n", - " print(f\"RMSE: {rmse}\")\n", - " print(f\"R²: {r2}\")\n", - " print()\n", - "\n", - "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n", - "X_class = df.drop('Price', axis=1)\n", - "y_class = (df['Price'] > df['Price'].mean()).astype(int)\n", - "\n", - "# Разделяем данные на обучающую и тестовую выборки для задачи классификации\n", - "X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.3, random_state=42)\n", - "\n", - "# Стандартизируем признаки для задачи классификации\n", - "scaler_class = StandardScaler()\n", - "X_train_class = scaler_class.fit_transform(X_train_class)\n", - "X_test_class = scaler_class.transform(X_test_class)\n", - "\n", - "# Список моделей для задачи классификации\n", - "models_class = {\n", - " \"Logistic Regression\": LogisticRegression(),\n", - " \"Random Forest Classification\": RandomForestClassifier(),\n", - " \"Gradient Boosting Classification\": GradientBoostingClassifier()\n", - "}\n", - "\n", - "# Обучаем и оцениваем модели для задачи классификации\n", - "print(\"Результаты для задачи классификации:\")\n", - "for name, model in models_class.items():\n", - " model.fit(X_train_class, y_train_class)\n", - " y_pred_class = model.predict(X_test_class)\n", - " accuracy = accuracy_score(y_test_class, y_pred_class)\n", - " print(f\"Model: {name}\")\n", - " print(f\"Accuracy: {accuracy}\")\n", - " print()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "1. Прогнозирование стоимости мобильных телефонов: \n", - "\n", - "Конвейер для задачи регрессии:" + "print(\"Размер обучающей выборки:\", X_train.shape)\n", + "print(\"Размер тестовой выборки:\", X_test.shape)" ] }, { @@ -1234,22 +715,19 @@ "name": "stdout", "output_type": "stream", "text": [ - "Результаты для задачи регрессии:\n", - "Model: Linear Regression\n", - "MAE: 4695.532622690401\n", - "MSE: 65643669.229680344\n", - "RMSE: 8102.078080941972\n", - "R²: 0.6878208068254403\n", - "\n" + "PriceCategory\n", + "1 946\n", + "2 946\n", + "0 946\n", + "Name: count, dtype: int64\n", + "Гиперпараметры для логистической регрессии:\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", - " warnings.warn(\n", - "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", + "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\linear_model\\_sag.py:349: ConvergenceWarning: The max_iter was reached which means the coef_ did not converge\n", " warnings.warn(\n" ] }, @@ -1257,437 +735,205 @@ "name": "stdout", "output_type": "stream", "text": [ - "Model: Random Forest Regression\n", - "MAE: 4002.1279166666664\n", - "MSE: 88540074.860938\n", - "RMSE: 9409.573574872455\n", - "R²: 0.578933209278842\n", - "\n", - "Model: Gradient Boosting Regression\n", - "MAE: 4080.6847402556627\n", - "MSE: 75338600.25148971\n", - "RMSE: 8679.781117717757\n", - "R²: 0.6417149784982356\n", - "\n" + "Accuracy: 0.8891\n", + "Precision: 0.8888\n", + "Recall: 0.8891\n", + "F1-Score: 0.8881\n", + "ROC-AUC: 0.9674\n", + "Гиперпараметры для случайного леса:\n", + "Accuracy: 0.9525\n", + "Precision: 0.9540\n", + "Recall: 0.9525\n", + "F1-Score: 0.9524\n", + "ROC-AUC: 0.9929\n", + "Гиперпараметры для градиентного бустинга:\n" ] }, { - "name": "stderr", - "output_type": "stream", - "text": [ - "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", - " warnings.warn(\n" + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[6], line 148\u001b[0m\n\u001b[0;32m 143\u001b[0m gb_pipeline \u001b[38;5;241m=\u001b[39m Pipeline([\n\u001b[0;32m 144\u001b[0m (\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mclassifier\u001b[39m\u001b[38;5;124m'\u001b[39m, GradientBoostingClassifier(random_state\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m42\u001b[39m))\n\u001b[0;32m 145\u001b[0m ])\n\u001b[0;32m 147\u001b[0m gb_random_search \u001b[38;5;241m=\u001b[39m RandomizedSearchCV(gb_pipeline, param_distributions\u001b[38;5;241m=\u001b[39mgb_param_dist, n_iter\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m50\u001b[39m, cv\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m5\u001b[39m, random_state\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m42\u001b[39m, n_jobs\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m)\n\u001b[1;32m--> 148\u001b[0m \u001b[43mgb_random_search\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my_train\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 149\u001b[0m gb_best_model \u001b[38;5;241m=\u001b[39m gb_random_search\u001b[38;5;241m.\u001b[39mbest_estimator_\n\u001b[0;32m 150\u001b[0m gb_results \u001b[38;5;241m=\u001b[39m evaluate_model(gb_best_model, X_test, y_test)\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473\u001b[0m, in \u001b[0;36m_fit_context..decorator..wrapper\u001b[1;34m(estimator, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1466\u001b[0m estimator\u001b[38;5;241m.\u001b[39m_validate_params()\n\u001b[0;32m 1468\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m config_context(\n\u001b[0;32m 1469\u001b[0m skip_parameter_validation\u001b[38;5;241m=\u001b[39m(\n\u001b[0;32m 1470\u001b[0m prefer_skip_nested_validation \u001b[38;5;129;01mor\u001b[39;00m global_skip_validation\n\u001b[0;32m 1471\u001b[0m )\n\u001b[0;32m 1472\u001b[0m ):\n\u001b[1;32m-> 1473\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfit_method\u001b[49m\u001b[43m(\u001b[49m\u001b[43mestimator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\model_selection\\_search.py:1019\u001b[0m, in \u001b[0;36mBaseSearchCV.fit\u001b[1;34m(self, X, y, **params)\u001b[0m\n\u001b[0;32m 1013\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_format_results(\n\u001b[0;32m 1014\u001b[0m all_candidate_params, n_splits, all_out, all_more_results\n\u001b[0;32m 1015\u001b[0m )\n\u001b[0;32m 1017\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m results\n\u001b[1;32m-> 1019\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_run_search\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevaluate_candidates\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1021\u001b[0m \u001b[38;5;66;03m# multimetric is determined here because in the case of a callable\u001b[39;00m\n\u001b[0;32m 1022\u001b[0m \u001b[38;5;66;03m# self.scoring the return type is only known after calling\u001b[39;00m\n\u001b[0;32m 1023\u001b[0m first_test_score \u001b[38;5;241m=\u001b[39m all_out[\u001b[38;5;241m0\u001b[39m][\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtest_scores\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\model_selection\\_search.py:1960\u001b[0m, in \u001b[0;36mRandomizedSearchCV._run_search\u001b[1;34m(self, evaluate_candidates)\u001b[0m\n\u001b[0;32m 1958\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_run_search\u001b[39m(\u001b[38;5;28mself\u001b[39m, evaluate_candidates):\n\u001b[0;32m 1959\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Search n_iter candidates from param_distributions\"\"\"\u001b[39;00m\n\u001b[1;32m-> 1960\u001b[0m \u001b[43mevaluate_candidates\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1961\u001b[0m \u001b[43m \u001b[49m\u001b[43mParameterSampler\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1962\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparam_distributions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mn_iter\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrandom_state\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrandom_state\u001b[49m\n\u001b[0;32m 1963\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1964\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\model_selection\\_search.py:965\u001b[0m, in \u001b[0;36mBaseSearchCV.fit..evaluate_candidates\u001b[1;34m(candidate_params, cv, more_results)\u001b[0m\n\u001b[0;32m 957\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mverbose \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m 958\u001b[0m \u001b[38;5;28mprint\u001b[39m(\n\u001b[0;32m 959\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFitting \u001b[39m\u001b[38;5;132;01m{0}\u001b[39;00m\u001b[38;5;124m folds for each of \u001b[39m\u001b[38;5;132;01m{1}\u001b[39;00m\u001b[38;5;124m candidates,\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 960\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m totalling \u001b[39m\u001b[38;5;132;01m{2}\u001b[39;00m\u001b[38;5;124m fits\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(\n\u001b[0;32m 961\u001b[0m n_splits, n_candidates, n_candidates \u001b[38;5;241m*\u001b[39m n_splits\n\u001b[0;32m 962\u001b[0m )\n\u001b[0;32m 963\u001b[0m )\n\u001b[1;32m--> 965\u001b[0m out \u001b[38;5;241m=\u001b[39m \u001b[43mparallel\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 966\u001b[0m \u001b[43m \u001b[49m\u001b[43mdelayed\u001b[49m\u001b[43m(\u001b[49m\u001b[43m_fit_and_score\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 967\u001b[0m \u001b[43m \u001b[49m\u001b[43mclone\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbase_estimator\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 968\u001b[0m \u001b[43m \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 969\u001b[0m \u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 970\u001b[0m \u001b[43m \u001b[49m\u001b[43mtrain\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtrain\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 971\u001b[0m \u001b[43m \u001b[49m\u001b[43mtest\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtest\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 972\u001b[0m \u001b[43m \u001b[49m\u001b[43mparameters\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mparameters\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 973\u001b[0m \u001b[43m \u001b[49m\u001b[43msplit_progress\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43msplit_idx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mn_splits\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 974\u001b[0m \u001b[43m \u001b[49m\u001b[43mcandidate_progress\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mcand_idx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mn_candidates\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 975\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mfit_and_score_kwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 976\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 977\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[43mcand_idx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparameters\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[43msplit_idx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[43mtrain\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtest\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mproduct\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 978\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43menumerate\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mcandidate_params\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 979\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43menumerate\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mcv\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msplit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mrouted_params\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msplitter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msplit\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 980\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 981\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 983\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(out) \u001b[38;5;241m<\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[0;32m 984\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[0;32m 985\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNo fits were performed. \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 986\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWas the CV iterator empty? \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 987\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWere there no candidates?\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 988\u001b[0m )\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\utils\\parallel.py:74\u001b[0m, in \u001b[0;36mParallel.__call__\u001b[1;34m(self, iterable)\u001b[0m\n\u001b[0;32m 69\u001b[0m config \u001b[38;5;241m=\u001b[39m get_config()\n\u001b[0;32m 70\u001b[0m iterable_with_config \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m 71\u001b[0m (_with_config(delayed_func, config), args, kwargs)\n\u001b[0;32m 72\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m delayed_func, args, kwargs \u001b[38;5;129;01min\u001b[39;00m iterable\n\u001b[0;32m 73\u001b[0m )\n\u001b[1;32m---> 74\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__call__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43miterable_with_config\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\joblib\\parallel.py:2007\u001b[0m, in \u001b[0;36mParallel.__call__\u001b[1;34m(self, iterable)\u001b[0m\n\u001b[0;32m 2001\u001b[0m \u001b[38;5;66;03m# The first item from the output is blank, but it makes the interpreter\u001b[39;00m\n\u001b[0;32m 2002\u001b[0m \u001b[38;5;66;03m# progress until it enters the Try/Except block of the generator and\u001b[39;00m\n\u001b[0;32m 2003\u001b[0m \u001b[38;5;66;03m# reaches the first `yield` statement. This starts the asynchronous\u001b[39;00m\n\u001b[0;32m 2004\u001b[0m \u001b[38;5;66;03m# dispatch of the tasks to the workers.\u001b[39;00m\n\u001b[0;32m 2005\u001b[0m \u001b[38;5;28mnext\u001b[39m(output)\n\u001b[1;32m-> 2007\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m output \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mreturn_generator \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;43mlist\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43moutput\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\joblib\\parallel.py:1650\u001b[0m, in \u001b[0;36mParallel._get_outputs\u001b[1;34m(self, iterator, pre_dispatch)\u001b[0m\n\u001b[0;32m 1647\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m\n\u001b[0;32m 1649\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backend\u001b[38;5;241m.\u001b[39mretrieval_context():\n\u001b[1;32m-> 1650\u001b[0m \u001b[38;5;28;01myield from\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_retrieve()\n\u001b[0;32m 1652\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mGeneratorExit\u001b[39;00m:\n\u001b[0;32m 1653\u001b[0m \u001b[38;5;66;03m# The generator has been garbage collected before being fully\u001b[39;00m\n\u001b[0;32m 1654\u001b[0m \u001b[38;5;66;03m# consumed. This aborts the remaining tasks if possible and warn\u001b[39;00m\n\u001b[0;32m 1655\u001b[0m \u001b[38;5;66;03m# the user if necessary.\u001b[39;00m\n\u001b[0;32m 1656\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exception \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n", + "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\joblib\\parallel.py:1762\u001b[0m, in \u001b[0;36mParallel._retrieve\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1757\u001b[0m \u001b[38;5;66;03m# If the next job is not ready for retrieval yet, we just wait for\u001b[39;00m\n\u001b[0;32m 1758\u001b[0m \u001b[38;5;66;03m# async callbacks to progress.\u001b[39;00m\n\u001b[0;32m 1759\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ((\u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jobs) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m) \u001b[38;5;129;01mor\u001b[39;00m\n\u001b[0;32m 1760\u001b[0m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jobs[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mget_status(\n\u001b[0;32m 1761\u001b[0m timeout\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtimeout) \u001b[38;5;241m==\u001b[39m TASK_PENDING)):\n\u001b[1;32m-> 1762\u001b[0m \u001b[43mtime\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msleep\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m0.01\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1763\u001b[0m \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[0;32m 1765\u001b[0m \u001b[38;5;66;03m# We need to be careful: the job list can be filling up as\u001b[39;00m\n\u001b[0;32m 1766\u001b[0m \u001b[38;5;66;03m# we empty it and Python list are not thread-safe by\u001b[39;00m\n\u001b[0;32m 1767\u001b[0m \u001b[38;5;66;03m# default hence the use of the lock\u001b[39;00m\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "import pandas as pd\n", - "from sklearn.model_selection import train_test_split, GridSearchCV\n", - "from sklearn.preprocessing import StandardScaler\n", - "from sklearn.linear_model import LinearRegression\n", - "from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor\n", - "from sklearn.pipeline import Pipeline\n", + "from imblearn.over_sampling import SMOTE\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import OneHotEncoder, LabelEncoder\n", "from sklearn.compose import ColumnTransformer\n", - "from sklearn.preprocessing import OneHotEncoder\n", - "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n", - "\n", - "# Загружаем набор данных\n", - "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", - "\n", - "# Удаление пустого столбца по имени\n", - "df = df.drop('Unnamed: 0', axis=1)\n", - "\n", - "# Определяем категориальные и числовые столбцы\n", - "categorical_cols = ['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE']\n", - "numerical_cols = ['Battery capacity (mAh)', 'Screen size (inches)', 'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera', 'Number of SIMs']\n", - "\n", - "# Создаем преобразователь для категориальных и числовых столбцов\n", - "preprocessor = ColumnTransformer(\n", - " transformers=[\n", - " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_cols),\n", - " ('num', StandardScaler(), numerical_cols)\n", - " ])\n", - "\n", - "# Список моделей для задачи регрессии\n", - "models_reg = {\n", - " \"Linear Regression\": LinearRegression(),\n", - " \"Random Forest Regression\": RandomForestRegressor(),\n", - " \"Gradient Boosting Regression\": GradientBoostingRegressor()\n", - "}\n", - "\n", - "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n", - "X_reg = df[categorical_cols + numerical_cols]\n", - "y_reg = df['Price']\n", - "\n", - "# Разделяем данные на обучающую и тестовую выборки для задачи регрессии\n", - "X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.3, random_state=42)\n", - "\n", - "# Обучаем и оцениваем модели для задачи регрессии\n", - "print(\"Результаты для задачи регрессии:\")\n", - "for name, model in models_reg.items():\n", - " pipeline = Pipeline(steps=[\n", - " ('preprocessor', preprocessor),\n", - " ('model', model)\n", - " ])\n", - " pipeline.fit(X_train_reg, y_train_reg)\n", - " y_pred_reg = pipeline.predict(X_test_reg)\n", - " mae = mean_absolute_error(y_test_reg, y_pred_reg)\n", - " mse = mean_squared_error(y_test_reg, y_pred_reg)\n", - " rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)\n", - " r2 = r2_score(y_test_reg, y_pred_reg)\n", - " print(f\"Model: {name}\")\n", - " print(f\"MAE: {mae}\")\n", - " print(f\"MSE: {mse}\")\n", - " print(f\"RMSE: {rmse}\")\n", - " print(f\"R²: {r2}\")\n", - " print()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "2. Оптимизация тарифной сетки:\n", - "\n", - " Конвейер для задачи классификации:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Результаты для задачи классификации:\n", - "Model: Logistic Regression\n", - "Accuracy: 0.8713235294117647\n", - "\n", - "Model: Random Forest Classification\n", - "Accuracy: 0.8786764705882353\n", - "\n", - "Model: Gradient Boosting Classification\n", - "Accuracy: 0.8676470588235294\n", - "\n" - ] - } - ], - "source": [ - "import pandas as pd\n", - "from sklearn.model_selection import train_test_split, GridSearchCV\n", - "from sklearn.preprocessing import StandardScaler\n", - "from sklearn.linear_model import LinearRegression\n", - "from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor\n", "from sklearn.pipeline import Pipeline\n", - "from sklearn.compose import ColumnTransformer\n", - "from sklearn.preprocessing import OneHotEncoder\n", - "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n", - "\n", - "# Загружаем набор данных\n", - "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", - "\n", - "# Удаление пустого столбца по имени\n", - "df = df.drop('Unnamed: 0', axis=1)\n", - "\n", - "# Определяем категориальные и числовые столбцы\n", - "categorical_cols = ['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE']\n", - "numerical_cols = ['Battery capacity (mAh)', 'Screen size (inches)', 'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera', 'Number of SIMs']\n", - "\n", - "# Создаем преобразователь для категориальных и числовых столбцов\n", - "preprocessor = ColumnTransformer(\n", - " transformers=[\n", - " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_cols),\n", - " ('num', StandardScaler(), numerical_cols)\n", - " ])\n", - "\n", - "# Список моделей для задачи классификации\n", - "models_class = {\n", - " \"Logistic Regression\": LogisticRegression(),\n", - " \"Random Forest Classification\": RandomForestClassifier(),\n", - " \"Gradient Boosting Classification\": GradientBoostingClassifier()\n", - "}\n", - "\n", - "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n", - "X_class = df[categorical_cols + numerical_cols]\n", - "y_class = (df['Price'] > df['Price'].mean()).astype(int)\n", - "\n", - "# Разделяем данные на обучающую и тестовую выборки для задачи классификации\n", - "X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.2, random_state=42)\n", - "\n", - "# Обучаем и оцениваем модели для задачи классификации\n", - "print(\"Результаты для задачи классификации:\")\n", - "for name, model in models_class.items():\n", - " pipeline = Pipeline(steps=[\n", - " ('preprocessor', preprocessor),\n", - " ('model', model)\n", - " ])\n", - " pipeline.fit(X_train_class, y_train_class)\n", - " y_pred_class = pipeline.predict(X_test_class)\n", - " accuracy = accuracy_score(y_test_class, y_pred_class)\n", - " print(f\"Model: {name}\")\n", - " print(f\"Accuracy: {accuracy}\")\n", - " print()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "1. Прогнозирование стоимости страховых взносов:\n", - "\n", - "Настройка гиперпараметров для задачи регрессии:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Результаты для задачи регрессии:\n", - "Model: Linear Regression\n", - "Best Parameters: {}\n", - "MAE: 4695.532622690401\n", - "MSE: 65643669.229680344\n", - "RMSE: 8102.078080941972\n", - "R²: 0.6878208068254403\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", - " warnings.warn(\n" - ] - } - ], - "source": [ - "import pandas as pd\n", - "from sklearn.model_selection import train_test_split, GridSearchCV\n", - "from sklearn.preprocessing import StandardScaler\n", - "from sklearn.linear_model import LinearRegression\n", - "from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor\n", - "from sklearn.pipeline import Pipeline\n", - "from sklearn.compose import ColumnTransformer\n", - "from sklearn.preprocessing import OneHotEncoder\n", - "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n", - "\n", - "# Загружаем набор данных\n", - "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", - "\n", - "# Удаление пустого столбца по имени\n", - "df = df.drop('Unnamed: 0', axis=1)\n", - "\n", - "# Определяем категориальные и числовые столбцы\n", - "categorical_cols = ['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE']\n", - "numerical_cols = ['Battery capacity (mAh)', 'Screen size (inches)', 'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera', 'Number of SIMs']\n", - "\n", - "# Создаем преобразователь для категориальных и числовых столбцов\n", - "preprocessor = ColumnTransformer(\n", - " transformers=[\n", - " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_cols),\n", - " ('num', StandardScaler(), numerical_cols)\n", - " ])\n", - "\n", - "# Список моделей и их гиперпараметров для задачи регрессии\n", - "models_reg = {\n", - " \"Linear Regression\": (LinearRegression(), {}),\n", - " \"Random Forest Regression\": (RandomForestRegressor(), {\n", - " 'model__n_estimators': [100, 200],\n", - " 'model__max_depth': [None, 10, 20]\n", - " }),\n", - " \"Gradient Boosting Regression\": (GradientBoostingRegressor(), {\n", - " 'model__n_estimators': [100, 200],\n", - " 'model__learning_rate': [0.01, 0.1],\n", - " 'model__max_depth': [3, 5]\n", - " })\n", - "}\n", - "\n", - "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n", - "X_reg = df[categorical_cols + numerical_cols]\n", - "y_reg = df['Price']\n", - "\n", - "# Разделяем данные на обучающую и тестовую выборки для задачи регрессии\n", - "X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.3, random_state=42)\n", - "\n", - "# Обучаем и оцениваем модели для задачи регрессии\n", - "print(\"Результаты для задачи регрессии:\")\n", - "for name, (model, params) in models_reg.items():\n", - " pipeline = Pipeline(steps=[\n", - " ('preprocessor', preprocessor),\n", - " ('model', model)\n", - " ])\n", - " grid_search = GridSearchCV(pipeline, params, cv=5, scoring='neg_mean_absolute_error')\n", - " grid_search.fit(X_train_reg, y_train_reg)\n", - " best_model = grid_search.best_estimator_\n", - " y_pred_reg = best_model.predict(X_test_reg)\n", - " mae = mean_absolute_error(y_test_reg, y_pred_reg)\n", - " mse = mean_squared_error(y_test_reg, y_pred_reg)\n", - " rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)\n", - " r2 = r2_score(y_test_reg, y_pred_reg)\n", - " print(f\"Model: {name}\")\n", - " print(f\"Best Parameters: {grid_search.best_params_}\")\n", - " print(f\"MAE: {mae}\")\n", - " print(f\"MSE: {mse}\")\n", - " print(f\"RMSE: {rmse}\")\n", - " print(f\"R²: {r2}\")\n", - " print()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "2. Оптимизация тарифной сетки:\n", - "\n", - "Настройка гиперпараметров для задачи классификации:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Результаты для задачи классификации:\n", - "Model: Logistic Regression\n", - "Best Parameters: {'model__C': 1, 'model__solver': 'lbfgs'}\n", - "Accuracy: 0.8713235294117647\n", - "\n", - "Model: Random Forest Classification\n", - "Best Parameters: {'model__max_depth': None, 'model__n_estimators': 200}\n", - "Accuracy: 0.8676470588235294\n", - "\n", - "Model: Gradient Boosting Classification\n", - "Best Parameters: {'model__learning_rate': 0.1, 'model__max_depth': 5, 'model__n_estimators': 200}\n", - "Accuracy: 0.8602941176470589\n", - "\n" - ] - } - ], - "source": [ - "import pandas as pd\n", - "from sklearn.model_selection import train_test_split, GridSearchCV\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier\n", - "from sklearn.pipeline import Pipeline\n", - "from sklearn.compose import ColumnTransformer\n", - "from sklearn.preprocessing import OneHotEncoder\n", - "from sklearn.metrics import accuracy_score\n", + "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score\n", + "from scipy.stats import uniform, randint\n", + "from sklearn.model_selection import RandomizedSearchCV\n", "\n", - "# Загружаем набор данных\n", - "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", + "# Выбор признаков и целевой переменной\n", + "features = [\n", + " 'Brand', 'Battery capacity (mAh)', 'Screen size (inches)', 'Touchscreen', \n", + " 'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', \n", + " 'Rear camera', 'Front camera', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', \n", + " 'Number of SIMs', '3G', '4G/ LTE'\n", + "]\n", + "target = 'PriceCategory' # Целевая переменная: категория цены\n", "\n", - "# Удаление пустого столбца по имени\n", - "df = df.drop('Unnamed: 0', axis=1)\n", + "# Преобразование целевой переменной в категории (например, бюджетные, средний класс, премиум)\n", + "bins = [0, 10000, 30000, float('inf')]\n", + "labels = ['Budget', 'Mid-Range', 'Premium']\n", + "df['PriceCategory'] = pd.cut(df['Price'], bins=bins, labels=labels)\n", "\n", - "# Определяем категориальные и числовые столбцы\n", - "categorical_cols = ['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE']\n", - "numerical_cols = ['Battery capacity (mAh)', 'Screen size (inches)', 'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera', 'Number of SIMs']\n", + "# Преобразование категорий в числа\n", + "label_encoder = LabelEncoder()\n", + "df[target] = label_encoder.fit_transform(df[target])\n", + "\n", + "# Определение категориальных и числовых признаков\n", + "categorical_features = [\n", + " 'Brand', 'Touchscreen', 'Operating system', 'Wi-Fi', \n", + " 'Bluetooth', 'GPS', '3G', '4G/ LTE'\n", + "]\n", + "numeric_features = [\n", + " 'Battery capacity (mAh)', 'Processor', 'Screen size (inches)', 'Resolution x', \n", + " 'Resolution y', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', \n", + " 'Front camera', 'Number of SIMs'\n", + "]\n", + "\n", + "# Препроцессор для обработки числовых и категориальных признаков\n", + "categorical_transformer = Pipeline(steps=[\n", + " ('onehot', OneHotEncoder(handle_unknown='ignore'))\n", + "])\n", + "\n", + "numeric_transformer = Pipeline(steps=[\n", + " ('scaler', StandardScaler())\n", + "])\n", "\n", - "# Создаем преобразователь для категориальных и числовых столбцов\n", "preprocessor = ColumnTransformer(\n", " transformers=[\n", - " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_cols),\n", - " ('num', StandardScaler(), numerical_cols)\n", + " ('num', numeric_transformer, numeric_features),\n", + " ('cat', categorical_transformer, categorical_features)\n", " ])\n", "\n", - "# Список моделей и их гиперпараметров для задачи классификации\n", - "models_class = {\n", - " \"Logistic Regression\": (LogisticRegression(), {\n", - " 'model__C': [0.1, 1, 10],\n", - " 'model__solver': ['liblinear', 'lbfgs']\n", - " }),\n", - " \"Random Forest Classification\": (RandomForestClassifier(), {\n", - " 'model__n_estimators': [100, 200],\n", - " 'model__max_depth': [None, 10, 20]\n", - " }),\n", - " \"Gradient Boosting Classification\": (GradientBoostingClassifier(), {\n", - " 'model__n_estimators': [100, 200],\n", - " 'model__learning_rate': [0.01, 0.1],\n", - " 'model__max_depth': [3, 5]\n", - " })\n", + "# Применение препроцессора\n", + "X = preprocessor.fit_transform(df[features])\n", + "y = df[target]\n", + "\n", + "# Балансировка классов с помощью SMOTE\n", + "smote = SMOTE(random_state=42)\n", + "X_resampled, y_resampled = smote.fit_resample(X, y)\n", + "\n", + "print(pd.Series(y_resampled).value_counts())\n", + "\n", + "# Разделение данных на обучающую и тестовую выборки\n", + "X_train, X_test, y_train, y_test = train_test_split(X_resampled, y_resampled, test_size=0.2, random_state=42)\n", + "\n", + "# Функция для оценки модели\n", + "def evaluate_model(model, X_test, y_test):\n", + " y_pred = model.predict(X_test)\n", + " y_pred_proba = model.predict_proba(X_test)\n", + " \n", + " accuracy = accuracy_score(y_test, y_pred)\n", + " precision = precision_score(y_test, y_pred, average='weighted') \n", + " recall = recall_score(y_test, y_pred, average='weighted') \n", + " f1 = f1_score(y_test, y_pred, average='weighted') \n", + " roc_auc = roc_auc_score(y_test, y_pred_proba, multi_class='ovr')\n", + " \n", + " print(f\"Accuracy: {accuracy:.4f}\")\n", + " print(f\"Precision: {precision:.4f}\")\n", + " print(f\"Recall: {recall:.4f}\")\n", + " print(f\"F1-Score: {f1:.4f}\")\n", + " print(f\"ROC-AUC: {roc_auc:.4f}\")\n", + " \n", + " return {\n", + " 'accuracy': accuracy,\n", + " 'precision': precision,\n", + " 'recall': recall,\n", + " 'f1': f1,\n", + " 'roc_auc': roc_auc\n", + " }\n", + "\n", + "# Логистическая регрессия\n", + "print(\"Гиперпараметры для логистической регрессии:\")\n", + "logreg_param_dist = {\n", + " 'classifier__C': uniform(loc=0, scale=4),\n", + " 'classifier__penalty': ['l1', 'l2'],\n", + " 'classifier__solver': ['liblinear', 'saga']\n", "}\n", "\n", - "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n", - "X_class = df[categorical_cols + numerical_cols]\n", - "y_class = (df['Price'] > df['Price'].mean()).astype(int)\n", + "logreg_pipeline = Pipeline([\n", + " ('classifier', LogisticRegression(max_iter=1000, random_state=42))\n", + "])\n", "\n", - "# Разделяем данные на обучающую и тестовую выборки для задачи классификации\n", - "X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.2, random_state=42)\n", + "logreg_random_search = RandomizedSearchCV(logreg_pipeline, param_distributions=logreg_param_dist, n_iter=50, cv=5, random_state=42, n_jobs=-1)\n", + "logreg_random_search.fit(X_train, y_train)\n", + "logreg_best_model = logreg_random_search.best_estimator_\n", + "logreg_results = evaluate_model(logreg_best_model, X_test, y_test)\n", "\n", - "# Обучаем и оцениваем модели для задачи классификации\n", - "print(\"Результаты для задачи классификации:\")\n", - "for name, (model, params) in models_class.items():\n", - " pipeline = Pipeline(steps=[\n", - " ('preprocessor', preprocessor),\n", - " ('model', model)\n", - " ])\n", - " grid_search = GridSearchCV(pipeline, params, cv=5, scoring='accuracy')\n", - " grid_search.fit(X_train_class, y_train_class)\n", - " best_model = grid_search.best_estimator_\n", - " y_pred_class = best_model.predict(X_test_class)\n", - " accuracy = accuracy_score(y_test_class, y_pred_class)\n", - " print(f\"Model: {name}\")\n", - " print(f\"Best Parameters: {grid_search.best_params_}\")\n", - " print(f\"Accuracy: {accuracy}\")\n", - " print()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "1. Прогнозирование стоимости страховых взносов: Задача: Регрессия\n", + "# Случайный лес\n", + "print(\"Гиперпараметры для случайного леса:\")\n", + "rf_param_dist = {\n", + " 'classifier__n_estimators': randint(100, 1000),\n", + " 'classifier__max_depth': [None] + list(randint(10, 100).rvs(10)),\n", + " 'classifier__min_samples_split': randint(2, 20),\n", + " 'classifier__min_samples_leaf': randint(1, 20),\n", + " 'classifier__bootstrap': [True, False]\n", + "}\n", "\n", - "Выбор метрик:\n", + "rf_pipeline = Pipeline([\n", + " ('classifier', RandomForestClassifier(random_state=42))\n", + "])\n", "\n", - "MAE (Mean Absolute Error): Средняя абсолютная ошибка. Показывает среднее отклонение предсказанных значений от фактических. Эта метрика легко интерпретируется, так как она измеряется в тех же единицах, что и целевая переменная (доллары).\n", + "rf_random_search = RandomizedSearchCV(rf_pipeline, param_distributions=rf_param_dist, n_iter=50, cv=5, random_state=42, n_jobs=-1)\n", + "rf_random_search.fit(X_train, y_train)\n", + "rf_best_model = rf_random_search.best_estimator_\n", + "rf_results = evaluate_model(rf_best_model, X_test, y_test)\n", "\n", - "MSE (Mean Squared Error): Среднеквадратичная ошибка. Показывает среднее квадратичное отклонение предсказанных значений от фактических. Эта метрика чувствительна к выбросам, так как ошибки возводятся в квадрат.\n", + "# Градиентный бустинг\n", + "print(\"Гиперпараметры для градиентного бустинга:\")\n", + "gb_param_dist = {\n", + " 'classifier__n_estimators': randint(100, 1000),\n", + " 'classifier__learning_rate': uniform(0.01, 0.5),\n", + " 'classifier__max_depth': [None] + list(randint(10, 100).rvs(10)),\n", + " 'classifier__min_samples_split': randint(2, 20),\n", + " 'classifier__min_samples_leaf': randint(1, 20),\n", + " 'classifier__subsample': uniform(0.5, 0.5)\n", + "}\n", "\n", - "RMSE (Root Mean Squared Error): Квадратный корень из среднеквадратичной ошибки. Показывает среднее отклонение предсказанных значений от фактических в тех же единицах, что и целевая переменная. Эта метрика также чувствительна к выбросам, но легче интерпретируется, чем MSE.\n", + "gb_pipeline = Pipeline([\n", + " ('classifier', GradientBoostingClassifier(random_state=42))\n", + "])\n", "\n", - "R² (R-squared): Коэффициент детерминации. Показывает, какую долю дисперсии целевой переменной объясняет модель. Значение R² близкое к 1 указывает на хорошее качество модели.\n", + "gb_random_search = RandomizedSearchCV(gb_pipeline, param_distributions=gb_param_dist, n_iter=50, cv=5, random_state=42, n_jobs=-1)\n", + "gb_random_search.fit(X_train, y_train)\n", + "gb_best_model = gb_random_search.best_estimator_\n", + "gb_results = evaluate_model(gb_best_model, X_test, y_test)\n", "\n", - "Обоснование:\n", + "# Вывод результатов\n", + "print(\"\\nРезультаты моделей:\")\n", + "print(\"\\nLogistic Regression:\")\n", + "for metric, value in logreg_results.items():\n", + " print(f\"{metric.capitalize()}: {value:.4f}\")\n", "\n", - "MAE: Хорошо подходит для задач, где важно понимать среднее отклонение предсказаний от фактических значений.\n", + "print(\"\\nRandom Forest:\")\n", + "for metric, value in rf_results.items():\n", + " print(f\"{metric.capitalize()}: {value:.4f}\")\n", "\n", - "MSE и RMSE: Полезны для задач, где важно минимизировать влияние выбросов, так как они возводят ошибки в квадрат.\n", - "\n", - "R²: Позволяет оценить, насколько хорошо модель объясняет вариацию целевой переменной.\n", - "\n", - "2. Оптимизация тарифной сетки: Задача: Классификация\n", - "\n", - "Выбор метрик:\n", - "\n", - "Accuracy: Доля правильных предсказаний среди всех предсказаний. Эта метрика показывает общую точность модели.\n", - "\n", - "Precision: Доля правильных положительных предсказаний среди всех положительных предсказаний. Эта метрика важна, если важно минимизировать количество ложноположительных результатов.\n", - "\n", - "Recall (Sensitivity): Доля правильных положительных предсказаний среди всех фактических положительных случаев. Эта метрика важна, если важно минимизировать количество ложноотрицательных результатов.\n", - "\n", - "F1-score: Гармоническое среднее между precision и recall. Эта метрика показывает баланс между precision и recall.\n", - "\n", - "Обоснование:\n", - "\n", - "Accuracy: Хорошо подходит для задач, где классы сбалансированы.\n", - "\n", - "Precision и Recall: Важны для задач, где важно минимизировать ошибки определенного типа (ложноположительные или ложноотрицательные).\n", - "\n", - "F1-score: Позволяет оценить баланс между precision и recall." + "print(\"\\nGradient Boosting:\")\n", + "for metric, value in gb_results.items():\n", + " print(f\"{metric.capitalize()}: {value:.4f}\")" ] }, { @@ -1696,574 +942,88 @@ "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Результаты для задачи регрессии:\n", - "Model: Linear Regression\n", - "Best Parameters: {}\n", - "MAE: 4808.184185261903\n", - "MSE: 77191075.38529098\n", - "RMSE: 8785.845171939407\n", - "R²: 0.7071551004885543\n", - "\n" + "ename": "AttributeError", + "evalue": "'dict' object has no attribute 'best_estimator'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[38], line 66\u001b[0m\n\u001b[0;32m 64\u001b[0m plot_roc_curve_multiclass(y_test, y_pred_proba, class_names, \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mROC Curve for \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmodel_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 65\u001b[0m \u001b[38;5;66;03m# Обученные модели\u001b[39;00m\n\u001b[1;32m---> 66\u001b[0m logreg_best_model \u001b[38;5;241m=\u001b[39m \u001b[43mlogreg_results\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbest_estimator\u001b[49m \u001b[38;5;66;03m# Обученная модель\u001b[39;00m\n\u001b[0;32m 67\u001b[0m rf_best_model \u001b[38;5;241m=\u001b[39m rf_results\u001b[38;5;241m.\u001b[39mbest_estimator_ \u001b[38;5;66;03m# Обученная модель\u001b[39;00m\n\u001b[0;32m 68\u001b[0m gb_best_model \u001b[38;5;241m=\u001b[39m gb_results\u001b[38;5;241m.\u001b[39mbest_estimator_ \n", + "\u001b[1;31mAttributeError\u001b[0m: 'dict' object has no attribute 'best_estimator'" ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", - " warnings.warn(\n", - "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", - " warnings.warn(\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: Random Forest Regression\n", - "Best Parameters: {'model__max_depth': None, 'model__n_estimators': 100}\n", - "MAE: 3931.812022058823\n", - "MSE: 99133452.49149376\n", - "RMSE: 9956.578352601548\n", - "R²: 0.6239108499500701\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.\n", - " warnings.warn(\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: Gradient Boosting Regression\n", - "Best Parameters: {'model__learning_rate': 0.1, 'model__max_depth': 5, 'model__n_estimators': 200}\n", - "MAE: 3741.1262483893015\n", - "MSE: 76106789.83221506\n", - "RMSE: 8723.920553983458\n", - "R²: 0.711268626466102\n", - "\n", - "Результаты для задачи классификации:\n", - "Model: Logistic Regression\n", - "Best Parameters: {'model__C': 1, 'model__solver': 'lbfgs'}\n", - "Accuracy: 0.8713235294117647\n", - "Precision: 0.8035714285714286\n", - "Recall: 0.6521739130434783\n", - "F1-score: 0.72\n", - "\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: Random Forest Classification\n", - "Best Parameters: {'model__max_depth': 20, 'model__n_estimators': 200}\n", - "Accuracy: 0.8676470588235294\n", - "Precision: 0.851063829787234\n", - "Recall: 0.5797101449275363\n", - "F1-score: 0.6896551724137931\n", - "\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhQAAAHHCAYAAADnOMH5AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABWdUlEQVR4nO3de1zO9/8/8MdVdJXqKulMkrMmZ5rlOJSYw2LmXAqzOS2n+G2GmMxhjG3msAnT2BznMJPzEHOKsUQ5E0MqlY7X6/eHb9fHpeK6er9Tlx733d63db3e7+t1Pd9Xb1fP63V6K4QQAkREREQSGJV0AERERGT4mFAQERGRZEwoiIiISDImFERERCQZEwoiIiKSjAkFERERScaEgoiIiCRjQkFERESSMaEgIiIiyZhQFJMrV67A29sbVlZWUCgU2Lp1q6z1X79+HQqFAuHh4bLWa8jatWuHdu3ayVZfamoqhg4dCkdHRygUCnz66aey1W0oeJ2VbqXh91OtWjUEBARolRX0+RceHg6FQoHr16+/9hgVCgWmT5/+2l+3rHmjE4r4+Hh89NFHqF69OkxNTaFSqeDl5YVvvvkGT58+LdbX9vf3xz///IMvv/wSa9euRbNmzYr19V6ngIAAKBQKqFSqAt/HK1euQKFQQKFQYP78+XrXf/fuXUyfPh3R0dEyRFt0s2fPRnh4OD7++GOsXbsWgwYNKtbXq1atmuZ9UygUMDc3R4sWLbBmzZpifV1D8+L79PyWkZFR0uHlc+zYMUyfPh1JSUl6Pe/gwYPw8/ODo6MjTExMYG9vj27dumHz5s3FE6iMSuLzb9euXUwaSli5kg6guOzcuRMffPABlEolBg8ejPr16yMrKwtHjhzBxIkTcfHiRSxfvrxYXvvp06eIiorCZ599hlGjRhXLa7i6uuLp06coX758sdT/KuXKlUN6ejq2b9+OPn36aO1bt24dTE1Ni/zhfvfuXcyYMQPVqlVDo0aNdH7enj17ivR6hdm/fz/efvttTJs2TdZ6X6ZRo0YYP348ACAhIQErV66Ev78/MjMzMWzYsNcWR2n3/Pv0PBMTkxKI5uWOHTuGGTNmICAgANbW1jo9Z9q0aQgNDUWtWrXw0UcfwdXVFY8ePcKuXbvQq1cvrFu3Dv379y/ewHUUGxsLI6P/fTct7PNv0KBB6Nu3L5RKZbHEsWvXLnz33XcFJhVPnz5FuXJv7J+7UuONfIevXbuGvn37wtXVFfv374eTk5Nm38iRIxEXF4edO3cW2+s/ePAAAHT+8CgKhUIBU1PTYqv/VZRKJby8vPDLL7/kSygiIiLQtWtXbNq06bXEkp6ejgoVKsj+x+S///6Du7u7bPXl5ORArVa/NM7KlStj4MCBmscBAQGoXr06Fi5cyITiOS++T3JRq9XIysoq0X9bGzduRGhoKHr37o2IiAitLw0TJ07En3/+iezs7BKL70UvJgiFff4ZGxvD2Nj4dYWlpSR/n2WKeAONGDFCABBHjx7V6fjs7GwRGhoqqlevLkxMTISrq6uYMmWKyMjI0DrO1dVVdO3aVfz111+iefPmQqlUCjc3N7F69WrNMdOmTRMAtDZXV1chhBD+/v6an5+X95zn7dmzR3h5eQkrKythbm4uateuLaZMmaLZf+3aNQFArFq1Sut5+/btE61atRIVKlQQVlZWonv37uLff/8t8PWuXLki/P39hZWVlVCpVCIgIECkpaW98v3y9/cX5ubmIjw8XCiVSvH48WPNvr///lsAEJs2bRIAxLx58zT7Hj16JMaPHy/q168vzM3NhaWlpejcubOIjo7WHHPgwIF879/z59m2bVvx1ltviVOnTonWrVsLMzMzMXbsWM2+tm3bauoaPHiwUCqV+c7f29tbWFtbizt37hR4foXFcO3aNSGEEPfv3xeBgYHC3t5eKJVK0aBBAxEeHq5VR97vZ968eWLhwoWievXqwsjISJw9e7bQ9zXv+npRs2bNhImJiVbZ4cOHRe/evYWLi4swMTERVapUEZ9++qlIT0/XOi7vd3X79m3Ro0cPYW5uLmxtbcX48eNFTk6O1rGPHz8W/v7+QqVSCSsrKzF48GBx9uxZyddZbGysGDBggFCpVMLW1lZ8/vnnQq1Wi5s3b4ru3bsLS0tL4eDgIObPn1/oe6PL+/S81NRUMW7cOFGlShVhYmIiateuLebNmyfUarXWcQDEyJEjxc8//yzc3d1FuXLlxJYtW4QQQty+fVsMGTJE2NvbCxMTE+Hu7i5+/PHHfK+1ePFi4e7uLszMzIS1tbVo2rSpWLdundZ7UNi1VJC6desKGxsbkZKS8sr3oqDPgXPnzgl/f3/h5uYmlEqlcHBwEEOGDBEPHz7Uem5KSooYO3ascHV1FSYmJsLOzk507NhRnD59WnPM5cuXhZ+fn3BwcBBKpVJUrlxZfPjhhyIpKUlzjKurq/D39y/0fPM+81atWlXgue/atUu0adNGWFhYCEtLS9GsWTPN+yeEbte6v79/ge9zHgBi2rRpWq975swZ0blzZ2FpaSnMzc3Fu+++K6KiorSOyYv5yJEjIjg4WNja2ooKFSqInj17iv/++++Vv5+y5o1sodi+fTuqV6+Od955R6fjhw4ditWrV6N3794YP348Tpw4gbCwMMTExGDLli1ax8bFxaF3794ICgqCv78/fvrpJwQEBKBp06Z466234OfnB2trawQHB6Nfv37o0qULLCws9Ir/4sWLeO+999CgQQOEhoZCqVQiLi4OR48efenz9u7dC19fX1SvXh3Tp0/H06dPsWTJEnh5eeHMmTOoVq2a1vF9+vSBm5sbwsLCcObMGaxcuRL29vb46quvdIrTz88PI0aMwObNmxEYGAjgWetE3bp10aRJk3zHX716FVu3bsUHH3wANzc33L9/H8uWLUPbtm3x77//wtnZGfXq1UNoaCi++OILDB8+HK1btwYArd/lo0eP4Ovri759+2LgwIFwcHAoML5vvvkG+/fvh7+/P6KiomBsbIxly5Zhz549WLt2LZydnQt8Xr169bB27VoEBwejSpUqmqZ1Ozs7PH36FO3atUNcXBxGjRoFNzc3/PbbbwgICEBSUhLGjh2rVdeqVauQkZGB4cOHQ6lUwsbGRqf3Nk9OTg5u376NihUrapX/9ttvSE9Px8cff4xKlSrh77//xpIlS3D79m389ttvWsfm5ubCx8cHnp6emD9/Pvbu3YsFCxagRo0a+PjjjwEAQgj06NEDR44cwYgRI1CvXj1s2bIF/v7++WLS9zr78MMPUa9ePcyZMwc7d+7ErFmzYGNjg2XLluHdd9/FV199hXXr1mHChAlo3rw52rRp88r3JTs7Gw8fPtQqq1ChAipUqAAhBLp3744DBw4gKCgIjRo1wp9//omJEyfizp07WLhwodbz9u/fj19//RWjRo2Cra0tqlWrhvv37+Ptt9+GQqHAqFGjYGdnhz/++ANBQUFISUnRDNBdsWIFxowZg969e2Ps2LHIyMjA+fPnceLECfTv3x9+fn64fPkyfvnlFyxcuBC2trYAnl1LBbly5QouXbqEwMBAWFpavvJ9KEhkZCSuXr2KIUOGwNHRUdO9e/HiRRw/fhwKhQIAMGLECGzcuBGjRo2Cu7s7Hj16hCNHjiAmJgZNmjRBVlYWfHx8kJmZidGjR8PR0RF37tzBjh07kJSUBCsrq3yvre/nX3h4OAIDA/HWW29hypQpsLa2xtmzZ7F7925Nl44u1/pHH32Eu3fvIjIyEmvXrn3le3Tx4kW0bt0aKpUKkyZNQvny5bFs2TK0a9cOhw4dgqenp9bxo0ePRsWKFTFt2jRcv34dixYtwqhRo7Bhwwadfy9lQklnNHJLTk4WAESPHj10Oj46OloAEEOHDtUqnzBhggAg9u/frylzdXUVAMThw4c1Zf/9959QKpVi/PjxmrLnv50+T9cWioULFwoA4sGDB4XGXdA3k0aNGgl7e3vx6NEjTdm5c+eEkZGRGDx4cL7XCwwM1Krz/fffF5UqVSr0NZ8/D3NzcyGEEL179xYdOnQQQgiRm5srHB0dxYwZMwp8DzIyMkRubm6+81AqlSI0NFRTdvLkyQK/FQvxrBUCgPjhhx8K3Pd8C4UQQvz5558CgJg1a5a4evWqsLCwED179nzlOQpR8DfhRYsWCQDi559/1pRlZWWJli1bCgsLC823yrzzV6lUOn+TcXV1Fd7e3uLBgwfiwYMH4p9//hGDBg3SfIt+3ostEUIIERYWJhQKhbhx44amLO+b2/PvrxBCNG7cWDRt2lTzeOvWrQKAmDt3rqYsJydHtG7dWvJ1Nnz4cK06q1SpIhQKhZgzZ46m/PHjx8LMzEzzTfdV7xMK+Daa9w0071xmzZql9bzevXsLhUIh4uLiNGUAhJGRkbh48aLWsUFBQcLJySnft/q+ffsKKysrzfvfo0cP8dZbb7003nnz5r2yVSLPtm3bBACxcOHCVx4rRMGfAwVdG7/88ku+zy4rK6t819Xz8lqnfvvtt5fG8HwLxfMxvfj592ILRVJSkrC0tBSenp7i6dOnWsc+35Kk67U+cuTIfC29eZ6/PoQQomfPnsLExETEx8dryu7evSssLS1FmzZt8sXcsWNHrZiCg4OFsbGxVksNCfHGzfJISUkBAJ2z+127dgEAxo0bp1We9630xbEW7u7umm/NwLNvGnXq1MHVq1eLHPOL8voet23bBrVardNzEhISEB0djYCAAK1vwQ0aNECnTp005/m8ESNGaD1u3bo1Hj16pHkPddG/f38cPHgQ9+7dw/79+3Hv3r1CB4splUrN4K3c3Fw8evQIFhYWqFOnDs6cOaPzayqVSgwZMkSnY729vfHRRx8hNDQUfn5+MDU1xbJly3R+rRft2rULjo6O6Nevn6asfPnyGDNmDFJTU3Ho0CGt43v16lXot9GC7NmzB3Z2drCzs4OHhwfWrl2LIUOGYN68eVrHmZmZaX5OS0vDw4cP8c4770AIgbNnz+art6Df9fPX7K5du1CuXDlNiwXwrM979OjRWs8rynU2dOhQrTqbNWsGIQSCgoI05dbW1nr9O/L09ERkZKTWNnjwYM25GBsbY8yYMVrPGT9+PIQQ+OOPP7TK27ZtqzVWRgiBTZs2oVu3bhBC4OHDh5rNx8cHycnJmuvV2toat2/fxsmTJ3WK+1X0/fwqyPPXRkZGBh4+fIi3334bALT+nVlbW+PEiRO4e/dugfXktUD8+eefSE9PL3I8hYmMjMSTJ08wefLkfGMc8lpRAP2v9VfJzc3Fnj170LNnT1SvXl1T7uTkhP79++PIkSP5PgOHDx+uFVPr1q2Rm5uLGzdu6P36b7I3LqFQqVQAgCdPnuh0/I0bN2BkZISaNWtqlTs6OsLa2jrfBVO1atV8dVSsWBGPHz8uYsT5ffjhh/Dy8sLQoUPh4OCAvn374tdff31pcpEXZ506dfLtq1evHh4+fIi0tDSt8hfPJa9ZXZ9z6dKlCywtLbFhwwasW7cOzZs3z/de5lGr1Vi4cCFq1aoFpVIJW1tb2NnZ4fz580hOTtb5NStXrqzXAMz58+fDxsYG0dHRWLx4Mezt7XV+7otu3LiBWrVqaY1qB569x3n7n+fm5qZX/Xl/KHfv3o358+fD2toajx8/zne+N2/e1PxRt7CwgJ2dHdq2bQsA+d5LU1PTfEnNi9fsjRs34OTklK95+sXrSY7rzMrKCqampprm/+fLdb32bG1t0bFjR60t74/DjRs34OzsnO+Psq6/owcPHiApKQnLly/XJHd5W14i+99//wEAQkJCYGFhgRYtWqBWrVoYOXLkK7smX0bfz6+CJCYmYuzYsXBwcICZmRns7Ow05/j8tTF37lxcuHABLi4uaNGiBaZPn66V0Lm5uWHcuHFYuXIlbG1t4ePjg++++06vf6svEx8fDwCoX7/+S4/T51rXxYMHD5Cenl7oNaxWq3Hr1i2tcjk+K8uCN24MhUqlgrOzMy5cuKDX857PPl+msFHKQogiv0Zubq7WYzMzMxw+fBgHDhzAzp07sXv3bmzYsAHvvvsu9uzZI9tIaSnnkkepVMLPzw+rV6/G1atXXzoPfPbs2Zg6dSoCAwMxc+ZM2NjYwMjICJ9++qnOLTGA9jcWXZw9e1bzB+Cff/7Ral0obvrGmveHEgB8fHxQt25dvPfee/jmm280rWi5ubno1KkTEhMTERISgrp168Lc3Bx37txBQEBAvveypEbWv+z15bj25PLi7yjv/Rs4cGCBY0iAZy0ywLM/QLGxsdixYwd2796NTZs24fvvv8cXX3yBGTNm6B1L3bp1ATy7TouqT58+OHbsGCZOnIhGjRrBwsICarUanTt31ro2+vTpg9atW2PLli3Ys2cP5s2bh6+++gqbN2+Gr68vAGDBggUICAjAtm3bsGfPHowZMwZhYWE4fvw4qlSpUuQYdaXvtV5cStP1Wpq9cS0UAPDee+8hPj4eUVFRrzzW1dUVarUaV65c0Sq/f/8+kpKS4OrqKltcFStWLHBxm4KazYyMjNChQwd8/fXX+Pfff/Hll19i//79OHDgQIF158UZGxubb9+lS5dga2sLc3NzaSdQiP79++Ps2bN48uQJ+vbtW+hxGzduRPv27fHjjz+ib9++8Pb2RseOHfO9J7omd7pIS0vDkCFD4O7ujuHDh2Pu3LmSmqddXV1x5cqVfB9kly5d0uyXU9euXdG2bVvMnj1b883/n3/+weXLl7FgwQKEhISgR48e6NixY6GDTHXh6uqKhIQEpKamapW/eD2V5HWmK1dXV9y9ezfft3xdf0d2dnawtLREbm5uvlaQvO35Vi5zc3N8+OGHWLVqFW7evImuXbviyy+/1KzDos/1XLt2bdSpUwfbtm3L97vQxePHj7Fv3z5MnjwZM2bMwPvvv49OnTppNe0/z8nJCZ988gm2bt2Ka9euoVKlSvjyyy+1jvHw8MDnn3+Ow4cP46+//sKdO3fwww8/6B3bi2rUqAEAL/3yp8+1ruv7bGdnhwoVKhR6DRsZGcHFxUXHs6DnvZEJxaRJk2Bubo6hQ4fi/v37+fbHx8fjm2++AfCsyR4AFi1apHXM119/DeDZB7pcatSogeTkZJw/f15TlpCQkG8mSWJiYr7n5i3wlJmZWWDdTk5OaNSoEVavXq31B/rChQvYs2eP5jyLQ/v27TFz5kx8++23cHR0LPQ4Y2PjfBn9b7/9hjt37miV5f1B0ndlwYKEhITg5s2bWL16Nb7++mtUq1ZNs1BUUXTp0gX37t3TGt2dk5ODJUuWwMLCQtMUK6eQkBA8evQIK1asAPC/b0vPv5dCCM01XRRdunRBTk4Oli5dqinLzc3FkiVLtI4ryetMV126dEFubi6+/fZbrfKFCxdCoVBovn0XxtjYGL169cKmTZsK/GOXt84C8GzG0fNMTEzg7u4OIYRmrQh9r+cZM2bg0aNHGDp0KHJycvLt37NnD3bs2FFo7ED+b84vfr7l5ubm6y6wt7eHs7Oz5t9GSkpKvtf38PCAkZFRkf/9PM/b2xuWlpYICwvLtwheXvz6XOu6vs/Gxsbw9vbGtm3btJYBv3//PiIiItCqVStN1xPp543r8gCe/eGOiIjQTFd7fqXMY8eOaab5AUDDhg3h7++P5cuXIykpCW3btsXff/+N1atXo2fPnmjfvr1scfXt2xchISF4//33MWbMGKSnp2Pp0qWoXbu21mCp0NBQHD58GF27doWrqyv+++8/fP/996hSpQpatWpVaP3z5s2Dr68vWrZsiaCgIM10Pisrq2JdktbIyAiff/75K4977733EBoaiiFDhuCdd97BP//8g3Xr1uX79lSjRg1YW1vjhx9+gKWlJczNzeHp6an3eIT9+/fj+++/x7Rp0zTTWFetWoV27dph6tSpmDt3rl71Ac8GZy1btgwBAQE4ffo0qlWrho0bN+Lo0aNYtGiRpMF0hfH19UX9+vXx9ddfY+TIkahbty5q1KiBCRMm4M6dO1CpVNi0aZOk/txu3brBy8sLkydPxvXr1+Hu7o7NmzcX2EddUteZrrp164b27dvjs88+w/Xr19GwYUPs2bMH27Ztw6effqr5Zvwyc+bMwYEDB+Dp6Ylhw4bB3d0diYmJOHPmDPbu3atJ+r29veHo6AgvLy84ODggJiYG3377Lbp27aq5Fpo2bQoA+Oyzz9C3b1+UL18e3bp1K7Ql58MPP9QsW3327Fn069dPs1Lm7t27sW/fPkRERBT4XJVKhTZt2mDu3LnIzs5G5cqVsWfPHly7dk3ruCdPnqBKlSro3bs3GjZsCAsLC+zduxcnT57EggULADz79zNq1Ch88MEHqF27NnJycrB27VpNwiWVSqXCwoULMXToUDRv3hz9+/dHxYoVce7cOaSnp2P16tV6Xet57/OYMWPg4+MDY2PjQltMZ82ahcjISLRq1QqffPIJypUrh2XLliEzM7NInwv0f173tJLX6fLly2LYsGGiWrVqwsTERFhaWgovLy+xZMkSrUWrsrOzxYwZM4Sbm5soX768cHFxeenCVi96cbpiYdOmhHi2YFX9+vWFiYmJqFOnjvj555/zTRvdt2+f6NGjh3B2dhYmJibC2dlZ9OvXT1y+fDnfa7w4tXLv3r3Cy8tLmJmZCZVKJbp161bogkMvTkstbOGZFz0/bbQwhU0bHT9+vHBychJmZmbCy8tLREVFFTjdc9u2bZqFhp4/z7yFrQryfD0pKSnC1dVVNGnSRGRnZ2sdFxwcLIyMjPItYvOiwn7f9+/fF0OGDBG2trbCxMREeHh45Ps9vOwa0Pf1hBAiPDxc6334999/RceOHYWFhYWwtbUVw4YNE+fOnct3TRT2uypoMbVHjx6JQYMGaRa2GjRoUKELW0m5zgqL6WW/2+fpsrDVkydPRHBwsHB2dhbly5cXtWrVeunCVgW5f/++GDlypHBxcRHly5cXjo6OokOHDmL58uWaY5YtWybatGkjKlWqJJRKpahRo4aYOHGiSE5O1qpr5syZonLlysLIyEjnKaR5nwP29vaiXLlyws7OTnTr1k1s27ZNc0xBnwO3b98W77//vrC2thZWVlbigw8+EHfv3tWaOpmZmSkmTpwoGjZsqFnYqWHDhuL777/X1HP16lURGBgoatSoIUxNTYWNjY1o37692Lt3r1acRZ02muf3338X77zzjuZaatGihfjll180+3W91nNycsTo0aOFnZ2dUCgUOi1s5ePjIywsLESFChVE+/btxbFjxwqM+eTJk1rleYvfHThwQND/KITgqBIiIiKS5o0cQ0FERESvFxMKIiIikowJBREREUnGhIKIiIgkY0JBREREkjGhICIiIsneyIWt5KZWq3H37l1YWlrKuiw0EREVPyEEnjx5Amdn53w39pNTRkYGsrKyZKnLxMQk311YSzsmFDq4e/cu13YnIjJwt27dKrabmmVkZMDMshKQI8+t3h0dHXHt2jWDSiqYUOggbwldE3d/KIx1v202kSG5eXB+SYdAVCyepKSgpptLsSyNnycrKwvISYfS3R+Q+nciNwv3/l2NrKwsJhRvmrxuDoWxCRMKemPxhkj0pnstXdblTCX/nRAK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REQy4SwPIiIikqwsd3kwoSAiIpJJWW6h4BgKIiIikowtFERERDIpyy0UTCiIiIhkUpbHULDLg4iIiCRjCwUREZFMFJChywOG2UTBhIKIiEgm7PIgIiIikoAtFERERDLhLA8iIiKSjF0eRERERBKwhYKIiEgm7PIgIiIiycpylwcTCiIiIpmU5RYKjqEgIiIiydhCQUREJBcZujwMdKFMJhRERERyYZcHERERkQRsoSAiIpIJZ3kQERGRZOzyICIiIpKALRREREQyYZcHERERScYuDyIiIiIJ2EJBREQkk7LcQsGEgoiISCYcQ0FERESSleUWCo6hICIiMmCHDx9Gt27d4OzsDIVCga1bt2r2ZWdnIyQkBB4eHjA3N4ezszMGDx6Mu3fvatVRrVo1TTKUt82ZM0evOJhQEBERySSvy0Pqpo+0tDQ0bNgQ3333Xb596enpOHPmDKZOnYozZ85g8+bNiI2NRffu3fMdGxoaioSEBM02evRoveJglwcREZFMSqLLw9fXF76+vgXus7KyQmRkpFbZt99+ixYtWuDmzZuoWrWqptzS0hKOjo76B/x/2EJBRERUCqWkpGhtmZmZstSbnJwMhUIBa2trrfI5c+agUqVKaNy4MebNm4ecnBy96mULBRERkUwUkGGWx//938XFRat82rRpmD59uqS6MzIyEBISgn79+kGlUmnKx4wZgyZNmsDGxgbHjh3DlClTkJCQgK+//lrnuplQEBERycRIoYCRxIwi7/m3bt3S+qOvVCol1ZudnY0+ffpACIGlS5dq7Rs3bpzm5wYNGsDExAQfffQRwsLCdH5ddnkQERGVQiqVSmuTklDkJRM3btxAZGSkVqJSEE9PT+Tk5OD69es6vwZbKIiIiGRSGhe2yksmrly5ggMHDqBSpUqvfE50dDSMjIxgb2+v8+swoSAiIpJJSczySE1NRVxcnObxtWvXEB0dDRsbGzg5OaF37944c+YMduzYgdzcXNy7dw8AYGNjAxMTE0RFReHEiRNo3749LC0tERUVheDgYAwcOBAVK1bUOQ4mFERERDIxUjzbpNahj1OnTqF9+/aax3njIfz9/TF9+nT8/vvvAIBGjRppPe/AgQNo164dlEol1q9fj+nTpyMzMxNubm4IDg7WGlehCyYUREREBqxdu3YQQhS6/2X7AKBJkyY4fvy45DiYUBAREclF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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: Gradient Boosting Classification\n", - "Best Parameters: {'model__learning_rate': 0.1, 'model__max_depth': 5, 'model__n_estimators': 200}\n", - "Accuracy: 0.8676470588235294\n", - "Precision: 0.8113207547169812\n", - "Recall: 0.6231884057971014\n", - "F1-score: 0.7049180327868853\n", - "\n" - ] - }, - { - "data": { - "image/png": "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lytXDg4ODvnKk5OTsWrVKmzYsAHvv/8+AGD16tWoU6cOTp8+jXfffVe/QF/BHgoiIqJS6NV7SmVmZhZY7/r163BycoKbmxv69euHW7duAQDOnz+P7OxseHt7q+vWrl0bVatWRWRkpOTxMqEgIiKSiJRTKJydnTXuKxUWFpbveC1atMCaNWuwb98+LF26FHFxcWjdujWePXuG+/fvQy6Xw8rKSuM59vb2uH//vuTnziEPIiIiqUh46e3bt29rLBst6JYQfn5+6n83aNAALVq0gIuLC3755ReYmprqGYhu2ENBRERUCimVSo1Nm3tMWVlZoWbNmoiJiYGDgwOysrKQlJSkUefBgwcFzrnQFxMKIiIiiZTEKo+XpaamIjY2Fo6OjmjatCnKly+PQ4cOqfdfu3YNt27dQsuWLaU4XQ0c8iAiIpLI217lMWHCBHTp0gUuLi64d+8epk+fDmNjY/Tp0weWlpYYPHgwxo0bB2trayiVSowePRotW7aUfIUHwISCiIjIYN25cwd9+vRBYmIibG1t0apVK5w+fRq2trYAgAULFsDIyAg9evRAZmYmfH198f3337+h1aJhQkFERCQRCedkamXjxo2v3W9iYoIlS5ZgyZIl+gWlBSYUREREUnnbGUUpwkmZREREpDf2UBAREUlE31UaeW0YIiYUREREEimJe3mUFkwoiIiIJFKGp1BwDgURERHpjz0UREREUinDXRRMKIiIiCRSlidlcsiDiIiI9MYeCiIiIolwlQcRERHprQxPoeCQBxEREemPPRRERERSKcNdFEwoiIiIJMJVHkRERER6YA8FERGRRLjKg4iIiPRWhqdQMKEgIiKSTBnOKDiHgoiIiPTGHgoiIiKJlOVVHkwoiIiIpCLBpEwDzSc45EFERET6Yw8FERGRRMrwnEwmFERERJIpwxkFhzyIiIhIb+yhICIikghXeRAREZHeyvKltznkQURERHpjDwUREZFEyvCcTCYUREREkinDGQUTCiIiIomU5UmZnENBREREemMPBRERkURkkGCVhySRvH1MKIiIiCRShqdQcMiDiIiI9MceCiIiIomU5QtbMaEgIiKSTNkd9OCQBxEREemNPRREREQSKctDHuyhICIikohMok1bYWFheOedd2BhYQE7Ozt0794d165d06jTrl07yGQyjW348OF6nWdBmFAQEREZqGPH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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" } ], "source": [ - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", - "from sklearn.model_selection import train_test_split, GridSearchCV\n", - "from sklearn.preprocessing import StandardScaler\n", - "from sklearn.linear_model import LinearRegression, LogisticRegression\n", - "from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n", - "from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier\n", - "from sklearn.pipeline import Pipeline\n", - "from sklearn.compose import ColumnTransformer\n", - "from sklearn.preprocessing import OneHotEncoder\n", - "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score, accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, ConfusionMatrixDisplay\n", - "\n", - "# Загружаем набор данных\n", - "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", - "\n", - "# Удаление пустого столбца по имени\n", - "df = df.drop('Unnamed: 0', axis=1)\n", - "\n", - "# Определяем категориальные и числовые столбцы\n", - "categorical_cols = ['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE']\n", - "numerical_cols = ['Battery capacity (mAh)', 'Screen size (inches)', 'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera', 'Number of SIMs']\n", - "\n", - "# Создаем преобразователь для категориальных и числовых столбцов\n", - "preprocessor = ColumnTransformer(\n", - " transformers=[\n", - " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_cols),\n", - " ('num', StandardScaler(), numerical_cols)\n", - " ])\n", - "\n", - "# Список моделей и их гиперпараметров для задачи регрессии\n", - "models_reg = {\n", - " \"Linear Regression\": (LinearRegression(), {}),\n", - " \"Random Forest Regression\": (RandomForestRegressor(), {\n", - " 'model__n_estimators': [100, 200],\n", - " 'model__max_depth': [None, 10, 20]\n", - " }),\n", - " \"Gradient Boosting Regression\": (GradientBoostingRegressor(), {\n", - " 'model__n_estimators': [100, 200],\n", - " 'model__learning_rate': [0.01, 0.1],\n", - " 'model__max_depth': [3, 5]\n", - " })\n", - "}\n", - "\n", - "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n", - "X_reg = df[categorical_cols + numerical_cols]\n", - "y_reg = df['Price']\n", - "\n", - "# Разделяем данные на обучающую и тестовую выборки для задачи регрессии\n", - "X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.2, random_state=42)\n", - "\n", - "# Обучаем и оцениваем модели для задачи регрессии\n", - "print(\"Результаты для задачи регрессии:\")\n", - "for name, (model, params) in models_reg.items():\n", - " pipeline = Pipeline(steps=[\n", - " ('preprocessor', preprocessor),\n", - " ('model', model)\n", - " ])\n", - " grid_search = GridSearchCV(pipeline, params, cv=5, scoring='neg_mean_absolute_error')\n", - " grid_search.fit(X_train_reg, y_train_reg)\n", - " best_model = grid_search.best_estimator_\n", - " y_pred_reg = best_model.predict(X_test_reg)\n", - " mae = mean_absolute_error(y_test_reg, y_pred_reg)\n", - " mse = mean_squared_error(y_test_reg, y_pred_reg)\n", - " rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)\n", - " r2 = r2_score(y_test_reg, y_pred_reg)\n", - " print(f\"Model: {name}\")\n", - " print(f\"Best Parameters: {grid_search.best_params_}\")\n", - " print(f\"MAE: {mae}\")\n", - " print(f\"MSE: {mse}\")\n", - " print(f\"RMSE: {rmse}\")\n", - " print(f\"R²: {r2}\")\n", - " print()\n", - "\n", - "# Список моделей и их гиперпараметров для задачи классификации\n", - "models_class = {\n", - " \"Logistic Regression\": (LogisticRegression(), {\n", - " 'model__C': [0.1, 1, 10],\n", - " 'model__solver': ['liblinear', 'lbfgs']\n", - " }),\n", - " \"Random Forest Classification\": (RandomForestClassifier(), {\n", - " 'model__n_estimators': [100, 200],\n", - " 'model__max_depth': [None, 10, 20]\n", - " }),\n", - " \"Gradient Boosting Classification\": (GradientBoostingClassifier(), {\n", - " 'model__n_estimators': [100, 200],\n", - " 'model__learning_rate': [0.01, 0.1],\n", - " 'model__max_depth': [3, 5]\n", - " })\n", - "}\n", - "\n", - "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n", - "X_class = df[categorical_cols + numerical_cols]\n", - "y_class = (df['Price'] > df['Price'].mean()).astype(int)\n", - "\n", - "# Разделяем данные на обучающую и тестовую выборки для задачи классификации\n", - "X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.2, random_state=42)\n", - "\n", - "# Обучаем и оцениваем модели для задачи классификации\n", - "print(\"Результаты для задачи классификации:\")\n", - "for name, (model, params) in models_class.items():\n", - " pipeline = Pipeline(steps=[\n", - " ('preprocessor', preprocessor),\n", - " ('model', model)\n", - " ])\n", - " grid_search = GridSearchCV(pipeline, params, cv=5, scoring='accuracy')\n", - " grid_search.fit(X_train_class, y_train_class)\n", - " best_model = grid_search.best_estimator_\n", - " y_pred_class = best_model.predict(X_test_class)\n", - " accuracy = accuracy_score(y_test_class, y_pred_class)\n", - " precision = precision_score(y_test_class, y_pred_class)\n", - " recall = recall_score(y_test_class, y_pred_class)\n", - " f1 = f1_score(y_test_class, y_pred_class)\n", - " print(f\"Model: {name}\")\n", - " print(f\"Best Parameters: {grid_search.best_params_}\")\n", - " print(f\"Accuracy: {accuracy}\")\n", - " print(f\"Precision: {precision}\")\n", - " print(f\"Recall: {recall}\")\n", - " print(f\"F1-score: {f1}\")\n", - " print()\n", - "\n", - " # Визуализация матрицы ошибок\n", - " cm = confusion_matrix(y_test_class, y_pred_class)\n", - " disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['Less', 'More'])\n", - " disp.plot(cmap=plt.cm.Blues)\n", - " plt.title(f'Confusion Matrix for {name}')\n", - " plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Давайте проанализируем полученные значения метрик и определим, являются ли они нормальными или их можно улучшить.\n", - "\n", - "### Оценка смещения и дисперсии для задачи регрессии:\n", - "#### Вывод для задачи регрессии:\n", - "\n", - "- Random Forest Regression демонстрирует наилучшие результаты по метрикам MAE и R², что указывает на высокую точность и стабильность модели.\n", - "- Linear Regression и Gradient Boosting Regression также показывают хорошие результаты, но уступают случайному лесу.\n", - "\n", - "#### Вывод для задачи классификации:\n", - "- Random Forest Classification демонстрирует наилучшие результаты по всем метрикам (Accuracy, Precision, Recall, F1-score), что указывает на высокую точность и стабильность модели.\n", - "- Logistic Regression и Gradient Boosting Classification также показывают хорошие результаты, но уступают случайному лесу.\n", - "\n", - "Для оценки смещения (bias) и дисперсии (variance) моделей можно использовать метод перекрестной проверки (cross-validation). Этот метод позволяет оценить, насколько хорошо модель обобщается на новых данных.\n", - "\n", - "Оценка смещения и дисперсии для задачи регрессии: Для задачи регрессии мы будем использовать метрики MAE (Mean Absolute Error) и R² (R-squared) для оценки смещения и дисперсии.\n", - "\n", - "Оценка смещения и дисперсии для задачи классификации: Для задачи классификации мы будем использовать метрики Accuracy, Precision, Recall и F1-score для оценки смещения и дисперсии.\n", - "\n", - "Пример кода для оценки смещения и дисперсии:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Оценка смещения и дисперсии для задачи регрессии:\n", - "Model: Linear Regression\n", - "MAE (Cross-Validation): Mean = 5393.4164031476985, Std = 2364.7028993279946\n", - "R² (Cross-Validation): Mean = 0.31163924349046784, Std = 0.20066100088089248\n", - "\n", - "Model: Random Forest Regression\n", - "MAE (Cross-Validation): Mean = 4632.622847297591, Std = 2958.2113579489355\n", - "R² (Cross-Validation): Mean = 0.37197535985326297, Std = 0.11953059546045496\n", - "\n", - "Model: Gradient Boosting Regression\n", - "MAE (Cross-Validation): Mean = 4705.057344875317, Std = 2676.698617934764\n", - "R² (Cross-Validation): Mean = 0.30094204368967814, Std = 0.29605037554256863\n", - "\n", - "Оценка смещения и дисперсии для задачи классификации:\n", - "Model: Logistic Regression\n", - "Accuracy (Cross-Validation): Mean = 0.8373806164532234, Std = 0.04588247503012167\n", - "Precision (Cross-Validation): Mean = 0.7753980572437796, Std = 0.128244461080632\n", - "Recall (Cross-Validation): Mean = 0.663888888888889, Std = 0.22281171811283865\n", - "F1-score (Cross-Validation): Mean = 0.6730794905263655, Std = 0.09462791851118425\n", - "\n", - "Model: Random Forest Classification\n", - "Accuracy (Cross-Validation): Mean = 0.835177447362709, Std = 0.04406396622710083\n", - "Precision (Cross-Validation): Mean = 0.807362406312931, Std = 0.11894947251838416\n", - "Recall (Cross-Validation): Mean = 0.6194444444444445, Std = 0.2382420182487952\n", - "F1-score (Cross-Validation): Mean = 0.6475067867122541, Std = 0.10752644539783694\n", - "\n", - "Model: Gradient Boosting Classification\n", - "Accuracy (Cross-Validation): Mean = 0.8469530062947689, Std = 0.03006931461001492\n", - "Precision (Cross-Validation): Mean = 0.8072507504934535, Std = 0.11323561235031351\n", - "Recall (Cross-Validation): Mean = 0.6250380517503805, Std = 0.23296204577560678\n", - "F1-score (Cross-Validation): Mean = 0.661152357410075, Std = 0.1082825984327667\n", - "\n" - ] - } - ], - "source": [ - "import pandas as pd\n", - "from sklearn.model_selection import cross_val_score\n", - "from sklearn.preprocessing import StandardScaler\n", - "from sklearn.linear_model import LinearRegression, LogisticRegression\n", - "from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n", - "from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier\n", - "from sklearn.pipeline import Pipeline\n", - "from sklearn.compose import ColumnTransformer\n", - "from sklearn.preprocessing import OneHotEncoder\n", - "\n", - "# Загружаем набор данных\n", - "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", - "\n", - "# Удаление пустого столбца по имени\n", - "df = df.drop('Unnamed: 0', axis=1)\n", - "\n", - "# Определяем категориальные и числовые столбцы\n", - "categorical_cols = ['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE']\n", - "numerical_cols = ['Battery capacity (mAh)', 'Screen size (inches)', 'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera', 'Number of SIMs']\n", - "\n", - "# Создаем преобразователь для категориальных и числовых столбцов\n", - "preprocessor = ColumnTransformer(\n", - " transformers=[\n", - " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_cols),\n", - " ('num', StandardScaler(), numerical_cols)\n", - " ])\n", - "\n", - "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n", - "X_reg = df[categorical_cols + numerical_cols]\n", - "y_reg = df['Price']\n", - "\n", - "# Список моделей для задачи регрессии\n", - "models_reg = {\n", - " \"Linear Regression\": LinearRegression(),\n", - " \"Random Forest Regression\": RandomForestRegressor(),\n", - " \"Gradient Boosting Regression\": GradientBoostingRegressor()\n", - "}\n", - "\n", - "# Оценка смещения и дисперсии для задачи регрессии\n", - "print(\"Оценка смещения и дисперсии для задачи регрессии:\")\n", - "for name, model in models_reg.items():\n", - " pipeline = Pipeline(steps=[\n", - " ('preprocessor', preprocessor),\n", - " ('model', model)\n", - " ])\n", - " mae_scores = -cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='neg_mean_absolute_error')\n", - " r2_scores = cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='r2')\n", - " print(f\"Model: {name}\")\n", - " print(f\"MAE (Cross-Validation): Mean = {mae_scores.mean()}, Std = {mae_scores.std()}\")\n", - " print(f\"R² (Cross-Validation): Mean = {r2_scores.mean()}, Std = {r2_scores.std()}\")\n", - " print()\n", - "\n", - "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n", - "X_class = df[categorical_cols + numerical_cols]\n", - "y_class = (df['Price'] > df['Price'].mean()).astype(int)\n", - "\n", - "# Список моделей для задачи классификации\n", - "models_class = {\n", - " \"Logistic Regression\": LogisticRegression(),\n", - " \"Random Forest Classification\": RandomForestClassifier(),\n", - " \"Gradient Boosting Classification\": GradientBoostingClassifier()\n", - "}\n", - "\n", - "# Оценка смещения и дисперсии для задачи классификации\n", - "print(\"Оценка смещения и дисперсии для задачи классификации:\")\n", - "for name, model in models_class.items():\n", - " pipeline = Pipeline(steps=[\n", - " ('preprocessor', preprocessor),\n", - " ('model', model)\n", - " ])\n", - " accuracy_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='accuracy')\n", - " precision_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='precision')\n", - " recall_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='recall')\n", - " f1_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='f1')\n", - " print(f\"Model: {name}\")\n", - " print(f\"Accuracy (Cross-Validation): Mean = {accuracy_scores.mean()}, Std = {accuracy_scores.std()}\")\n", - " print(f\"Precision (Cross-Validation): Mean = {precision_scores.mean()}, Std = {precision_scores.std()}\")\n", - " print(f\"Recall (Cross-Validation): Mean = {recall_scores.mean()}, Std = {recall_scores.std()}\")\n", - " print(f\"F1-score (Cross-Validation): Mean = {f1_scores.mean()}, Std = {f1_scores.std()}\")\n", - " print()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABJoAAAJOCAYAAAD/Fm2FAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACdRklEQVR4nOzde3yO9ePH8fc2O889xx0wtqiY02rCopC1OUSKnBkJYRWryLdySikK5VxCB4pOKuQ0h76yUqRvEVEOHWxOcTNss12/Pzx2/dy2sXFtN9vr+Xh4uO/r+lzX9bmufXbd19735/pcLoZhGAIAAAAAAACukauzKwAAAAAAAIDigaAJAAAAAAAAliBoAgAAAAAAgCUImgAAAAAAAGAJgiYAAAAAAABYgqAJAAAAAAAAliBoAgAAAAAAgCUImgAAAAAAAGAJgiYAAAAAAABYgqAJN7w+ffrIz8+vSLe5f/9+ubi4aMGCBUW63eJsyZIlKleunE6fPu3squSpcePGGj58eL7Lnz59Wo888oiCgoLk4uKioUOHFl7lYHJxcdGYMWOcXY0icy3now0bNsjFxUUbNmywvF4AcL0qyOfEli1b5OHhoQMHDlhej9mzZ6tq1apKS0vL9zLvvfeeatasKXd3d5UpU8byOiGnPn36KDQ01NnVKFLNmzdX8+bNr2rZ0NBQ9enTx9L64MZD0FSMLFiwQC4uLnJxcdGmTZtyzDcMQyEhIXJxcdF9993nhBoWXGZmpipVqiQXFxd99dVXzq6OJc6cOaMxY8YUyh922T//3P49+uijlm/PKpmZmRo9erQee+wxh9AwNDRULi4uio6OznW5t956y9y/H374Idcyw4cPl4uLi7p06ZLr/Ow/0vP69/LLL5tlR4wYoRkzZig5OTlf+/XSSy9pwYIFGjRokN577z316tUrX8tdrezjlf3P19dXDRs21Lvvvluo28UFY8aMkYuLi1xdXfXnn3/mmG+32+Xt7S0XFxfFx8c7oYYAiouLr/lcXFxUqlQpVa5cWX369NHff//t7OoVK88++6y6deumatWqmdOaN2/ucPy9vb1Vr149TZ06VVlZWQ7L9+rVS02bNlWjRo3UrFkz/frrr+a8Pn36KD09XXPmzMlXXXbt2qU+ffqoevXqeuutt/Tmm29as5N5yP5cy/7n7u6u0NBQPf744zpx4kShbhuO16jjx4/PtUyPHj3k4uJS5F+6A1dSytkVgPW8vLy0aNEiNW3a1GH6xo0b9ddff8nT09NJNSu4devW6dChQwoNDdXChQvVunVrZ1fpmp05c0Zjx46VpKv+puBy7r33XvXu3TvH9FtuucXybVnlyy+/1O7duzVgwIAc87y8vLR+/XolJycrKCjIYd7ChQvl5eWlc+fO5bpewzD0wQcfKDQ0VF9++aVOnTql0qVL51q2W7duatOmTY7pt912m/n6/vvvl81m08yZMzVu3Lgr7te6devUuHFjjR49+oplrRIREaEnn3xSknTo0CHNnTtXcXFxSktLU//+/YusHs509uxZlSrlvI83T09PffDBBzl6v3366adOqhGA4mrcuHEKCwvTuXPn9O2332rBggXatGmTfvnlF3l5eTm7eje87du3a+3atdq8eXOOeVWqVNGECRMkSUePHtWiRYs0bNgwHTlyRC+++KJZ7vnnnzevwYYOHarBgwdr/fr1ki5c48TFxWny5Ml67LHH5OLictn6bNiwQVlZWXr99ddVo0YNq3bzimbNmiU/Pz+lpqYqMTFR06ZN07Zt23L9Yrs4euutt3IEiEXJy8tLH3zwgZ577jmH6ampqfr888/5Xcd1iR5NxVCbNm300Ucf6fz58w7TFy1apMjIyBx/rF/P3n//fd1+++0aNmyYli5dqtTUVGdX6bp3yy23qGfPnjn+NWzY8LLLnTlzJtfp58+fV3p6+jXV6Uo/t/nz56tJkyaqXLlyjnlNmjSRn5+fFi9e7DD9r7/+0n//+1+1bds2z/Vu2LBBf/31l+bNm6fz589f9g/922+/PdfjVrt2bbOMq6urOnXqpHfffVeGYVx2nyTp8OHDlnZrz8/PonLlymbdn376aW3atEl+fn6aMmWKZfXIL2f9vnp5eTk1aGrTpo0++OCDHNMXLVp02fYKAAXVunVr9ezZU4888ojmzp2rp556Sr///ru++OILZ1etUOR1rVJY5s+fr6pVq6px48Y55vn7+5uft0OHDtXXX3+tatWqadq0acrMzDTLXfxFn2EYcnV1/POrc+fOOnDggBk+Xc7hw4clydJri/wc006dOqlnz54aOHCglixZoi5duuibb77Rli1bLKtHfmRlZeX55WJhcnd3d+oX9W3atNHOnTv1008/OUz//PPPlZ6ernvvvddJNQPyRtBUDHXr1k3Hjh3TmjVrzGnp6en6+OOP1b1791yXycrK0tSpU1W7dm15eXkpMDBQAwcO1L///utQ7vPPP1fbtm1VqVIleXp6qnr16nrhhRccPlClCz116tSpo507d6pFixby8fFR5cqVNXHixHzvx9mzZ/XZZ5+pa9eu6ty5s86ePavPP/88z/J//PGHYmNj5evrq0qVKmncuHE5woAPP/xQkZGRKl26tGw2m+rWravXX389x3oeeughlStXTj4+PmrcuLGWL19+xfrmdS/zxfd179+/XxUrVpQkjR071uwOe/E4Abt27VKnTp1Urlw5eXl5qUGDBpZfMGb/fLZu3aq7775bPj4++s9//mN20X311Vc1depUVa9eXZ6entq5c6ekCz107rrrLvn6+qpMmTK6//77HbqAS//fzXrnzp3q3r27ypYtm6N33cXOnTunlStX5nl7nJeXlx588EEtWrTIYfoHH3ygsmXLKjY2Ns91L1y4UOHh4WrRooWio6O1cOHC/B6iPN177706cOCAtm/fnmeZ7HFv9u3bp+XLl5s/5/3790u6cKHYr18/BQYGysvLS/Xr19c777zjsI4r/Szyq2LFiqpZs6Z+//13h+n5/Z3PysrSmDFjVKlSJfn4+KhFixbauXNnjvvvs2/j2LhxowYPHqyAgABVqVLFnP/VV1+Zbad06dJq27atduzY4bCt5ORk9e3bV1WqVJGnp6eCg4N1//33m8dNkn744QfFxsaqQoUK8vb2VlhYmB5++GGH9eQ29saPP/6o1q1by2azyc/PTy1bttS3337rUCZ7H7755hslJCSoYsWK8vX11QMPPKAjR47k95Cre/fu2r59u3bt2uWwb+vWrcvzHJyfNiFJJ06cUJ8+feTv768yZcooLi4uz9sXrvZcsmfPHnXs2FFBQUHy8vJSlSpV1LVrV508eTJ/BwCA09x1112SlOOcn5v8nHMNw9D48eNVpUoV8zNgx44dOT4Dsj/7L5V9Xr14nQW9lrz0WkWS0tLSNHr0aNWoUUOenp4KCQnR8OHDc4x1lJaWpmHDhqlixYoqXbq02rdvr7/++uuKxybb0qVLdc8991yxp5F04Xrljjvu0KlTp8xA6GKJiYmaO3euwy35khQZGaly5cpd9hpXunB7fHYP6YoVK+b4rJs5c6Zq164tT09PVapUSUOGDMnx+XC5Y1oQebWz7777Tq1atZK/v798fHzUrFkzffPNNzmW37Bhgxo0aCAvLy9Vr15dc+bMybUNZd9qvnDhQnPfVq5cKUn6+++/9fDDDyswMFCenp6qXbu25s2bl2Nb06ZNU+3ateXj46OyZcuqQYMGDteUp06d0tChQxUaGipPT08FBATo3nvv1bZt28wyuY3RlJqaqieffFIhISHy9PTUrbfeqldffTXH3x7Z+7B06VLVqVPHrGv2fuRHVFSUwsLCclwLL1y4UK1atVK5cuVyXS4/bUKS3nzzTVWvXl3e3t5q2LCh/vvf/+a6vvz+3l0qIyNDY8eO1c033ywvLy+VL19eTZs2dfhbFcUPt84VQ6GhoYqKitIHH3xg3mr21Vdf6eTJk+rataveeOONHMsMHDhQCxYsUN++ffX4449r3759mj59un788Ud98803cnd3l3ThgsHPz08JCQny8/PTunXrNGrUKNntdk2aNMlhnf/++69atWqlBx98UJ07d9bHH3+sESNGqG7duvm6Be6LL77Q6dOn1bVrVwUFBal58+ZauHBhrn+oZWZmqlWrVmrcuLEmTpyolStXavTo0Tp//rx5i9OaNWvUrVs3tWzZUq+88ook6ddff9U333yjJ554QpKUkpKiO++8U2fOnNHjjz+u8uXL65133lH79u318ccf64EHHijATyKnihUratasWRo0aJAeeOABPfjgg5KkevXqSZJ27Nhh9ux55pln5OvrqyVLlqhDhw765JNP8rX9c+fO6ejRozmm22w2eXh4mO+PHTum1q1bq2vXrurZs6cCAwPNefPnz9e5c+c0YMAAeXp6qly5clq7dq1at26tm266SWPGjNHZs2c1bdo0NWnSRNu2bcvxAfzQQw/p5ptv1ksvvXTZ3j9bt25Venq6br/99jzLdO/eXTExMfr9999VvXp1SRd6h3Tq1Mlsm5dKS0vTJ598Yt5G1q1bN/Xt2zfXW/CkC9/o5XbcypQp49A7JjIyUpL0zTffONxWd7FatWrpvffe07Bhw1SlShWzDhUrVtTZs2fVvHlz7d27V/Hx8QoLC9NHH32kPn366MSJE2ZbzJbbz6Igzp8/r7/++ktly5Z1mJ7f3/mRI0dq4sSJateunWJjY/XTTz8pNjY2z28UBw8erIoVK2rUqFFmj6b33ntPcXFxio2N1SuvvKIzZ85o1qxZatq0qX788Uez7XTs2FE7duzQY489ptDQUB0+fFhr1qzRwYMHzfcxMTGqWLGinnnmGZUpU0b79++/4i1pO3bs0F133SWbzabhw4fL3d1dc+bMUfPmzbVx40Y1atTIofxjjz2msmXLavTo0dq/f7+mTp2q+Pj4HL3q8nL33XerSpUqWrRokXn+Wbx4sfz8/HLt0ZTfNmEYhu6//35t2rRJjz76qGrVqqXPPvtMcXFxue7z1ZxL0tPTFRsbq7S0ND322GMKCgrS33//rWXLlunEiRPy9/fP1zEA4BzZgc6l5/zcXOmcK0mjRo3S+PHj1aZNG7Vp00bbtm1TTEzMNfV0Lsi1ZG7XKllZWWrfvr02bdqkAQMGqFatWvr55581ZcoU/fbbb1q6dKm5/COPPKL3339f3bt315133ql169blu2fp33//rYMHD172+uRS2V8SXdrj6Pvvv1fnzp01f/583XHHHTmWu/3223MNZC42depUvfvuu/rss8/MW9myrx/HjBmjsWPHKjo6WoMGDdLu3bs1a9Ysff/99w6f6dLlr/8Ksp+SYztbt26dWrdurcjISI0ePVqurq6aP3++7rnnHv33v/81e9b/+OOPatWqlYKDgzV27FhlZmZq3Lhx5hexl1q3bp2WLFmi+Ph4VahQQaGhoUpJSVHjxo3NEKdixYr66quv1K9fP9ntdvPhK2+99ZYef/xxderUSU888YTOnTun//3vf/ruu+/MvyceffRRffzxx4qPj1d4eLiOHTumTZs26ddff83zZ28Yhtq3b6/169erX79+ioiI0KpVq/T000/r77//ztGLfNOmTfr00081ePBglS5dWm+88YY6duyogwcPqnz58vk65t26ddP777+vl19+WS4uLjp69KhWr16t9957L9fQKr9t4u2339bAgQN15513aujQofrjjz/Uvn17lStXTiEhIeb6CvJ7l1tdJkyYoEceeUQNGzaU3W7XDz/8oG3bttEbqzgzUGzMnz/fkGR8//33xvTp043SpUsbZ86cMQzDMB566CGjRYsWhmEYRrVq1Yy2bduay/33v/81JBkLFy50WN/KlStzTM9e38UGDhxo+Pj4GOfOnTOnNWvWzJBkvPvuu+a0tLQ0IygoyOjYsWO+9ue+++4zmjRpYr5/8803jVKlShmHDx92KBcXF2dIMh577DFzWlZWltG2bVvDw8PDOHLkiGEYhvHEE08YNpvNOH/+fJ7bHDp0qCHJ+O9//2tOO3XqlBEWFmaEhoYamZmZhmEYxr59+wxJxvz58x32uVmzZjnWGRcXZ1SrVs18f+TIEUOSMXr06BxlW7ZsadStW9fhWGZlZRl33nmncfPNN+dZ72yS8vz3wQcfONRVkjF79myH5bP3y2az5TjOERERRkBAgHHs2DFz2k8//WS4uroavXv3NqeNHj3akGR069btivU1DMOYO3euIcn4+eefc8zLbqvnz583goKCjBdeeMEwDMPYuXOnIcnYuHGjQ7u/2Mcff2xIMvbs2WMYhmHY7XbDy8vLmDJlSq77nNe/pKSkHPXy8PAwBg0adMV9u/R3zTAMY+rUqYYk4/333zenpaenG1FRUYafn59ht9sd6pXbz+Jy24uJiTGOHDliHDlyxPj555+NXr16GZKMIUOGmOXy+zufnJxslCpVyujQoYNDuTFjxhiSjLi4OHNa9s+hadOmDr9jp06dMsqUKWP079/fYR3JycmGv7+/Of3ff/81JBmTJk3Kc/8+++yzXH/Wl7r096tDhw6Gh4eH8fvvv5vT/vnnH6N06dLG3XffnWMfoqOjjaysLHP6sGHDDDc3N+PEiROX3W522z9y5Ijx1FNPGTVq1DDn3XHHHUbfvn3N+l3888hvm1i6dKkhyZg4caJZ7vz588Zdd92V43yU33PJ+vXrDUnG+vXrDcMwjB9//NGQZHz00UeX3VcAzpV9vlq7dq1x5MgR488//zQ+/vhjo2LFioanp6fx559/Xnb5/JxzDx8+bHh4eBht27Z1OCf+5z//yfEZkH3+y6ue+/btM6cV9Fry0muV9957z3B1dXW4VjMMw5g9e7Yhyfjmm28MwzCM7du3G5KMwYMHO5Tr3r17ntdhF1u7dq0hyfjyyy9zzGvWrJlRs2ZN8/N2165dxtNPP21IyvG5v2XLFiMoKMj47LPP8tzWgAEDDG9v78vWxzAcP2eyZf+cYmJizOtUwzCM6dOnG5KMefPmOdQ7t2N6pe3t3r3bOHLkiLF//35j3rx5hre3t1GxYkUjNTXVMIwLny8333yzERsb69BWzpw5Y4SFhRn33nuvOa1du3aGj4+P8ffff5vT9uzZY5QqVSpHG5JkuLq6Gjt27HCY3q9fPyM4ONg4evSow/SuXbsa/v7+Zhu7//77jdq1a192H/39/R0+k3Nz6bV89ufx+PHjHcp16tTJcHFxMfbu3euwDx4eHg7TfvrpJ0OSMW3atMtuN/tacNKkScYvv/zi8DfKjBkzDD8/PyM1NdWIi4szfH19zeXy2ybS09ONgIAAIyIiwkhLSzPLvfnmm4Ykh79r8vt7ZxgXrkcvPj/Ur18/x+8Fij9unSumsm81W7ZsmU6dOqVly5blecvGRx99JH9/f9177706evSo+S8yMlJ+fn4O94x7e3ubr0+dOqWjR4/qrrvu0pkzZxxuE5EkPz8/9ezZ03zv4eGhhg0b6o8//rhi/Y8dO6ZVq1apW7du5rSOHTvKxcVFS5YsyXWZi5/ilP0NR3p6utauXSvpQs+U1NTUy3bTXLFihRo2bOhwq5efn58GDBig/fv3F/i2pYI4fvy41q1bp86dO5vH9ujRozp27JhiY2O1Z8+efD1J5v7779eaNWty/GvRooVDOU9PT/Xt2zfXdXTs2NHhm6VDhw5p+/bt6tOnj0OPmnr16unee+/VihUrcqwjv0+5O3bsmKTLf/vq5uamzp07m+PeLFy4UCEhIWbX7dwsXLhQDRo0MAfLzL5dK6/b5wYMGJDrcQsPD89RtmzZsrn2fsqPFStWKCgoyKFtu7u76/HHH9fp06e1ceNGh/KX/iyuZPXq1apYsaIqVqyounXr6r333lPfvn0dviXO7+98YmKizp8/r8GDBzts47HHHstz+/3795ebm5v5fs2aNTpx4oS6devmsC03Nzc1atTI3Ja3t7c8PDy0YcOGHLfvZcv+hnjZsmXKyMjI1/HIzMzU6tWr1aFDB910003m9ODgYHXv3l2bNm2S3W53WGbAgAEO3ffvuusuZWZmFujR1t27d9fevXv1/fffm//ndQ7Ob5tYsWKFSpUqpUGDBpnl3Nzccvw8ruVckt1jadWqVUU+FgqAgouOjlbFihUVEhKiTp06ydfXV1988YXDrcu5yc85d+3atUpPT88xSHV2b5GrVZBrydyuVT766CPVqlVLNWvWdPhcueeeeyTJ/FzJvjZ5/PHHHZbPb/2vdH2ya9cu8/O2Zs2amjRpktq3b68FCxY4lOvQoYNcXFw0depUNW/eXPfff3+OdZUtW1Znz569qvNu9s9p6NChDuM/9e/fXzabLcfwD5e7/svLrbfeqooVKyo0NFQPP/ywatSooa+++ko+Pj6SLgyavmfPHnXv3l3Hjh0zfyapqalq2bKlvv76a2VlZSkzM1Nr165Vhw4dVKlSJXP9NWrUyPNuh2bNmjlcixmGoU8++UTt2rWTYRgObSA2NlYnT540b3srU6aM/vrrL33//fd57luZMmX03Xff6Z9//sn38VixYoXc3NxytK0nn3xShmHkeFJ2dHS02SNfunD9bLPZ8vU3UbbatWurXr165rXwokWLdP/995s/g4vlt0388MMPOnz4sB599FGHux6yb9G/WH5/73JTpkwZ7dixQ3v27Mn3/uLGx61zxVTFihUVHR2tRYsW6cyZM8rMzFSnTp1yLbtnzx6dPHlSAQEBuc6/+D7zHTt26LnnntO6dety/HF26fgdVapUyXGvddmyZfW///3vivVfvHixMjIydNttt2nv3r3m9EaNGmnhwoUaMmSIQ3lXV1eHPyKl/x98Mbt77+DBg7VkyRK1bt1alStXVkxMjDp37qxWrVqZyxw4cCDHbTTShVuhsufXqVPnivW/Gnv37pVhGHr++ef1/PPP51rm8OHDuQ6YfbEqVarkOd7RxSpXruzwoXKxsLAwh/fZf2DfeuutOcrWqlVLq1atUmpqqnx9ffNcx5UYVxhcu3v37nrjjTf0008/adGiReratWueYyacOHFCK1asUHx8vEP7adKkiT755BP99ttvOZ7Cd/PNN+fruGXXNT/jNeTmwIEDuvnmm3MMBnpxG7tYQY9jo0aNNH78eGVmZuqXX37R+PHj9e+//zr8rPP7O59dl0ufbFOuXLk8L7wvrW/2RUX2hcilbDabpAsXvq+88oqefPJJBQYGqnHjxrrvvvvUu3dv81bHZs2aqWPHjho7dqymTJmi5s2bq0OHDurevXueg3QeOXJEZ86cybPtZmVl6c8//3QY9L1q1aoO5bL3Na8/xnJz2223qWbNmlq0aJHKlCmjoKCgPI9BftvEgQMHFBwcnOMRxpfu27WcS8LCwpSQkKDJkydr4cKFuuuuu9S+fXv17NmT2+aA69CMGTN0yy236OTJk5o3b56+/vprh/Nhenq6jh8/7rBMxYoV83XOzT733HzzzTmWz8+teXkpyLVkbtcqe/bs0a+//prnlzAXf4a5uro6/IEv5X4tczl5XZ+EhoaaTyP7/fff9eKLL+rIkSM5ngCWny8Js7dxNdcWeV2jeXh46KabbspxXXG567+8fPLJJ7LZbDpy5IjeeOMN7du3zyEwzP6sz+1W7mwnT57UuXPndPbs2VyfmJfXU/Quva44cuSITpw4oTfffFNvvvlmrstkt4ERI0Zo7dq1atiwoWrUqKGYmBh1795dTZo0MctOnDhRcXFxCgkJUWRkpNq0aaPevXvn+LviYgcOHFClSpVyPMk4r2u5S68rpAvXFgW5rpAuXAu/9tprGjZsmDZv3pzn+Fr5bRN5/Y67u7vn2P/8/t7lZty4cbr//vt1yy23qE6dOmrVqpV69epl3vqJ4omgqRjr3r27+vfvr+TkZLVu3TrPJ1RkZWUpICAgz54e2SeUEydOqFmzZrLZbBo3bpyqV68uLy8vbdu2TSNGjMjx2M+LezVc7EqBgiSzLhd/EFzsjz/+uOwHQG4CAgK0fft2rVq1Sl999ZW++uorzZ8/X71798510N2CcnFxyXXfLh3cMi/Zx++pp57Kc4BrKx9le/EFQkHmWbH+i2Xfm/7vv/9e9hvYRo0aqXr16ho6dKj27duXZ+8Q6cK3LmlpaXrttdf02muv5Zi/cOFCjR07Nl/1y82JEydUoUKFq16+IAr6s6hQoYIZmMXGxqpmzZq677779PrrryshIUFS/n/nrahvdrt+7733ch0b6+Lxr4YOHap27dpp6dKlWrVqlZ5//nlNmDBB69at02233SYXFxd9/PHH+vbbb/Xll19q1apVevjhh/Xaa6/p22+/zRHAXK1rOXddrHv37po1a5ZKly6tLl265AiSCsu1nktee+019enTR59//rlWr16txx9/XBMmTNC33357xV4SAIpWw4YN1aBBA0kXes40bdpU3bt31+7du+Xn56fNmzfn6NG8b98+hYaGXvGcWxB5BSSXXgMV9Foyt8/ArKws1a1bV5MnT851mxePK3MtLr4+yY2vr6/DF1RNmjTR7bffrv/85z+5jod6Of/++698fHwsuf66kqvZxt13321e97Rr105169ZVjx49tHXrVrm6upo/t0mTJikiIiLXdfj5+V3VE+Pyuq7o2bNnnsFWdoBRq1Yt7d69W8uWLdPKlSv1ySefaObMmRo1apR5Hdi5c2fddddd+uyzz7R69WpNmjRJr7zyij799NN8jSmbH1ZdV3Tr1k0jR45U//79Vb58ecXExFhRvXy5lt+7u+++W7///rt5XTF37lxNmTJFs2fP1iOPPFJYVYaTETQVYw888IAGDhyob7/99rKD2FavXl1r165VkyZNLvvhs2HDBh07dkyffvqp7r77bnP6vn37LK33vn37tHnzZsXHx6tZs2YO87KystSrVy8tWrRIzz33nMP0P/74w6GXym+//SZJDoNUe3h4qF27dmrXrp2ysrI0ePBgzZkzR88//7xq1KihatWqaffu3TnqlN2Vu1q1annWu2zZsrl2gb30W428LsaygzN3d/d896wpKtn7ndexqVChgkNvpoKoWbOmpAs/97p16162bLdu3TR+/HjVqlUrzwsZ6UKQVKdOHfPpLBebM2eOFi1adNVB099//6309HTzW6uCqlatmv73v/8pKyvLIXjITxu7Gm3btlWzZs300ksvaeDAgfL19c3373x2Xfbu3evwjeKxY8fy/S1c9jfJAQEB+WrX1atX15NPPqknn3xSe/bsUUREhF577TW9//77ZpnGjRurcePGevHFF7Vo0SL16NFDH374Ya4XKxUrVpSPj0+ebdfV1dWyP0ou1b17d40aNUqHDh3Se++9l2e5/LaJatWqKTExUadPn3YI1S7dNyvOJXXr1lXdunX13HPPafPmzWrSpIlmz56t8ePHX9X6ABQ+Nzc3TZgwQS1atND06dP1zDPPqH79+jmGDLg49L/cOTf73LNnzx6HL/eOHDmS4zMgu4fTiRMnHL7YvPQayIpryerVq+unn35Sy5YtL9sDqFq1amZvo4t7duT2eZCbi69P8qNevXrq2bOn5syZo6eeeirXXix52bdv3zVdV0gX9uvin1N6err27dtn+TWln5+fRo8erb59+2rJkiXq2rWr+Vlvs9kuu72AgAB5eXk59DbPltu03GQ/QTAzMzNf++br66suXbqoS5cuSk9P14MPPqgXX3xRI0eONHufBQcHa/DgwRo8eLAOHz6s22+/XS+++GKeQVO1atW0du1anTp1yqFXU2Fdy2WrWrWqmjRpog0bNmjQoEEOX9ZdWj/pym3i4t/xi3tdZ2RkaN++fapfv745Lb+/d3kpV66c+vbtq759++r06dO6++67NWbMGIKmYowxmooxPz8/zZo1S2PGjFG7du3yLNe5c2dlZmbqhRdeyDHv/Pnz5mMws9P4i9P39PR0zZw509J6Z/eyGD58uDp16uTwr3PnzmrWrFmuPTGmT59uvjYMQ9OnT5e7u7tatmwp6f/vtc/m6upqfuOR/VjONm3aaMuWLUpKSjLLpaam6s0331RoaGiu4/Vkq169unbt2uXwGPSffvopx1NEsu+lvvTxogEBAWrevLnmzJmjQ4cO5Vh/QR6vbrXg4GBFRETonXfecaj3L7/8otWrV6tNmzZXve7IyEh5eHjohx9+uGLZRx55RKNHj861l1K2P//8U19//bU6d+6co/106tRJffv21d69e/Xdd99dVX23bt0qSbrzzjuvavk2bdooOTnZIfw9f/68pk2bJj8/vxzhqhVGjBihY8eO6a233pKU/9/5li1bqlSpUpo1a5ZDmYt/164kNjZWNptNL730Uq7jKmW36zNnzuT4prN69eoqXbq0+fv577//5vj2LztwzOvRum5uboqJidHnn3/u8HjtlJQULVq0SE2bNjVv37Na9erVNXXqVE2YMMF82k5u8tsm2rRpo/Pnzzv8PDIzMzVt2jSH9V3LucRut+v8+fMO0+rWrStXV9crPr4YgPM1b95cDRs21NSpU3Xu3DmVLVtW0dHRDv+8vLzydc6Njo6Wu7u7pk2b5nDunTp1ao7tZgcNX3/9tTktNTU1R49xK64lO3furL///tv8TLvY2bNnzSeeZocEl/Yuyq3+ualcubJCQkLydX2Sbfjw4crIyMiz10detm3bdtXXFdHR0fLw8NAbb7zhcFzffvttnTx5Mt9P2SuIHj16qEqVKuZTnCMjI1W9enW9+uqrOn36dI7y2Z87bm5uio6O1tKlSx3GRNq7d2+OcY3y4ubmpo4dO+qTTz7RL7/8kue2pJzX/h4eHgoPD5dhGMrIyFBmZmaO2zUDAgJUqVKly37mtWnTRpmZmTmuh6ZMmSIXFxfLekLlZvz48Ro9evRlx8vMb5to0KCBKlasqNmzZzs8SXLBggU5/k7J7+9dbi79Ofj5+alGjRpcVxRz9Ggq5i53r3S2Zs2aaeDAgZowYYK2b9+umJgYubu7a8+ePfroo4/0+uuvq1OnTrrzzjtVtmxZxcXF6fHHH5eLi4vee++9Anf7vJKFCxcqIiIiz14G7du312OPPaZt27aZjx318vLSypUrFRcXp0aNGumrr77S8uXL9Z///Me8DeiRRx7R8ePHdc8996hKlSo6cOCApk2bpoiICPNbpGeeeUYffPCBWrdurccff1zlypXTO++8o337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mjIzM/X8888rLCxM3t7eql69ul544QUZhmGWMQxDo0aNUnBwsLy9vRUdHa09e/Y4rOf48ePq0aOHbDabypQpo379+un06dMOZf73v//prrvukpeXl0JCQjRx4sQi2UcAAAAAAICSwqlB0yuvvKJZs2Zp+vTp+vXXX/XKK69o4sSJmjZtmllm4sSJeuONNzR79mx999138vX1VWxsrM6dO2eW6dGjh3bs2KE1a9Zo2bJl+vrrrzVgwABzvt1uV0xMjKpVq6atW7dq0qRJGjNmjN58880i3V8AAAAAAIDizMW4uPtQEbvvvvsUGBiot99+25zWsWNHeXt76/3335dhGKpUqZKefPJJPfXUU5KkkydPKjAwUAsWLFDXrl3166+/Kjw8XN9//70aNGggSVq5cqXatGmjv/76S5UqVdKsWbP07LPPKjk5WR4eHpKkZ555RkuXLtWuXbuuWE+73S5/f3+dPHmSQS4BALgO8VntPBx7AACub0X9We3UHk133nmnEhMT9dtvv0mSfvrpJ23atEmtW7eWJO3bt0/JycmKjo42l/H391ejRo2UlJQkSUpKSlKZMmXMkEmSoqOj5erqqu+++84sc/fdd5shkyTFxsZq9+7d+vfffwt9PwEAAAAAAEqCUs7c+DPPPCO73a6aNWvKzc1NmZmZevHFF9WjRw9JUnJysiQpMDDQYbnAwEBzXnJysgICAhzmlypVSuXKlXMoExYWlmMd2fPKli3rMC8tLU1paWnme7vdLknKyMhQRkbGNe0zAACwHp/PAAAA1wenBk1LlizRwoULtWjRItWuXVvbt2/X0KFDValSJcXFxTmtXhMmTNDYsWNzTF+9erV8fHycUCMAAHA5Z86ccXYVAAAAICcHTU8//bSeeeYZde3aVZJUt25dHThwQBMmTFBcXJyCgoIkSSkpKQoODjaXS0lJUUREhCQpKChIhw8fdljv+fPndfz4cXP5oKAgpaSkOJTJfp9d5mIjR45UQkKC+d5utyskJEQxMTGMPQAAwHUou/cxpBkzZmjSpElKTk5W/fr1NW3aNDVs2DDP8idOnNCzzz6rTz/9VMePH1e1atU0depUtWnTpghrDQAAigunBk1nzpyRq6vjMFFubm7KysqSJIWFhSkoKEiJiYlmsGS32/Xdd99p0KBBkqSoqCidOHFCW7duVWRkpCRp3bp1ysrK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XnMlvv/+e82ZM0f16tVzmD5s2DB9+eWX+uijj7Rx40b9888/evDBB835mZmZatu2rdLT07V582a98847WrBggUaNGmWW2bdvn9q2basWLVpo+/btGjp0qB555BGtWrXqmusNAABwLdLT0zVy5Eg1aNBAd955pxk0zZ8/X2FhYZo6daqGDRvm3EoCAAAUQIGCpsaNG+utt97SoUOHNHDgQH344YeqVKmSsrKytGbNGp06darAFTh9+rR69Oiht956S2XLljWnnzx5Um+//bYmT56se+65R5GRkZo/f742b96sb7/9VpK0evVq7dy5U++//74iIiLUunVrvfDCC5oxY4bS09MlXeiGHhYWptdee021atVSfHy8OnXqpClTphS4rgAAAFZ6/vnnNWvWLIWGhmr//v166KGHNGDAAE2ZMkWTJ0/W/v37NWLEiAKvd8aMGQoNDZWXl5caNWqkLVu25Fn2008/VYMGDVSmTBn5+voqIiJC77333rXsFgAAKMGu6qlzvr6+evjhh/Xwww9r9+7devvtt/Xyyy/rmWee0b333qsvvvgi3+saMmSI2rZtq+joaI0fP96cvnXrVmVkZCg6OtqcVrNmTVWtWlVJSUlq3LixkpKSVLduXQUGBpplYmNjNWjQIO3YsUO33XabkpKSHNaRXebiW/QulZaWprS0NPO93W6XJGVkZCgjIyPf+5ZfLkam5eu83rko0+F1STwGkgqlPRVEST3utL8LnNn+Suoxp+1dUBhtz9nn06v10Ucf6d1331X79u31yy+/qF69ejp//rx++uknubi4XNU6Fy9erISEBHPMp6lTpyo2Nla7d+9WQEBAjvLlypXTs88+q5o1a8rDw0PLli1T3759FRAQoNjY2GvdRQAAUMJcVdB0sVtvvVUTJ07UhAkTtGzZMs2bNy/fy3744Yfatm2bvv/++xzzkpOT5eHhoTJlyjhMDwwMVHJyslnm4pApe372vMuVsdvtOnv2rLy9vXNse8KECRo7dmyO6atXr5aPj/WPly2JIy+cO3fOfB16dq+8DC8n1sZ5Vqxw7iObS2Lbk2h/2ZzZ/mh7tD2rnTlz5sqFrkN//fWXIiMjJUl16tSRp6enhg0bdtUhkyRNnjxZ/fv3V9++fSVd6N29fPlyzZs3T88880yO8s2bN3d4/8QTT+idd97Rpk2bCJoAAECBFSho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WAIAAAAAAMC1c2qPph9++EEtWrQw32eHP3FxcVqwYIGGDx+u1NRUDRgwQCdOnFDTpk21cuVKeXl5mcssXLhQ8fHxatmypVxdXdWxY0e98cYb5nx/f3+tXr1aQ4YMUWRkpCpUqKBRo0ZpwIABRbejAAAAAAAAJYBTg6bmzZvLMIw857u4uGjcuHEaN25cnmXKlSunRYsWXXY79erV03//+9+rricAAAAAAACuzKm3zgEAAAAAAKD4IGgCAAAAAACAJQiaAAAAAAAAYAmCJgAAAAAAAFiCoAkAAAAAAACWIGgCAAAAAACAJQiaAAAAAAAAYAmCJgAAAAAAAFiCoAkAAAAAAACWIGgCAAAAAACAJQiaAAAAAAAAYAmCJgAAAAAAAFiCoAkAAAAAAACWIGgCAAAAAACAJQiaAAAAAAAAYAmCJgAAAAAAAFiCoAkAAAAAAACWIGgCAAAAAACAJQiaAAD/196dR1VV7v8DfzMeBoUAFdAULBIwRdDUC1bYFUWzrpZDqeWQV72phDl+NZfDcuxaaplZWmpdh2vmWJqiXisXmvOUMsiQQ4KmeE0sAeH9+8Mf+3IEZegwJO/XWmctz56eZ+/n8+z98dmcvUVERERERCxCA00iIiIiIiIiImIRGmgSERERERERERGL0ECTiIiIiIiIiIhYhAaaRERERERERETEIjTQJCIiIiIiIiIiFqGBJhERERERERERsQjbyq6AiIiIiIiIiDxYfr16Gb9m/FLi5bOzbhn//jk5DvYmh1KV5+JeGy4edUq1jpQPDTSJiIiIiIiIiEXt3bIGMSs+KNO6H4zsXep1OrwyHB37RpWpPLEsDTSJiIiIiIiIiEWFdX4JTUL/WmHlubjXrrCy5P400CQiIiIiIiIiFuXiUUc/Zaum9DBwERERERERERGxCA00iYiIiIiIiIiIRWigSURERERERERELEIDTSIiIiIiIiIiYhEaaBIREREREREREYvQQJOIiIiIiIiIiFiEBppERERERERERMQiNNAkIiIiIiIiIiIWoYEmERERERERERGxCA00iYiIiIiIiIiIRWigSURERERERERELEIDTSIiIiIiIiIiYhEaaBIREREREREREYvQQJOIiIiIiIiIiFiEBppERERERERERMQiNNAkIiIiIiIiIiIWoYEmERERERERERGxCA00iYiIiIiIiIiI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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABJoAAASlCAYAAADgRbP+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzde3zO9f/H8ee182bmuM1pX3PKIZock1MhC5HkEHIsFVZqHSVmSvt2IB2UyKkivg7JFwmLDogSUjlL5DCnNIbZ4f37w2/Xd5ddm43Pdu3wuN9ubna9r8/h9bn2vq7rvefnZDPGGAEAAAAAAAA3yM3VBQAAAAAAAKBwIGgCAAAAAACAJQiaAAAAAAAAYAmCJgAAAAAAAFiCoAkAAAAAAACWIGgCAAAAAACAJQiaAAAAAAAAYAmCJgAAAAAAAFiCoAkAAAAAAACWIGgCCqm9e/eqffv2KlGihGw2m5YsWeLqkuwGDhyo0NBQl61/1qxZstlsOnjwoEP7G2+8oapVq8rd3V3169eXJIWGhmrgwIF5XuPYsWNls9nyfL2udCP94o477tAdd9xhaT0AgBt3PZ/t69atk81m07p163KlpmtxNh7IDw4ePCibzaZZs2a5rAZn4yJnY87Mxlp5wWazaezYsXm+Xle5kX7h6vcaCi+CJuRr77//vmw2m5o2berqUgqcAQMGaMeOHRo/frw++eQTNWrUKNfXGR8fr+joaIWFhcnf31++vr6qW7eunn/+eR09ejTX138jVq1apeeee07NmzfXzJkz9eqrr+b6Oi9cuKCxY8fmuy93m80mm82mhx9+2Onzo0aNsk9z6tSpPK4OAJCVtD/w0/75+PjopptuUkREhOLi4lxdXr7nivGAdOUP/m7duqlcuXLy8vJSUFCQOnfurMWLF+fJ+m+EK8acK1asyHdhUtpOQjc3Nx0+fDjD8/Hx8fL19ZXNZlNERIQLKgTyjoerCwCyMmfOHIWGhmrz5s3at2+fqlev7uqSCoSLFy9q48aNGjVqVJ59kR04cEDt2rXToUOH1KNHDz3yyCPy8vLSL7/8ounTp+vzzz/Xnj178qSWa+nXr58eeOABeXt729u+/vprubm5afr06fLy8rK37969W25uuZPJX7hwQdHR0ZKU4Wicl156SS+88EKurDc7fHx8tGjRIr3//vsOr4ckffbZZ/Lx8dGlS5dcVB0A4FrGjRunKlWq6NKlS/r+++/1wQcfaMWKFfr111/l5+eXZ3VMmzZNqampOZqnVatWunjxYobvn7yQ2XggN0VFRWncuHGqUaOGHn30UVWuXFmnT5/WihUrdP/992vOnDnq06dPntRyLVePizIbczoba1lpxYoVmjx5stOw6eLFi/LwcN2fud7e3vrss8/03HPPObQXhNAQsApHNCHf+uOPP7RhwwZNnDhRgYGBmjNnjqtLylRCQoKrS3Bw8uRJSVLJkiUtW2ZW25icnKxu3bopLi5O69at02effabhw4dryJAhevfdd3XgwAH16NHDslpulLu7u3x8fBxOTTtx4oR8fX0zDCq9vb3l6emZ1yXKw8NDPj4+eb7eNHfffbfi4+P15ZdfOrRv2LBBf/zxhzp16uSiygAA2dGhQwc9+OCDevjhhzVr1iw9+eST+uOPP/TFF19kOk9ujGc8PT1zHDa4ubnJx8cn13b0ZCWz8cD1Msbo4sWLmT6/cOFCjRs3Tt27d9dvv/2m6OhoDR48WM8++6zWrl2rlStXKiAgwJJarHD1uCizMaezsVZe8fHxcWnQ1LFjR3322WcZ2ufOncv4CUUGQRPyrTlz5qhUqVLq1KmTunfvnmnQdPbsWT311FMKDQ2Vt7e3KlWqpP79+zuc0nPp0iWNHTtWN910k3x8fFS+fHl169ZN+/fvl5T5+cnOznkeOHCg/P39tX//fnXs2FHFixdX3759JUnfffedevTooX/961/y9vZWSEiInnrqKacDjF27dqlnz54KDAyUr6+vatasqVGjRkmS1q5dK5vNps8//zzDfHPnzpXNZtPGjRudvh5jx45V5cqVJUnPPvusbDabw7URtm7dqg4dOiggIED+/v5q27atfvjhB4dlpB12/80332jYsGEKCgpSpUqVnK5PkhYtWqTt27dr1KhRatGiRYbnAwICNH78+Eznl6Q333xTt99+u8qUKSNfX181bNhQCxcuzDDd6tWr1aJFC5UsWVL+/v6qWbOmXnzxRYdp3n33Xd18883y8/NTqVKl1KhRI82dOzfD9qVdN8Bms2nmzJlKSEiwn2qQ9jt3di2Ca/W5y5cva8yYMWrYsKFKlCihYsWKqWXLllq7dq19GQcPHlRgYKAkKTo62r7etD1zzq7RlJycrJdfflnVqlWTt7e3QkND9eKLLyox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RpJp0aKFSU5OznJdxhhz6623mhIlSlxzujQDBgwwlStXdmi7+rW7fPmyqVu3rmnTpo297a233jKSzMmTJzNd9r333mtuvvnmLNeftn1//PGHQ03FihXLMG3lypXNgAED7I+z0+eSk5NNYmKiw3N///23CQ4ONoMHD7a3nTx50khy+vuMiooy6T+it23bZiSZhx9+2GG6Z555xkgyX3/9tUPNksy3335rbztx4oTx9vY2Tz/9dIZ1XU2SGT58uDlz5ozx8vIyn3zyiTHGmOXLlxubzWYOHjxory/td3H58mUTFBRk6tatay5evGhf1rJly4wkM2bMGHtb/fr1Tfny5R369qpVq4wkh37x3XffGUlmzpw5DvWtXLkyQ3vr1q1N69at7Y+z0w8AoDBK+45bs2aNOXnypDl8+LCZN2+eKVOmjPH19TV//fWXMSbz8Ux2P3vPnj1rihcvbpo2berwuW+M43jm6u/8ESNGmICAgCzHF1ePy3LyHZO2XePGjXNY5q233moaNmyY6TrTz3/1eOB6voNXrlx5zXV98cUXRpJ56623rjmtMc7Hpc7Gnp999lmGcUCJEiXM8OHDM1321q1bjSSzYMGCLGu4elyU2Zjz6rFWdvtLdsfSw4cPdxgnpXf12Cqn49927do51PTUU08Zd3d3h3GLM+nHRs8884ypXr26/bnGjRubQYMG2etL/7uYNGmSkWQ+/fRTe9vly5dNs2bNjL+/v4mPjzfGGLNkyRIjybz++uv26ZKTk03Lli0z9Iu2bduaevXqmUuXLtnbUlNTze23325q1Khhb7v6vZbdfgBcC6fOIV+aM2eOgoODdeedd0q6cghsr169NG/ePIfDnhctWqSwsDCnqXzaHpxFixapbNmyevzxxzOd5no42yPm6+tr/zkhIUGnTp3S7bffLmOMtm7dKunKuezffvutBg8erH/961+Z1tO/f38lJiY6nD42f/58JScn68EHH8xxvSkpKVq1apW6du2qqlWr2tvLly+vPn366Pvvv1d8fLzDPEOGDJG7u/s1lx0fH3/de+LSpH/t/v77b/3zzz9q2bKlwyHdaXsrv/jii0wvLFqyZEn99ddf+vHHH2+onsxkp8+5u7vbr+2QmpqqM2fOKDk5WY0aNXLYnpxYsWKFJCkyMtKh/emnn5YkLV++3KG9Tp06atmypf1xYGCgatasqQMHDmR7naVKldLdd99tv87A3Llzdfvtt9sPk0/vp59+0okTJzRs2DCHa0t16tRJtWrVstd37Ngxbdu2TQMGDHDYK3bXXXepTp06DstcsGCBSpQoobvuukunTp2y/2vYsKH8/f0dTkW8Wm73AwDI79q1a6fAwECFhITogQcekL+/vz7//HNVrFjRYbqrxzPZ/exdvXq1zp07pxdeeCHDNQWzGl+VLFlSCQkJWr16dba3JbvfMek99thjDo9btmyZo+/A9HL6HVylShWFh4dfc7lp464bGUOlHz9dunRJp06d0m233SZJGcZQmzZtyvQuwGnfyV999ZUuXLhw3fVkJrv9JTtj6Zy4nvHvI4884lBTy5YtlZKSoj///DPb6+3Tp4/27dunH3/80f5/Zkf5rVixQuXKlVPv3r3tbZ6ennriiSd0/vx5ffPNN/bpPDw8HN6z7u7uGf7GOXPmjL7++mv17NlT586ds7+HT58+rfDwcO3du9fpZQ2k3O8HKDoImpDvpKSkaN68ebrzzjv1xx9/aN++fdq3b5+aNm2quLg4xcbG2qfdv39/pteKST9NzZo1Lb0ooIeHh9PTfA4dOqSBAweqdOnS9msCtG7dWpLs5zWnDXKuVXetWrXUuHFjh2tTzZkzR7fddtt13X3v5MmTunDhgtPDt2vXrq3U1NQMt2KtUqVKtpYdEBCgc+fO5bim9JYtW6bbbrtNPj4+Kl26tP3UsvTng/fq1UvNmzfXww8/rODgYD3wwAP6z3/+4xA6Pf/88/L391eTJk1Uo0YNDR8+3OHUuhuVnT4nSbNnz9Ytt9wiHx8flSlTRoGBgVq+fPl1n9/+559/ys3NLcPvvly5cipZsmSGwc/VIaZ0JTjKzrWN0uvTp49Wr16tQ4cOacmSJZkOktLW76x/1apVy/582v81atTIMN3V8+7du1f//POPgoKCFBgY6PDv/PnzOnHiRKZ153Y/AID8bvLkyVq9erXWrl2r33//XQcOHMgQfjgbz2T3szftVLzsfCemN2zYMN10003q0KGDKlWqpMGDB2vlypVZzpPd75g0Pj4+9usgprme78D068/Jd3BOxk+SbmgMdebMGY0YMULBwcHy9fVVYGCgff3pxxyvv/66fv31V4WEhKhJkyYaO3asQ/BWpUoVRUZG6qOPPlLZsmUVHh6uyZMnW3Zdnuz2l+yMpXPiesa/V4+hSpUqJUk56j+33nqratWqpblz52rOnDkqV66c/TppV/vzzz9Vo0aNDBe/r127tv35tP/Lly+f4fTEq7dt3759MsZo9OjRGd7DUVFRkpTpGCq3+wGKDq7RhHzn66+/1rFjxzRv3jzNmzcvw/Nz5sxR+/btLV1nZnveMrtopLe3d4Yvg5SUFN111106c+aMnn/+edWqVUvFihXTkSNHNHDgwBzf2le6clTTiBEj9NdffykxMVE//PCD3nvvvRwv53ql36uUlVq1amnr1q06fPiwQkJCcrye7777Tl26dFGrVq30/vvvq3z58vL09NTMmTMdLhDp6+urb7/9VmvXrtXy5cu1cuVKzZ8/X23atNGqVavk7u6u2rVra/fu3Vq2bJlWrlypRYsW6f3339eYMWMUHR2d49qux6effqqBAweqa9euevbZZxUUFCR3d3fFxMTYB1rXK7tH4WV2JJoxJkfr69Kli7y9vTVgwAAlJiaqZ8+eOZr/RqSmpiooKCjTGwFc/UdEevmhHwCAKzVp0kSNGjXKchpn45kb+ezNjqCgIG3btk1fffWVvvzyS3355ZeaOXOm+vfv7/Tix9cjO0djX4/sfgfnZPwkSTt27Ljumnr27KkNGzbo2WefVf369eXv76/U1FTdfffdDmPPnj17qmXLlvr888+1atUqvfHGG3rttde0ePFidejQQZI0YcIEDRw4UF988YVWrVqlJ554QjExMfrhhx+yvCmMVXJjLH09rBpD9enTRx988IGKFy+uXr165dldFNNep2eeeSbTI+uy2mnt6n6AwoGgCfnOnDlzFBQUZL+bRHqLFy/W559/rilTpsjX11fVqlXTr7/+muXyqlWrpk2bNikpKSnTCwen7am4+q4NOTlEdseOHdqzZ49mz56t/v3729uvPjQ87bDda9UtSQ888IAiIyP12Wef6eLFi/L09FSvXr2yXVN6gYGB8vPz0+7duzM8t2vXLrm5uV1XSCRJnTt31meffaZPP/1UI0eOzPH8ixYtko+Pj7766iuHWyDPnDkzw7Rubm5q27at2rZtq4kTJ+rVV1/VqFGjtHbtWrVr106SVKxYMfXq1Uu9evXS5cuX1a1bN40fP14jR47McLh2TmWnzy1cuFBVq1bV4sWLHQalaXuR0uTk1M3KlSsrNTVVe/fute/hkqS4uDidPXvW6elsVvD19VXXrl316aefqkOHDipbtmym9UlXLoB69R673bt3259P+3/v3r0ZlnF136xWrZrWrFmj5s2bZ3vQnl5u9gMAKKyy+9mbdjOVX3/9NcdHWnt5ealz587q3LmzUlNTNWzYMH344YcaPXq002Vl9zsmt+TWd/BNN92kmjVr6osvvtDbb7+d5YW0nfn7778VGxur6OhojRkzxt7u7DtWunK62LBhwzRs2DCdOHFCDRo00Pjx4+1BkyTVq1dP9erV00svvaQNGzaoefPmmjJlil555ZXr2sY02ekv2R1LS9kfQ+Xm+Pda+vTpozFjxujYsWNZXrS8cuXK+uWXX5SamuoQRqXdtS79GCo2NtZ+k5Y0V29b2t8anp6e9rFxTuVWP0DRwalzyFcuXryoxYsX65577lH37t0z/IuIiNC5c+fsdzm7//77tX37dqe3Rk/b63D//ffr1KlTTo8ESpumcuXKcnd317fffuvw/Pvvv5/t2tP2fqTf22GMcbhdr3TlC69Vq1aaMWOGDh065LSeNGXLllWHDh306aefas6cObr77rsz/UM/O/W1b99eX3zxhcOtZuPi4jR37ly1aNHCfgh3TnXv3l316tXT+PHjtXHjxgzPnzt3TqNGjcqyNpvN5nAE2cGDB7VkyRKH6c6cOZNh3vr160uS/fbCV9/O18vLS3Xq1JExRklJSdndpExlp8856wubNm3K8Nqk3d0ns9vSptexY0dJ0qRJkxzaJ06cKElO72JilWeeeUZRUVEaPXp0ptM0atRIQUFBmjJlisOtnr/88kvt3LnTXl/58uVVv359zZ492+Ew7NWrV+v33393WGbPnj2VkpKil19+OcP6kpOTs3zdcrsfAEBhld3P3vbt26t48eKKiYnJcCfSrI78uPrz2c3NzX7H1fTfH+ll9zsmt+Tmd3B0dLROnz6thx9+WMnJyRmeX7VqlZYtW+Z0XmfjDWd1pqSkZDj1KSgoSBUqVLC/nvHx8RnWX69ePbm5uWX6e8mJ7PSX7I6lpSs7k6Rrj6Fyc/x7LdWqVdOkSZMUExOjJk2aZDpdx44ddfz4cYe72iUnJ+vdd9+Vv7+//dTBjh07Kjk5WR988IF9upSUFL377rsOywsKCtIdd9yhDz/8UMeOHcuwvpMnT2ZaS273AxQdHNGEfGXp0qU6d+6cunTp4vT52267TYGBgZozZ4569eqlZ599VgsXLlSPHj00ePBgNWzYUGfOnNHSpUs1ZcoUhYWFqX///vr4448VGRmpzZs3q2XLlkpISNCaNWs0bNgw3XvvvSpRooR69Oihd999VzabTdWqVdOyZcuyvAbM1WrVqqVq1arpmWee0ZEjRxQQEKBFixY5PZ/7nXfeUYsWLdSgQQM98sgjqlKlig4ePKjly5dr27ZtDtP2799f3bt3lySng76ceOWVV7R69Wq1aNFCw4YNk4eHhz788EMlJibq9ddfv+7lenp6avHixWrXrp1atWqlnj17qnnz5vL09NRvv/2muXPnqlSpUho/frzT+Tt16qSJEyfq7rvvVp8+fXTixAlNnjxZ1atX1y+//GKfbty4cfr222/VqVMnVa5cWSdOnND777+vSpUqqUWLFpKuDGTKlSun5s2bKzg4WDt37tR7772nTp063fAFyyVlq8/dc889Wrx4se677z516tRJf/zxh6ZMmaI6dero/Pnz9mX5+vqqTp06mj9/vm666SaVLl1adevWdXr9grCwMA0YMEBTp07V2bNn1bp1a23evFmzZ89W165d7RfOzw1hYWEKCwvLchpPT0+99tprGjRokFq3bq3evXvbbz0dGhqqp556yj5tTEyMOnXqpBYtWmjw4ME6c+aM3n33Xd18880Or0/r1q316KOPKiYmRtu2bVP79u3l6empvXv3asGCBXr77bft742r5XY/AIDCKrufvQEBAXrrrbf08MMPq3HjxurTp49KlSql7du368KFC5meBvfwww/rzJkzatOmjSpVqqQ///xT7777rurXr+9wtFB6OfmOyQ25+R3cq1cv7dixQ+PHj9fWrVvVu3dvVa5cWadPn9bKlSsVGxvrcBmB9AICAtSqVSu9/vrrSkpKUsWKFbVq1Sr98ccfDtOdO3dOlSpVUvfu3RUWFiZ/f3+tWbNGP/74oyZMmCDpyqUrIiIi1KNHD910001KTk7WJ598Ind3d91///3XvX3pa71Wf8nJWLphw4aSpCeeeELh4eFyd3fXAw884HTduTX+zY4RI0Zcc5pHHnlEH374oQYOHKgtW7YoNDRUCxcu1Pr16zVp0iT7uKVz585q3ry5XnjhBR08eFB16tTR4sWLnV4/afLkyWrRooXq1aunIUOGqGrVqoqLi9PGjRv1119/afv27U5rye1+gCIk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dnV5AAAANyzHhyC9+eabatWqlSpXrqxbb71VkrRt2zYFBwfrk08+sbxAAACAwmLRokVauHCh7rjjDntbx44d5evrq549e+qDDz5wXXEAAAAWyHHQVLFiRf3yyy+aM2eOtm/fLl9fXw0aNEi9e/fOcIteAAAA/M+FCxcUHBycoT0oKIhT5wAAQKFwXRdVKlasmB555BGrawEAACjUmjVrpqioKH388cfy8fGRJF28eFHR0dFq1qyZi6sDAAC4cdd99e7ff/9dhw4d0uXLlx3au3TpcsNFAQAAFEZvv/22wsPDValSJYWFhUmStm/fLh8fH3311Vcurg4AAODG5ThoOnDggO677z7t2LFDNptNxhhJks1mkySlpKRYWyEAAEAhUbduXe3du1dz5szRrl27JEm9e/dW37595evr6+LqAAAAblyOg6YRI0aoSpUqio2NVZUqVbR582adPn1aTz/9tN58883cqBEAAKDQ8PPz05AhQ1xdBgAAQK7IcdC0ceNGff311ypbtqzc3Nzk5uamFi1aKCYmRk888YS2bt2aG3UCAAAUSEuXLlWHDh3k6emppUuXZjktlyAAAAAFXY6DppSUFBUvXlySVLZsWR09elQ1a9ZU5cqVtXv3bssLBAAAKMi6du2q48ePKygoSF27ds10OpvNxiUIAABAgZfjoKlu3bravn27qlSpoqZNm+r111+Xl5eXpk6dqqpVq+ZGjQAAAAVWamqq058BAAAKoxwHTS+99JISEhIkSePGjdM999yjli1bqkyZMpo/f77lBQIAABRmZ8+eVcmSJV1dBgAAgCXccjpDeHi4unXrJkmqXr26du3apVOnTunEiRNq06aN5QUCAAAUFq+99prDjrkePXqodOnSqlixorZv3+7CygAAAKyRo6ApKSlJHh4e+vXXXx3aS5cuLZvNZmlhAAAAhc2UKVMUEhIiSVq9erXWrFmjlStXqkOHDnr22WddXB0AAMCNy9Gpc56envrXv/7FhSoBAACuw/Hjx+1B07Jly9SzZ0+1b99eoaGhatq0qYurAwAAuHE5PnVu1KhRevHFF3XmzJncqAcAAKDQKlWqlA4fPixJWrlypdq1aydJMsawIw8AABQKOb4Y+Hvvvad9+/apQoUKqly5sooVK+bw/M8//2xZcQAAAIVJt27d1KdPH9WoUUOnT59Whw4dJElbt25V9erVXVwdAADAjctx0NS1a9dcKAMAAKDwe+uttxQaGqrDhw/r9ddfl7+/vyTp2LFjGjZsmIurAwAAuHE5DpqioqJyow4AAIBCz9PTU88880yG9qeeesoF1QAAAFgvx0ETAAAAsm/p0qXq0KGDPD09tXTp0iyn7dKlSx5VBQAAkDtyHDS5ubnJZrNl+jwXsgQAAPifrl276vjx4woKCsryEgQ2m41xFAAAKPByHDR9/vnnDo+TkpK0detWzZ49W9HR0ZYVBgAAUBikpqY6/RkAAKAwynHQdO+992Zo6969u26++WbNnz9fDz30kCWFAQAAAAAAoGBxs2pBt912m2JjY61aHAAAQKHzxBNP6J133snQ/t577+nJJ5/M+4IAAAAsZknQdPHiRb3zzjuqWLGiFYsDAAAolBYtWqTmzZtnaL/99tu1cOFCF1QEAABgrRyfOleqVCmHi4EbY3Tu3Dn5+fnp008/tbQ4AACAwuT06dMqUaJEhvaAgACdOnXKBRUBAABYK8dB01tvveUQNLm5uSkwMFBNmzZVqVKlLC0OAACgMKlevbpWrlypiIgIh/Yvv/xSVatWdVFVAAAA1slx0DRw4MBcKAMAAKDwi4yMVEREhE6ePKk2bdpIkmJjYzVhwgRNmjTJtcUBAABYIMdB08yZM+Xv768ePXo4tC9YsEAXLlzQgAEDLCsOAACgMBk8eLASExM1fvx4vfzyy5Kk0NBQffDBB+rfv7+LqwMAALhxOb4YeExMjMqWLZuhPSgoSK+++qolRQEAABRWQ4cO1V9//aW4uDjFx8frwIEDhEwAAKDQyHHQdOjQIVWpUiVDe+XKlXXo0CFLigIAACiskpOTtWbNGi1evFjGGEnS0aNHdf78eRdXBgAAcONyfOpcUFCQfvnlF4WGhjq0b9++XWXKlLGqLgAAgELnzz//1N13361Dhw4pMTFRd911l4oXL67XXntNiYmJmjJliqtLBAAAuCE5PqKpd+/eeuKJJ7R27VqlpKQoJSVFX3/9tUaMGKEHHnggN2oEAAAoFEaMGKFGjRrp77//lq+vr739vvvuU2xsrAsrAwAAsEaOj2h6+eWXdfDgQbVt21YeHldmT01NVf/+/blGEwAAQBa+++47bdiwQV5eXg7toaGhOnLkiIuqAgAAsE6OgyYvLy/Nnz9fr7zyirZt2yZfX1/Vq1dPlStXzo36AAAACo3U1FSlpKRkaP/rr79UvHhxF1QEAABgrRwHTWlq1KihGjVqWFkLAABAoda+fXtNmjRJU6dOlSTZbDadP39eUVFR6tixo4urAwAAuHE5vkbT/fffr9deey1D++uvv64ePXpYUhQAAEBh9Oabb2r9+vWqU6eOLl26pD59+thPm3M2vgIAAChocnxE07fffquxY8dmaO/QoYMmTJhgRU0AAACFUkhIiLZv36758+dr+/btOn/+vB566CH17dvX4eLgAAAABVWOg6bz589nuIClJHl6eio+Pt6SogAAAAqbpKQk1apVS8uWLVPfvn3Vt29fV5cEAABguRyfOlevXj3Nnz8/Q/u8efNUp04dS4oCAAAobDw9PXXp0iVXlwEAAJCrcnxE0+jRo9WtWzft379fbdq0kSTFxsZq7ty5WrhwoeUFAgAAFBbDhw/Xa6+9po8++kgeHtd9TxYAAIB8K8cjnM6dO2vJkiV69dVXtXDhQvn6+iosLExff/21SpcunRs1AgAAFAo//vijYmNjtWrVKtWrV0/FihVzeH7x4sUuqgwAAMAa17UrrVOnTurUqZMkKT4+Xp999pmeeeYZbdmyRSkpKZYWCAAAUFiULFlS999/v6vLAAAAyDXXfcz2t99+q+nTp2vRokWqUKGCunXrpsmTJ1tZGwAAQKGQmpqqN954Q3v27NHly5fVpk0bjR07ljvNAQCAQidHQdPx48c1a9YsTZ8+XfHx8erZs6cSExO1ZMkSLgQOAACQifHjx2vs2LFq166dfH199c477+jkyZOaMWOGq0sDAACwVLbvOte5c2fVrFlTv/zyiyZNmqSjR4/q3Xffzc3aAAAACoWPP/5Y77//vr766istWbJE//3vfzVnzhylpqa6ujQAAABLZfuIpi+//FJPPPGEhg4dqho1auRmTQAAAIXKoUOH1LFjR/vjdu3ayWaz6ejRo6pUqZILKwMAALBWto9o+v7773Xu3Dk1bNhQTZs21XvvvadTp07lZm0AAACFQnJysnx8fBzaPD09lZSU5KKKAAAAcke2j2i67bbbdNttt2nSpEmaP3++ZsyYocjISKWmpmr16tUKCQlR8eLFc7NWAACAAskYo4EDB8rb29vedunSJT322GMqVqyYvW3x4sWuKA8AAMAy2T6iKU2xYsU0ePBgff/999qxY4eefvpp/fvf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euklvfjii6pRo4aWLFmiunXrumoToCuH10dFRWU4xB7IbfQ9uAp9D67E+Knw4LMErkC/g6vQ94oGm8kv978DAAAAAABAgebSazQBAAAAAACg8CBoAgAAAAAAgCUImgAAAAAAAGAJgqYCJDQ0VJMmTbru+WfNmqWSJUtaVk9hcqOvbV6z2WxasmSJq8solPLqtV23bp1sNpvOnj1rb1uyZImqV68ud3d3Pfnkk3nynh04cKDKli2rJ598UpJ0xx132H/G/4wdO1b169d3dRl2efWZdfDgQdlsNm3bts3etn79etWrV0+enp7q2rWr076cGwYOHKiuXbvm6jpQODF+yj0FbfwkMYbKTUVpDJX2nZQ2bmL85Bzjp232tiI3fjKwxIABA8y9996bq+s4ceKESUhIyNa0lStXNm+99ZZD24ULF0xcXNx1r3/mzJlGkpFkbDabKVeunOnZs6f5888/r3uZ+UVOXltjrvy+014LDw8PExoaap599llz8eLFXKzyfySZzz//PE/WlV767U7/b+/evXleS/qasvveO3bsmImIiDBVqlQxXl5eplKlSuaee+4xa9assU+TV69tYmKiOXbsmElNTbW3lSlTxjRs2NCEhoYab29vExQUZBo3bmzef//9HPXPzKxdu9ZIMn///be9bcCAAaZDhw4mPj7eGGPM6dOn7T9bJbu/o6v7V+nSpU14eLjZvn27pfVci7M+cO7cOXPq1Kk8Wf8///xjXnzxRVOzZk3j7e1tgoODTdu2bc2iRYvs/cXZZ3xuSE5ONseOHTNJSUn2tiZNmpgHH3zQHD582Pz9999O+/KN+OOPP4wks3XrVof2s2fPOvRdFA6Mnwq2nI6fjGEMxRjqxl39vXPs2DHj6+trSpYsaby9vU1gYKC57bbbzGuvvWbJ+MmYjGOotNcubdzE+InxU3qMn4zxyO0gC9YJDAy8ofl9fX3l6+t7Q8sICAjQ7t27ZYzRH3/8oWHDhqlHjx7atGnTDS33WpKSkuTp6Zlry7+e1/buu+/WzJkzlZSUpC1btmjAgAGy2Wx67bXXcqHC/CNtu9O73r55+fJleXl5WVHWNR08eFDNmzdXyZIl9cYbb6hevXpKSkrSV199peHDh2vXrl15UkcaLy8vlStXzv54x44dOn36tIoVK2avz9vbWzt27NDUqVNVsWJFdenSxemybvT9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ip5//vkMdYSHh6tUqVL68ccftWDBAq1Zs0YREREO03399dc6evSovv32W02cOFFRUVG65557VKpUKW3atEmPPfaYHn30Uf3111+Z/s6zkp1+nra9Xl5eWr9+vaZMmaKzZ8+qTZs2uvXWW/XTTz9p5cqViouLU8+ePSVJx44dU+/evTV48GDt3LlT69atU7du3WSM0TPPPKOePXvq7rvvtvf122+/PUNtZ86c0cqVKzV8+HAVK1Ysw/NZ7eEoXry4Zs2apd9//11vv/22pk2bprfeesv+fN++fVWpUiX9+OOP2rJli1544QX73rHhw4crMTFR3377rXbs2KHXXnvN6V6dmjVrymazSbrSV51th81ms79npSt7J0aNGqWnnnpKgwcPVmpqqkqUKKHXX39d69at0+jRo7Vt2zaFh4dLkkJCQtSvXz9J0rvvvqtvvvlGDRo00Oeff56hntWrV+unn37S0qVL1aFDB509e1aenp7asmWLevTooQkTJighIUFvvvmmHnnkEXl4eGjXrl2qVq2avv32Wx06dEjPPPOMJGX7d+TM+fPn9emnn6p69eoqU6aMpOz197ffflsTJkzQm2++qV9++UXh4eHq0qWL9u7dKynrz4off/xRkjRz5kwdO3bM/tiZtWvXav/+/Vq7dq1mz56tWbNmadasWfbn+/fvr6NHj2rdunVatGiRpk6dqhMnTmS6vNTUVM2bN099+/ZVhQoVMjzv7+8vDw/nByK7ubnpnXfe0W+//abZs2fr66+/1nPPPWd/Pqu+OHr0aP3+++/68ssvtXPnTn3wwQcqW7ZshnWEhITo2LFjCggI0KRJk3Ts2LEMn4uStG3bNrVt21Z16tTRxo0b9f3336tz585KSUmRdOV3GBkZqZ9++kmxsbFyc3PTfffdp9TUVEmyf0auWbNGx44d0+LFi51u83PPPadFixZp9uzZ+vnnn1W9enWFh4frzJkzDtONGjVKEyZM0E8//SQPDw8NHjzY6fKQ/zB+Kpzjp3PnzunYsWNatmyZli1bpjVr1ig2Ntbh6BzGUIyhsjOGOnPmjH766Sc9/fTTkpyPodLGV8uXL5cknT59WuPGjdOyZct07733KjU1VZUqVdLQoUM1ffp0TZgwQUlJSfrpp580cOBASdKCBQvs616xYoX69OmT6ff5wIED9dNPP6lly5a6+eabFRYWpqCgIHXr1k133323jh8/rgsXLmjlypVyc3NT/fr1FRgYqFatWjF++n+MnwrJ+ClHsRQyldVeirRzRdMn6pMnTzb+/v4mJSXFxMfHG09PT7NgwQL782fPnjV+fn6Z7pGbMGGCuemmmxzS3/Scpb5X71Fr1qyZ6du3b7a3Me0aA2mpu/4/LX3iiSfs07Rt29aebKf55JNPTPny5Y0xV5JYDw8Pc+zYMfvzme2RmzRpksNyqlWrlmFv1ssvv2yaNWtmjDHm8ccfN23atHF6nmtOXq9Vq1YZd3d3c+jQIfvzv/32m5FkT3vDwsLsr4W3t7f9ugs1atTI9PUzxphOnTqZp59+2v64devWpkWLFg7TNG7c2Dz//PPGGGO++uor4+Hh4ZDOf/nllw6v19SpU02pUqUc9jItX77cuLm52fciDhgwwFSuXNmkpKTYp6lZs6Zp2bKl/XFycrIpVqyY+eyzzzKtf8CAAcbd3d0UK1bM/q979+7GmGv387TtTb/H0pgrv8P27ds7tB0+fNhIMrt37zZbtmwxkszBgwczrela569v2rTJSDKLFy/Ocjpjrn19gTfeeMM0bNjQ/rh48eJm1qxZTqetV6+eGTt2rNPn0u/F+OGHH5zurfL397f3s+eee87+npVknnzyyWtuS48ePYwk+56ZMmXKOOw5SUpKMpUqVXI4oqlJkyZGklm/fr35888/jbu7u9mxY4fx9fU1//nPf4wxxtSpU8dIMvv27bN/LowdO9YEBwcbY6783tN+NiZn1xhI378kmfLly5stW7bYp8lOf69QoYIZP368w7IbN25shg0bZozJ+rPCGOd9wNkeucqVK5vk5GR7W48ePUyvXr2MMVeOPJBk3zNrjDF79+41kjLdIxcXF2ckmYkTJ2byCv3PtfbsLViwwJQpU8b+OKu+2LlzZzNo0CCnzzk7379EiRL2oySMyXjdit69e5vmzZtfcxvSnDx50kgyO3bsyHSdxjj2o/PnzxtPT08zZ84c+/OXL182FSpUMK+//rpDXemvH7J8+XIjKc+uBYNrY/x0RVEZP0VFRRl3d3f7Z33aGEqSWbhwYaavoTGMoRhD/U/a53vae+CTTz5xGEOVKVPG3reee+45Y8yV9212x0/Dhw83bdq0sY+hypcvbx599FH7d13a+OnqI5rSrpW0aNEi4+7ubo4cOWJOnTplH0O1bdvWdOrUyUgyr732mn0slTZuYvzE+KkwjZ84oikP7Ny5U82aNbMn6pLUvHlznT9/Xn/99ZcOHDigpKQkh71hJUqUUM2aNTNdZo8ePXTx4kVVrVpVQ4YM0eeff67k5OQc1ZWWmuZE8eLFtW3bNv3000+aMGGCGjRoYN/bJknbt2/XuHHj7Ofj+vv7a8iQITp27JguXLig3bt3KyQkxOF81Mz2AjZq1Mj+c0JCgvbv36+HHnrIYdmvvPKK9u/fL+nKHoRt27apZs2aeuKJJ7Rq1Sr7/Dl5vXbu3KmQkBCFhITY2+rUqaOSJUtq586d9rZixYpp27Zt2rRpkwYMGKAmTZo4LDMlJUUvv/yy6tWrp9KlS8vf319fffVVhnOlb7nlFofH5cuXt6f2abWkT+ebNWuWod6wsDCHvUzNmzdXamqqdu/ebW+7+eab5eb2v7d8cHCww15Jd3d3lSlTJss9BpJ05513atu2bfZ/77zzjr2OrPp5moYNGzosb/v27Vq7dq3D77VWrVqSrpzLHBYWprZt26pevXrq0aOHpk2bpr///jvLGq9mjMnR9OnNnz9fzZs3V7ly5eTv76+XXnrJ4XcYGRmphx9+WO3atdO///1ve3+UpCeeeEKvvPKKmjdvrqioKP3yyy85Wvfo0aPl7++vm2++WYmJiQ7v2fTvjzTPP/+8SpYsKXd3d9lsNi1YsECSdOjQIf3zzz86ffq0w/QeHh4ZlnPhwgXZbDY1bdpUO3bsUEpKim677TYlJibqwQcflL+/v3bv3i13d3dVq1ZNkuTn56dbbrnF3nfS9+GcSt+/Nm/erPDwcHXo0EF//vmnpGv39/j4eB09elTNmzd3WG7z5s3t79+sPity4uabb7YfjSA5bvfu3bvl4eGhBg0a2J+vXr26SpUqlenybqSfrlmzRm3btlXFihVVvHhx9evXT6dPn9aFCxckZd0Xhw4dqnnz5ql+/fp67rnntGHDhuuuQ7r2d8vevXvVu3dvVa1aVQEBAfa9oTm5jsT+/fuVlJTk8Hv29PRUkyZNHD6nJcfP2PLly0vSdfdP5C3GT4Vz/OTv72//rN+0aZMaN24sf39/3X///fZpGEMxhrqRMdTmzZsVHR0td3d3JSYmSpL97l/Oxk+TJ09W7dq15e3tLTc3N02ePFnr1q2TJP322286duyYateubZ/e2fhJunKElYeHhzw8PJSSkqKbbrpJlStXto+hvvnmG504cUJ+fn4KCgqSn5+fqlWrZu+3jJ8YPxWm8RNBUwEVEhKi3bt36/3335evr6+GDRumVq1aKSkpKdvLuJ4LW7q5ual69eqqXbu2IiMjddttt2no0KH258+fP6/o6GiHL9EdO3Zo79698vHxydG60n8Qnj9/XpI0bdo0h2X/+uuv+uGHHyRJDRo00B9//KGXX35ZFy9eVM+ePdW9e3dJ1rxeV3N3d1f16tUVFhamGTNm2P+YT/PGG2/o7bff1vPPP6+1a9faT2O6fPmyw3KuvgihzWazHwJpJWfruZ51FytWTNWrV7f/S/vgya6rD7s+f/68Onfu7PB73bZtm/bu3atWrVrJ3d1dq1ev1pdffqk6dero3XffVc2aNfXHH39ke501atSQzWbL8cUqN27cqL59+6pjx45atmyZtm7dqlGjRjn8DseOHavffvtNnTp10tdff606derYT0d7+OGHdeDAAfXr1087duxQo0aN9O6772ZYT/Xq1R0Gl2mCgoLk7u5uf6+mf89e/TrOmjVLr7/+umrUqKGpU6dq5cqV6tixoyRl6HPZdf78ebm7u2vLli2qWbOmHnvsMW3btk3jx4+Xn5+ffTpPT0/ZbDb7F336n3Mqff9q3LixPvroIyUkJGjatGnXtTxnsvqsyAmr37uBgYEqWbJkjvvpwYMHdc899+iWW27RokWLtGXLFk2ePFnS/373WfXFtIHoU089paNHj6pt27b2Q/evx7W+Wzp37qwzZ85o2rRp2rRpk/1iyNfbT68l/e8p7X2WG5+xKBgYP7l+/OTm5mb/rA8LC9MDDzygxMRETZ8+3T4NY6jM50+vqI+hqlatKpvNZj+1K317cHCwQ1va+/bq13DevHl65plndPjwYbVp00Zz5sxRz5497X/EX893U0JCgn38lBbMPPbYY9q5c6f69u1r7ztp/6eNmxg/XR/GT/lz/ETQlAdq166tjRs3OnxwrF+/XsWLF1elSpVUtWpVeXp6OpzL+s8//2jPnj1ZLtfX11edO3fWO++8o3Xr1mnjxo3asWOHpCt3Y0g7nzMzt9xyi2JjY29gy65cB2D+/Pn26yE0aNBAu3fvdvgSTfvn5uammjVr6vDhw4qLi7MvI6tzeNMEBwerQoUKOnDgQIblVqlSxT5dQECAevXqpWnTpmn+/PlatGiR/XzTrF6v9GrXrq3Dhw/r8OHD9rbff/9dZ8+eVZ06dZzW5+bmpnbt2umff/7RxYsXJV35Hd9777168MEHFRYWpqpVq17zd5pZLemvE5E2MEw/zfbt25WQkGBvW79+vf31zivX6ueZadCggX777TeFhoZm+N2mDQZsNpuaN2+u6Ohobd26VV5eXvaBSHb6eunSpRUeHq7Jkyc7vE5pzp4963S+DRs2qHLlyho1apQaNWqkGjVq2PcMpXfTTTfpqaee0qpVq9StWzeHO8qEhIToscce0+LFi/X00087/cIvU6aM7rzzTkmy9x9nsnrPfvnll5KuXGPkoYceUnh4uEOtJUqUsJ+nn/Z6JScna8uWLQ7L8fPzkzFGmzZt0q233qqUlBTt3btXBw8eVMuWLVW9enUFBwc77Nm9luz8jjJjs9nk5uZmf12u1d8DAgJUoUIFrV+/3mE569evd3j/ZvVZ4enped31pqlZs6aSk5O1detWe9u+ffuy3JPs5uamBx54QHPmzNHRo0czPH/+/HmnRxJs2bJFqampmjBhgm677TbddNNNTufPqi8GBgZqwIAB+vTTTzVp0iRNnTo1p5tsl1U/PX36tHbv3q2XXnpJbdu2Ve3atTO8JmnXacnqd1CtWjX7dUrSJCUl6ccff8z0cxoFD+Onwj9+kq589pUoUUIvvfQSYyjGUDkaQ5UuXVp33XWXPvrooyy3Qcp49Fua9evXq169ekpISNDUqVPVu3dvnT592v59W7x4cZUvX97e/1JSUpyOn9LqSU5Ols1mU0pKik6cOKFSpUo5jKFycgcwxk9XMH4qmOMngiYL/fPPPxn2KBw+fFjDhg3T4cOH9fjjj2vXrl364osvFBUVpcjISLm5ual48eIaMGCAnn32Wa1du1a//fabHnroIbm5uTk9ykG6cvTC9OnT9euvv+rAgQP69NNP5evrq8qVK0uSQkND9e233+rIkSM6deqU02VERUXps88+U1RUlHbu3Gm/wFlOhISE6L777tOYMWMkSWPGjNHHH3+s6Oho/fbbb9q5c6fmzZunl156SZJ01113qVq1ahowYIB++eUXrV+/3v5cZtuaJjo6WjExMXrnnXe0Z88e7dixQzNnztTEiROl/2Pv/uNrrv//j9/PZjv7wfyabcwyvwphqzFvP0K1KCXqHSKGSoUVrZT1w0xYpTfeSQ3vpHelfOiXdyRavN+JN0X66ffPwsYSY9hme37/8N15O87Gxms7tt2ul8sudp7n9ePxOnuec57u53WeL0lTp07V+++/ry1btmjbtm1auHChQkJCVKNGjYs+XueKiYlRq1atdN9992njxo1av369YmNj1aVLl0JPky0QEREhSY4kvGnTplqxYoXWrFmjzZs36+GHH3YaIBZHTEyMrr76ag0ePFg//PCDvv76a5fJP++77z75+Pho8ODB+vnnn7Vy5Uo9+uijGjRokMunOaXpYv28KCNHjtSRI0fUv39/ffvtt9q5c6e++OILDR06VHl5eVq3bp0mT56s7777Tvv27dNHH32kw4cPO05hDg8P148//qitW7cqIyOjyE9ZZ86cqby8PEVHR+vDDz/U9u3btXnzZr366qsup9IXaNq0qfbt26cPPvhAO3fu1Kuvvuo0efapU6cUFxenVatWae/evfrmm2/07bffOmobPXq0vvjiC+3evVsbN27UypUrnU69Ptcrr7wiSXrkkUe0YMECbd68WQcPHlROTo62bNkiT09Px3NWkn777Ten52xB/4uPj1dqaqr69evncgrsQw89JOnsc2nNmjUaNmyYywDR19fX8RWJQ4cOqUePHurbt6+qV6+u1q1ba/369frss89K9Gl2cf9GkpSdna20tDSlpaVp8+bNevTRRx2f2ErF6+9jxozRSy+9pAULFmjr1q0aO3asNm3apFGjRkm68GtFQb2pqalKS0sr8VcMCjRr1kwxMTF66KGHtH79en3//fd66KGH5Ovre8HXukmTJiksLEzt2rXTP//5T/3666/avn275s6dq+uuu85xdsK5mjRpotzcXM2YMUO7du3SO++8o5SUFKdlLtQXx40bp08//VQ7duzQL7/8os8++6zIflocCQkJ+vbbbzVixAj9+OOP2rJli9544w1lZGSoZs2aql27tmbPnq0dO3boq6++Unx8vNP6QUFB8vX1dUxqe+6ZogX8/f01fPhwjRkzRsuWLdOvv/6qYcOG6eTJk3rggQcuuXa4B+Onyj1+ks5+yOHp6ckYijFUicdQr7/+uiNE+Oqrr7R582Zt3bpVa9asUX5+vuMrWomJiZKk999/3+l527RpU23ZskVVqlRRUlKS4uLitHbtWqf+NmrUKM2fP1+SNHv2bN1///2FBmw1atRQr1699MILL+iWW27Rvffeq5iYGAUFBalevXpKTk7WDz/8UOTf83yMnxg/levxU7Fnc8IFFUz+dv7PAw88YIy5tMvzRkdHm7FjxzqWOXfyso8//ti0a9fOBAQEGH9/f/OXv/zFacKutWvXmtatWzsmwjOm8MvrfvjhhyYyMtJ4e3ubwMBAc/fddxd5jIWtX7AvSWbdunXGGGOWLVtmOnToYHx9fU1AQICJjo42s2fPdixfcHleb29v06xZM/Ovf/3LSDLLli0zxhQ9kZkxxrz33nuOemvWrGk6d+7smJxw9uzZJjIy0vj7+5uAgABz8803m40bNxbr8Srp5XkjIiJMQECAU23Tpk0zNWrUMHXq1DEnTpwwf/zxh+nVq5epWrWqCQoKMs8995yJjY11mtTv/EswG2NMr169zODBgx23t27dajp16mS8vb3N1VdfbZYtW+Yy2V5xL817rsL2fbEJ8qy4NO/5+zTm7OWH77rrLlOjRg3j6+trmjVrZkaPHm3y8/PNr7/+arp37+64BOfVV19tZsyY4Vj30KFD5pZbbnFMnF3UpV+NOXu51JEjR5oGDRoYb29vExoaau68806ndc5/bMeMGWNq165tqlatavr162emTZvmeB5kZ2ebe++913HZ53r16pm4uDjHRHlxcXGmcePGxm63mzp16phBgwaZjIwMY4zrBIB//vmnkWTuuusu07BhQ+Pl5WV8fHyMp6enmTJlisnKyjLGnH3OSjJVqlRxes6ePn3adO7c2dhsNiPJBAcHm7/+9a9Oz6Xc3Fzzl7/8xbFMixYtTGxsrNNk4F26dDEPP/yw49K8Pj4+pnHjxqZ+/frGy8vL1K1b11x//fWmatWqxpj/vS58/PHHjteac38vyd/o/NfRatWqmbZt27pMEFucy/OOHz/ehIaGGi8vL5fL817otcKYs5ctb9KkialSpcpFL897roLJQAscOHDA3HbbbcZut5sGDRqY+fPnm6CgIJOSklLo8Rc4evSoGTt2rGnatKnx9vY2wcHBJiYmxnz88ceOCTjPf65OnTrV1K1b1/j6+pru3bubf/7zn07960J98YUXXjDNmzc3vr6+platWqZXr15m165dxphLm8zSmLOvBR06dDB2u93UqFHDdO/e3XH/ihUrTPPmzY3dbjetW7c2q1atcnnezZkzx4SFhRkPD48iL8976tQp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JLVt21Y2m83pO9ULFy5UVFSUfH19FRgYqIEDB7p8VXDIkCGqWrWqdu7cqR49eqhatWq67777itznyy+/rBMnTujNN990CpkKNGnSRKNGjSpy/SNHjujJJ59Uq1atVLVqVQUEBOi2227TDz/84LLsjBkzdO2118rPz081a9ZUmzZtNH/+fMf9x48f1+jRox2Pf1BQkG655RZt3LjR6fgKziAq+KrY7t27tWTJEsfpzHv27ClyjqYtW7aob9++qlOnjnx9fXXNNdfo2Wefddy/d+9ejRgxQtdcc418fX1Vu3Zt9enTx+krcvPmzVOfPn0kSTfeeKNjv6tWrZJU+PfoDx06pAceeEDBwcHy8fFRRESE3n77badlCmp+5ZVXNHv2bDVu3Fh2u11t27bVt99+W+Tf4Hy9evWS3W7XwoULndrnz5+vvn37ytPT02WdM2fO6IUXXnDsMzw8XM8884yys7OdljPGaOLEiapfv778/Px044036pdffim0jqNHj2r06NEKCwuT3W5XkyZN9NJLL130U8ji9AMAQMnUq1fvsv6DXtzX5nXr1qlHjx6qWbOm/P391bp1a/397393Wuarr77SDTfcIH9/f9WoUUO9evXS5s2bnZYpmCvo119/1YABA1SzZk116tTJcf+7777rGBPVqlVL9957r3777bcLHsOQIUPUpUsXSVKfPn1ks9mc3q+tqOt8s2bN0v79+zV16lSXkEmSgoODXc6MOVdJxp4ffPCBoqKiVK1aNQUEBKhVq1ZOj31ubq6SkpLUtGlT+fj4qHbt2urUqZNWrFjhcnzS/8YlK1eu1C+//OIy3ilsjqb9+/frgQceUL169WS329WwYUMNHz5cOTk5koo3bly1apXatm0rSRo6dKhjvwVjusLmaMrKytITTzzhGHNcc801euWVV2SMcVrOZrMpLi5On3zyiVq2bCm73a5rr71Wy5YtK/JvcL727durYcOGTmNYSXrvvfd06623qlatWoWu9/rrr+vaa6+V3W5XvXr1NHLkyEK/NlkwBvT19VV0dLS+/vrrQreXnZ2txMRENWnSRHa7XWFhYXrqqadcxm7nK04/AEqCM5pQ4RWEATVr1nS0/fLLL+rYsaNCQ0M1duxY+fv76//+7//Uu3dvffjhh7rrrrsknZ1Q+oYbbtDmzZt1//336/rrr1dGRoYWL16s33//XYGBgcrMzNQ//vEP9e/fX8OGDdPx48f15ptvqnv37lq/fr3Lqb0l9eyzz+qaa67R7NmzHafAN27cWNLZcGPo0KFq27atkpOTlZ6err///e/65ptv9P333zt90nTmzBl1795dnTp10iuvvCI/P78i9/mvf/1LjRo1UocOHS6p5l27dumTTz5Rnz591LBhQ6Wnp2vWrFnq0qWLfv31V8fp+XPmzNFjjz2me+65R6NGjdLp06f1448/at26dRowYIAk6ZFHHtGiRYsUFxenFi1a6I8//tDq1au1efNmXX/99S77bt68ud555x09/vjjql+/vp544glJUp06dXT48GGX5X/88UfdcMMN8vLy0kMPPaTw8HDt3LlT//rXvzRp0iRJZ09vX7Nmje69917Vr19fe/bs0RtvvKGuXbvq119/lZ+fnzp37qzHHntMr776qp555hk1b97cUU9hTp06pa5du2rHjh2Ki4tTw4YNtXDhQg0ZMkRHjx51CfLmz5+v48eP6+GHH5bNZtPLL7+su+++W7t27SrWfxL8/PzUq1cvvf/++xo+fLgk6YcfftAvv/yif/zjH/rxxx9d1nnwwQf19ttv65577tETTzyhdevWKTk5WZs3b9bHH3/sWG7cuHGaOHGievTooR49emjjxo3q1q2bYwBZ4OTJk+rSpYv279+vhx9+WFdddZXWrFmjhIQEHTx4UNOnTy+y/pL2AwCAdOzYMccHYwXOPav1chXntXnFihW64447VLduXY0aNUohISHavHmzPvvsM8d73ZdffqnbbrtNjRo10vjx43Xq1CnNmDFDHTt21MaNG10ChD59+qhp06aaPHmyIzSYNGmSnn/+efXt21cPPvigDh8+rBkzZqhz584uY6JzPfzwwwoNDdXkyZP12GOPqW3btgoODrasrsIsXrxYvr6+uueeey7hUVexx54rVqxQ//79dfPNN+ull16SJG3evFnffPON47EfP368kpOT9eCDDyo6OlqZmZn67rvvtHHjRt1yyy0u+65Tp47eeecdTZo0SSdOnFBycrKkosc7Bw4cUHR0tI4ePaqHHnpIzZo10/79+7Vo0SKdPHlS3t7exRo3Nm/eXBMmTNC4ceP00EMPOT5ILmqsaozRnXfeqZUrV+qBBx5QZGSkvvjiC40ZM0b79+93+crf6tWr9dFHH2nEiBGqVq2aXn31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fv75Z4WFhSk6Olrjx48v0Zv+hRRs52J/41OnTmncuHGO7/gXHM/Ro0cv+W+8d+9eNW3a1GlwIf3v1PPz/37nB2EFoVNJJvD28vJSnz59NH/+fP3nP//Rb7/95viKYmH1eXh4qEmTJk7tISEhqlGjhqO+gn+bNm3qtFydOnWcgjFJ2r59u5YtW+byvCu4kmLB864wpdkPAKCiio6OVkxMjNNPSeXl5SktLc3pp+Cr0Rd7bS6YH/NC77MXGs80b95cGRkZysrKcmo//0p627dvlzFGTZs2dXmP2bx58wXfX0qzrqIEBARc1jhLKt7Yc8SIEbr66qt12223qX79+rr//vtdvsI1YcIEHT16VFdffbVatWqlMWPGFPp1+ktx+PBhZWZmXnScVdxxY0ns3btX9erVcwn0ijvOks6OtUp6oZQBAwZo4cKF2rFjh9asWXPBcZbk2r+8vb3VqFGji46zvLy81KhRI6e27du365dffnF5Dlx99dWSLjzOKs1+gMqJOZpQ4URHRzs+Nendu7c6deqkAQMGaOvWrapatapj0uEnn3xS3bt3L3Qb5//n+kLeffddDRkyRL1799aYMWMUFBQkT09PJScnu0xA7k7nflp0IQEBAapXr95lXXlm8uTJev7553X//ffrhRdeUK1ateTh4aHRo0c7TfrcvHlzbd26VZ999pmWLVumDz/8UK+//rrGjRunpKQkSVLfvn11ww036OOPP9by5cs1ZcoUvfTSS/roo4902223XXKNJfHoo4/qrbfe0ujRo9W+fXtVr15dNptN9957b5ldSrewybolXXAOiMIMGDBAKSkpGj9+vCIiIlyuzHe+c89Sulz5+fm65ZZb9NRTTxV6f8FAqDBXQj8AgMrot99+cwlQVq5cqa5du7rttfncM42ls+8vNptNn3/+eaHvl1WrVi21Wi5UV1GaNWumTZs2KScn55KuSlvcsWdQUJA2bdqkL774Qp9//rk+//xzvfXWW4qNjXVcfKRz587auXOnPv30Uy1fvlz/+Mc/NG3aNKWkpOjBBx8scW2XorjjxtJk1Tirf//+SkhI0LBhw1S7dm1169bNivKKJT8/X61atdLUqVMLvf/c+ZzOdyX0A1QsBE2o0AredG+88Ua99tprGjt2rCP99/Lyuugne40bN75o4LJo0SI1atRIH330kdN/ygvOjiotDRo0kCRt3brVcUpsga1btzruvxR33HGHZs+erbVr16p9+/YlXn/RokW68cYb9eabbzq1Hz161GUSUn9/f/Xr10/9+vVTTk6O7r77bk2aNEkJCQmOrwTWrVtXI0aM0IgRI3To0CFdf/31mjRp0mUPYgv6QnH+xoMHD9bf/vY3R9vp06ddrgpSklCmQYMG+vHHH5Wfn+8UAG7ZssVxf2no1KmTrrrqKq1atcoxMWhR9eXn52v79u1OE3ymp6fr6NGjjvoK/t2+fbvTJ2uHDx92+RSwcePGOnHixCV9oi6VXj8AABQtJCTE5atX516+/UKvzQVfRfr555+LfO0/dzxzvi1btigwMFD+/v4XrLFx48Yyxqhhw4YX/NCiJKyoqyg9e/bU2rVr9eGHHxb5FfYLKcnY09vbWz179lTPnj2Vn5+vESNGaNasWXr++ecdH6zWqlVLQ4cO1dChQ3XixAl17txZ48ePv+yAoU6dOgoICCjWOKs448aSjrO+/PJLHT9+3OmsptIeZ1111VXq2LGjVq1apeHDh6tKlcL/u31u/zp3/JSTk6Pdu3c7ni/njrPOHe/n5uZq9+7dTs/Fxo0b64cfftDNN998SR8UllY/QOXEV+dQ4XXt2lXR0dGaPn26Tp8+raCgIHXt2lWzZs3SwYMHXZY/98pkf/3rX/XDDz84XWGrQMEnHAWfgJz7ice6deu0du1aqw/FSZs2bRQUFKSUlBSnS5Z+/vnn2rx5s26//fZL3vZTTz0lf39/Pfjgg0pPT3e5f+fOnS6XJT6Xp6enyydACxcudMx9VeCPP/5wuu3t7a0WLVrIGKPc3Fzl5eW5nDIdFBSkevXqXfQyrcVRp04dde7cWXPnztW+ffuc7ju3/sKOZ8aMGcrLy3NqKxhwFnZZ2vP16NFDaWlpWrBggaPtzJkzmjFjhqpWreq41LLVbDabXn31VSUmJmrQoEEXrE+Sy5XgCj4lK+hfMTEx8vLy0owZM5weo8KuINe3b1+tXbtWX3zxhct9R48e1ZkzZwqtpbT7AQCgaD4+Pi5fv6tZs2axXpuvv/56NWzYUNOnT3d5byx4z6hbt64iIyP19ttvOy3z888/a/ny5Y73owu5++675enpqaSkJJf3a2OMy3ijOKyoqyiPPPKI6tatqyeeeELbtm1zuf/QoUOaOHFikesXd+x5/nF7eHiodevWkuT4G52/TNWqVdWkSRNL3l89PDzUu3dv/etf/9J3333ncv+5Y+nijBtLOs7Ky8vTa6+95tQ+bdo02Wy2Uv2QauLEiUpMTNSjjz5a5DIxMTHy9vbWq6++6nTsb775po4dO+YYZ7Vp00Z16tRRSkqK09V8582b5/I49O3bV/v379ecOXNc9nfq1CmXr3qeqzT7ASonzmhCpTBmzBj16dNH8+bN0yOPPKKZM2eqU6dOatWqlYYNG6ZGjRopPT1da9eu1e+//64ffvjBsd6iRYvUp08f3X///YqKitKRI0e0ePFipaSkKCIiQnfccYc++ugj3XXXXbr99tu1e/dupaSkqEWLFjpx4kSpHZOXl5deeuklDR06VF26dFH//v2Vnp6uv//97woPD9fjjz9+ydtu3Lix5s+fr379+ql58+aKjY1Vy5YtlZOTozVr1mjhwoUaMmRIkevfcccdmjBhgoYOHaoOHTrop59+0nvvvefyXfJu3bopJCREHTt2VHBwsDZv3qzXXntNt99+u6pVq6ajR4+qfv36uueeexQREaGqVavqyy+/1Lfffut0dtHlePXVV9WpUyddf/31euihh9SwYUPt2bNHS5Ys0aZNmxzH884776h69epq0aKF1q5dqy+//NLlcreRkZHy9PTUSy+9pGPHjslut+umm25SUFCQy34feughzZo1S0OGDNGGDRsUHh6uRYsW6ZtvvtH06dMva5LQi+nVq5d69ep1wWUiIiI0ePBgzZ49W0ePHlWXLl20fv16vf322+rdu7duvPFGSWfDuieffFLJycm644471KNHD33//ff6/PPPXc5eGzNmjBYvXqw77rhDQ4YMUVRUlLKysvTTTz9p0aJF2rNnT6GX3T5+/Hip9wMAqIx+/PFHLV68WNLZOSyPHTvmCDgiIiLUs2fPItctzmuzh4eH3njjDfXs2VORkZEaOnSo6tatqy1btuiXX35xfPAwZcoU3XbbbWrfvr0eeOABnTp1SjNmzFD16tU1fvz4ix5H48aNNXHiRCUkJGjPnj3q3bu3qlWrpt27d+vjjz/WQw89pCeffLLEj8/l1lWUmjVr6uOPP1aPHj0UGRmpgQMHKioqSpK0ceNGvf/++xc8o7y4Y88HH3xQR44c0U033aT69etr7969mjFjhiIjIx1nK7do0UJdu3ZVVFSUatWqpe+++06LFi1SXFzcJR/fuSZPnqzly5erS5cueuihh9S8eXMdPHhQCxcu1OrVq1WjRo1ijxsbN26sGjVqKCUlRdWqVZO/v7/atWtX6NxYPXv21I033qhnn31We/bsUUREhJYvX65PP/1Uo0ePdpr422pdunS56AeGderUUUJCgpKSknTrrbfqzjvv1NatW/X666+rbdu2GjhwoKSz4/2JEyfq4Ycf1k033aR+/fpp9+7deuutt1wen0GDBun//u//9Mgjj2jlypXq2LGj8vLytGXLFv3f//2fvvjii0InZZdKvx+gEirTa9wBpajgUr6FXT41Ly/PNG7c2DRu3NhxidedO3ea2NhYExISYry8vExoaKi54447zKJFi5zW/eOPP0xcXJwJDQ013t7epn79+mbw4MEmIyPDGHP20qyTJ082DRo0MHa73Vx33XXms88+c7nMqjGul3wtqHn37t2XfGwLFiww1113nbHb7aZWrVrmvvvuM7///rvTMudfUrW4tm3bZoYNG2bCw8ONt7e3qVatmunYsaOZMWOGOX36tGO58y+Revr0afPEE0+YunXrGl9fX9OxY0ezdu1al8vzzpo1y3Tu3NnUrl3b2O1207hxYzNmzBhz7NgxY4wx2dnZZsyYMSYiIsJUq1bN+Pv7m4iICPP666+7HN/5j3WDBg1cLtNacAna8y+L+/PPP5u77rrL1KhRw/j4+JhrrrnGPP/88477//zzTzN06FATGBhoqlatarp37262bNnictzGGDNnzhzTqFEj4+npaSSZlStXGmNcL01sjDHp6emO7Xp7e5tWrVq51HbuZXPPd35/KkxRl2w+X2GXKc7NzTVJSUmmYcOGxsvLy4SFhZmEhASnv70xZ59fSUlJjr93165dzc8//1zo43P8+HGTkJBgmjRpYry9vU1gYKDp0KGDeeWVV0xOTk6hx1bcfgAAOOtC44bClivs5/zX7/OV5LV59erV5pZbbnEs17p1a5fLxn/55ZemY8eOxtfX1wQEBJiePXuaX3/91WmZxMREI8kcPny40Jo+/PBD06lTJ+Pv72/8/f1Ns2bNzMiRI83WrVsveCwXeq+0oq6iHDhwwDz++OPm6quvNj4+PsbPz89ERUWZSZMmOcZCxriOIYo79ly0aJHp1q2bCQoKMt7e3uaqq64yDz/8sDl48KBjmYkTJ5ro6GhTo0YN4+vra5o1a2Ym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LuUQAAAALuiSgqaJEycqJSVFc+bMcZp0qmPHjtq4caNlxQEAAFQkQ4cOVd++fdWyZUvZbDbFxMRIktatW6dmzZq5uToAAIDLd0lzNG3dulWdO3d2aa9evbqOHj16uTUBAABUSOPHj1fLli3122+/qU+fPo6runl6emrs2LFurg4AAODyXVLQFBISoh07dig8PNypffXq1WrUqJEVdQEAAFRI99xzjyTp999/V35+vjw8PDR48GA3VwUAAGCNS/rq3LBhwzRq1CitW7dONptNBw4c0HvvvacnnnhCw4cPt7pGAACACqdFixbas2ePu8sAAACw1CWd0TR27Fjl5+fr5ptv1smTJ9W5c2fZ7XaNGTNGDz74oNU1ooxl/nFImUcOF3v5nOzTjt/379wsb7tPifYXUKuOAmoHlWgdAADKO2OMu0sAAACw3CUFTTabTc8++6zGjBmjHTt26MSJE2rRooVmzZqlhg0bKi0tzeo6UYbWLFmg5e++dknrvhY/oMTrdBsYp1tjH72k/QEAAAAAgCtHiYKm7OxsjR8/XitWrHCcwdS7d2+99dZbuuuuu+Tp6anHH3+8tGpFGelwez+1bH9Tme0voFadMtsXAABXimeeeUa1atVydxkAAACWKlHQNG7cOM2aNUsxMTFas2aN+vTpo6FDh+q///2v/va3v6lPnz7y9PQsrVpRRgJqB/FVNgAASllCQoK7SwAAALBciSYDX7hwof75z39q0aJFWr58ufLy8nTmzBn98MMPuvfeewmZAAAALsFvv/2m+++/391lAAAAXLYSBU2///67oqKiJEktW7aU3W7X448/LpvNVirFAQAAVAZHjhzR22+/7e4yAAAALluJvjqXl5cnb2/v/61cpYqqVq1qeVEAAAAVyeLFiy94/65du8qoEgAAgNJVoqDJGKMhQ4bIbrdLkk6fPq1HHnlE/v7+Tst99NFH1lUIAABQzvXu3Vs2m03GmCKX4QxxAABQEZToq3ODBw9WUFCQqlevrurVq2vgwIGqV6+e43bBDwAAAP6nbt26+uijj5Sfn1/oz8aNG91dIgAAgCVKdEbTW2+9VVp1AAAAVFhRUVHasGGDevXqVej9FzvbCQAAoLwoUdAEAACAkhszZoyysrKKvL9JkyZauXJlGVYEAABQOgiaAAAASlloaKgaNmxY5P3+/v7q0qVLGVYEAABQ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dzc//PCDpfVcTGF94Pjx4yYjI6NM9n/s2DHzzDPPmGuuucbY7XYTHBxsbr75ZvPhhx86+kthr/Gl4cyZM+bgwYMmNzfX0RYdHW0GDhxofvvtN/Pnn38W2pcvx+7du40k8/333zu1Hz161KnvomJg/FS+lXT8ZAxjKMZQl+/8952DBw8aX19fU6NGDWO3202dOnXMX/7yF/PSSy9ZMn4yxnUMVfDYFYybGD8xfjoX4ydjqpR2kAXr1KlT57LW9/X1la+v72VtIyAgQFu3bpUxRrt379aIESPUp08frVu37rK2ezG5ubny8vIqte1fymN766236q233lJubq42bNigwYMHy2az6aWXXiqFCq8cBcd9rkvtmzk5OfL29rairIvas2ePOnbsqBo1amjKlClq1aqVcnNz9cUXX2jkyJHasmVLmdRRwNvbWyEhIY7bP/30k/744w/5+/s76rPb7frpp580e/ZshYaG6s477yx0W5f7/PD29la1atUkSbVq1brk7Vjh3P6Vlpam5557TnfccYf27dvn1rqqVq2qqlWrlvp+jh49qk6dOunYsWOaOHGi2rZtqypVqujf//63nnrqKd10001lemaFp6enUz+VpJ07d+qRRx5R/fr1HW3nL1MaqlevXur7QMXE+OnKGj9JjKHOxRiq5M4dQ+3atUsdOnTQqVOnNGbMGN17771O46dmzZqV2vhJcv+4qQDjJ8ZPRXHb+KnMo60K6mKJ86pVq0zbtm2Nt7e3CQkJMU8//bRTwpmZmWkGDBhg/Pz8TEhIiJk6darp0qWLGTVqlGOZcxPY/Px8k5iYaMLCwoy3t7epW7euefTRR40xxnTp0sXl0xJjzn6iVr16dae6Fi9ebNq0aWPsdrupXbu26d27d5HHUNj6r776qpFkjh075mj75JNPzHXXXWfsdrtp2LChGT9+vNOxbt682XTs2NHY7XbTvHlzs2LFCqcEvCCN/eCDD0znzp2N3W43b731ljHGmDlz5phmzZoZu91urrnmGjNz5kzHdrOzs83IkSNNSEiIsdvt5qqrrjKTJ0++6ON1/mNrjDF79+41d955p/H39zfVqlUzffr0MWlpaY77IyIiTEBAgPnnP/9pGjRoYAICAkz9+vVNRESEY5mMjAxz7733mnr16hlfX1/TsmVLM3/+fKfHr0uXLubRRx81Y8aMMTVr1jTBwcEmMTHRaZlt27aZG264wfF4LV++3OUTgx9//NHceOONxsfHx9SqVcsMGzbMHD9+3HF/Qf+cNGmSCQoKMtWrVzdJSUkmNzfXPPnkk6ZmzZomNDTUzJ071/UPf47L7eddunQxI0eONKNGjTK1a9c2Xbt2NcYY89NPP5lbb73V+Pv7m6CgIDNw4EBz+PBhx3oLFy40LVu2dBzfzTffbE6cOGESExNd+vrKlSsLre22224zoaGh5sSJEy73nZvyn//YPvXUU6Zp06bG19fXNGzY0Dz33HMmJyfHcf+mTZtM165dTdWqVU21atXM9ddfb7799ltjjDF79uwxd9xxh6lRo4bx8/MzLVq0MEuWLDHGOH8yVvD7+cdx7nOu4NOOxYsXOz4F9vLyMp6eniYxMdGcOXPGdO7c2Xh7extJxtPT01x//fWOT+ELnlfn/lx77bUmNjbW1K5d2/Fa06VLF/Pwww+bQYMGmRo1ahgfHx8THh5ugoKCjJ+fn4mOjjZPP/20qV69ulm2bJkJCQkxkkxUVJRp0qSJ8ff3N927dzcHDhwwxpgS/Y0K619ff/21kWQOHTrkaLtYf8/LyzNJSUkmNDTUeHt7m4iICPP555877r/Qa0WDBg2cam3QoIHjOM59fhfUOmXKFBMSEmJq1aplRowY4dQ3Dhw4YHr06OF4DN97772LfpI2fPhw4+/vb/bv3+9y3/Hjxx3Pp/O387e//c20bNnS+Pn5mfr165vhw4c7PSYX6otHjhwxAwYMMIGBgcbHx8c0adLE8Vpw7qdjhfWht956q9Az5VavXm26dOni+IS5W7du5siRI8YYYz7//HPTsWNHU716dVOrVi1z++23mx07djjWPX8fXbp0cXrMC5w+fdo8+uijpk6dOsZut5uOHTua9evXO+4vqOvLL780UVFRxtfX17Rv395s2bKlyMcfZY/xU+UaPyUmJpqaNWua66+/3jF+6tevn7nzzjvNdddd51iOMRRjqOKOodq2bXvBMdS5Z4tIMldddZXx8PAwksw111xjzpw5Y+6//34TGBhobDabsdlsplq1aqZ///6OMdSOHTtc9tG4cWPTq1cvx+tNwb9HjhwxgwYNMtWrVzdVqlQxdrvd+Pr6mujoaKe64uPjjYeHh7Hb7cbf39/4+fkxfvr/GD9VjPETczSVgf3796tHjx5q27atfvjhB73xxht68803NXHiRMcy8fHx+uabb7R48WKtWLFCX3/9tTZu3FjkNj/88ENNmzZNs2bN0vbt2/XJJ5+oVatWkqSPPvpI9evX14QJE3Tw4EEdPHiw0G0sWbJEd911l3r06KHvv/9eqampio6OLvZxHTp0SB9//LE8PT3l6ekpSfr6668VGxurUaNG6ddff9WsWbM0b948TZo0SZKUl5en3r17y8/PT+vWrdPs2bP17LPPFrr9sWPHatSoUdq8ebO6d++u9957T+PGjdOkSZO0efNmTZ48Wc8//7zefvttSdKrr76qxYsX6//+7/+0detWvffeewoPD7/o43W+/Px89erVS0eOHNG///1vrVixQrt27VK/fv2clsvKytInn3yizz77TK+++qoOHDigw4cPO+4/ffq0oqKitGTJEv3888966KGHNGjQIK1fv95pO2+//bb8/f21bt06vfzyy5owYYJWrFjhqOXuu++Wt7e31q1bp5SUFD399NMudXTv3l01a9bUt99+q4ULF+rLL79UXFyc03JfffWVDhw4oP/85z+aOnWqEhMTdccdd6hmzZpat26dHnnkET388MP6/fffi/ybX0hx+nnB8Xp7e+ubb75RSkqKjh49qptuuknXXXedvvvuOy1btkzp6enq27evJOngwYPq37+/7r//fm3evFmrVq3S3XffLWOMnnzySfXt21e33nqro6936NDBpbYjR45o2bJlGjlypPz9/V3uv9AnHNWqVdO8efP066+/6u9//7vmzJmj/9femQdFdeRx/DsXODBcohBQCuUULMCg4oFiRXBZdQ2lidcSxGi8b4zorgeicV0P1GCRpCAmnlHXRSq7uOIJMYsEAUERh5FDhUSMEaMJaJDjt3+w0+HJcBk22Zjfp2pK5r03/fp1/7rf1/51/3rnzp3ifGhoKHr27ImsrCzk5ORg1apVwju2YMEC1NTU4MKFC8jPz8eWLVsMenXc3d0hk8kANNqqoeeQyWSizQKN3onVq1dj2bJlmDFjBhoaGmBhYYGtW7ciLS0Na9euRV5eHoKDgwEADg4OCAsLAwDs3r0bn332GXx9fZGUlNQsP2fOnEF2djb+8Y9/YPTo0Xj48CFUKhVycnIwceJExMTEoLq6Gtu3b8fs2bOhVCpRWFgIZ2dnXLhwAWVlZXj77bcBoN11ZIiqqiocPHgQLi4usLa2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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import pandas as pd\n", "import matplotlib.pyplot as plt\n", - "from sklearn.model_selection import cross_val_score\n", - "from sklearn.preprocessing import StandardScaler\n", - "from sklearn.linear_model import LinearRegression, LogisticRegression\n", - "from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n", - "from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier\n", - "from sklearn.pipeline import Pipeline\n", - "from sklearn.compose import ColumnTransformer\n", - "from sklearn.preprocessing import OneHotEncoder\n", + "from sklearn.metrics import confusion_matrix, roc_curve, auc, roc_auc_score, accuracy_score, precision_score, recall_score, f1_score\n", + "from sklearn.preprocessing import label_binarize\n", + "import numpy as np\n", "\n", - "# Загружаем набор данных\n", - "df = pd.read_csv(\"..//static//csv//ndtv_data_final.csv\")\n", + "def plot_confusion_matrix(y_true, y_pred, title):\n", + " cm = confusion_matrix(y_true, y_pred)\n", + " sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', cbar=False)\n", + " plt.title(title)\n", + " plt.xlabel('Предсказанные значения')\n", + " plt.ylabel('Истинные значения')\n", + " plt.show()\n", "\n", - "# Удаление пустого столбца по имени\n", - "df = df.drop('Unnamed: 0', axis=1)\n", + "def plot_roc_curve_multiclass(y_true, y_pred_proba, class_names, title):\n", + " # Бинаризация меток для мультиклассовой классификации\n", + " y_true_bin = label_binarize(y_true, classes=np.unique(y_true))\n", + " n_classes = y_true_bin.shape[1]\n", "\n", - "# Определяем категориальные и числовые столбцы\n", - "categorical_cols = ['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE']\n", - "numerical_cols = ['Battery capacity (mAh)', 'Screen size (inches)', 'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera', 'Number of SIMs']\n", + " # Вычисление ROC-кривых для каждого класса\n", + " fpr = dict()\n", + " tpr = dict()\n", + " roc_auc = dict()\n", + " for i in range(n_classes):\n", + " fpr[i], tpr[i], _ = roc_curve(y_true_bin[:, i], y_pred_proba[:, i])\n", + " roc_auc[i] = auc(fpr[i], tpr[i])\n", "\n", - "# Создаем преобразователь для категориальных и числовых столбцов\n", - "preprocessor = ColumnTransformer(\n", - " transformers=[\n", - " ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_cols),\n", - " ('num', StandardScaler(), numerical_cols)\n", - " ])\n", + " # Построение ROC-кривых\n", + " plt.figure(figsize=(8, 6))\n", + " colors = ['blue', 'red', 'green', 'purple', 'orange'] # Цвета для каждого класса\n", + " for i, color in zip(range(n_classes), colors):\n", + " plt.plot(fpr[i], tpr[i], color=color, lw=2,\n", + " label=f'ROC curve (class {class_names[i]}, area = {roc_auc[i]:.2f})')\n", "\n", - "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n", - "X_reg = df[categorical_cols + numerical_cols]\n", - "y_reg = df['Price']\n", + " plt.plot([0, 1], [0, 1], 'k--', lw=2)\n", + " plt.xlim([0.0, 1.0])\n", + " plt.ylim([0.0, 1.05])\n", + " plt.xlabel('False Positive Rate')\n", + " plt.ylabel('True Positive Rate')\n", + " plt.title(title)\n", + " plt.legend(loc=\"lower right\")\n", + " plt.show()\n", "\n", - "# Список моделей для задачи регрессии\n", - "models_reg = {\n", - " \"Linear Regression\": LinearRegression(),\n", - " \"Random Forest Regression\": RandomForestRegressor(),\n", - " \"Gradient Boosting Regression\": GradientBoostingRegressor()\n", - "}\n", + "def evaluate_and_plot_model(model, X_test, y_test, model_name, class_names):\n", + " y_pred = model.predict(X_test)\n", + " y_pred_proba = model.predict_proba(X_test)\n", + " \n", + " # Метрики\n", + " accuracy = accuracy_score(y_test, y_pred)\n", + " precision = precision_score(y_test, y_pred, average='weighted')\n", + " recall = recall_score(y_test, y_pred, average='weighted')\n", + " f1 = f1_score(y_test, y_pred, average='weighted')\n", + " roc_auc = roc_auc_score(y_test, y_pred_proba, multi_class='ovr', average='weighted')\n", + " \n", + " print(f\"{model_name} Metrics:\")\n", + " print(f\"Accuracy: {accuracy:.4f}\")\n", + " print(f\"Precision: {precision:.4f}\")\n", + " print(f\"Recall: {recall:.4f}\")\n", + " print(f\"F1-Score: {f1:.4f}\")\n", + " print(f\"ROC-AUC: {roc_auc:.4f}\")\n", + " \n", + " # Визуализация\n", + " plot_confusion_matrix(y_test, y_pred, f'Confusion Matrix for {model_name}')\n", + " plot_roc_curve_multiclass(y_test, y_pred_proba, class_names, f'ROC Curve for {model_name}')\n", "\n", - "# Оценка смещения и дисперсии для задачи регрессии\n", - "mae_means = []\n", - "mae_stds = []\n", - "r2_means = []\n", - "r2_stds = []\n", - "\n", - "for name, model in models_reg.items():\n", - " pipeline = Pipeline(steps=[\n", - " ('preprocessor', preprocessor),\n", - " ('model', model)\n", - " ])\n", - " mae_scores = -cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='neg_mean_absolute_error')\n", - " r2_scores = cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='r2')\n", - " mae_means.append(mae_scores.mean())\n", - " mae_stds.append(mae_scores.std())\n", - " r2_means.append(r2_scores.mean())\n", - " r2_stds.append(r2_scores.std())\n", - "\n", - "# Визуализация результатов для задачи регрессии\n", - "fig, ax = plt.subplots(1, 2, figsize=(12, 6))\n", - "\n", - "ax[0].bar(models_reg.keys(), mae_means, yerr=mae_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n", - "ax[0].set_ylabel('MAE')\n", - "ax[0].set_title('Mean Absolute Error (MAE) for Regression Models')\n", - "ax[0].yaxis.grid(True)\n", - "\n", - "ax[1].bar(models_reg.keys(), r2_means, yerr=r2_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n", - "ax[1].set_ylabel('R²')\n", - "ax[1].set_title('R-squared (R²) for Regression Models')\n", - "ax[1].yaxis.grid(True)\n", - "\n", - "plt.tight_layout()\n", - "plt.show()\n", - "\n", - "# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n", - "X_class = df[categorical_cols + numerical_cols]\n", - "y_class = (df['Price'] > df['Price'].mean()).astype(int)\n", - "\n", - "# Список моделей для задачи классификации\n", - "models_class = {\n", - " \"Logistic Regression\": LogisticRegression(),\n", - " \"Random Forest Classification\": RandomForestClassifier(),\n", - " \"Gradient Boosting Classification\": GradientBoostingClassifier()\n", - "}\n", - "\n", - "# Оценка смещения и дисперсии для задачи классификации\n", - "accuracy_means = []\n", - "accuracy_stds = []\n", - "precision_means = []\n", - "precision_stds = []\n", - "recall_means = []\n", - "recall_stds = []\n", - "f1_means = []\n", - "f1_stds = []\n", - "\n", - "for name, model in models_class.items():\n", - " pipeline = Pipeline(steps=[\n", - " ('preprocessor', preprocessor),\n", - " ('model', model)\n", - " ])\n", - " accuracy_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='accuracy')\n", - " precision_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='precision')\n", - " recall_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='recall')\n", - " f1_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='f1')\n", - " accuracy_means.append(accuracy_scores.mean())\n", - " accuracy_stds.append(accuracy_scores.std())\n", - " precision_means.append(precision_scores.mean())\n", - " precision_stds.append(precision_scores.std())\n", - " recall_means.append(recall_scores.mean())\n", - " recall_stds.append(recall_scores.std())\n", - " f1_means.append(f1_scores.mean())\n", - " f1_stds.append(f1_scores.std())\n", - "\n", - "# Визуализация результатов для задачи классификации\n", - "fig, ax = plt.subplots(2, 2, figsize=(12, 12))\n", - "\n", - "ax[0, 0].bar(models_class.keys(), accuracy_means, yerr=accuracy_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n", - "ax[0, 0].set_ylabel('Accuracy')\n", - "ax[0, 0].set_title('Accuracy for Classification Models')\n", - "ax[0, 0].yaxis.grid(True)\n", - "\n", - "ax[0, 1].bar(models_class.keys(), precision_means, yerr=precision_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n", - "ax[0, 1].set_ylabel('Precision')\n", - "ax[0, 1].set_title('Precision for Classification Models')\n", - "ax[0, 1].yaxis.grid(True)\n", - "\n", - "ax[1, 0].bar(models_class.keys(), recall_means, yerr=recall_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n", - "ax[1, 0].set_ylabel('Recall')\n", - "ax[1, 0].set_title('Recall for Classification Models')\n", - "ax[1, 0].yaxis.grid(True)\n", - "\n", - "ax[1, 1].bar(models_class.keys(), f1_means, yerr=f1_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n", - "ax[1, 1].set_ylabel('F1-score')\n", - "ax[1, 1].set_title('F1-score for Classification Models')\n", - "ax[1, 1].yaxis.grid(True)\n", - "\n", - "plt.tight_layout()\n", - "plt.show()" + "# Пример использования\n", + "class_names = ['Budget', 'Mid-Range', 'Premium'] # Замените на ваши классы\n", + "evaluate_and_plot_model(logreg_best_model, X_test, y_test, 'Logistic Regression', class_names)\n", + "evaluate_and_plot_model(rf_best_model, X_test, y_test, 'Random Forest', class_names)\n", + "evaluate_and_plot_model(gb_best_model, X_test, y_test, 'Gradient Boosting', class_names)" ] } ], From 8d8ec3b4c3c5307607ed3e57964e3cdb8edbf3a4 Mon Sep 17 00:00:00 2001 From: "a.puchkina" Date: Thu, 12 Dec 2024 17:27:43 +0400 Subject: [PATCH 4/4] =?UTF-8?q?=D0=BE=D1=88=D1=80=D0=B8=D0=B1=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D1=83=D0=B4=D0=B0=20=D0=B2=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab_4/lab4.ipynb | 212 ++++++++++++++++++++++++++--------------------- 1 file changed, 116 insertions(+), 96 deletions(-) diff --git a/lab_4/lab4.ipynb b/lab_4/lab4.ipynb index 61ff186..208db8e 100644 --- a/lab_4/lab4.ipynb +++ b/lab_4/lab4.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -417,7 +417,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -471,7 +471,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -526,7 +526,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -673,7 +673,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -708,7 +708,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -717,55 +717,49 @@ "text": [ "PriceCategory\n", "1 946\n", - "2 946\n", "0 946\n", "Name: count, dtype: int64\n", - "Гиперпараметры для логистической регрессии:\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "d:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\linear_model\\_sag.py:349: ConvergenceWarning: The max_iter was reached which means the coef_ did not converge\n", - " warnings.warn(\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Accuracy: 0.8891\n", - "Precision: 0.8888\n", - "Recall: 0.8891\n", - "F1-Score: 0.8881\n", - "ROC-AUC: 0.9674\n", + "Гиперпараметры для логистической регрессии:\n", + "Accuracy: 0.8760\n", + "Precision: 0.8784\n", + "Recall: 0.8760\n", + "F1-Score: 0.8762\n", + "ROC-AUC: 0.9521\n", "Гиперпараметры для случайного леса:\n", - "Accuracy: 0.9525\n", - "Precision: 0.9540\n", - "Recall: 0.9525\n", - "F1-Score: 0.9524\n", - "ROC-AUC: 0.9929\n", - "Гиперпараметры для градиентного бустинга:\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[6], line 148\u001b[0m\n\u001b[0;32m 143\u001b[0m gb_pipeline \u001b[38;5;241m=\u001b[39m Pipeline([\n\u001b[0;32m 144\u001b[0m (\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mclassifier\u001b[39m\u001b[38;5;124m'\u001b[39m, GradientBoostingClassifier(random_state\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m42\u001b[39m))\n\u001b[0;32m 145\u001b[0m ])\n\u001b[0;32m 147\u001b[0m gb_random_search \u001b[38;5;241m=\u001b[39m RandomizedSearchCV(gb_pipeline, param_distributions\u001b[38;5;241m=\u001b[39mgb_param_dist, n_iter\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m50\u001b[39m, cv\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m5\u001b[39m, random_state\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m42\u001b[39m, n_jobs\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m)\n\u001b[1;32m--> 148\u001b[0m \u001b[43mgb_random_search\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my_train\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 149\u001b[0m gb_best_model \u001b[38;5;241m=\u001b[39m gb_random_search\u001b[38;5;241m.\u001b[39mbest_estimator_\n\u001b[0;32m 150\u001b[0m gb_results \u001b[38;5;241m=\u001b[39m evaluate_model(gb_best_model, X_test, y_test)\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\base.py:1473\u001b[0m, in \u001b[0;36m_fit_context..decorator..wrapper\u001b[1;34m(estimator, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1466\u001b[0m estimator\u001b[38;5;241m.\u001b[39m_validate_params()\n\u001b[0;32m 1468\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m config_context(\n\u001b[0;32m 1469\u001b[0m skip_parameter_validation\u001b[38;5;241m=\u001b[39m(\n\u001b[0;32m 1470\u001b[0m prefer_skip_nested_validation \u001b[38;5;129;01mor\u001b[39;00m global_skip_validation\n\u001b[0;32m 1471\u001b[0m )\n\u001b[0;32m 1472\u001b[0m ):\n\u001b[1;32m-> 1473\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfit_method\u001b[49m\u001b[43m(\u001b[49m\u001b[43mestimator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\model_selection\\_search.py:1019\u001b[0m, in \u001b[0;36mBaseSearchCV.fit\u001b[1;34m(self, X, y, **params)\u001b[0m\n\u001b[0;32m 1013\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_format_results(\n\u001b[0;32m 1014\u001b[0m all_candidate_params, n_splits, all_out, all_more_results\n\u001b[0;32m 1015\u001b[0m )\n\u001b[0;32m 1017\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m results\n\u001b[1;32m-> 1019\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_run_search\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevaluate_candidates\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1021\u001b[0m \u001b[38;5;66;03m# multimetric is determined here because in the case of a callable\u001b[39;00m\n\u001b[0;32m 1022\u001b[0m \u001b[38;5;66;03m# self.scoring the return type is only known after calling\u001b[39;00m\n\u001b[0;32m 1023\u001b[0m first_test_score \u001b[38;5;241m=\u001b[39m all_out[\u001b[38;5;241m0\u001b[39m][\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtest_scores\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\model_selection\\_search.py:1960\u001b[0m, in \u001b[0;36mRandomizedSearchCV._run_search\u001b[1;34m(self, evaluate_candidates)\u001b[0m\n\u001b[0;32m 1958\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_run_search\u001b[39m(\u001b[38;5;28mself\u001b[39m, evaluate_candidates):\n\u001b[0;32m 1959\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Search n_iter candidates from param_distributions\"\"\"\u001b[39;00m\n\u001b[1;32m-> 1960\u001b[0m \u001b[43mevaluate_candidates\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1961\u001b[0m \u001b[43m \u001b[49m\u001b[43mParameterSampler\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1962\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparam_distributions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mn_iter\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrandom_state\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrandom_state\u001b[49m\n\u001b[0;32m 1963\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1964\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\model_selection\\_search.py:965\u001b[0m, in \u001b[0;36mBaseSearchCV.fit..evaluate_candidates\u001b[1;34m(candidate_params, cv, more_results)\u001b[0m\n\u001b[0;32m 957\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mverbose \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m 958\u001b[0m \u001b[38;5;28mprint\u001b[39m(\n\u001b[0;32m 959\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFitting \u001b[39m\u001b[38;5;132;01m{0}\u001b[39;00m\u001b[38;5;124m folds for each of \u001b[39m\u001b[38;5;132;01m{1}\u001b[39;00m\u001b[38;5;124m candidates,\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 960\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m totalling \u001b[39m\u001b[38;5;132;01m{2}\u001b[39;00m\u001b[38;5;124m fits\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(\n\u001b[0;32m 961\u001b[0m n_splits, n_candidates, n_candidates \u001b[38;5;241m*\u001b[39m n_splits\n\u001b[0;32m 962\u001b[0m )\n\u001b[0;32m 963\u001b[0m )\n\u001b[1;32m--> 965\u001b[0m out \u001b[38;5;241m=\u001b[39m \u001b[43mparallel\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 966\u001b[0m \u001b[43m \u001b[49m\u001b[43mdelayed\u001b[49m\u001b[43m(\u001b[49m\u001b[43m_fit_and_score\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 967\u001b[0m \u001b[43m \u001b[49m\u001b[43mclone\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbase_estimator\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 968\u001b[0m \u001b[43m \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 969\u001b[0m \u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 970\u001b[0m \u001b[43m \u001b[49m\u001b[43mtrain\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtrain\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 971\u001b[0m \u001b[43m \u001b[49m\u001b[43mtest\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtest\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 972\u001b[0m \u001b[43m \u001b[49m\u001b[43mparameters\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mparameters\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 973\u001b[0m \u001b[43m \u001b[49m\u001b[43msplit_progress\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43msplit_idx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mn_splits\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 974\u001b[0m \u001b[43m \u001b[49m\u001b[43mcandidate_progress\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mcand_idx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mn_candidates\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 975\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mfit_and_score_kwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 976\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 977\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[43mcand_idx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparameters\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[43msplit_idx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[43mtrain\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtest\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mproduct\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 978\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43menumerate\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mcandidate_params\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 979\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43menumerate\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mcv\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msplit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mrouted_params\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msplitter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msplit\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 980\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 981\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 983\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(out) \u001b[38;5;241m<\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[0;32m 984\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[0;32m 985\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNo fits were performed. \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 986\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWas the CV iterator empty? \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 987\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWere there no candidates?\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 988\u001b[0m )\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\sklearn\\utils\\parallel.py:74\u001b[0m, in \u001b[0;36mParallel.__call__\u001b[1;34m(self, iterable)\u001b[0m\n\u001b[0;32m 69\u001b[0m config \u001b[38;5;241m=\u001b[39m get_config()\n\u001b[0;32m 70\u001b[0m iterable_with_config \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m 71\u001b[0m (_with_config(delayed_func, config), args, kwargs)\n\u001b[0;32m 72\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m delayed_func, args, kwargs \u001b[38;5;129;01min\u001b[39;00m iterable\n\u001b[0;32m 73\u001b[0m )\n\u001b[1;32m---> 74\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__call__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43miterable_with_config\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\joblib\\parallel.py:2007\u001b[0m, in \u001b[0;36mParallel.__call__\u001b[1;34m(self, iterable)\u001b[0m\n\u001b[0;32m 2001\u001b[0m \u001b[38;5;66;03m# The first item from the output is blank, but it makes the interpreter\u001b[39;00m\n\u001b[0;32m 2002\u001b[0m \u001b[38;5;66;03m# progress until it enters the Try/Except block of the generator and\u001b[39;00m\n\u001b[0;32m 2003\u001b[0m \u001b[38;5;66;03m# reaches the first `yield` statement. This starts the asynchronous\u001b[39;00m\n\u001b[0;32m 2004\u001b[0m \u001b[38;5;66;03m# dispatch of the tasks to the workers.\u001b[39;00m\n\u001b[0;32m 2005\u001b[0m \u001b[38;5;28mnext\u001b[39m(output)\n\u001b[1;32m-> 2007\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m output \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mreturn_generator \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;43mlist\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43moutput\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\joblib\\parallel.py:1650\u001b[0m, in \u001b[0;36mParallel._get_outputs\u001b[1;34m(self, iterator, pre_dispatch)\u001b[0m\n\u001b[0;32m 1647\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m\n\u001b[0;32m 1649\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backend\u001b[38;5;241m.\u001b[39mretrieval_context():\n\u001b[1;32m-> 1650\u001b[0m \u001b[38;5;28;01myield from\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_retrieve()\n\u001b[0;32m 1652\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mGeneratorExit\u001b[39;00m:\n\u001b[0;32m 1653\u001b[0m \u001b[38;5;66;03m# The generator has been garbage collected before being fully\u001b[39;00m\n\u001b[0;32m 1654\u001b[0m \u001b[38;5;66;03m# consumed. This aborts the remaining tasks if possible and warn\u001b[39;00m\n\u001b[0;32m 1655\u001b[0m \u001b[38;5;66;03m# the user if necessary.\u001b[39;00m\n\u001b[0;32m 1656\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exception \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n", - "File \u001b[1;32md:\\ULSTU\\AIM2\\AIM-PIbd-32-Puchkina-A-A\\aimenv\\Lib\\site-packages\\joblib\\parallel.py:1762\u001b[0m, in \u001b[0;36mParallel._retrieve\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1757\u001b[0m \u001b[38;5;66;03m# If the next job is not ready for retrieval yet, we just wait for\u001b[39;00m\n\u001b[0;32m 1758\u001b[0m \u001b[38;5;66;03m# async callbacks to progress.\u001b[39;00m\n\u001b[0;32m 1759\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ((\u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jobs) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m) \u001b[38;5;129;01mor\u001b[39;00m\n\u001b[0;32m 1760\u001b[0m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jobs[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mget_status(\n\u001b[0;32m 1761\u001b[0m timeout\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtimeout) \u001b[38;5;241m==\u001b[39m TASK_PENDING)):\n\u001b[1;32m-> 1762\u001b[0m \u001b[43mtime\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msleep\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m0.01\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1763\u001b[0m \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[0;32m 1765\u001b[0m \u001b[38;5;66;03m# We need to be careful: the job list can be filling up as\u001b[39;00m\n\u001b[0;32m 1766\u001b[0m \u001b[38;5;66;03m# we empty it and Python list are not thread-safe by\u001b[39;00m\n\u001b[0;32m 1767\u001b[0m \u001b[38;5;66;03m# default hence the use of the lock\u001b[39;00m\n", - "\u001b[1;31mKeyboardInterrupt\u001b[0m: " + "Accuracy: 0.9393\n", + "Precision: 0.9395\n", + "Recall: 0.9393\n", + "F1-Score: 0.9392\n", + "ROC-AUC: 0.9833\n", + "Гиперпараметры для градиентного бустинга:\n", + "Accuracy: 0.9261\n", + "Precision: 0.9261\n", + "Recall: 0.9261\n", + "F1-Score: 0.9261\n", + "ROC-AUC: 0.9777\n", + "\n", + "Результаты моделей:\n", + "\n", + "Logistic Regression:\n", + "Accuracy: 0.8760\n", + "Precision: 0.8784\n", + "Recall: 0.8760\n", + "F1: 0.8762\n", + "Roc_auc: 0.9521\n", + "\n", + "Random Forest:\n", + "Accuracy: 0.9393\n", + "Precision: 0.9395\n", + "Recall: 0.9393\n", + "F1: 0.9392\n", + "Roc_auc: 0.9833\n", + "\n", + "Gradient Boosting:\n", + "Accuracy: 0.9261\n", + "Precision: 0.9261\n", + "Recall: 0.9261\n", + "F1: 0.9261\n", + "Roc_auc: 0.9777\n" ] } ], @@ -793,7 +787,7 @@ "target = 'PriceCategory' # Целевая переменная: категория цены\n", "\n", "# Преобразование целевой переменной в категории (например, бюджетные, средний класс, премиум)\n", - "bins = [0, 10000, 30000, float('inf')]\n", + "bins = [0, 10000, 60000, float('inf')]\n", "labels = ['Budget', 'Mid-Range', 'Premium']\n", "df['PriceCategory'] = pd.cut(df['Price'], bins=bins, labels=labels)\n", "\n", @@ -843,7 +837,7 @@ "# Функция для оценки модели\n", "def evaluate_model(model, X_test, y_test):\n", " y_pred = model.predict(X_test)\n", - " y_pred_proba = model.predict_proba(X_test)\n", + " y_pred_proba = model.predict_proba(X_test)[:, 1]\n", " \n", " accuracy = accuracy_score(y_test, y_pred)\n", " precision = precision_score(y_test, y_pred, average='weighted') \n", @@ -938,19 +932,74 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 46, "metadata": {}, "outputs": [ { - "ename": "AttributeError", - "evalue": "'dict' object has no attribute 'best_estimator'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[38], line 66\u001b[0m\n\u001b[0;32m 64\u001b[0m plot_roc_curve_multiclass(y_test, y_pred_proba, class_names, \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mROC Curve for \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmodel_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 65\u001b[0m \u001b[38;5;66;03m# Обученные модели\u001b[39;00m\n\u001b[1;32m---> 66\u001b[0m logreg_best_model \u001b[38;5;241m=\u001b[39m \u001b[43mlogreg_results\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbest_estimator\u001b[49m \u001b[38;5;66;03m# Обученная модель\u001b[39;00m\n\u001b[0;32m 67\u001b[0m rf_best_model \u001b[38;5;241m=\u001b[39m rf_results\u001b[38;5;241m.\u001b[39mbest_estimator_ \u001b[38;5;66;03m# Обученная модель\u001b[39;00m\n\u001b[0;32m 68\u001b[0m gb_best_model \u001b[38;5;241m=\u001b[39m gb_results\u001b[38;5;241m.\u001b[39mbest_estimator_ \n", - "\u001b[1;31mAttributeError\u001b[0m: 'dict' object has no attribute 'best_estimator'" + "name": "stdout", + "output_type": "stream", + "text": [ + "Logistic Regression Metrics:\n", + "Accuracy: 0.8760\n", + "Precision: 0.8784\n", + "Recall: 0.8760\n", + "F1-Score: 0.8762\n", + "ROC-AUC: 0.9521\n" ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Random Forest Metrics:\n", + "Accuracy: 0.9393\n", + "Precision: 0.9395\n", + "Recall: 0.9393\n", + "F1-Score: 0.9392\n", + "ROC-AUC: 0.9833\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi8AAAHHCAYAAAB3K7g2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA92ElEQVR4nO3dd3gU5f7+8XsT0itIQgAhhSC9NwFpglIEwYiIiCYUEZReBPQoRZqAdEWQQxWliFLkqEhTwRxAIAEpAtIU6UhJA5LM7w9+2S9LCtmQsAzn/bquXGafeWb2M5PB3HnmmVmLYRiGAAAATMLJ0QUAAADYg/ACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfACAABMhfCC/wmHDx/W008/LT8/P1ksFq1cuTJXt3/8+HFZLBbNnz8/V7drZg0bNlTDhg1zbXtxcXHq2rWrgoKCZLFY1Ldv31zbtllwngG3EF5w3/zxxx96/fXXFRYWJnd3d/n6+qpu3bqaOnWqEhMT8/S9IyMjtXfvXo0ePVqLFi1S9erV8/T97qeoqChZLBb5+vpmeBwPHz4si8Uii8WiiRMn2r39v//+W8OHD1dMTEwuVJtzY8aM0fz589WjRw8tWrRIr7zySp6+X0hIiPW4WSwWeXl5qWbNmlq4cGGevq/Z3Hmcbv9KSkpydHnp/PLLLxo+fLguX77s6FJwD/I5ugD8b1i7dq1eeOEFubm56dVXX1X58uV148YNbdmyRYMGDdK+ffs0e/bsPHnvxMRERUdH65133lHPnj3z5D2Cg4OVmJgoFxeXPNn+3eTLl08JCQlas2aN2rVrZ7Ns8eLFcnd3z/Evkr///lsjRoxQSEiIKleunO311q1bl6P3y8zGjRv1+OOPa9iwYbm63axUrlxZAwYMkCSdPn1ac+bMUWRkpK5fv67XXnvtvtXxoLv9ON3O1dXVAdVk7ZdfftGIESMUFRUlf39/R5eDHCK8IM8dO3ZM7du3V3BwsDZu3KjChQtbl7355ps6cuSI1q5dm2fvf/78eUnK0/9RWSwWubu759n278bNzU1169bVF198kS68fP7553rmmWe0YsWK+1JLQkKCPD09c/0X17lz51S2bNlc215ycrJSU1OzrLNo0aLq2LGj9XVUVJTCwsI0efJkwstt7jxOuSU1NVU3btxw6L8tPJi4bIQ8N378eMXFxenf//63TXBJEx4erj59+lhfJycn6/3331eJEiXk5uamkJAQvf3227p+/brNeiEhIWrZsqW2bNmimjVryt3dXWFhYTbD+sOHD1dwcLAkadCgQbJYLAoJCZF06xdR2ve3Gz58uCwWi03bDz/8oCeeeEL+/v7y9vZWqVKl9Pbbb1uXZzYXYePGjapXr568vLzk7++v1q1b68CBAxm+35EjR6x/Dfr5+alTp05KSEjI/MDeoUOHDvr2229thsN37Nihw4cPq0OHDun6X7p0SQMHDlSFChXk7e0tX19fNW/eXLGxsdY+mzdvVo0aNSRJnTp1sl4OSNvPhg0bqnz58tq5c6fq168vT09P63G5c85LZGSk3N3d0+1/06ZNlT9/fv39998Z7tfmzZtlsVh07NgxrV271lrD8ePHJd0KNV26dFGhQoXk7u6uSpUqacGCBTbbSPv5TJw4UVOmTLGeW/v378/WsU0TEBCg0qVL648//rBp//nnn/XCCy+oePHicnNzU7FixdSvX790l/GioqLk7e2tU6dOqU2bNvL29lZAQIAGDhyolJQUm76XL19WVFSU/Pz85O/vr8jIyEwvddhznh06dEgdO3aUn5+fAgIC9O6778owDP35559q3bq1fH19FRQUpA8//NCuY5OV+Ph4DRgwQMWKFZObm5tKlSqliRMnyjAMm34Wi0U9e/bU4sWLVa5cObm5uem7776TJJ06dUqdO3dWoUKF5ObmpnLlymnu3Lnp3mv69OkqV66cPD09lT9/flWvXl2ff/659RgMGjRIkhQaGpruXIJ5MPKCPLdmzRqFhYWpTp062erftWtXLViwQG3bttWAAQO0bds2jR07VgcOHNDXX39t0/fIkSNq27atunTposjISM2dO1dRUVGqVq2aypUrp4iICPn7+6tfv3566aWX1KJFC3l7e9tV/759+9SyZUtVrFhRI0eOlJubm44cOaKtW7dmud769evVvHlzhYWFafjw4UpMTNT06dNVt25d7dq1K11wateunUJDQzV27Fjt2rVLc+bMUWBgoD744INs1RkREaHu3bvrq6++UufOnSXdGnUpXbq0qlatmq7/0aNHtXLlSr3wwgsKDQ3V2bNnNWvWLDVo0ED79+9XkSJFVKZMGY0cOVLvvfeeunXrpnr16kmSzc/y4sWLat68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GjVqlGt1tW/fXoMHD9Zzzz2n3r17KyEhQTNnztRjjz1mM2F15MiR+umnn/TMM88oODhY586d08cff6xHH31UTzzxRKbbnzBhgpo3b67atWurS5cu1ltY/fz8srycc6+cnJz0r3/96679WrZsqZEjR6pTp06qU6eO9u7dq8WLF1vnKqQpUaKE/P399cknn8jHx0deXl6qVauW3fNHNm7cqI8//ljDhg2z3ro9b948NWzYUO+++67Gjx9v1/YkqVu3bpo1a5aioqK0c+dOhYSE6Msvv9TWrVs1ZcqUbE8Ut0fz5s1Vvnx5TZo0SW+++aZKly6tEiVKaODAgTp16pR8fX21YsWKe5p31apVK9WtW1dDhgzR8ePHVbZsWX311VcZzkVy1HmWXa1atVKjRo30zjvv6Pjx46pUqZLWrVunVatWqW/fvipRosRdtzFu3Dht2rRJtWrV0muvvaayZcvq0qVL2rVrl9avX2/9A+Ppp59WUFCQ6tatq0KFCunAgQOaMWOGnnnmGeu5UK1aNUnSO++8o/bt28vFxUWtWrVy+AgV7OSYm5zwv+jQoUPGa6+9ZoSEhBiurq6Gj4+PUbduXWP69OlGUlKStd/NmzeNESNGGKGhoYaLi4tRrFgxY+jQoTZ9DCPjW2cNI/0tupndKm0YhrFu3TqjfPnyhqurq1GqVCnjs88+S3er9IYNG4zWrVsbRYoUMVxdXY0iRYoYL730knHo0KF073Hn7cTr16836tata3h4eBi+vr5Gq1atjP3799v0SXu/O2/FnjdvXrZu6bz9VunMZHar9IABA4zChQsbHh4eRt26dY3o6OgMb3FetWqVUbZsWSNfvnw2+9mgQYNMb029fTtXr141goODjapVqxo3b9606devXz/DycnJiI6OznIfMvt5nz171ujUqZNRsGBBw9XV1ahQoUK6n0NW54C972cYhjF//nyb47B//36jSZMmhre3t1GwYEHjtddeM2JjY9OdE5n9rO485wzDMC5evGi88sorhq+vr+Hn52e88sorxu7du3P9PMuspqx+trfL6jiluXbtmtGvXz+jSJEihouLi1GyZEljwoQJRmpqqk0/ZXAbepqzZ88ab775plGsWDHDxcXFCAoKMho3bmzMnj3b2mfWrFlG/fr1jUceecRwc3MzSpQoYQwaNMi4cuWKzbbef/99o2jRooaT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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gradient Boosting Metrics:\n", + "Accuracy: 0.9261\n", + "Precision: 0.9261\n", + "Recall: 0.9261\n", + "F1-Score: 0.9261\n", + "ROC-AUC: 0.9777\n" + ] + }, + { + "data": { + "image/png": "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tEP/hx56KN19TXLqd6dmzZpq0qSJmjRpoueee07ffPONypcvr969e+vatWuSrh9r0aJF072wufm5y+rfhAYNGqh9+/YaPny4ChYsqDZt2mjmzJl3fDn77f7GnD59WvHx8Rn+nmX2u4e7j/ACp/j7+6to0aL67bffnFovqzeLcnNzy7DdGJPtfaSkpDg89vb21k8//aQ1a9bohRde0J49e/T000/r8ccfT9f3TtzJsaTx9PRUZGSkZs+erWXLlmU66iJdv2/KgAED9Oijj2revHn6/vvv9cMPP6hChQpZHmGSrp8fZ+zatcv+H+mvv/7q1Lp3Kqu1li1bVpLS/dwWKlTI/p/yjVfN3W4f8+bNU+fOnVWyZEl99tln+ve//60ffvhBjz32mFPn+lZSU1Nls9ns27756+YRrpz4ecuqPHnyqFGjRjpx4oRiYmKytY3b/U2w2WxavHixNm/erN69e+v48ePq2rWrqlWrli6EOuNunifkHsILnNaqVSv99ddf2rx58237hoSEKDU1Nd0fuFOnTunixYsZDtNnV/78+XXx4sV07Te/Wpeu//Ft3LixPvroI+3bt0+jRo3SunXr0g3Fp0mr848//ki3bP/+/SpYsKB8fX3v7AAy8eyzz2rXrl26cuWKOnbsmGm/xYsXq1GjRvrss8/UsWNHNW3aVE2aNEl3TnLyrqNXr15Vly5dVL58efXo0UMffvihtm3blu3thYSEKCYmJl0A2L9/v315drRo0UJubm6aP39+tmu70eLFixUWFqalS5fqhRdeULNmzdSkSRMlJCQ49AsJCdGJEyfS/Web0c/RzUqWLCljjEJDQ+0B68av2rVrO113Tj73ycnJkv43mhUSEqK///473ajszc+ds38TateurVGjRmn79u2aP3++9u7dqy+//DLHjydNUFCQvLy8dODAgXTLMmqDaxBe4LQ33nhDvr6+6t69u06dOpVu+V9//aUJEyZIuv62hySNHz/eoc9HH30kSXriiSdyrK6SJUvq0qVL2rNnj73txIkT6a5oOn/+fLp1064OyWxIukiRIqpcubJmz57tEAZ+++03rV692n6cuaFRo0Z69913NXnyZAUHB2faz83NLd2rx6+++krHjx93aEsLWRkFPWcNGjRIR48e1ezZs/XRRx+pRIkSioqKyvbQfsuWLXXy5EktXLjQ3pacnKxJ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AACQJU7PeenatauuXLmSG7UAAADcltPhZfbs2YqPj8+NWgAAAG7L6fBijJHNZsuNWgAAAG7L6TkvktS3b195e3tnuOzzzz+/o4IAAABuJVvhxRgjY0xO1wIAAHBbTocXm82miRMnKigoKDfqAQAAuKVszXkBAABwFafDS1RUVKbzXQAAAHKb0+Fl/PjxGX4EwPnz53X58uUcKQoAACAzToeXjh076ssvv0zXvmjRInXs2DFHigIAAMiM0+Fly5YtatSoUbr2hg0basuWLTlSFAAAQGacDi+JiYlKTk5O156UlMSddwEAQK5zOrzUrFlT06dPT9c+depUVatWLUeKAgAAyIzT93kZOXKkmjRpot27d6tx48aSpLVr12rbtm1avXp1jhcIAABwI6dHXiIiIrR582YVK1ZMixYt0qpVqxQeHq49e/aofv36uVEjAACAnc3ch3edS0g/JQfAfSJ/jd6uLgFALonfNTlL/ZweeQEAAHClLM95cXNzy1K/lJSUbBcDAABwO1kOL+7u7nJzc1OfPn1Up06d3KwJAAAgU1kOL3/++afeeustjR07Vm3atNHo0aNVunTp3KwNAAAgnSzPeSlevLjmzJmjXbt2KSEhQRUrVlSPHj104sSJ3KwPAADAgdMTdh9++GF98803WrNmjX777TeFh4dryJAhunTpUm7UBwAA4CDbVxs9+uij+uWXXzR//nytXLlSYWFhGjNmTE7WBgAAkE6W7/MSGRmZ6bLk5GStWbNGiYmJ98TVRtznBbh/cZ8X4P6V1fu8ZHnCbkBAwC2XP/3001ndFAAAQLZlObzMnDkzN+sAAADIEu6wCwAALIXwAgAALIXwAgAALIXwAgAALIXwAgAALIXwAgAALIXwAgAALIXwAgAALIXwAgAALIXwAgAALIXwAgAALIXwAgAALIXwAgAALIXwAkvYsX2b+rzcU00a1tMjFcpo3do1DsunfDxJbVo1V63qlVWvTg316NZZe/bsdlG1AG4lompJLR7/kg6uHqX4XZPVumElh+VBBfw0ffjzOrh6lM798pFWTH5ZJYsXcujTNTJC33/aT6d+HqP4XZMVkM/7bh4CXIzwAkuIj49TmTJlNOStoRkuDwkpoSFvvqMly1Zp1twvVPTBB9Xrxa46f/78Xa4UwO34envq1z+P69XRCzNcvmhcD4U+VFD/eHWaaj/z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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -960,6 +1009,7 @@ "from sklearn.preprocessing import label_binarize\n", "import numpy as np\n", "\n", + "# Функция для построения матрицы ошибок\n", "def plot_confusion_matrix(y_true, y_pred, title):\n", " cm = confusion_matrix(y_true, y_pred)\n", " sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', cbar=False)\n", @@ -968,39 +1018,10 @@ " plt.ylabel('Истинные значения')\n", " plt.show()\n", "\n", - "def plot_roc_curve_multiclass(y_true, y_pred_proba, class_names, title):\n", - " # Бинаризация меток для мультиклассовой классификации\n", - " y_true_bin = label_binarize(y_true, classes=np.unique(y_true))\n", - " n_classes = y_true_bin.shape[1]\n", - "\n", - " # Вычисление ROC-кривых для каждого класса\n", - " fpr = dict()\n", - " tpr = dict()\n", - " roc_auc = dict()\n", - " for i in range(n_classes):\n", - " fpr[i], tpr[i], _ = roc_curve(y_true_bin[:, i], y_pred_proba[:, i])\n", - " roc_auc[i] = auc(fpr[i], tpr[i])\n", - "\n", - " # Построение ROC-кривых\n", - " plt.figure(figsize=(8, 6))\n", - " colors = ['blue', 'red', 'green', 'purple', 'orange'] # Цвета для каждого класса\n", - " for i, color in zip(range(n_classes), colors):\n", - " plt.plot(fpr[i], tpr[i], color=color, lw=2,\n", - " label=f'ROC curve (class {class_names[i]}, area = {roc_auc[i]:.2f})')\n", - "\n", - " plt.plot([0, 1], [0, 1], 'k--', lw=2)\n", - " plt.xlim([0.0, 1.0])\n", - " plt.ylim([0.0, 1.05])\n", - " plt.xlabel('False Positive Rate')\n", - " plt.ylabel('True Positive Rate')\n", - " plt.title(title)\n", - " plt.legend(loc=\"lower right\")\n", - " plt.show()\n", - "\n", + "# Функция для оценки и визуализации модели\n", "def evaluate_and_plot_model(model, X_test, y_test, model_name, class_names):\n", " y_pred = model.predict(X_test)\n", - " y_pred_proba = model.predict_proba(X_test)\n", - " \n", + " y_pred_proba = model.predict_proba(X_test)[:, 1]\n", " # Метрики\n", " accuracy = accuracy_score(y_test, y_pred)\n", " precision = precision_score(y_test, y_pred, average='weighted')\n", @@ -1017,10 +1038,9 @@ " \n", " # Визуализация\n", " plot_confusion_matrix(y_test, y_pred, f'Confusion Matrix for {model_name}')\n", - " plot_roc_curve_multiclass(y_test, y_pred_proba, class_names, f'ROC Curve for {model_name}')\n", "\n", "# Пример использования\n", - "class_names = ['Budget', 'Mid-Range', 'Premium'] # Замените на ваши классы\n", + "class_names = ['Budget', 'Mid-Range', 'Premium']\n", "evaluate_and_plot_model(logreg_best_model, X_test, y_test, 'Logistic Regression', class_names)\n", "evaluate_and_plot_model(rf_best_model, X_test, y_test, 'Random Forest', class_names)\n", "evaluate_and_plot_model(gb_best_model, X_test, y_test, 'Gradient Boosting', class_names)"