AIM-PIbd-32-Petrushin-E-A/lab_5/lab5.ipynb

479 lines
204 KiB
Plaintext
Raw Normal View History

2024-11-22 18:03:41 +04:00
{
"cells": [
{
"cell_type": "code",
2024-11-22 20:35:31 +04:00
"execution_count": 45,
2024-11-22 18:03:41 +04:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" ID Price Levy Manufacturer Model Prod. year Category \\\n",
"0 45654403 13328 1399 LEXUS RX 450 2010 Jeep \n",
"1 44731507 16621 1018 CHEVROLET Equinox 2011 Jeep \n",
"2 45774419 8467 - HONDA FIT 2006 Hatchback \n",
"3 45769185 3607 862 FORD Escape 2011 Jeep \n",
"4 45809263 11726 446 HONDA FIT 2014 Hatchback \n",
"\n",
" Leather interior Fuel type Engine volume Mileage Cylinders \\\n",
"0 Yes Hybrid 3.5 186005 km 6.0 \n",
"1 No Petrol 3 192000 km 6.0 \n",
"2 No Petrol 1.3 200000 km 4.0 \n",
"3 Yes Hybrid 2.5 168966 km 4.0 \n",
"4 Yes Petrol 1.3 91901 km 4.0 \n",
"\n",
" Gear box type Drive wheels Doors Wheel Color Airbags \n",
"0 Automatic 4x4 04-May Left wheel Silver 12 \n",
"1 Tiptronic 4x4 04-May Left wheel Black 8 \n",
"2 Variator Front 04-May Right-hand drive Black 2 \n",
"3 Automatic 4x4 04-May Left wheel White 0 \n",
"4 Automatic Front 04-May Left wheel Silver 4 \n",
"Index(['ID', 'Price', 'Levy', 'Manufacturer', 'Model', 'Prod. year',\n",
" 'Category', 'Leather interior', 'Fuel type', 'Engine volume', 'Mileage',\n",
" 'Cylinders', 'Gear box type', 'Drive wheels', 'Doors', 'Wheel', 'Color',\n",
" 'Airbags'],\n",
" dtype='object')\n"
]
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import sklearn\n",
"from sklearn.model_selection import train_test_split, GridSearchCV, cross_val_score\n",
"from sklearn.preprocessing import StandardScaler, OneHotEncoder\n",
"from sklearn.compose import ColumnTransformer\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.linear_model import LinearRegression, LogisticRegression\n",
"from sklearn.tree import DecisionTreeRegressor, DecisionTreeClassifier\n",
"from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n",
"from sklearn.metrics import mean_squared_error, f1_score, accuracy_score, roc_auc_score, confusion_matrix, classification_report\n",
"df = pd.read_csv(\"./static/csv/car_price_prediction.csv\")\n",
"print(df.head())\n",
"print(df.columns)"
]
2024-11-22 20:35:31 +04:00
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Предварительная обработка данных\n",
"Обработка пропущенных значений"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"object\n",
"Пропущенные значения после заполнения:\n",
"ID 0\n",
"Price 0\n",
"Levy 0\n",
"Manufacturer 0\n",
"Model 0\n",
"Prod. year 0\n",
"Category 0\n",
"Leather interior 0\n",
"Fuel type 0\n",
"Engine volume 0\n",
"Mileage 0\n",
"Cylinders 0\n",
"Gear box type 0\n",
"Drive wheels 0\n",
"Doors 0\n",
"Wheel 0\n",
"Color 0\n",
"Airbags 0\n",
"dtype: int64\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Egor\\AppData\\Local\\Temp\\ipykernel_21864\\90121908.py:3: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n",
"The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n",
"\n",
"For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n",
"\n",
"\n",
" df['Levy'].fillna(df['Levy'].median(), inplace=True)\n",
"C:\\Users\\Egor\\AppData\\Local\\Temp\\ipykernel_21864\\90121908.py:21: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n",
"The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n",
"\n",
"For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n",
"\n",
"\n",
" df['Mileage'].fillna(df['Mileage'].median(), inplace=True)\n",
"C:\\Users\\Egor\\AppData\\Local\\Temp\\ipykernel_21864\\90121908.py:22: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n",
"The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n",
"\n",
"For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n",
"\n",
"\n",
" df['Engine volume'].fillna(df['Engine volume'].median(), inplace=True)\n",
"C:\\Users\\Egor\\AppData\\Local\\Temp\\ipykernel_21864\\90121908.py:24: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n",
"The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n",
"\n",
"For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n",
"\n",
"\n",
" df['Mileage'].fillna(df['Mileage'].mean(), inplace=True)\n"
]
}
],
"source": [
"# Очистка столбца 'Levy' от нечисловых значений\n",
"df['Levy'] = pd.to_numeric(df['Levy'], errors='coerce')\n",
"df['Levy'].fillna(df['Levy'].median(), inplace=True)\n",
"\n",
"\n",
"# Очистка столбца 'Mileage' от нечисловых значений\n",
"df['Mileage'] = df['Mileage'].str.replace(' km', '').astype(float)\n",
"df['Mileage'] = pd.to_numeric(df['Mileage'], errors='coerce')\n",
"\n",
"# Проверка типа данных в столбце 'Engine volume'\n",
"print(df['Engine volume'].dtype)\n",
"\n",
"# Если столбец 'Engine volume' не является строковым, преобразуем его в строку\n",
"if df['Engine volume'].dtype != 'object':\n",
" df['Engine volume'] = df['Engine volume'].astype(str)\n",
"\n",
"# Очистка столбца 'Engine volume' от нечисловых значений\n",
"df['Engine volume'] = df['Engine volume'].str.replace(r'[^0-9.]', '', regex=True).astype(float)\n",
"\n",
"# Заполнение пропущенных значений\n",
"df['Mileage'].fillna(df['Mileage'].median(), inplace=True)\n",
"df['Engine volume'].fillna(df['Engine volume'].median(), inplace=True)\n",
"\n",
"df['Mileage'].fillna(df['Mileage'].mean(), inplace=True)\n",
"\n",
"# Проверка на наличие NaN после заполнения\n",
"print(\"Пропущенные значения после заполнения:\")\n",
"print(df.isnull().sum())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Кодирование категориальных переменных"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.calibration import LabelEncoder\n",
"\n",
"le = LabelEncoder()\n",
"categorical_cols = ['Manufacturer', 'Model', 'Category', 'Leather interior',\n",
" 'Fuel type', 'Gear box type', 'Drive wheels', 'Doors',\n",
" 'Wheel', 'Color']\n",
"for col in categorical_cols:\n",
" df[col] = le.fit_transform(df[col].astype(str))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Масштабирование признаков\n",
"#### Понижение размерности - PCA\n",
"#### Визуализация PCA\n",
"\n",
"Данные распределены вдоль оси X (Главный компонент 1) с некоторым разбросом вдоль оси Y (Главный компонент 2).\n",
"\n",
"Большая часть дисперсии в данных объясняется первой главной компонентой.\n",
"\n",
"Возможно, данные содержат несколько кластеров, которые можно идентифицировать с помощью кластерного анализа."
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from pyexpat import features\n",
"from sklearn.decomposition import PCA\n",
"\n",
"features = df.drop(['ID', 'Price'], axis=1)\n",
"\n",
"# Масштабирование признаков\n",
"scaler = StandardScaler()\n",
"X_scaled = scaler.fit_transform(features)\n",
"\n",
"# Проверка на наличие NaN после масштабирования\n",
"if np.isnan(X_scaled).any():\n",
" raise ValueError(\"В масштабированных данных все еще присутствуют NaN.\")\n",
"\n",
"# Понижение размерности - PCA\n",
"pca = PCA(n_components=2)\n",
"X_pca = pca.fit_transform(X_scaled)\n",
"\n",
"# Визуализация PCA\n",
"plt.scatter(X_pca[:, 0], X_pca[:, 1])\n",
"plt.xlabel('Главный компонент 1')\n",
"plt.ylabel('Главный компонент 2')\n",
"plt.title('Визуализация данных после PCA')\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Выбор количества кластеров\n",
"\n",
2024-11-22 20:53:52 +04:00
"#### График локтя\n",
"\n",
"Инерция — это мера внутрикластерного рассеяния. Чем меньше инерция, тем более компактны и плотны кластеры.\n",
"\n",
"Цель: Минимизировать инерцию, но при этом не создавать слишком много мелких кластеров.\n",
"\n",
"Инерция резко падает при увеличении k от 2 до 3, а затем начинает выравниваться.\n",
"\n",
"Локтевая точка находится при k = 3.\n",
"\n",
"Оптимальное количество кластеров равно 3."
2024-11-22 20:35:31 +04:00
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlYAAAHHCAYAAAB9dxZkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAByzklEQVR4nO3deVhUZf8G8HtmgAEEBpFdVsUNccUNzUxFUcncSnPLJcsULZdMrdzqV6QtVmq2Y1mupaZmKm6YhuKGiihuKKgsIjLs6zy/P3yZHAEFGjgD3J/rOtf7zjnPnPmeAzS3z3nOc2RCCAEiIiIi+s/kUhdAREREVFswWBERERHpCYMVERERkZ4wWBERERHpCYMVERERkZ4wWBERERHpCYMVERERkZ4wWBERERHpCYMVERERkZ4wWBERERHpCYMVERFRNVqzZg1kMhlOnjwpdSlUBRisiPDvf+hkMhmOHDlSYrsQAq6urpDJZHj22WclqJCIiGoCBiuih5iammLdunUl1oeFheHWrVtQKpUSVEVERDUFgxXRQwYMGIDNmzejsLBQZ/26devg6+sLR0dHiSojIqKagMGK6CEjR47EvXv3EBoaql2Xn5+P3377DaNGjSr1PRqNBp9//jlatmwJU1NTODg4YPLkybh//762jYeHh/ZSY2mLh4eHtm1WVhZmz54NV1dXKJVKNGvWDJ988gmEECU++9ChQ2Xus7zGjx9f6vsXL16s0+7AgQPo3r076tWrB2trawwaNAgXL17UabN48eISn33w4EEolUq89tprOm0etxw6dEj7/tWrV8PHxwfm5uY6bX777bdyHd8zzzxTruMDdC8JP7w888wzOu3OnDmDfv36wc7OTqddeS4Tl/fnW57flxs3bjzxXI4fP17n2G7cuKH9DI1Gg9atW0Mmk2HNmjXa9cW/E23bti1Rf3BwMGQyGSwsLHTWh4SEoFevXrC3t4dSqYS3tzdWr15d6jko6/f24b+D4jZP+jkX/z6lpKTorD958mSJ4wIq9nv86GJkZKTTbvPmzfD19YWZmRlsbW0xZswY3L59+7H1luX+/fvo1KkTXFxcEBMTU6l9kGEwenITorrDw8MDfn5+WL9+Pfr37w8A+Ouvv6BWq/Hiiy/iyy+/LPGeyZMnY82aNZgwYQJef/11xMbGYuXKlThz5gyOHj0KY2NjfP7558jMzAQAXLx4ER9++CHefvtttGjRAgC0X1JCCDz33HM4ePAgXn75ZbRt2xZ79uzBnDlzcPv2bSxfvrzUul9//XV07NgRAPDzzz/rBMPysLW11dn32LFjdbbv27cP/fv3R6NGjbB48WLk5ORgxYoV6NatG06fPq3zhfiws2fPYvDgwRgwYABWrVoFABg6dCi8vLy0bWbOnIkWLVrg1Vdf1a4rPi8bN27E1KlT8cwzz2D69OmoV6+e9vxVhIuLC4KDgwEAmZmZmDJlymPbL1++HLa2tgCADz74QGebWq1G//79IYTArFmz4Orqqj2OJ6noz7dPnz546aWXdNZ9+umn2tBuZ2eHtWvXardt2bIFW7du1VnXuHHjMutZu3Ytzp8/X+o2IyMjXLhwAWfOnEG7du2069esWQNTU9MS7VevXo2WLVviueeeg5GREXbs2IGpU6dCo9EgKCio1M94+G/g22+/RVxcXJm16kNFf49Xr16tEyDl8n/7Ior/5jt27Ijg4GAkJSXhiy++wNGjR3HmzBlYW1uXu66UlBT06dMHqampCAsLe+zPjGoAQUQiJCREABAnTpwQK1euFJaWliI7O1sIIcQLL7wgevbsKYQQwt3dXQQGBmrf9/fffwsA4tdff9XZ3+7du0tdL4QQBw8eFADEwYMHS2zbtm2bACD+7//+T2f9888/L2Qymbh69arO+r179woA4rffftOuCwoKEhX50x49erTw9PTUWQdALFq0SPu6bdu2wt7eXty7d0+77uzZs0Iul4uXXnpJu27RokXaz75x44ZwcnISTz31lMjJySnz893d3cW4ceNK3TZy5EhhbW2t8/7i87d58+ZyHV/Xrl2Fj4+P9vXdu3dLHF+x7777TgAQN2/e1K7r0aOH6NGjh/b1nj17BACxfv36Esfx8O9GaSry8wUggoKCSuwjMDBQuLu7l7r/h8//o4p/x2NjY4UQQuTm5go3NzfRv39/AUCEhIRo244bN07Uq1dPDBw4UEybNk27/u+//xZmZmZi8ODBol69ejr7L/57eVhAQIBo1KhRifWhoaECgAgLC9P5zIePq7w/5+Jjvnv3rs76EydOlDiuiv4eP7rPYvn5+cLe3l74+Pjo/G7u3LlTABALFy58bM0P//cmISFBtGzZUjRq1EjcuHHjse+jmoGXAokeMXz4cOTk5GDnzp3IyMjAzp07y7wMuHnzZqhUKvTp0wcpKSnaxdfXFxYWFjh48GCFPnvXrl1QKBR4/fXXddbPnj0bQgj89ddfOutzc3MBoNQehPLKz89/7KD8hIQEREZGYvz48bCxsdGub926Nfr06YNdu3aVeM+9e/cQEBAAS0tLbN++vdL1ZWRkwNzc/D8dX25ubrnfn5+fDwCPPR8ZGRkAgAYNGlS4lor+fKvSqlWrcO/ePSxatKjMNhMnTsS6deuQl5cH4MHlvqFDh0KlUpVoa2Zmpv3/arUaKSkp6NGjB65fvw61Wq3TtjznuVhGRgZSUlKQlpb22Hapqak6f4OPfmZlfo/LcvLkSSQnJ2Pq1Kk6v1uBgYFo3rw5/vzzz3Lt59atW+jRowcKCgpw+PBhuLu7l7sGMlwMVkSPsLOzg7+/P9atW4ctW7agqKgIzz//fKltr1y5ArVaDXt7e9jZ2eksmZmZSE5OrtBn37x5E87OzrC0tNRZX3y55ObNmzrri8eVlPZFV15paWklxss8WhMANGvWrMS2Fi1aICUlBVlZWTrrn332WcTExCAtLa3UsWHl5efnhzt37mDx4sWIi4sr9QvzSVJSUsp9foq/vB93Pjp06ABjY2MsXrwYZ86c0X6RazSaJ+6/oj/fqqJWq/Hhhx9i1qxZcHBwKLNdYGAgjIyM8McffyArKwubNm3ChAkTSm179OhR+Pv7a8cu2dnZ4e2339Z+3sPKc56LTZw4EXZ2dqhfvz4sLS0xatQoJCUllWjXrFkznb8/f39/ne2V+T0uy+P21bx583L/HMeOHYvk5GSEhYWhYcOG5XoPGT6OsSIqxahRo/DKK68gMTER/fv3L3O8hEajgb29PX799ddSt9vZ2VVhldAORC5rjFN5JCYm6v1fypcuXcJff/2F4cOHY/bs2QgJCanUfmbOnImYmBi8//77WLJkSYXfn5+fj4SEBPTp06dc7RMTE2FhYYF69eqV2cbd3R0hISF444030L59e51trVu3rnCNUli6dCnkcjnmzJmDe/fuldnO2NgYY8aMQUhICLKzs9GgQQP06tVLZwwXAFy7dg29e/dG8+bN8dlnn8HV1RUmJibYtWsXli9fXiJ0JiYmAkC57rJduHAhunfvjoKCApw6dQrvvfce0tLSSvQw/f7777CystK+vnz5cpljuwzF0KFD8fPPP+OLL77QjgGkmo/BiqgUQ4YMweTJk3Hs2DFs3LixzHaNGzfGvn370K1bN51LIZXl7u6Offv2ISMjQ6dX49KlS9rtDzt58iQcHR3h4uJSqc8rKCjA1atX0a9fv8fWBKDUO5UuXboEW1vbEkFk+/bt6N69O4KDgzFt2jSMGTMGvXv3rnB9ZmZm+O6773DmzBmoVCosWrQIZ8+exZtvvlmu9589exYFBQXo0KFDudpHR0dre48eZ/To0YiLi8OSJUuwdu1a1K9fH2PGjHni+yr6860Kd+7c0X6RW1paPjZYAQ96jNq0aYP4+HiMGzeu1DtOd+zYgby8PGzfvh1ubm7a9WVdCo+OjoadnV25Lqe2atVK2/vUv39/xMXF4aeffkJhYaHOXXpPP/209oYDACX+MVSZ3+OyPLyvXr166WyLiYkp989x+vTp8PLywsKFC6FSqTBv3rxyvY8MGy8FEpXCwsICq1evxuLFizFw4MAy2w0fPhx
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"\n",
"from sklearn.cluster import KMeans\n",
"from sklearn.metrics import silhouette_score\n",
"\n",
"\n",
"inertia = []\n",
"silhouette = []\n",
"for k in range(2, 11):\n",
" kmeans = KMeans(n_clusters=k, random_state=42)\n",
" kmeans.fit(X_scaled)\n",
" inertia.append(kmeans.inertia_)\n",
" silhouette.append(silhouette_score(X_scaled, kmeans.labels_))\n",
"\n",
"plt.plot(range(2, 11), inertia, marker='o')\n",
"plt.xlabel('Количество кластеров (k)')\n",
"plt.ylabel('Инерция')\n",
"plt.title('Метод локтя для оптимального k')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2024-11-22 20:53:52 +04:00
"#### График силуэта\n",
"\n",
"Коэффициент силуэта — это метрика, которая оценивает качество кластеризации. Он измеряет, насколько хорошо каждый объект в кластере подобен другим объектам в том же кластере (компактность) и насколько он отличается от объектов в других кластерах (разделение).\n",
"\n",
"Значения: Коэффициент силуэта принимает значения от -1 до 1. Чем ближе значение к 1, тем лучше кластеризация. Значение 0 указывает на то, что кластеры пересекаются, а отрицательное значение указывает на неправильную кластеризацию.\n",
"\n",
"Коэффициент силуэта достигает максимума при k = 2 и затем снижается при увеличении k.\n",
"\n",
"Оптимальное количество кластеров равно 2."
2024-11-22 20:35:31 +04:00
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"\n",
"plt.plot(range(2, 11), silhouette, marker='o')\n",
"plt.xlabel('Количество кластеров (k)')\n",
"plt.ylabel('Коэффициент силуэта')\n",
"plt.title('Коэффициент силуэта для оптимального k')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Предположим, что оптимальное k равно 3 на основе графиков\n",
"\n",
"#### Иерархическая кластеризация\n",
"\n",
"\n",
"#### K-Means кластеризация\n",
"\n",
2024-11-22 20:53:52 +04:00
"#### Оценка качества кластеризации\n",
"\n",
"Коэффициент силуэта — это метрика, которая оценивает качество кластеризации. Он измеряет, насколько хорошо каждый объект в кластере подобен другим объектам в том же кластере (компактность) и насколько он отличается от объектов в других кластерах (разделение).\n",
"\n",
"Значения: Коэффициент силуэта принимает значения от -1 до 1. Чем ближе значение к 1, тем лучше кластеризация. Значение 0 указывает на то, что кластеры пересекаются, а отрицательное значение указывает на неправильную кластеризацию.\n",
"\n",
"Индекс Дэвиса-Болдина — это метрика, которая оценивает качество кластеризации. Он измеряет отношение среднего расстояния между объектами в одном кластере к среднему расстоянию между объектами в разных кластерах.\n",
"\n",
"Значения: Чем меньше значение индекса Дэвиса-Болдина, тем лучше кластеризация.\n",
"\n",
"Коэффициент силуэта:\n",
"Иерархическая кластеризация: Коэффициент силуэта равен 0.133, что указывает на то, что кластеры имеют некоторую компактность, но не очень высокую.\n",
"\n",
"K-Means кластеризация: Коэффициент силуэта равен 0.172, что немного выше, чем у иерархической кластеризации. Это указывает на то, что K-Means лучше справляется с созданием более компактных кластеров.\n",
"\n",
"Индекс Дэвиса-Болдина:\n",
"Иерархическая кластеризация: Индекс Дэвиса-Болдина равен 2.509, что указывает на то, что кластеры имеют значительное пересечение.\n",
"\n",
"K-Means кластеризация: Индекс Дэвиса-Болдина равен 2.234, что немного ниже, чем у иерархической кластеризации. Это указывает на то, что K-Means лучше справляется с разделением кластеров."
2024-11-22 20:35:31 +04:00
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Коэффициент силуэта (Agg): 0.13306117230156736\n",
"Индекс Дэвиса-Болдина (Agg): 2.5089898754817166\n",
"Коэффициент силуэта (KMeans): 0.17159548190302554\n",
"Индекс Дэвиса-Болдина (KMeans): 2.23429912220393\n"
]
}
],
"source": [
"\n",
"from sklearn.cluster import AgglomerativeClustering\n",
"from sklearn.metrics import davies_bouldin_score\n",
"\n",
"\n",
"agg_clustering = AgglomerativeClustering(n_clusters=3, linkage='ward')\n",
"labels_agg = agg_clustering.fit_predict(X_scaled)\n",
"\n",
"kmeans = KMeans(n_clusters=3, random_state=42)\n",
"labels_kmeans = kmeans.fit_predict(X_scaled)\n",
"\n",
"\n",
"silhouette_agg = silhouette_score(X_scaled, labels_agg)\n",
"davies_bouldin_agg = davies_bouldin_score(X_scaled, labels_agg)\n",
"\n",
"silhouette_kmeans = silhouette_score(X_scaled, labels_kmeans)\n",
"davies_bouldin_kmeans = davies_bouldin_score(X_scaled, labels_kmeans)\n",
"\n",
"print(f\"Коэффициент силуэта (Agg): {silhouette_agg}\")\n",
"print(f\"Индекс Дэвиса-Болдина (Agg): {davies_bouldin_agg}\")\n",
"print(f\"Коэффициент силуэта (KMeans): {silhouette_kmeans}\")\n",
"print(f\"Индекс Дэвиса-Болдина (KMeans): {davies_bouldin_kmeans}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2024-11-22 20:53:52 +04:00
"#### Визуализация кластеров\n",
"\n",
"Главный компонент 1 (ось X): Это первая главная компонента, которая объясняет наибольшую дисперсию в данных.\n",
"\n",
"Главный компонент 2 (ось Y): Это вторая главная компонента, которая объясняет следующую по величине дисперсию в данных.\n",
"\n",
"Данные распределены вдоль оси X (Главный компонент 1) с некоторым разбросом вдоль оси Y (Главный компонент 2).\n",
"\n",
"Большая часть дисперсии в данных объясняется первой главной компонентой.\n",
"\n",
"На графике видны три кластера, которые расположены вдоль оси X."
2024-11-22 20:35:31 +04:00
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAj4AAAHHCAYAAAC/R1LgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAADD9ElEQVR4nOzddZiU1dvA8e95prY7qKWRRkJCkEZBLLBBRbC7A1ssFPu1fiaIhEirIEqDiogiICndsd0zuzPPef+Y3WGXnZmd2d7lfK5rlX3yntl47j11CymlRFEURVEU5SygVXcAiqIoiqIoVUUlPoqiKIqinDVU4qMoiqIoyllDJT6KoiiKopw1VOKjKIqiKMpZQyU+iqIoiqKcNVTioyiKoijKWUMlPoqiKIqinDVU4qMoiqIoyllDJT6KoihKMX/++Sdms5mDBw9Wdyg1Wq9evXjiiSeqOwzFTyrxUWqUKVOmIIQo9hEXF8fAgQP56aefqjs8RTkrPPPMM4waNYomTZq4tg0YMIAOHTqUOHb58uUEBQXRtWtXUlJS3F5vwIABCCFo1aqV2/1Lly51/bzPmTOnYl5EFXjyySf56KOPOHHiRHWHovhBJT5KjfTSSy/xzTffMHXqVJ544gkSExMZPnw4P/74Y3WHpih12qZNm1i2bBl33XVXqceuWLGCyy67jNatW7Ns2TKioqI8HhsQEMCePXv4888/S+ybPn06AQEB5Yq7OlxxxRWEhYXx8ccfV3coih9U4qPUSBdffDE33ngjN910E4899hhr167FZDIxc+bM6g5NUeq0yZMn07hxY3r16uX1uNWrV3PZZZdxzjnnlJr0ALRo0YLWrVuX+Bm2Wq3Mnz+fSy65pNyxVzVN07j66quZOnUqqt537aESH6VWiIiIIDAwEKPR6Np24MABhBBMmTKl2LH33nsvQgjGjh3r2jZv3jx69OhBVFQUgYGBtGnThjfeeMP1y2rlypUIIZg/f36Je8+YMQMhBOvWrQNgy5YtjB07lubNmxMQEEC9evW45ZZbSE5Odht706ZNS3TfCSFYtWpVsWOKxgswe/ZshBA0bdrUtW3Xrl0MGjSIevXqYbFYSEhI4K677irWxZCXl8fzzz9Pt27dCA8PJzg4mL59+7Jy5cpi1y98/956660SMXfo0IEBAwYU2zZgwIAS2zZs2OB6PUVlZWXx6KOP0rx5c0wmU7HXnZSU5PZ98nafV199FU3TmDFjhtvX4O6jqLfeeovevXsTHR1NYGAg3bp189ilMm3aNHr06EFQUBCRkZH069ePX375BfD8tSz8KPq10nWd9957j/bt2xMQEEB8fDx33nknqampxe7XtGlTLr30Un755Rc6d+5MQEAA7dq1Y968eSVi27dvH9dccw1RUVEEBQXRq1cvFi1aVOyYVatWFYvJYrFwzjnnMHHiRJ8ezgsWLGDQoEEl3sOi1q5dyyWXXELLli1ZtmwZ0dHRpV4XYNSoUcyaNQtd113bfvjhB3Jycrj22mvdnnP06FFuueUW4uPjsVgstG/fnq+++qrYMWX5nv/ss89o0aIFFouF7t27s2HDhmLHnjhxgnHjxtGoUSMsFgv169fniiuu4MCBA8WOu/DCCzl48CCbNm3y6T1Qqp+x9EMUpeqlp6eTlJSElJJTp07xwQcfkJWVxY033uj1vD179vD555+X2J6RkUHPnj25+eabMZlMLFmyhPHjx2M0Gnn00UcZMGAACQkJTJ8+nZEjRxY7d/r06bRo0YLzzz8fcI5H2LdvH+PGjaNevXps27aNzz77jG3btvHHH3+4fWD07duXO+64A4AdO3bw2muveX0ddrudZ555psT27OxsGjVqxGWXXUZYWBhbt27lo48+4ujRo/zwww+u1/rFF18watQobr/9djIzM/nyyy8ZOnQof/75J507d/Z6b388+eSTbrc//vjj/O9//+PWW2+lT58+mEwm5s2b5zaxLM3kyZN59tlnefvttxk9erTbY+644w769u0L4PY+77//Ppdffjk33HADeXl5fPvtt1xzzTX8+OOPxVoaJkyYwIsvvkjv3r156aWXMJvNrF+/nhUrVnDRRRfx3nvvkZWVBZz+Oj799NO0bdsWgJCQENe17rzzTqZMmcK4ceN44IEH2L9/Px9++CH//PMPv/32GyaTyXXs7t27ue6667jrrru4+eabmTx5Mtdccw1LlizhwgsvBODkyZP07t2bnJwcHnjgAaKjo/n666+5/PLLmTNnTonv28K4cnNzmTVrFk8//TRxcXHceuutHt/ro0ePcujQIbp27erxmN9++43hw4fTrFkzli9fTkxMjMdjzzR69GhefPFFVq1axaBBgwDnHxaDBw8mLi6uxPEnT56kV69eCCG47777iI2N5aeffuLWW28lIyODhx56CPD/e37GjBlkZmZy5513IoRg0qRJXHnllezbt8/1dbnqqqvYtm0b999/P02bNuXUqVMsXbqUQ4cOFUtwu3Xr5npfunTp4vN7oVQjqSg1yOTJkyVQ4sNiscgpU6YUO3b//v0SkJMnT3Ztu/baa2WHDh1kQkKCvPnmm73eq127dvLSSy91ff7UU09Ji8Ui09LSXNtOnToljUajfOGFF1zbcnJySlxr5syZEpBr1qwpsa9hw4Zy3Lhxrs9XrlwpAbly5UrXtiZNmhSL9+OPP5YWi0UOHDhQNmnSxOvruOeee2RISIjrc7vdLm02W7FjUlNTZXx8vLzllltc2wrfvzfffLPENdu3by/79+9fbFv//v2LbVu8eLEE5LBhw+SZv0rq168vhw4dWmzbCy+8IAGZmJjo9fUUvc+iRYuk0WiUjz76qNtjd+/eLQH59ddfl7hPUWd+zfLy8mSHDh3koEGDil1L0zQ5cuRI6XA4ih2v63qJe7v7OhZau3atBOT06dOLbV+yZEmJ7U2aNJGAnDt3rmtbenq6rF+/vuzSpYtr20MPPSQBuXbtWte2zMxM2axZM9m0aVNXzO7islqtUtM0ec8995SItahly5ZJQP7www8l9vXv319GRUXJ0NBQ2b59e3nq1Cmv1zrz3Pbt20sppTzvvPPkrbfeKqV0fl+azWb59ddfu+KePXu267xbb71V1q9fXyYlJRW73vXXXy/Dw8NdX1d/v+ejo6NlSkqKa/vChQuLve7U1FSPPxvumM1meffdd/v6dijVTHV1KTXSRx99xNKlS1m6dCnTpk1j4MCB3HbbbW6b/wv9/fffzJ49m4kTJ6Jp7r+1k5KSOHLkCFOmTGHPnj3069fPtW/MmDHYbLZiXSCzZs3CbrcXa2kKDAx0/dtqtZKUlOQaD7Fx48YS98zLy8Nisfj82nNycnjppZe47777aNy4sdtj0tPTOXnyJMuXL2fRokXFXofBYMBsNgPO7paUlBTsdjvnnXee2/jKQkrJU089xVVXXUXPnj1L7M/MzPS5+8OTP//8k2uvvZarrrqKN9980+0xeXl5AKW+v0W/ZqmpqaSnp9O3b99i78eCBQvQdZ3nn3++xPePt24fd2bPnk14eDgXXnghSUlJro9u3boREhJSogumQYMGxVpswsLCGDNmDP/8849rxtDixYvp0aMHF1xwgeu4kJAQ7rjjDg4cOMD27duLXbOw1fTQoUNMmjQJXdddrSyeFHbXRkZGut2fnZ1NZmYm8fHxhIWF+f6GFDF69GjmzZtHXl4ec+bMwWAwlGitAuf32Ny5c7nsssuQUhZ7H4cOHUp6errr6+fv9/x1111X7DUWthbu27cPcH6/mM1mVq1aVaJr0p3IyMhSu3CVmkMlPkqN1KNHD4YMGcKQIUO44YYbWLRoEe3ateO+++5zPezONH78ePr27cull17qdr/VaiU2NpaEhARuueUWHn/8cR5//HHX/jZt2tC9e3emT5/u2jZ9+nR69epFy5YtXdtSUlJ48MEHiY+PJzAwkNjYWJo1awY4HzZnSk9PL9YFUpp33nkHq9XK008/7fGYoUOHUq9ePYYMGULbtm2ZNWtWsf1ff/01nTp1IiAggOjoaGJjY1m0aJHb+Mpi+vTpbNu2zWOX3fnnn8/8+fO
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"\n",
"plt.scatter(X_pca[:, 0], X_pca[:, 1], c=labels_kmeans)\n",
"plt.xlabel('Главный компонент 1')\n",
"plt.ylabel('Главный компонент 2')\n",
"plt.title('Визуализация кластеров (K-Means)')\n",
"plt.show()"
]
2024-11-22 18:03:41 +04:00
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}