890 lines
238 KiB
Plaintext
890 lines
238 KiB
Plaintext
|
{
|
|||
|
"cells": [
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"## Начало лабораторной работы"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 5,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"Index(['age', 'sex', 'bmi', 'children', 'smoker', 'region', 'charges'], dtype='object')\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"import pandas as pd\n",
|
|||
|
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
|
|||
|
"print(df.columns)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"## Бизнес-цели\n",
|
|||
|
"\n",
|
|||
|
"1. Оптимизация тарифов:\n",
|
|||
|
"\n",
|
|||
|
"Цель: Разработка более точных и справедливых тарифов на страховку, основанных на индивидуальных рисках клиентов.\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": [
|
|||
|
"## Технические цели для каждой бизнес-цели:\n",
|
|||
|
"\n",
|
|||
|
"1. Оптимизация тарифов:\n",
|
|||
|
"\n",
|
|||
|
"* **Техническая цель:** Разработка и внедрение модели машинного обучения, которая будет прогнозировать стоимость страховки с высокой точностью на основе данных о клиентах (возраст, пол, ИМТ, количество детей, статус курения, регион проживания).\n",
|
|||
|
"* **Ключевые задачи:**\n",
|
|||
|
" * Сбор и подготовка данных (очистка, нормализация, обработка пропущенных значений).\n",
|
|||
|
" * Исследование данных и выявление важных признаков.\n",
|
|||
|
" * Выбор и обучение модели машинного обучения (линейная регрессия, случайный лес, градиентный бустинг и т.д.).\n",
|
|||
|
" * Оценка качества модели (метрики: RMSE, MAE, R²).\n",
|
|||
|
" * Разработка API для интеграции модели в существующие системы компании.\n",
|
|||
|
" * Тестирование и развертывание модели в продакшн.\n",
|
|||
|
" * Мониторинг и поддержка модели (обновление данных, переобучение модели).\n",
|
|||
|
"\n",
|
|||
|
"2. Оценка рисков:\n",
|
|||
|
"\n",
|
|||
|
"* **Техническая цель:** Разработка модели оценки рисков для новых видов страхования или географических регионов, которая позволит определить потенциальные убытки и скорректировать тарифы соответствующим образом.\n",
|
|||
|
"* **Ключевые задачи:**\n",
|
|||
|
" * Сбор и подготовка данных о новых видах страхования или регионах (исторические данные, демографическая информация, данные о рисках).\n",
|
|||
|
" * Исследование данных и выявление закономерностей, связанных с рисками.\n",
|
|||
|
" * Выбор и обучение модели машинного обучения для оценки рисков (классификация, регрессия).\n",
|
|||
|
" * Оценка качества модели (метрики: точность, полнота, F1-мера, AUC-ROC).\n",
|
|||
|
" * Разработка отчетов и дашбордов для визуализации результатов оценки рисков.\n",
|
|||
|
" * Интеграция модели в процесс принятия решений о тарифах и страховых продуктах.\n",
|
|||
|
" * Тестирование и развертывание модели в продакшн.\n",
|
|||
|
" * Мониторинг и поддержка модели (обновление данных, переобучение модели).\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 6,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"Размер обучающей выборки: (1940, 6)\n",
|
|||
|
"Размер контрольной выборки: (416, 6)\n",
|
|||
|
"Размер тестовой выборки: (416, 6)\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"import pandas as pd\n",
|
|||
|
"from sklearn.model_selection import train_test_split\n",
|
|||
|
"\n",
|
|||
|
"# Загрузка данных\n",
|
|||
|
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
|
|||
|
"\n",
|
|||
|
"# Перемешивание данных\n",
|
|||
|
"df = df.sample(frac=1, random_state=42).reset_index(drop=True)\n",
|
|||
|
"\n",
|
|||
|
"# Разделение на признаки и целевую переменную\n",
|
|||
|
"X = df.drop('charges', axis=1)\n",
|
|||
|
"y = df['charges']\n",
|
|||
|
"\n",
|
|||
|
"# Разбиение на обучающую, контрольную и тестовую выборки\n",
|
|||
|
"X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)\n",
|
|||
|
"X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)\n",
|
|||
|
"\n",
|
|||
|
"# Вывод размеров выборок\n",
|
|||
|
"print(\"Размер обучающей выборки:\", X_train.shape)\n",
|
|||
|
"print(\"Размер контрольной выборки:\", X_val.shape)\n",
|
|||
|
"print(\"Размер тестовой выборки:\", X_test.shape)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 7,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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idG5556ryMhI9ejRQyaTya3P7YqceIvsyb53NdnGujw+nJ9BTEyMiouL3V575513XPGmp6e7vfbVV1/p/PPPV1BQkEJCQjR8+PByfZXecMMNCg4OLhfXBx98IJPJ5Nb/Wk2/Zy+99JK6du0qq9WqhIQETZgwQZmZmW7zDBgwwHUsdOnSRb169dIff/xR4TFakRPPGVFRURo+fLgr4Z3MokWLXOeRqKgojRkzRgcOHHC9npeXp40bNyoxMVHDhw9XaGiogoKCNGDAALcuYHbu3CmTyaTnn3++3Dp+/vlnmUwmvfPOO+W22cl5nir7nV2/fr1uuOEGtW3bVv7+/oqLi9NNN92kI0eOuL237HHgtGTJEp177rkKDAxUWFiYRowYUW6fOL9XZb83a9asqfDY6datW7mYpep/x9q0aSNJateunfr06aOMjAwFBARU+L050Q033OD2Gbdo0aLc/pcqPzc7OY9N53d6y5YtOnr0qEJCQtS/f/8q95XT3Xff7XZOSkhIkHQ8L8+ZM0cmk0lt27aVr6+vTCaTfHx8NGLEiHK5JCkpST179nTLy8nJybJarfr2229Pmpd79+5dbtvIy+7Iy+TlsttIXvb+vFxRfnziiSdkNpu1cOFCt+kny99S9fdlZee5is5NJpNJd955pxYsWKCOHTvK399fvXr10vfff19uPdU5Zirbb85H2WOmss/7RM4YTzRixAhXPnbKy8vT/fff7zr3dOzYUc8880y54995/FmtVvXq1UudO3eu9NxZWUzOh8ViUcuWLTVu3Di375/zWP3ggw8qXU7Z3xRSafc5ycnJ+vDDD9WuXTv5+fmpdevWeuCBB1RQUFDu/dU5Bv71r39JkjZv3qxzzz1XAQEBSk5OVmFhoaTjOf+zzz5z5Xzn/+IXXXSREhISdNZZZyk3N9e1zKysLPXv319+fn6ufdChQwdt2rRJEv+LS+R8cj45v6ymnvNrknel6p9vVq9erWHDhqlFixYKCgpSjx499MILL0gq/z9lRY+y+7C6+686219SUqLHHntM7dq1k9VqVZs2bfTggw+WO7+0adNGN9xwgywWi04//XSdfvrp+uijj2Qymcrl74q0adPGFYvZbFZcXJz+7//+z21Qd+c5+Zlnnql0Oc7vvNOqVavk7++vHTt2uPZJXFycxo8fr4yMjHLvr8lvtJ07d2rw4MEKCgpSQkKCpk+f7nY+qqhOkpOTo169eik5OVmHDh1yTa9uHjkZnxrNXQlnsT0yMlJSacHok08+0VVXXaXk5GSlpqbq1VdfVf/+/bVp0yZXYcFut2vEiBFavny5Ro0apXvuuUc5OTlaunSpNm7cqHbt2rnWcc0112jYsGFu6508eXKF8TzxxBMymUz6xz/+obS0NM2aNUsDBw7UunXrFBAQIEn65ptvNHToUPXq1UtTp06V2WzW66+/rosuukg//PCDzj777HLLbdWqlWvgk9zcXN1+++0VrnvKlCm6+uqrdcstt+jw4cN68cUXdcEFF+j3339XeHh4ufeMGzdO559/viTpo48+0scff+z2+vjx410tLu6++27t2rVLc+bM0e+//66ffvpJvr6+Fe6HmsjMzKxwUBeHw6HLLrtMP/74o8aNG6fOnTtrw4YNev7557V161a3QUVqKz8/X/3799eBAwc0fvx
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x600 with 3 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"import pandas as pd\n",
|
|||
|
"from sklearn.model_selection import train_test_split\n",
|
|||
|
"import matplotlib.pyplot as plt\n",
|
|||
|
"import seaborn as sns\n",
|
|||
|
"\n",
|
|||
|
"# Загрузка данных\n",
|
|||
|
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
|
|||
|
"\n",
|
|||
|
"# Перемешивание данных\n",
|
|||
|
"df = df.sample(frac=1, random_state=42).reset_index(drop=True)\n",
|
|||
|
"\n",
|
|||
|
"# Разделение на признаки и целевую переменную\n",
|
|||
|
"X = df.drop('charges', axis=1)\n",
|
|||
|
"y = df['charges']\n",
|
|||
|
"\n",
|
|||
|
"# Разбиение на обучающую, контрольную и тестовую выборки\n",
|
|||
|
"X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)\n",
|
|||
|
"X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)\n",
|
|||
|
"\n",
|
|||
|
"# Функция для оценки сбалансированности выборок\n",
|
|||
|
"def evaluate_balance(y_train, y_val, y_test):\n",
|
|||
|
" plt.figure(figsize=(18, 6))\n",
|
|||
|
" \n",
|
|||
|
" plt.subplot(1, 3, 1)\n",
|
|||
|
" sns.histplot(y_train, kde=True)\n",
|
|||
|
" plt.title('Распределение целевой переменной в обучающей выборке')\n",
|
|||
|
" \n",
|
|||
|
" plt.subplot(1, 3, 2)\n",
|
|||
|
" sns.histplot(y_val, kde=True)\n",
|
|||
|
" plt.title('Распределение целевой переменной в контрольной выборке')\n",
|
|||
|
" \n",
|
|||
|
" plt.subplot(1, 3, 3)\n",
|
|||
|
" sns.histplot(y_test, kde=True)\n",
|
|||
|
" plt.title('Распределение целевой переменной в тестовой выборке')\n",
|
|||
|
" \n",
|
|||
|
" plt.show()\n",
|
|||
|
"\n",
|
|||
|
"# Оценка сбалансированности выборок\n",
|
|||
|
"evaluate_balance(y_train, y_val, y_test)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"**Процесс конструирования признаков для обеих задач:**\n",
|
|||
|
"1. **Анализ и очистка данных:**\n",
|
|||
|
" - Проверить наличие пропущенных значений и дубликатов и обработать их (заполнение средним значением, медианой или удаление строк).\n",
|
|||
|
"\n",
|
|||
|
"2. **Кодирование категориальных признаков:**\n",
|
|||
|
" - Применить One-Hot Encoding для категориальных признаков (`sex`, `smoker`, `region`).\n",
|
|||
|
"\n",
|
|||
|
"3. **Создание новых признаков:**\n",
|
|||
|
" - **Возрастные группы:** Разделить возраст на группы (например, молодые, средний возраст, пожилые).\n",
|
|||
|
" - **Индекс массы тела (ИМТ) группы:** Разделить ИМТ на группы (например, недостаточный вес, нормальный вес, избыточный вес, ожирение).\n",
|
|||
|
" - **Количество детей:** Создать бинарный признак, указывающий, есть ли у клиента дети.\n",
|
|||
|
" - **Комбинированные признаки:** Создать новые признаки, комбинируя существующие (например, возраст и ИМТ, возраст и статус курения).\n",
|
|||
|
"\n",
|
|||
|
"4. **Нормализация и стандартизация:**\n",
|
|||
|
" - Применить нормализацию или стандартизацию к числовым признакам (`age`, `bmi`, `children`), чтобы привести их к одному масштабу.\n",
|
|||
|
"\n",
|
|||
|
"5. **Анализ важности признаков:**\n",
|
|||
|
" - Удалить малозначимые признаки, чтобы упростить модель и улучшить ее производительность."
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"## 1. Оптимизация тарифов"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 9,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"Обучающая выборка после конструирования признаков:\n",
|
|||
|
" age bmi children sex_female sex_male smoker_no \\\n",
|
|||
|
"1684 1.781292 0.374453 -0.907604 True False True \n",
|
|||
|
"862 -0.083478 -0.570585 -0.085975 True False True \n",
|
|||
|
"1992 -1.087585 -0.495147 -0.907604 True False True \n",
|
|||
|
"889 0.705463 -0.586335 -0.907604 True False True \n",
|
|||
|
"1362 0.777185 -0.680839 -0.907604 False True True \n",
|
|||
|
"\n",
|
|||
|
" smoker_yes region_northeast region_northwest region_southeast \\\n",
|
|||
|
"1684 False False True False \n",
|
|||
|
"862 False True False False \n",
|
|||
|
"1992 False False False True \n",
|
|||
|
"889 False False False True \n",
|
|||
|
"1362 False False False False \n",
|
|||
|
"\n",
|
|||
|
" region_southwest age_bin age_bmi \n",
|
|||
|
"1684 False 4.0 1.734561 \n",
|
|||
|
"862 False 1.0 -0.339153 \n",
|
|||
|
"1992 False 0.0 -1.055293 \n",
|
|||
|
"889 False 2.0 0.231109 \n",
|
|||
|
"1362 True 2.0 0.228540 \n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"import pandas as pd\n",
|
|||
|
"from sklearn.model_selection import train_test_split\n",
|
|||
|
"from sklearn.preprocessing import OneHotEncoder, StandardScaler\n",
|
|||
|
"from sklearn.compose import ColumnTransformer\n",
|
|||
|
"from sklearn.pipeline import Pipeline\n",
|
|||
|
"\n",
|
|||
|
"# Загрузка данных\n",
|
|||
|
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
|
|||
|
"\n",
|
|||
|
"# Перемешивание данных\n",
|
|||
|
"df = df.sample(frac=1, random_state=42).reset_index(drop=True)\n",
|
|||
|
"\n",
|
|||
|
"# Разделение на признаки и целевую переменную\n",
|
|||
|
"X = df.drop('charges', axis=1)\n",
|
|||
|
"y = df['charges']\n",
|
|||
|
"\n",
|
|||
|
"# Разбиение на обучающую, контрольную и тестовую выборки\n",
|
|||
|
"X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)\n",
|
|||
|
"X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)\n",
|
|||
|
"\n",
|
|||
|
"# Определение категориальных и числовых признаков\n",
|
|||
|
"categorical_features = ['sex', 'smoker', 'region']\n",
|
|||
|
"numerical_features = ['age', 'bmi', 'children']\n",
|
|||
|
"\n",
|
|||
|
"# Унитарное кодирование категориальных признаков (one-hot encoding)\n",
|
|||
|
"train_data_encoded = pd.get_dummies(X_train, columns=categorical_features)\n",
|
|||
|
"val_data_encoded = pd.get_dummies(X_val, columns=categorical_features)\n",
|
|||
|
"test_data_encoded = pd.get_dummies(X_test, columns=categorical_features)\n",
|
|||
|
"\n",
|
|||
|
"# Дискретизация числовых признаков (пример для возраста)\n",
|
|||
|
"age_bins = [18, 30, 40, 50, 60, 100]\n",
|
|||
|
"train_data_encoded['age_bin'] = pd.cut(train_data_encoded['age'], bins=age_bins, labels=False)\n",
|
|||
|
"val_data_encoded['age_bin'] = pd.cut(val_data_encoded['age'], bins=age_bins, labels=False)\n",
|
|||
|
"test_data_encoded['age_bin'] = pd.cut(test_data_encoded['age'], bins=age_bins, labels=False)\n",
|
|||
|
"\n",
|
|||
|
"# «Ручной» синтез признаков (пример: комбинированный признак возраст и ИМТ)\n",
|
|||
|
"train_data_encoded['age_bmi'] = train_data_encoded['age'] * train_data_encoded['bmi']\n",
|
|||
|
"val_data_encoded['age_bmi'] = val_data_encoded['age'] * val_data_encoded['bmi']\n",
|
|||
|
"test_data_encoded['age_bmi'] = test_data_encoded['age'] * test_data_encoded['bmi']\n",
|
|||
|
"\n",
|
|||
|
"# Масштабирование числовых признаков\n",
|
|||
|
"numerical_features = ['age', 'bmi', 'children', 'age_bmi']\n",
|
|||
|
"scaler = StandardScaler()\n",
|
|||
|
"train_data_encoded[numerical_features] = scaler.fit_transform(train_data_encoded[numerical_features])\n",
|
|||
|
"val_data_encoded[numerical_features] = scaler.transform(val_data_encoded[numerical_features])\n",
|
|||
|
"test_data_encoded[numerical_features] = scaler.transform(test_data_encoded[numerical_features])\n",
|
|||
|
"\n",
|
|||
|
"# Вывод результатов\n",
|
|||
|
"print(\"Обучающая выборка после конструирования признаков:\")\n",
|
|||
|
"print(train_data_encoded.head())"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"## 2. Оценка рисков"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 10,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"Обучающая выборка после конструирования признаков:\n",
|
|||
|
" age bmi children sex_female sex_male smoker_no \\\n",
|
|||
|
"1684 1.781292 0.374453 -0.907604 True False True \n",
|
|||
|
"862 -0.083478 -0.570585 -0.085975 True False True \n",
|
|||
|
"1992 -1.087585 -0.495147 -0.907604 True False True \n",
|
|||
|
"889 0.705463 -0.586335 -0.907604 True False True \n",
|
|||
|
"1362 0.777185 -0.680839 -0.907604 False True True \n",
|
|||
|
"\n",
|
|||
|
" smoker_yes region_northeast region_northwest region_southeast \\\n",
|
|||
|
"1684 False False True False \n",
|
|||
|
"862 False True False False \n",
|
|||
|
"1992 False False False True \n",
|
|||
|
"889 False False False True \n",
|
|||
|
"1362 False False False False \n",
|
|||
|
"\n",
|
|||
|
" region_southwest age_bin age_bmi \n",
|
|||
|
"1684 False 4.0 1.734561 \n",
|
|||
|
"862 False 1.0 -0.339153 \n",
|
|||
|
"1992 False 0.0 -1.055293 \n",
|
|||
|
"889 False 2.0 0.231109 \n",
|
|||
|
"1362 True 2.0 0.228540 \n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"import pandas as pd\n",
|
|||
|
"from sklearn.model_selection import train_test_split\n",
|
|||
|
"from sklearn.preprocessing import OneHotEncoder, StandardScaler\n",
|
|||
|
"from sklearn.compose import ColumnTransformer\n",
|
|||
|
"from sklearn.pipeline import Pipeline\n",
|
|||
|
"\n",
|
|||
|
"# Загрузка данных\n",
|
|||
|
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
|
|||
|
"\n",
|
|||
|
"# Перемешивание данных\n",
|
|||
|
"df = df.sample(frac=1, random_state=42).reset_index(drop=True)\n",
|
|||
|
"\n",
|
|||
|
"# Разделение на признаки и целевую переменную\n",
|
|||
|
"X = df.drop('charges', axis=1)\n",
|
|||
|
"y = df['charges']\n",
|
|||
|
"\n",
|
|||
|
"# Разбиение на обучающую, контрольную и тестовую выборки\n",
|
|||
|
"X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)\n",
|
|||
|
"X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)\n",
|
|||
|
"\n",
|
|||
|
"# Определение категориальных и числовых признаков\n",
|
|||
|
"categorical_features = ['sex', 'smoker', 'region']\n",
|
|||
|
"numerical_features = ['age', 'bmi', 'children']\n",
|
|||
|
"\n",
|
|||
|
"# Унитарное кодирование категориальных признаков (one-hot encoding)\n",
|
|||
|
"train_data_encoded = pd.get_dummies(X_train, columns=categorical_features)\n",
|
|||
|
"val_data_encoded = pd.get_dummies(X_val, columns=categorical_features)\n",
|
|||
|
"test_data_encoded = pd.get_dummies(X_test, columns=categorical_features)\n",
|
|||
|
"\n",
|
|||
|
"# Дискретизация числовых признаков (пример для возраста)\n",
|
|||
|
"age_bins = [18, 30, 40, 50, 60, 100]\n",
|
|||
|
"train_data_encoded['age_bin'] = pd.cut(train_data_encoded['age'], bins=age_bins, labels=False)\n",
|
|||
|
"val_data_encoded['age_bin'] = pd.cut(val_data_encoded['age'], bins=age_bins, labels=False)\n",
|
|||
|
"test_data_encoded['age_bin'] = pd.cut(test_data_encoded['age'], bins=age_bins, labels=False)\n",
|
|||
|
"\n",
|
|||
|
"# «Ручной» синтез признаков (пример: комбинированный признак возраст и ИМТ)\n",
|
|||
|
"train_data_encoded['age_bmi'] = train_data_encoded['age'] * train_data_encoded['bmi']\n",
|
|||
|
"val_data_encoded['age_bmi'] = val_data_encoded['age'] * val_data_encoded['bmi']\n",
|
|||
|
"test_data_encoded['age_bmi'] = test_data_encoded['age'] * test_data_encoded['bmi']\n",
|
|||
|
"\n",
|
|||
|
"# Масштабирование числовых признаков\n",
|
|||
|
"numerical_features = ['age', 'bmi', 'children', 'age_bmi']\n",
|
|||
|
"scaler = StandardScaler()\n",
|
|||
|
"train_data_encoded[numerical_features] = scaler.fit_transform(train_data_encoded[numerical_features])\n",
|
|||
|
"val_data_encoded[numerical_features] = scaler.transform(val_data_encoded[numerical_features])\n",
|
|||
|
"test_data_encoded[numerical_features] = scaler.transform(test_data_encoded[numerical_features])\n",
|
|||
|
"\n",
|
|||
|
"# Вывод результатов\n",
|
|||
|
"print(\"Обучающая выборка после конструирования признаков:\")\n",
|
|||
|
"print(train_data_encoded.head())"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"## Процесс конструирования признаков с применением фреймворка Featuretools:\n",
|
|||
|
"\n",
|
|||
|
"### 1. Оптимизация тарифов"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 15,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"Обучающая выборка после конструирования признаков:\n",
|
|||
|
" age bmi children sex_female sex_male smoker_no \\\n",
|
|||
|
"index \n",
|
|||
|
"0 1.781292 0.374453 -0.907604 True False True \n",
|
|||
|
"1 -0.083478 -0.570585 -0.085975 True False True \n",
|
|||
|
"2 -1.087585 -0.495147 -0.907604 True False True \n",
|
|||
|
"3 0.705463 -0.586335 -0.907604 True False True \n",
|
|||
|
"4 0.777185 -0.680839 -0.907604 False True True \n",
|
|||
|
"\n",
|
|||
|
" smoker_yes region_northeast region_northwest region_southeast \\\n",
|
|||
|
"index \n",
|
|||
|
"0 False False True False \n",
|
|||
|
"1 False True False False \n",
|
|||
|
"2 False False False True \n",
|
|||
|
"3 False False False True \n",
|
|||
|
"4 False False False False \n",
|
|||
|
"\n",
|
|||
|
" region_southwest age_bin age_bmi \n",
|
|||
|
"index \n",
|
|||
|
"0 False 4 1.734561 \n",
|
|||
|
"1 False 1 -0.339153 \n",
|
|||
|
"2 False 0 -1.055293 \n",
|
|||
|
"3 False 2 0.231109 \n",
|
|||
|
"4 True 2 0.228540 \n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stderr",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"c:\\Users\\midni\\AIM\\AIM-PIbd-32-Bulatova-K-R\\aimenv\\Lib\\site-packages\\featuretools\\entityset\\entityset.py:1733: UserWarning: index index not found in dataframe, creating new integer column\n",
|
|||
|
" warnings.warn(\n",
|
|||
|
"c:\\Users\\midni\\AIM\\AIM-PIbd-32-Bulatova-K-R\\aimenv\\Lib\\site-packages\\featuretools\\synthesis\\deep_feature_synthesis.py:169: UserWarning: Only one dataframe in entityset, changing max_depth to 1 since deeper features cannot be created\n",
|
|||
|
" warnings.warn(\n",
|
|||
|
"c:\\Users\\midni\\AIM\\AIM-PIbd-32-Bulatova-K-R\\aimenv\\Lib\\site-packages\\featuretools\\computational_backends\\feature_set_calculator.py:143: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n",
|
|||
|
" df = pd.concat([df, default_df], sort=True)\n",
|
|||
|
"c:\\Users\\midni\\AIM\\AIM-PIbd-32-Bulatova-K-R\\aimenv\\Lib\\site-packages\\featuretools\\computational_backends\\feature_set_calculator.py:143: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n",
|
|||
|
" df = pd.concat([df, default_df], sort=True)\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"import pandas as pd\n",
|
|||
|
"from sklearn.model_selection import train_test_split\n",
|
|||
|
"import featuretools as ft\n",
|
|||
|
"\n",
|
|||
|
"# Загрузка данных\n",
|
|||
|
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
|
|||
|
"\n",
|
|||
|
"# Перемешивание данных\n",
|
|||
|
"df = df.sample(frac=1, random_state=42).reset_index(drop=True)\n",
|
|||
|
"\n",
|
|||
|
"# Разделение на признаки и целевую переменную\n",
|
|||
|
"X = df.drop('charges', axis=1)\n",
|
|||
|
"y = df['charges']\n",
|
|||
|
"\n",
|
|||
|
"# Разбиение на обучающую, контрольную и тестовую выборки\n",
|
|||
|
"X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)\n",
|
|||
|
"X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)\n",
|
|||
|
"\n",
|
|||
|
"# Определение категориальных и числовых признаков\n",
|
|||
|
"categorical_features = ['sex', 'smoker', 'region']\n",
|
|||
|
"numerical_features = ['age', 'bmi', 'children']\n",
|
|||
|
"\n",
|
|||
|
"# Унитарное кодирование категориальных признаков (one-hot encoding)\n",
|
|||
|
"X_train_encoded = pd.get_dummies(X_train, columns=categorical_features)\n",
|
|||
|
"X_val_encoded = pd.get_dummies(X_val, columns=categorical_features)\n",
|
|||
|
"X_test_encoded = pd.get_dummies(X_test, columns=categorical_features)\n",
|
|||
|
"\n",
|
|||
|
"# Дискретизация числовых признаков (пример для возраста)\n",
|
|||
|
"age_bins = [18, 30, 40, 50, 60, 100]\n",
|
|||
|
"X_train_encoded['age_bin'] = pd.cut(X_train_encoded['age'], bins=age_bins, labels=False)\n",
|
|||
|
"X_val_encoded['age_bin'] = pd.cut(X_val_encoded['age'], bins=age_bins, labels=False)\n",
|
|||
|
"X_test_encoded['age_bin'] = pd.cut(X_test_encoded['age'], bins=age_bins, labels=False)\n",
|
|||
|
"\n",
|
|||
|
"# «Ручной» синтез признаков (пример: комбинированный признак возраст и ИМТ)\n",
|
|||
|
"X_train_encoded['age_bmi'] = X_train_encoded['age'] * X_train_encoded['bmi']\n",
|
|||
|
"X_val_encoded['age_bmi'] = X_val_encoded['age'] * X_val_encoded['bmi']\n",
|
|||
|
"X_test_encoded['age_bmi'] = X_test_encoded['age'] * X_test_encoded['bmi']\n",
|
|||
|
"\n",
|
|||
|
"# Масштабирование числовых признаков\n",
|
|||
|
"from sklearn.preprocessing import StandardScaler\n",
|
|||
|
"\n",
|
|||
|
"numerical_features = ['age', 'bmi', 'children', 'age_bmi']\n",
|
|||
|
"scaler = StandardScaler()\n",
|
|||
|
"X_train_encoded[numerical_features] = scaler.fit_transform(X_train_encoded[numerical_features])\n",
|
|||
|
"X_val_encoded[numerical_features] = scaler.transform(X_val_encoded[numerical_features])\n",
|
|||
|
"X_test_encoded[numerical_features] = scaler.transform(X_test_encoded[numerical_features])\n",
|
|||
|
"\n",
|
|||
|
"# Конструирование признаков с применением фреймворка Featuretools\n",
|
|||
|
"es = ft.EntitySet(id='insurance_data')\n",
|
|||
|
"es = es.add_dataframe(dataframe_name='train', dataframe=X_train_encoded, index='index')\n",
|
|||
|
"\n",
|
|||
|
"# Генерация признаков\n",
|
|||
|
"feature_matrix, feature_defs = ft.dfs(entityset=es, target_dataframe_name='train', max_depth=2)\n",
|
|||
|
"\n",
|
|||
|
"# Преобразование признаков для контрольной и тестовой выборок\n",
|
|||
|
"X_val_feature_matrix = ft.calculate_feature_matrix(features=feature_defs, entityset=es, instance_ids=X_val_encoded.index)\n",
|
|||
|
"X_test_feature_matrix = ft.calculate_feature_matrix(features=feature_defs, entityset=es, instance_ids=X_test_encoded.index)\n",
|
|||
|
"\n",
|
|||
|
"# Вывод результатов\n",
|
|||
|
"print(\"Обучающая выборка после конструирования признаков:\")\n",
|
|||
|
"print(feature_matrix.head())"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"### 2. Оценка рисков"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 16,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"Обучающая выборка после конструирования признаков:\n",
|
|||
|
" age bmi children sex_female sex_male smoker_no \\\n",
|
|||
|
"index \n",
|
|||
|
"0 1.781292 0.374453 -0.907604 True False True \n",
|
|||
|
"1 -0.083478 -0.570585 -0.085975 True False True \n",
|
|||
|
"2 -1.087585 -0.495147 -0.907604 True False True \n",
|
|||
|
"3 0.705463 -0.586335 -0.907604 True False True \n",
|
|||
|
"4 0.777185 -0.680839 -0.907604 False True True \n",
|
|||
|
"\n",
|
|||
|
" smoker_yes region_northeast region_northwest region_southeast \\\n",
|
|||
|
"index \n",
|
|||
|
"0 False False True False \n",
|
|||
|
"1 False True False False \n",
|
|||
|
"2 False False False True \n",
|
|||
|
"3 False False False True \n",
|
|||
|
"4 False False False False \n",
|
|||
|
"\n",
|
|||
|
" region_southwest age_bin age_bmi \n",
|
|||
|
"index \n",
|
|||
|
"0 False 4 1.734561 \n",
|
|||
|
"1 False 1 -0.339153 \n",
|
|||
|
"2 False 0 -1.055293 \n",
|
|||
|
"3 False 2 0.231109 \n",
|
|||
|
"4 True 2 0.228540 \n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stderr",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"c:\\Users\\midni\\AIM\\AIM-PIbd-32-Bulatova-K-R\\aimenv\\Lib\\site-packages\\featuretools\\entityset\\entityset.py:1733: UserWarning: index index not found in dataframe, creating new integer column\n",
|
|||
|
" warnings.warn(\n",
|
|||
|
"c:\\Users\\midni\\AIM\\AIM-PIbd-32-Bulatova-K-R\\aimenv\\Lib\\site-packages\\featuretools\\synthesis\\deep_feature_synthesis.py:169: UserWarning: Only one dataframe in entityset, changing max_depth to 1 since deeper features cannot be created\n",
|
|||
|
" warnings.warn(\n",
|
|||
|
"c:\\Users\\midni\\AIM\\AIM-PIbd-32-Bulatova-K-R\\aimenv\\Lib\\site-packages\\featuretools\\computational_backends\\feature_set_calculator.py:143: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n",
|
|||
|
" df = pd.concat([df, default_df], sort=True)\n",
|
|||
|
"c:\\Users\\midni\\AIM\\AIM-PIbd-32-Bulatova-K-R\\aimenv\\Lib\\site-packages\\featuretools\\computational_backends\\feature_set_calculator.py:143: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n",
|
|||
|
" df = pd.concat([df, default_df], sort=True)\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"import pandas as pd\n",
|
|||
|
"from sklearn.model_selection import train_test_split\n",
|
|||
|
"import featuretools as ft\n",
|
|||
|
"\n",
|
|||
|
"# Загрузка данных\n",
|
|||
|
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
|
|||
|
"\n",
|
|||
|
"# Перемешивание данных\n",
|
|||
|
"df = df.sample(frac=1, random_state=42).reset_index(drop=True)\n",
|
|||
|
"\n",
|
|||
|
"# Разделение на признаки и целевую переменную\n",
|
|||
|
"X = df.drop('charges', axis=1)\n",
|
|||
|
"y = df['charges']\n",
|
|||
|
"\n",
|
|||
|
"# Разбиение на обучающую, контрольную и тестовую выборки\n",
|
|||
|
"X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)\n",
|
|||
|
"X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)\n",
|
|||
|
"\n",
|
|||
|
"# Определение категориальных и числовых признаков\n",
|
|||
|
"categorical_features = ['sex', 'smoker', 'region']\n",
|
|||
|
"numerical_features = ['age', 'bmi', 'children']\n",
|
|||
|
"\n",
|
|||
|
"# Унитарное кодирование категориальных признаков (one-hot encoding)\n",
|
|||
|
"X_train_encoded = pd.get_dummies(X_train, columns=categorical_features)\n",
|
|||
|
"X_val_encoded = pd.get_dummies(X_val, columns=categorical_features)\n",
|
|||
|
"X_test_encoded = pd.get_dummies(X_test, columns=categorical_features)\n",
|
|||
|
"\n",
|
|||
|
"# Дискретизация числовых признаков (пример для возраста)\n",
|
|||
|
"age_bins = [18, 30, 40, 50, 60, 100]\n",
|
|||
|
"X_train_encoded['age_bin'] = pd.cut(X_train_encoded['age'], bins=age_bins, labels=False)\n",
|
|||
|
"X_val_encoded['age_bin'] = pd.cut(X_val_encoded['age'], bins=age_bins, labels=False)\n",
|
|||
|
"X_test_encoded['age_bin'] = pd.cut(X_test_encoded['age'], bins=age_bins, labels=False)\n",
|
|||
|
"\n",
|
|||
|
"# «Ручной» синтез признаков (пример: комбинированный признак возраст и ИМТ)\n",
|
|||
|
"X_train_encoded['age_bmi'] = X_train_encoded['age'] * X_train_encoded['bmi']\n",
|
|||
|
"X_val_encoded['age_bmi'] = X_val_encoded['age'] * X_val_encoded['bmi']\n",
|
|||
|
"X_test_encoded['age_bmi'] = X_test_encoded['age'] * X_test_encoded['bmi']\n",
|
|||
|
"\n",
|
|||
|
"# Масштабирование числовых признаков\n",
|
|||
|
"from sklearn.preprocessing import StandardScaler\n",
|
|||
|
"\n",
|
|||
|
"numerical_features = ['age', 'bmi', 'children', 'age_bmi']\n",
|
|||
|
"scaler = StandardScaler()\n",
|
|||
|
"X_train_encoded[numerical_features] = scaler.fit_transform(X_train_encoded[numerical_features])\n",
|
|||
|
"X_val_encoded[numerical_features] = scaler.transform(X_val_encoded[numerical_features])\n",
|
|||
|
"X_test_encoded[numerical_features] = scaler.transform(X_test_encoded[numerical_features])\n",
|
|||
|
"\n",
|
|||
|
"# Конструирование признаков с применением фреймворка Featuretools\n",
|
|||
|
"es = ft.EntitySet(id='insurance_data')\n",
|
|||
|
"es = es.add_dataframe(dataframe_name='train', dataframe=X_train_encoded, index='index')\n",
|
|||
|
"\n",
|
|||
|
"# Генерация признаков\n",
|
|||
|
"feature_matrix, feature_defs = ft.dfs(entityset=es, target_dataframe_name='train', max_depth=2)\n",
|
|||
|
"\n",
|
|||
|
"# Преобразование признаков для контрольной и тестовой выборок\n",
|
|||
|
"X_val_feature_matrix = ft.calculate_feature_matrix(features=feature_defs, entityset=es, instance_ids=X_val_encoded.index)\n",
|
|||
|
"X_test_feature_matrix = ft.calculate_feature_matrix(features=feature_defs, entityset=es, instance_ids=X_test_encoded.index)\n",
|
|||
|
"\n",
|
|||
|
"# Вывод результатов\n",
|
|||
|
"print(\"Обучающая выборка после конструирования признаков:\")\n",
|
|||
|
"print(feature_matrix.head())"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"## Оценка качества наборов признаков по критериям:\n",
|
|||
|
"\n",
|
|||
|
"### 1. Предсказательная способность\n",
|
|||
|
"\n",
|
|||
|
"**Определение:** \n",
|
|||
|
"Предсказательная способность набора признаков определяет, насколько хорошо эти признаки позволяют модели предсказывать целевую переменную.\n",
|
|||
|
"\n",
|
|||
|
"**Оценка:**\n",
|
|||
|
"- **Обучающая выборка:** \n",
|
|||
|
" - Оценивается с помощью метрик качества модели (например, RMSE, MAE, R²) на обучающей выборке.\n",
|
|||
|
" - Высокие значения метрик указывают на высокую предсказательную способность.\n",
|
|||
|
"- **Контрольная и тестовая выборки:**\n",
|
|||
|
" - Оценивается с помощью метрик качества модели на контрольной и тестовой выборках.\n",
|
|||
|
" - Близкие значения метрик на всех выборках указывают на хорошую обобщающую способность модели.\n",
|
|||
|
"\n",
|
|||
|
"### 2. Скорость вычисления\n",
|
|||
|
"\n",
|
|||
|
"**Определение:**\n",
|
|||
|
"Скорость вычисления набора признаков определяет, насколько быстро можно вычислить эти признаки и обучить модель на них.\n",
|
|||
|
"\n",
|
|||
|
"**Оценка:**\n",
|
|||
|
"- **Время вычисления признаков:**\n",
|
|||
|
" - Измеряется время, затрачиваемое на вычисление признаков для всех выборок.\n",
|
|||
|
" - Меньшее время указывает на более быстрое вычисление.\n",
|
|||
|
"- **Время обучения модели:**\n",
|
|||
|
" - Измеряется время, затрачиваемое на обучение модели на вычисленных признаках.\n",
|
|||
|
" - Меньшее время указывает на более быстрое обучение.\n",
|
|||
|
"\n",
|
|||
|
"### 3. Надежность\n",
|
|||
|
"\n",
|
|||
|
"**Определение:**\n",
|
|||
|
"Надежность набора признаков определяет, насколько стабильно модель, обученная на этих признаках, показывает хорошие результаты на разных выборках данных.\n",
|
|||
|
"\n",
|
|||
|
"**Оценка:**\n",
|
|||
|
"- **Стабильность метрик:**\n",
|
|||
|
" - Оценивается стабильность метрик качества модели (например, RMSE, MAE, R²) на разных выборках данных.\n",
|
|||
|
" - Близкие значения метрик на разных выборках указывают на высокую надежность.\n",
|
|||
|
"- **Устойчивость к изменениям данных:**\n",
|
|||
|
" - Оценивается, как меняются метрики качества модели при добавлении или удалении данных.\n",
|
|||
|
" - Небольшие изменения метрик указывают на высокую устойчивость.\n",
|
|||
|
"\n",
|
|||
|
"### 4. Корреляция\n",
|
|||
|
"\n",
|
|||
|
"**Определение:**\n",
|
|||
|
"Корреляция набора признаков определяет, насколько сильно признаки коррелируют друг с другом и с целевой переменной.\n",
|
|||
|
"\n",
|
|||
|
"**Оценка:**\n",
|
|||
|
"- **Корреляция между признаками:**\n",
|
|||
|
" - Оценивается с помощью матрицы корреляции признаков.\n",
|
|||
|
" - Высокая корреляция между признаками может привести к мультиколлинеарности, что снижает качество модели.\n",
|
|||
|
"- **Корреляция с целевой переменной:**\n",
|
|||
|
" - Оценивается с помощью коэффициента корреляции Пирсона или Спирмена.\n",
|
|||
|
" - Высокая корреляция с целевой переменной указывает на высокую предсказательную способность признаков.\n",
|
|||
|
"\n",
|
|||
|
"### 5. Цельность\n",
|
|||
|
"\n",
|
|||
|
"**Определение:**\n",
|
|||
|
"Цельность набора признаков определяет, насколько хорошо признаки соответствуют бизнес-целям и задачам модели.\n",
|
|||
|
"\n",
|
|||
|
"**Оценка:**\n",
|
|||
|
"- **Соответствие бизнес-целям:**\n",
|
|||
|
" - Оценивается, насколько признаки помогают решать поставленные бизнес-задачи (например, оптимизация тарифов, оценка рисков).\n",
|
|||
|
" - Признаки, которые помогают решать бизнес-задачи, считаются целесообразными.\n",
|
|||
|
"- **Интерпретируемость:**\n",
|
|||
|
" - Оценивается, насколько легко интерпретировать значения признаков и их влияние на целевую переменную.\n",
|
|||
|
" - Интерпретируемые признаки считаются более целесообразными."
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 17,
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stderr",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"c:\\Users\\midni\\AIM\\AIM-PIbd-32-Bulatova-K-R\\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": [
|
|||
|
"RMSE: 2750.642231395856\n",
|
|||
|
"R²: 0.9507037692209687\n",
|
|||
|
"MAE: 1279.1669853384874\n",
|
|||
|
"Cross-validated RMSE: 3242.964333689781\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1000x600 with 1 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"Train RMSE: 1072.3827255198853\n",
|
|||
|
"Train R²: 0.9921277274068127\n",
|
|||
|
"Train MAE: 480.25126389741285\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stderr",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"c:\\Users\\midni\\AIM\\AIM-PIbd-32-Bulatova-K-R\\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"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA2QAAAIjCAYAAABswtioAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAADg4klEQVR4nOzdd3hUVf7H8ff0SSaNhCQECL0XQUABFSyUqNgLdhHsggVc27qC3VUXsYCiooILrt39iSiICCpFFBAVpAZCgJBCeiaZTLu/P9iMBBAJBiYJn9fzzPMw555753svJXznnPM9JsMwDEREREREROSoM4c7ABERERERkWOVEjIREREREZEwUUImIiIiIiISJkrIREREREREwkQJmYiIiIiISJgoIRMREREREQkTJWQiIiIiIiJhooRMREREREQkTJSQiYiIiIiIhIkSMhER+ctMJhMPP/xwuMMIu9NOO43TTjst9D4jIwOTycT06dPDFtO+9o2xNjz88MOYTCZ2795dq9cVETkWKCETEaljXn75ZUwmE3379j3sa2RlZfHwww+zevXq2gusjlu0aBEmkyn0stlstGnThmuvvZYtW7aEO7waWbp0KQ8//DBFRUVhjSMQCPDWW29x2mmnER8fj8PhoFWrVowcOZIVK1aENTYRkYbCGu4ARESkulmzZtGqVSt++OEHNm/eTLt27Wp8jaysLB555BFatWpFz549az/IOuyOO+7ghBNOwOfzsWrVKl577TXmzJnDr7/+StOmTY9qLC1btqSiogKbzVaj85YuXcojjzzCddddR1xc3JEJ7k9UVFRw0UUXMXfuXAYOHMjf//534uPjycjI4P3332fGjBlkZmbSvHnzsMQnItJQKCETEalDtm7dytKlS/n444+5+eabmTVrFhMmTAh3WPXKgAEDuOSSSwAYOXIkHTp04I477mDGjBk88MADBzzH7XbjcrlqPRaTyYTT6az16x4N99xzD3PnzmXSpEncdddd1Y5NmDCBSZMmHdV4DMPA4/EQERFxVD9XRORI05RFEZE6ZNasWTRq1Ihhw4ZxySWXMGvWrAP2KyoqYuzYsbRq1QqHw0Hz5s259tpr2b17N4sWLeKEE04A9iQkVVP4qtYxtWrViuuuu26/a+67tsjr9TJ+/Hh69+5NbGwsLpeLAQMGsHDhwhrfV05ODlarlUceeWS/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
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1000x600 with 1 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"import pandas as pd\n",
|
|||
|
"from sklearn.model_selection import train_test_split\n",
|
|||
|
"from sklearn.ensemble import RandomForestRegressor\n",
|
|||
|
"from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error\n",
|
|||
|
"from sklearn.model_selection import cross_val_score\n",
|
|||
|
"import matplotlib.pyplot as plt\n",
|
|||
|
"import seaborn as sns\n",
|
|||
|
"\n",
|
|||
|
"# Загрузка данных\n",
|
|||
|
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
|
|||
|
"\n",
|
|||
|
"# Предобработка данных\n",
|
|||
|
"# Преобразуем категориальные переменные в числовые\n",
|
|||
|
"df = pd.get_dummies(df, drop_first=True)\n",
|
|||
|
"\n",
|
|||
|
"# Разделение данных на признаки и целевую переменную\n",
|
|||
|
"X = df.drop('charges', axis=1)\n",
|
|||
|
"y = df['charges']\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",
|
|||
|
"model = RandomForestRegressor(random_state=42)\n",
|
|||
|
"\n",
|
|||
|
"# Обучение модели\n",
|
|||
|
"model.fit(X_train, y_train)\n",
|
|||
|
"\n",
|
|||
|
"# Предсказание и оценка\n",
|
|||
|
"y_pred = model.predict(X_test)\n",
|
|||
|
"\n",
|
|||
|
"rmse = mean_squared_error(y_test, y_pred, squared=False)\n",
|
|||
|
"r2 = r2_score(y_test, y_pred)\n",
|
|||
|
"mae = mean_absolute_error(y_test, y_pred)\n",
|
|||
|
"\n",
|
|||
|
"print(f\"RMSE: {rmse}\")\n",
|
|||
|
"print(f\"R²: {r2}\")\n",
|
|||
|
"print(f\"MAE: {mae}\")\n",
|
|||
|
"\n",
|
|||
|
"# Кросс-валидация\n",
|
|||
|
"scores = cross_val_score(model, X_train, y_train, cv=5, scoring='neg_mean_squared_error')\n",
|
|||
|
"rmse_cv = (-scores.mean())**0.5\n",
|
|||
|
"print(f\"Cross-validated RMSE: {rmse_cv}\")\n",
|
|||
|
"\n",
|
|||
|
"# Анализ важности признаков\n",
|
|||
|
"feature_importances = model.feature_importances_\n",
|
|||
|
"feature_names = X_train.columns\n",
|
|||
|
"\n",
|
|||
|
"importance_df = pd.DataFrame({'Feature': feature_names, 'Importance': feature_importances})\n",
|
|||
|
"importance_df = importance_df.sort_values(by='Importance', ascending=False)\n",
|
|||
|
"\n",
|
|||
|
"plt.figure(figsize=(10, 6))\n",
|
|||
|
"sns.barplot(x='Importance', y='Feature', data=importance_df)\n",
|
|||
|
"plt.title('Feature Importance')\n",
|
|||
|
"plt.show()\n",
|
|||
|
"\n",
|
|||
|
"# Проверка на переобучение\n",
|
|||
|
"y_train_pred = model.predict(X_train)\n",
|
|||
|
"\n",
|
|||
|
"rmse_train = mean_squared_error(y_train, y_train_pred, squared=False)\n",
|
|||
|
"r2_train = r2_score(y_train, y_train_pred)\n",
|
|||
|
"mae_train = mean_absolute_error(y_train, y_train_pred)\n",
|
|||
|
"\n",
|
|||
|
"print(f\"Train RMSE: {rmse_train}\")\n",
|
|||
|
"print(f\"Train R²: {r2_train}\")\n",
|
|||
|
"print(f\"Train MAE: {mae_train}\")\n",
|
|||
|
"\n",
|
|||
|
"# Визуализация результатов\n",
|
|||
|
"plt.figure(figsize=(10, 6))\n",
|
|||
|
"plt.scatter(y_test, y_pred, alpha=0.5)\n",
|
|||
|
"plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2)\n",
|
|||
|
"plt.xlabel('Actual Charges')\n",
|
|||
|
"plt.ylabel('Predicted Charges')\n",
|
|||
|
"plt.title('Actual vs Predicted Charges')\n",
|
|||
|
"plt.show()"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"## Вывод по данным:\n",
|
|||
|
"\n",
|
|||
|
"1. Train RMSE: Значение RMSE на обучающей выборке составляет 1072.38, что указывает на среднеквадратичную ошибку в предсказании стоимости медицинского страхования.\n",
|
|||
|
"\n",
|
|||
|
"2. Train R²: Значение R² на обучающей выборке составляет 0.9921, что говорит о том, что модель объясняет 99.21% вариации в данных. Это очень высокий показатель, что может указывать на потенциальное переобучение.\n",
|
|||
|
"\n",
|
|||
|
"3. Train MAE: Значение MAE на обучающей выборке составляет 480.25, что указывает на среднюю абсолютную ошибку в предсказании стоимости медицинского страхования."
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"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
|
|||
|
}
|