AIM-PIbd-32-Bulatova-K-R/lab_3/lab_3.ipynb

890 lines
238 KiB
Plaintext
Raw Normal View History

2024-10-26 10:29:31 +04:00
{
"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
}