1936 lines
318 KiB
Plaintext
Raw Normal View History

2024-11-09 11:45:34 +04:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Начало лабораторной работы"
]
},
{
"cell_type": "code",
"execution_count": 6,
"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": [
"### Бизнес-цели"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"1. Прогнозирование стоимости страховых взносов:\n",
"\n",
"Цель: Разработать модель, которая будет предсказывать стоимость страховых взносов для новых клиентов на основе их характеристик (возраст, пол, ИМТ, количество детей, статус курения, регион проживания).\n",
"\n",
"Применение:\n",
"Клиенты могут получить представление о примерной стоимости страховки до обращения в компанию.\n",
"\n",
"2. Оптимизация тарифной сетки:\n",
"\n",
"Цель: Определить оптимальные коэффициенты для различных факторов, влияющих на стоимость страховки (например, возраст, ИМТ, статус курения), чтобы максимизировать прибыль компании при сохранении конкурентоспособных тарифов.\n",
"\n",
"Применение:\n",
"Страховые компании могут использовать эти коэффициенты для корректировки тарифной сетки и повышения эффективности бизнеса."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"1. Прогнозирование стоимости страховых взносов:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Среднее значение поля 'charges': 13261.369959046897\n",
" age sex bmi children smoker region charges \\\n",
"0 19 female 27.900 0 yes southwest 16884.92400 \n",
"1 18 male 33.770 1 no southeast 1725.55230 \n",
"2 28 male 33.000 3 no southeast 4449.46200 \n",
"3 33 male 22.705 0 no northwest 21984.47061 \n",
"4 32 male 28.880 0 no northwest 3866.85520 \n",
"\n",
" above_average_charges charges_volatility \n",
"0 1 62648.55411 \n",
"1 0 62648.55411 \n",
"2 0 62648.55411 \n",
"3 1 62648.55411 \n",
"4 0 62648.55411 \n"
]
}
],
"source": [
"import pandas as pd\n",
"\n",
"# Загружаем набор данных\n",
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
"\n",
"# Устанавливаем случайное состояние\n",
"random_state = 42\n",
"\n",
"# Рассчитываем среднее значение стоимости страховых взносов\n",
"average_charges = df['charges'].mean()\n",
"print(f\"Среднее значение поля 'charges': {average_charges}\")\n",
"\n",
"# Создаем новую переменную, указывающую, превышает ли стоимость страховых взносов среднюю\n",
"df['above_average_charges'] = (df['charges'] > average_charges).astype(int)\n",
"\n",
"# Рассчитываем волатильность (разницу между максимальной и минимальной стоимостью страховых взносов)\n",
"df['charges_volatility'] = df['charges'].max() - df['charges'].min()\n",
"\n",
"# Выводим первые строки измененной таблицы для проверки\n",
"print(df.head())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"2. Оптимизация тарифной сетки:"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Средняя стоимость страховых взносов для 'age':\n",
"age\n",
"18 6714.267794\n",
"19 9634.641344\n",
"20 10159.697736\n",
"21 5349.737625\n",
"22 10675.132648\n",
"23 12050.721224\n",
"24 10648.015962\n",
"25 9610.781531\n",
"26 5955.403311\n",
"27 13130.462272\n",
"28 8757.474523\n",
"29 10430.158727\n",
"30 13580.480238\n",
"31 10196.980573\n",
"32 10071.740266\n",
"33 12118.482617\n",
"34 11613.528121\n",
"35 11307.182031\n",
"36 12204.476138\n",
"37 17595.511688\n",
"38 8102.733674\n",
"39 11468.895088\n",
"40 11772.251310\n",
"41 9533.603123\n",
"42 13061.038669\n",
"43 19267.278653\n",
"44 16439.727524\n",
"45 14404.055995\n",
"46 14201.069951\n",
"47 18153.128652\n",
"48 14632.500445\n",
"49 12696.006264\n",
"50 15663.003301\n",
"51 15452.800438\n",
"52 18951.581034\n",
"53 15795.645012\n",
"54 18252.834139\n",
"55 16164.545488\n",
"56 14727.018377\n",
"57 16283.671944\n",
"58 13815.290525\n",
"59 18639.637165\n",
"60 21979.418507\n",
"61 22024.457609\n",
"62 18926.646066\n",
"63 19884.998461\n",
"64 24419.101775\n",
"Name: charges, dtype: float64\n",
"\n",
"Средняя стоимость страховых взносов для 'sex':\n",
"sex\n",
"female 12486.831977\n",
"male 14013.872721\n",
"Name: charges, dtype: float64\n",
"\n",
"Средняя стоимость страховых взносов для 'bmi':\n",
"bmi\n",
"15.960 1694.796400\n",
"16.815 4904.000350\n",
"17.195 14455.644050\n",
"17.290 7813.353433\n",
"17.385 2775.192150\n",
" ... \n",
"48.070 9432.925300\n",
"49.060 11381.325400\n",
"50.380 2438.055200\n",
"52.580 44501.398200\n",
"53.130 1163.462700\n",
"Name: charges, Length: 548, dtype: float64\n",
"\n",
"Средняя стоимость страховых взносов для 'children':\n",
"children\n",
"0 12317.920881\n",
"1 12722.650521\n",
"2 15268.182723\n",
"3 15304.070620\n",
"4 13550.983876\n",
"5 8706.036629\n",
"Name: charges, dtype: float64\n",
"\n",
"Средняя стоимость страховых взносов для 'smoker':\n",
"smoker\n",
"no 8417.874411\n",
"yes 32223.139764\n",
"Name: charges, dtype: float64\n",
"\n",
"Средняя стоимость страховых взносов для 'region':\n",
"region\n",
"northeast 13475.874737\n",
"northwest 12463.129315\n",
"southeast 14748.777706\n",
"southwest 12164.196435\n",
"Name: charges, dtype: float64\n",
"\n",
"Средняя стоимость страховых взносов для комбинации 'age' и 'smoker':\n",
"age smoker\n",
"18 no 3083.404099\n",
" yes 25473.730221\n",
"19 no 3492.047133\n",
" yes 26445.951817\n",
"20 no 3673.112925\n",
" ... \n",
"62 yes 37084.607312\n",
"63 no 14205.335706\n",
" yes 40331.784380\n",
"64 no 15805.350545\n",
" yes 40569.885331\n",
"Name: charges, Length: 94, dtype: float64\n",
"\n",
"Средняя стоимость страховых взносов для комбинации 'bmi' и 'smoker':\n",
"bmi smoker\n",
"15.960 no 1694.79640\n",
"16.815 no 4904.00035\n",
"17.195 yes 14455.64405\n",
"17.290 no 5305.30260\n",
" yes 12829.45510\n",
" ... \n",
"48.070 no 9432.92530\n",
"49.060 no 11381.32540\n",
"50.380 no 2438.05520\n",
"52.580 yes 44501.39820\n",
"53.130 no 1163.46270\n",
"Name: charges, Length: 701, dtype: float64\n",
"\n",
"Средняя стоимость страховых взносов для комбинации 'region' и 'smoker':\n",
"region smoker\n",
"northeast no 9225.395851\n",
" yes 29790.212814\n",
"northwest no 8681.948181\n",
" yes 29959.103039\n",
"southeast no 7887.181702\n",
" yes 35262.090761\n",
"southwest no 7956.579615\n",
" yes 32346.494062\n",
"Name: charges, dtype: float64\n",
"\n"
]
}
],
"source": [
"import pandas as pd\n",
"\n",
"# Загружаем набор данных\n",
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
"\n",
"# Устанавливаем случайное состояние\n",
"random_state = 42\n",
"\n",
"# Рассчитываем среднюю стоимость страховых взносов для каждого значения каждого признака\n",
"for column in ['age', 'sex', 'bmi', 'children', 'smoker', 'region']:\n",
" print(f\"Средняя стоимость страховых взносов для '{column}':\")\n",
" print(df.groupby(column)['charges'].mean())\n",
" print()\n",
"\n",
"# Рассчитываем среднюю стоимость страховых взносов для комбинаций признаков\n",
"# для комбинации 'age' и 'smoker'\n",
"print(\"Средняя стоимость страховых взносов для комбинации 'age' и 'smoker':\")\n",
"print(df.groupby(['age', 'smoker'])['charges'].mean())\n",
"print()\n",
"\n",
"# Рассчитываем среднюю стоимость страховых взносов для комбинации 'bmi' и 'smoker'\n",
"print(\"Средняя стоимость страховых взносов для комбинации 'bmi' и 'smoker':\")\n",
"print(df.groupby(['bmi', 'smoker'])['charges'].mean())\n",
"print()\n",
"\n",
"# Рассчитываем среднюю стоимость страховых взносов для комбинации 'region' и 'smoker'\n",
"print(\"Средняя стоимость страховых взносов для комбинации 'region' и 'smoker':\")\n",
"print(df.groupby(['region', 'smoker'])['charges'].mean())\n",
"print()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Выбор ориентира для каждой задачи:\n",
"1. Прогнозирование стоимости страховых взносов:\n",
"Ориентир:\n",
"\n",
"R² (коэффициент детерминации): 0.75 - 0.85\n",
"\n",
"MAE (средняя абсолютная ошибка): 2000 - 3000 долларов\n",
"\n",
"RMSE (среднеквадратичная ошибка): 3000 - 5000 долларов\n",
"\n",
"Объяснение:\n",
"\n",
"R²: Значение 0.75 - 0.85 будет означать, что модель объясняет 75-85% вариации стоимости страховых взносов, что является хорошим результатом для задачи регрессии.\n",
"\n",
"MAE: Значение 2000 - 3000 долларов будет означать, что в среднем модель ошибается на 2000 - 3000 долларов при прогнозировании стоимости страховых взносов.\n",
"\n",
"RMSE: Значение 3000 - 5000 долларов будет означать, что среднеквадратичная ошибка модели составляет 3000 - 4000 долларов.\n",
"\n",
"2. Оптимизация тарифной сетки:\n",
"Ориентир:\n",
"\n",
"Увеличение прибыли компании: 5% - 10%\n",
"\n",
"Сохранение конкурентоспособных тарифов:\n",
"\n",
"Средняя стоимость страховых взносов не должна увеличиваться более чем на 5% по сравнению с текущими тарифами.\n",
"\n",
"Доля клиентов, считающих тарифы дорогими, не должна увеличиваться более чем на 2%.\n",
"\n",
"Объяснение:\n",
"\n",
"Увеличение прибыли компании: Цель оптимизации тарифной сетки - максимизировать прибыль компании. Ориентир в 5% - 10% увеличения прибыли является реалистичным и достижимым.\n",
"\n",
"Сохранение конкурентоспособных тарифов: Важно, чтобы оптимизация тарифной сетки не привела к значительному увеличению стоимости страховых взносов для клиентов. Ориентир в 5% увеличения средней стоимости страховых взносов и 2% увеличения доли клиентов, считающих тарифы дорогими, позволяет сохранить конкурентоспособность компании."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"MAE: 4160.247974762991\n",
"MSE: 39933194.54805147\n",
"RMSE: 6319.271678607549\n",
"R²: 0.73981661775643\n",
"Ориентиры для прогнозирования стоимости страховых взносов не достигнуты.\n",
"Средняя стоимость страховых взносов для 'age':\n",
"age\n",
"18 6714.267794\n",
"19 9634.641344\n",
"20 10159.697736\n",
"21 5349.737625\n",
"22 10675.132648\n",
"23 12050.721224\n",
"24 10648.015962\n",
"25 9610.781531\n",
"26 5955.403311\n",
"27 13130.462272\n",
"28 8757.474523\n",
"29 10430.158727\n",
"30 13580.480238\n",
"31 10196.980573\n",
"32 10071.740266\n",
"33 12118.482617\n",
"34 11613.528121\n",
"35 11307.182031\n",
"36 12204.476138\n",
"37 17595.511688\n",
"38 8102.733674\n",
"39 11468.895088\n",
"40 11772.251310\n",
"41 9533.603123\n",
"42 13061.038669\n",
"43 19267.278653\n",
"44 16439.727524\n",
"45 14404.055995\n",
"46 14201.069951\n",
"47 18153.128652\n",
"48 14632.500445\n",
"49 12696.006264\n",
"50 15663.003301\n",
"51 15452.800438\n",
"52 18951.581034\n",
"53 15795.645012\n",
"54 18252.834139\n",
"55 16164.545488\n",
"56 14727.018377\n",
"57 16283.671944\n",
"58 13815.290525\n",
"59 18639.637165\n",
"60 21979.418507\n",
"61 22024.457609\n",
"62 18926.646066\n",
"63 19884.998461\n",
"64 24419.101775\n",
"Name: charges, dtype: float64\n",
"\n",
"Средняя стоимость страховых взносов для 'bmi':\n",
"bmi\n",
"15.960 1694.796400\n",
"16.815 4904.000350\n",
"17.195 14455.644050\n",
"17.290 7813.353433\n",
"17.385 2775.192150\n",
" ... \n",
"48.070 9432.925300\n",
"49.060 11381.325400\n",
"50.380 2438.055200\n",
"52.580 44501.398200\n",
"53.130 1163.462700\n",
"Name: charges, Length: 548, dtype: float64\n",
"\n",
"Средняя стоимость страховых взносов для 'children':\n",
"children\n",
"0 12317.920881\n",
"1 12722.650521\n",
"2 15268.182723\n",
"3 15304.070620\n",
"4 13550.983876\n",
"5 8706.036629\n",
"Name: charges, dtype: float64\n",
"\n",
"Средняя стоимость страховых взносов для 'sex_male':\n",
"sex_male\n",
"False 12486.831977\n",
"True 14013.872721\n",
"Name: charges, dtype: float64\n",
"\n",
"Средняя стоимость страховых взносов для 'smoker_yes':\n",
"smoker_yes\n",
"False 8417.874411\n",
"True 32223.139764\n",
"Name: charges, dtype: float64\n",
"\n",
"Средняя стоимость страховых взносов для 'region_northwest':\n",
"region_northwest\n",
"False 13512.808188\n",
"True 12463.129315\n",
"Name: charges, dtype: float64\n",
"\n",
"Средняя стоимость страховых взносов для 'region_southeast':\n",
"region_southeast\n",
"False 12693.396712\n",
"True 14748.777706\n",
"Name: charges, dtype: float64\n",
"\n",
"Средняя стоимость страховых взносов для 'region_southwest':\n",
"region_southwest\n",
"False 13620.788872\n",
"True 12164.196435\n",
"Name: charges, dtype: float64\n",
"\n",
"Средняя стоимость страховых взносов для комбинации 'age' и 'smoker_yes':\n",
"age smoker_yes\n",
"18 False 3083.404099\n",
" True 25473.730221\n",
"19 False 3492.047133\n",
" True 26445.951817\n",
"20 False 3673.112925\n",
" ... \n",
"62 True 37084.607312\n",
"63 False 14205.335706\n",
" True 40331.784380\n",
"64 False 15805.350545\n",
" True 40569.885331\n",
"Name: charges, Length: 94, dtype: float64\n",
"\n",
"Средняя стоимость страховых взносов для комбинации 'bmi' и 'smoker_yes':\n",
"bmi smoker_yes\n",
"15.960 False 1694.79640\n",
"16.815 False 4904.00035\n",
"17.195 True 14455.64405\n",
"17.290 False 5305.30260\n",
" True 12829.45510\n",
" ... \n",
"48.070 False 9432.92530\n",
"49.060 False 11381.32540\n",
"50.380 False 2438.05520\n",
"52.580 True 44501.39820\n",
"53.130 False 1163.46270\n",
"Name: charges, Length: 701, dtype: float64\n",
"\n",
"Средняя стоимость страховых взносов для комбинации 'region_northwest' и 'smoker_yes':\n",
"region_northwest smoker_yes\n",
"False False 8331.120934\n",
" True 32822.144996\n",
"True False 8681.948181\n",
" True 29959.103039\n",
"Name: charges, dtype: float64\n",
"\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"
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.linear_model import LinearRegression\n",
"from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n",
"\n",
"# Загружаем набор данных\n",
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
"\n",
"# Преобразуем категориальные переменные в числовые\n",
"df = pd.get_dummies(df, columns=['sex', 'smoker', 'region'], drop_first=True)\n",
"\n",
"# Разделяем данные на признаки (X) и целевую переменную (y)\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",
"scaler = StandardScaler()\n",
"X_train = scaler.fit_transform(X_train)\n",
"X_test = scaler.transform(X_test)\n",
"\n",
"# Обучаем модель линейной регрессии\n",
"model = LinearRegression()\n",
"model.fit(X_train, y_train)\n",
"\n",
"# Делаем предсказания на тестовой выборке\n",
"y_pred = model.predict(X_test)\n",
"\n",
"# Оцениваем качество модели\n",
"mae = mean_absolute_error(y_test, y_pred)\n",
"mse = mean_squared_error(y_test, y_pred)\n",
"rmse = mean_squared_error(y_test, y_pred, squared=False)\n",
"r2 = r2_score(y_test, y_pred)\n",
"\n",
"print(f\"MAE: {mae}\")\n",
"print(f\"MSE: {mse}\")\n",
"print(f\"RMSE: {rmse}\")\n",
"print(f\"R²: {r2}\")\n",
"\n",
"# Проверяем, достигнуты ли ориентиры\n",
"if r2 >= 0.75 and mae <= 3000 and rmse <= 5000:\n",
" print(\"Ориентиры для прогнозирования стоимости страховых взносов достигнуты!\")\n",
"else:\n",
" print(\"Ориентиры для прогнозирования стоимости страховых взносов не достигнуты.\")\n",
"\n",
"# Оптимизация тарифной сетки\n",
"# Убедитесь, что столбцы существуют\n",
"columns_to_group = ['age', 'bmi', 'children', 'sex_male', 'smoker_yes', 'region_northwest', 'region_southeast', 'region_southwest']\n",
"\n",
"# Рассчитываем среднюю стоимость страховых взносов для каждого значения каждого признака\n",
"for column in columns_to_group:\n",
" print(f\"Средняя стоимость страховых взносов для '{column}':\")\n",
" print(df.groupby(column)['charges'].mean())\n",
" print()\n",
"\n",
"# Рассчитываем среднюю стоимость страховых взносов для комбинаций признаков\n",
"# Например, для комбинации 'age' и 'smoker_yes'\n",
"print(\"Средняя стоимость страховых взносов для комбинации 'age' и 'smoker_yes':\")\n",
"print(df.groupby(['age', 'smoker_yes'])['charges'].mean())\n",
"print()\n",
"\n",
"# Рассчитываем среднюю стоимость страховых взносов для комбинации 'bmi' и 'smoker_yes'\n",
"print(\"Средняя стоимость страховых взносов для комбинации 'bmi' и 'smoker_yes':\")\n",
"print(df.groupby(['bmi', 'smoker_yes'])['charges'].mean())\n",
"print()\n",
"\n",
"# Рассчитываем среднюю стоимость страховых взносов для комбинации 'region_northwest' и 'smoker_yes'\n",
"print(\"Средняя стоимость страховых взносов для комбинации 'region_northwest' и 'smoker_yes':\")\n",
"print(df.groupby(['region_northwest', 'smoker_yes'])['charges'].mean())\n",
"print()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Анализ применимости алгоритмов обучения с учителем для решения поставленных задач:\n",
"1. Прогнозирование стоимости страховых взносов:\n",
"Задача: Регрессия\n",
"\n",
"Свойства алгоритмов:\n",
"\n",
"Линейная регрессия:\n",
"Применимость: Хорошо подходит для задач, где зависимость между признаками и целевой переменной линейна.\n",
"Преимущества: Проста в реализации, интерпретируема.\n",
"Недостатки: Может плохо работать, если зависимость нелинейна.\n",
"\n",
"Деревья решений (регрессия):\n",
"Применимость: Подходит для задач с нелинейными зависимостями.\n",
"Преимущества: Может обрабатывать категориальные признаки, не требует масштабирования данных.\n",
"Недостатки: Подвержены переобучению, могут давать нестабильные результаты.\n",
"\n",
"Случайный лес (регрессия):\n",
"Применимость: Хорошо подходит для задач с нелинейными зависимостями и большим количеством признаков.\n",
"Преимущества: Устойчив к переобучению, может обрабатывать категориальные признаки.\n",
"Недостатки: Менее интерпретируем, чем линейная регрессия.\n",
"\n",
"Градиентный бустинг (регрессия):\n",
"Применимость: Подходит для задач с нелинейными зависимостями и сложными взаимосвязями между признаками.\n",
"Преимущества: Может достигать высокой точности, устойчив к переобучению.\n",
"Недостатки: Сложнее в настройке, чем случайный лес, менее интерпретируем.\n",
"\n",
"Нейронные сети (регрессия):\n",
"Применимость: Подходит для задач с очень сложными зависимостями и большим количеством данных.\n",
"Преимущества: Может моделировать очень сложные зависимости.\n",
"Недостатки: Требует большого количества данных, сложнее в настройке и интерпретации.\n",
"\n",
"Вывод:\n",
"\n",
"Линейная регрессия: Может быть хорошим выбором для начала, особенно если зависимость между признаками и целевой переменной линейна.\n",
"\n",
"Деревья решений и случайный лес: Подходят для задач с нелинейными зависимостями.\n",
"\n",
"Градиентный бустинг: Может давать более высокую точность, чем случайный лес, но требует больше времени на настройку.\n",
"\n",
"Нейронные сети: Могут быть излишними для этой задачи, если данных недостаточно много.\n",
"\n",
"2. Оптимизация тарифной сетки:\n",
"Задача: Классификация (группировка клиентов по группам риска)\n",
"\n",
"Свойства алгоритмов:\n",
"\n",
"Логистическая регрессия:\n",
"Применимость: Хорошо подходит для задач бинарной классификации, где зависимость между признаками и целевой переменной линейна.\n",
"Преимущества: Проста в реализации, интерпретируема.\n",
"Недостатки: Может плохо работать, если зависимость нелинейна.\n",
"\n",
"Деревья решений (классификация):\n",
"Применимость: Подходит для задач с нелинейными зависимостями.\n",
"Преимущества: Может обрабатывать категориальные признаки, не требует масштабирования данных.\n",
"Недостатки: Подвержены переобучению, могут давать нестабильные результаты.\n",
"\n",
"Случайный лес (классификация):\n",
"Применимость: Хорошо подходит для задач с нелинейными зависимостями и большим количеством признаков.\n",
"Преимущества: Устойчив к переобучению, может обрабатывать категориальные признаки.\n",
"Недостатки: Менее интерпретируем, чем линейная регрессия.\n",
"\n",
"Градиентный бустинг (классификация):\n",
"Применимость: Подходит для задач с нелинейными зависимостями и сложными взаимосвязями между признаками.\n",
"Преимущества: Может достигать высокой точности, устойчив к переобучению.\n",
"Недостатки: Сложнее в настройке, чем случайный лес, менее интерпретируем.\n",
"\n",
"Нейронные сети (классификация):\n",
"Применимость: Подходит для задач с очень сложными зависимостями и большим количеством данных.\n",
"Преимущества: Может моделировать очень сложные зависимости.\n",
"Недостатки: Требует большого количества данных, сложнее в настройке и интерпретации.\n",
"\n",
"Вывод:\n",
"\n",
"Логистическая регрессия: Может быть хорошим выбором для начала, особенно если зависимость между признаками и целевой переменной линейна.\n",
"\n",
"Деревья решений и случайный лес: Подходят для задач с нелинейными зависимостями.\n",
"\n",
"Градиентный бустинг: Может давать более высокую точность, чем случайный лес, но требует больше времени на настройку.\n",
"\n",
"Нейронные сети: Могут быть излишними для этой задачи, если данных недостаточно много.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"1. Прогнозирование стоимости страховых взносов:\n",
"Выбранные модели:\n",
"\n",
"Линейная регрессия\n",
"\n",
"Случайный лес (регрессия)\n",
"\n",
"Градиентный бустинг (регрессия)\n",
"\n",
"2. Оптимизация тарифной сетки:\n",
"Выбранные модели:\n",
"\n",
"Логистическая регрессия\n",
"\n",
"Случайный лес (классификация)\n",
"\n",
"Градиентный бустинг (классификация)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Результаты для задачи регрессии:\n",
"Model: Linear Regression\n",
"MAE: 4160.247974762991\n",
"MSE: 39933194.54805147\n",
"RMSE: 6319.271678607549\n",
"R²: 0.73981661775643\n",
"\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",
"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",
"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": [
"Model: Random Forest Regression\n",
"MAE: 1303.0047135437117\n",
"MSE: 7810682.767902057\n",
"RMSE: 2794.759876608732\n",
"R²: 0.9491097598580805\n",
"\n",
"Model: Gradient Boosting Regression\n",
"MAE: 2297.7789526178262\n",
"MSE: 19231434.89568898\n",
"RMSE: 4385.365993356652\n",
"R²: 0.8746982345593103\n",
"\n",
"Результаты для задачи классификации:\n",
"Model: Logistic Regression\n",
"Accuracy: 0.8864864864864865\n",
"\n",
"Model: Random Forest Classification\n",
"Accuracy: 0.9765765765765766\n",
"\n",
"Model: Gradient Boosting Classification\n",
"Accuracy: 0.9225225225225225\n",
"\n"
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.linear_model import LinearRegression, LogisticRegression\n",
"from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n",
"from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier\n",
"from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score, accuracy_score\n",
"\n",
"# Загружаем набор данных\n",
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
"\n",
"# Преобразуем категориальные переменные в числовые\n",
"df = pd.get_dummies(df, columns=['sex', 'smoker', 'region'], drop_first=True)\n",
"\n",
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n",
"X_reg = df.drop('charges', axis=1)\n",
"y_reg = df['charges']\n",
"\n",
"# Разделяем данные на обучающую и тестовую выборки для задачи регрессии\n",
"X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.2, random_state=42)\n",
"\n",
"# Стандартизируем признаки для задачи регрессии\n",
"scaler_reg = StandardScaler()\n",
"X_train_reg = scaler_reg.fit_transform(X_train_reg)\n",
"X_test_reg = scaler_reg.transform(X_test_reg)\n",
"\n",
"# Список моделей для задачи регрессии\n",
"models_reg = {\n",
" \"Linear Regression\": LinearRegression(),\n",
" \"Random Forest Regression\": RandomForestRegressor(),\n",
" \"Gradient Boosting Regression\": GradientBoostingRegressor()\n",
"}\n",
"\n",
"# Обучаем и оцениваем модели для задачи регрессии\n",
"print(\"Результаты для задачи регрессии:\")\n",
"for name, model in models_reg.items():\n",
" model.fit(X_train_reg, y_train_reg)\n",
" y_pred_reg = model.predict(X_test_reg)\n",
" mae = mean_absolute_error(y_test_reg, y_pred_reg)\n",
" mse = mean_squared_error(y_test_reg, y_pred_reg)\n",
" rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)\n",
" r2 = r2_score(y_test_reg, y_pred_reg)\n",
" print(f\"Model: {name}\")\n",
" print(f\"MAE: {mae}\")\n",
" print(f\"MSE: {mse}\")\n",
" print(f\"RMSE: {rmse}\")\n",
" print(f\"R²: {r2}\")\n",
" print()\n",
"\n",
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n",
"X_class = df.drop('charges', axis=1)\n",
"y_class = (df['charges'] > df['charges'].mean()).astype(int)\n",
"\n",
"# Разделяем данные на обучающую и тестовую выборки для задачи классификации\n",
"X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.2, random_state=42)\n",
"\n",
"# Стандартизируем признаки для задачи классификации\n",
"scaler_class = StandardScaler()\n",
"X_train_class = scaler_class.fit_transform(X_train_class)\n",
"X_test_class = scaler_class.transform(X_test_class)\n",
"\n",
"# Список моделей для задачи классификации\n",
"models_class = {\n",
" \"Logistic Regression\": LogisticRegression(),\n",
" \"Random Forest Classification\": RandomForestClassifier(),\n",
" \"Gradient Boosting Classification\": GradientBoostingClassifier()\n",
"}\n",
"\n",
"# Обучаем и оцениваем модели для задачи классификации\n",
"print(\"Результаты для задачи классификации:\")\n",
"for name, model in models_class.items():\n",
" model.fit(X_train_class, y_train_class)\n",
" y_pred_class = model.predict(X_test_class)\n",
" accuracy = accuracy_score(y_test_class, y_pred_class)\n",
" print(f\"Model: {name}\")\n",
" print(f\"Accuracy: {accuracy}\")\n",
" print()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"1. Прогнозирование стоимости страховых взносов:\n",
"Конвейер для задачи регрессии:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Результаты для задачи регрессии:\n",
"Model: Linear Regression\n",
"MAE: 4158.694987099099\n",
"MSE: 39908584.112821\n",
"RMSE: 6317.32412599045\n",
"R²: 0.7399769662171334\n",
"\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"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: Random Forest Regression\n",
"MAE: 1302.1428312961073\n",
"MSE: 7363635.134840652\n",
"RMSE: 2713.6018747857343\n",
"R²: 0.9520224836336337\n",
"\n",
"Model: Gradient Boosting Regression\n",
"MAE: 2304.718628546955\n",
"MSE: 19256343.733882822\n",
"RMSE: 4388.205069716184\n",
"R²: 0.8745359418641633\n",
"\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",
"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"
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.linear_model import LinearRegression\n",
"from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.compose import ColumnTransformer\n",
"from sklearn.preprocessing import OneHotEncoder\n",
"from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n",
"\n",
"# Загружаем набор данных\n",
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
"\n",
"# Определяем категориальные и числовые столбцы\n",
"categorical_cols = ['sex', 'smoker', 'region']\n",
"numerical_cols = ['age', 'bmi', 'children']\n",
"\n",
"# Создаем преобразователь для категориальных и числовых столбцов\n",
"preprocessor = ColumnTransformer(\n",
" transformers=[\n",
" ('cat', OneHotEncoder(), categorical_cols),\n",
" ('num', StandardScaler(), numerical_cols)\n",
" ])\n",
"\n",
"# Список моделей для задачи регрессии\n",
"models_reg = {\n",
" \"Linear Regression\": LinearRegression(),\n",
" \"Random Forest Regression\": RandomForestRegressor(),\n",
" \"Gradient Boosting Regression\": GradientBoostingRegressor()\n",
"}\n",
"\n",
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n",
"X_reg = df[categorical_cols + numerical_cols]\n",
"y_reg = df['charges']\n",
"\n",
"# Разделяем данные на обучающую и тестовую выборки для задачи регрессии\n",
"X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.2, random_state=42)\n",
"\n",
"# Обучаем и оцениваем модели для задачи регрессии\n",
"print(\"Результаты для задачи регрессии:\")\n",
"for name, model in models_reg.items():\n",
" pipeline = Pipeline(steps=[\n",
" ('preprocessor', preprocessor),\n",
" ('model', model)\n",
" ])\n",
" pipeline.fit(X_train_reg, y_train_reg)\n",
" y_pred_reg = pipeline.predict(X_test_reg)\n",
" mae = mean_absolute_error(y_test_reg, y_pred_reg)\n",
" mse = mean_squared_error(y_test_reg, y_pred_reg)\n",
" rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)\n",
" r2 = r2_score(y_test_reg, y_pred_reg)\n",
" print(f\"Model: {name}\")\n",
" print(f\"MAE: {mae}\")\n",
" print(f\"MSE: {mse}\")\n",
" print(f\"RMSE: {rmse}\")\n",
" print(f\"R²: {r2}\")\n",
" print()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"2. Оптимизация тарифной сетки:\n",
"Конвейер для задачи классификации:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Результаты для задачи классификации:\n",
"Model: Logistic Regression\n",
"Accuracy: 0.8846846846846846\n",
"\n",
"Model: Random Forest Classification\n",
"Accuracy: 0.9801801801801802\n",
"\n",
"Model: Gradient Boosting Classification\n",
"Accuracy: 0.9243243243243243\n",
"\n"
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.compose import ColumnTransformer\n",
"from sklearn.preprocessing import OneHotEncoder\n",
"from sklearn.metrics import accuracy_score\n",
"\n",
"# Загружаем набор данных\n",
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
"\n",
"# Определяем категориальные и числовые столбцы\n",
"categorical_cols = ['sex', 'smoker', 'region']\n",
"numerical_cols = ['age', 'bmi', 'children']\n",
"\n",
"# Создаем преобразователь для категориальных и числовых столбцов\n",
"preprocessor = ColumnTransformer(\n",
" transformers=[\n",
" ('cat', OneHotEncoder(), categorical_cols),\n",
" ('num', StandardScaler(), numerical_cols)\n",
" ])\n",
"\n",
"# Список моделей для задачи классификации\n",
"models_class = {\n",
" \"Logistic Regression\": LogisticRegression(),\n",
" \"Random Forest Classification\": RandomForestClassifier(),\n",
" \"Gradient Boosting Classification\": GradientBoostingClassifier()\n",
"}\n",
"\n",
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n",
"X_class = df[categorical_cols + numerical_cols]\n",
"y_class = (df['charges'] > df['charges'].mean()).astype(int)\n",
"\n",
"# Разделяем данные на обучающую и тестовую выборки для задачи классификации\n",
"X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.2, random_state=42)\n",
"\n",
"# Обучаем и оцениваем модели для задачи классификации\n",
"print(\"Результаты для задачи классификации:\")\n",
"for name, model in models_class.items():\n",
" pipeline = Pipeline(steps=[\n",
" ('preprocessor', preprocessor),\n",
" ('model', model)\n",
" ])\n",
" pipeline.fit(X_train_class, y_train_class)\n",
" y_pred_class = pipeline.predict(X_test_class)\n",
" accuracy = accuracy_score(y_test_class, y_pred_class)\n",
" print(f\"Model: {name}\")\n",
" print(f\"Accuracy: {accuracy}\")\n",
" print()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"1. Прогнозирование стоимости страховых взносов:\n",
"\n",
"Настройка гиперпараметров для задачи регрессии:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Результаты для задачи регрессии:\n",
"Model: Linear Regression\n",
"Best Parameters: {}\n",
"MAE: 4158.694987099099\n",
"MSE: 39908584.112821\n",
"RMSE: 6317.32412599045\n",
"R²: 0.7399769662171334\n",
"\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",
"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": [
"Model: Random Forest Regression\n",
"Best Parameters: {'model__max_depth': None, 'model__n_estimators': 200}\n",
"MAE: 1292.4041719905688\n",
"MSE: 7345926.566814439\n",
"RMSE: 2710.3369839956135\n",
"R²: 0.9521378632113484\n",
"\n",
"Model: Gradient Boosting Regression\n",
"Best Parameters: {'model__learning_rate': 0.1, 'model__max_depth': 5, 'model__n_estimators': 200}\n",
"MAE: 1556.4693865098072\n",
"MSE: 9320749.44024657\n",
"RMSE: 3052.990245684806\n",
"R²: 0.9392709713847187\n",
"\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"
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split, GridSearchCV\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.linear_model import LinearRegression\n",
"from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.compose import ColumnTransformer\n",
"from sklearn.preprocessing import OneHotEncoder\n",
"from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n",
"\n",
"# Загружаем набор данных\n",
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
"\n",
"# Определяем категориальные и числовые столбцы\n",
"categorical_cols = ['sex', 'smoker', 'region']\n",
"numerical_cols = ['age', 'bmi', 'children']\n",
"\n",
"# Создаем преобразователь для категориальных и числовых столбцов\n",
"preprocessor = ColumnTransformer(\n",
" transformers=[\n",
" ('cat', OneHotEncoder(), categorical_cols),\n",
" ('num', StandardScaler(), numerical_cols)\n",
" ])\n",
"\n",
"# Список моделей и их гиперпараметров для задачи регрессии\n",
"models_reg = {\n",
" \"Linear Regression\": (LinearRegression(), {}),\n",
" \"Random Forest Regression\": (RandomForestRegressor(), {\n",
" 'model__n_estimators': [100, 200],\n",
" 'model__max_depth': [None, 10, 20]\n",
" }),\n",
" \"Gradient Boosting Regression\": (GradientBoostingRegressor(), {\n",
" 'model__n_estimators': [100, 200],\n",
" 'model__learning_rate': [0.01, 0.1],\n",
" 'model__max_depth': [3, 5]\n",
" })\n",
"}\n",
"\n",
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n",
"X_reg = df[categorical_cols + numerical_cols]\n",
"y_reg = df['charges']\n",
"\n",
"# Разделяем данные на обучающую и тестовую выборки для задачи регрессии\n",
"X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.2, random_state=42)\n",
"\n",
"# Обучаем и оцениваем модели для задачи регрессии\n",
"print(\"Результаты для задачи регрессии:\")\n",
"for name, (model, params) in models_reg.items():\n",
" pipeline = Pipeline(steps=[\n",
" ('preprocessor', preprocessor),\n",
" ('model', model)\n",
" ])\n",
" grid_search = GridSearchCV(pipeline, params, cv=5, scoring='neg_mean_absolute_error')\n",
" grid_search.fit(X_train_reg, y_train_reg)\n",
" best_model = grid_search.best_estimator_\n",
" y_pred_reg = best_model.predict(X_test_reg)\n",
" mae = mean_absolute_error(y_test_reg, y_pred_reg)\n",
" mse = mean_squared_error(y_test_reg, y_pred_reg)\n",
" rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)\n",
" r2 = r2_score(y_test_reg, y_pred_reg)\n",
" print(f\"Model: {name}\")\n",
" print(f\"Best Parameters: {grid_search.best_params_}\")\n",
" print(f\"MAE: {mae}\")\n",
" print(f\"MSE: {mse}\")\n",
" print(f\"RMSE: {rmse}\")\n",
" print(f\"R²: {r2}\")\n",
" print()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"2. Оптимизация тарифной сетки:\n",
"\n",
"Настройка гиперпараметров для задачи классификации:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Результаты для задачи классификации:\n",
"Model: Logistic Regression\n",
"Best Parameters: {'model__C': 10, 'model__solver': 'liblinear'}\n",
"Accuracy: 0.8864864864864865\n",
"\n",
"Model: Random Forest Classification\n",
"Best Parameters: {'model__max_depth': None, 'model__n_estimators': 100}\n",
"Accuracy: 0.9783783783783784\n",
"\n",
"Model: Gradient Boosting Classification\n",
"Best Parameters: {'model__learning_rate': 0.1, 'model__max_depth': 5, 'model__n_estimators': 200}\n",
"Accuracy: 0.9621621621621622\n",
"\n"
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split, GridSearchCV\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.compose import ColumnTransformer\n",
"from sklearn.preprocessing import OneHotEncoder\n",
"from sklearn.metrics import accuracy_score\n",
"\n",
"# Загружаем набор данных\n",
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
"\n",
"# Определяем категориальные и числовые столбцы\n",
"categorical_cols = ['sex', 'smoker', 'region']\n",
"numerical_cols = ['age', 'bmi', 'children']\n",
"\n",
"# Создаем преобразователь для категориальных и числовых столбцов\n",
"preprocessor = ColumnTransformer(\n",
" transformers=[\n",
" ('cat', OneHotEncoder(), categorical_cols),\n",
" ('num', StandardScaler(), numerical_cols)\n",
" ])\n",
"\n",
"# Список моделей и их гиперпараметров для задачи классификации\n",
"models_class = {\n",
" \"Logistic Regression\": (LogisticRegression(), {\n",
" 'model__C': [0.1, 1, 10],\n",
" 'model__solver': ['liblinear', 'lbfgs']\n",
" }),\n",
" \"Random Forest Classification\": (RandomForestClassifier(), {\n",
" 'model__n_estimators': [100, 200],\n",
" 'model__max_depth': [None, 10, 20]\n",
" }),\n",
" \"Gradient Boosting Classification\": (GradientBoostingClassifier(), {\n",
" 'model__n_estimators': [100, 200],\n",
" 'model__learning_rate': [0.01, 0.1],\n",
" 'model__max_depth': [3, 5]\n",
" })\n",
"}\n",
"\n",
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n",
"X_class = df[categorical_cols + numerical_cols]\n",
"y_class = (df['charges'] > df['charges'].mean()).astype(int)\n",
"\n",
"# Разделяем данные на обучающую и тестовую выборки для задачи классификации\n",
"X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.2, random_state=42)\n",
"\n",
"# Обучаем и оцениваем модели для задачи классификации\n",
"print(\"Результаты для задачи классификации:\")\n",
"for name, (model, params) in models_class.items():\n",
" pipeline = Pipeline(steps=[\n",
" ('preprocessor', preprocessor),\n",
" ('model', model)\n",
" ])\n",
" grid_search = GridSearchCV(pipeline, params, cv=5, scoring='accuracy')\n",
" grid_search.fit(X_train_class, y_train_class)\n",
" best_model = grid_search.best_estimator_\n",
" y_pred_class = best_model.predict(X_test_class)\n",
" accuracy = accuracy_score(y_test_class, y_pred_class)\n",
" print(f\"Model: {name}\")\n",
" print(f\"Best Parameters: {grid_search.best_params_}\")\n",
" print(f\"Accuracy: {accuracy}\")\n",
" print()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"1. Прогнозирование стоимости страховых взносов:\n",
"Задача: Регрессия\n",
"\n",
"Выбор метрик:\n",
"\n",
"MAE (Mean Absolute Error): Средняя абсолютная ошибка. Показывает среднее отклонение предсказанных значений от фактических. Эта метрика легко интерпретируется, так как она измеряется в тех же единицах, что и целевая переменная (доллары).\n",
"\n",
"MSE (Mean Squared Error): Среднеквадратичная ошибка. Показывает среднее квадратичное отклонение предсказанных значений от фактических. Эта метрика чувствительна к выбросам, так как ошибки возводятся в квадрат.\n",
"\n",
"RMSE (Root Mean Squared Error): Квадратный корень из среднеквадратичной ошибки. Показывает среднее отклонение предсказанных значений от фактических в тех же единицах, что и целевая переменная. Эта метрика также чувствительна к выбросам, но легче интерпретируется, чем MSE.\n",
"\n",
"R² (R-squared): Коэффициент детерминации. Показывает, какую долю дисперсии целевой переменной объясняет модель. Значение R² близкое к 1 указывает на хорошее качество модели.\n",
"\n",
"Обоснование:\n",
"\n",
"MAE: Хорошо подходит для задач, где важно понимать среднее отклонение предсказаний от фактических значений.\n",
"\n",
"MSE и RMSE: Полезны для задач, где важно минимизировать влияние выбросов, так как они возводят ошибки в квадрат.\n",
"\n",
"R²: Позволяет оценить, насколько хорошо модель объясняет вариацию целевой переменной.\n",
"\n",
"2. Оптимизация тарифной сетки:\n",
"Задача: Классификация\n",
"\n",
"Выбор метрик:\n",
"\n",
"Accuracy: Доля правильных предсказаний среди всех предсказаний. Эта метрика показывает общую точность модели.\n",
"\n",
"Precision: Доля правильных положительных предсказаний среди всех положительных предсказаний. Эта метрика важна, если важно минимизировать количество ложноположительных результатов.\n",
"\n",
"Recall (Sensitivity): Доля правильных положительных предсказаний среди всех фактических положительных случаев. Эта метрика важна, если важно минимизировать количество ложноотрицательных результатов.\n",
"\n",
"F1-score: Гармоническое среднее между precision и recall. Эта метрика показывает баланс между precision и recall.\n",
"\n",
"Обоснование:\n",
"\n",
"Accuracy: Хорошо подходит для задач, где классы сбалансированы.\n",
"\n",
"Precision и Recall: Важны для задач, где важно минимизировать ошибки определенного типа (ложноположительные или ложноотрицательные).\n",
"\n",
"F1-score: Позволяет оценить баланс между precision и recall."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Результаты для задачи регрессии:\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"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: Linear Regression\n",
"Best Parameters: {}\n",
"MAE: 4158.694987099099\n",
"MSE: 39908584.112821\n",
"RMSE: 6317.32412599045\n",
"R²: 0.7399769662171334\n",
"\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"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: Random Forest Regression\n",
"Best Parameters: {'model__max_depth': None, 'model__n_estimators': 100}\n",
"MAE: 1309.2968994795137\n",
"MSE: 7399293.51911523\n",
"RMSE: 2720.164244878465\n",
"R²: 0.9517901526335497\n",
"\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"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: Gradient Boosting Regression\n",
"Best Parameters: {'model__learning_rate': 0.1, 'model__max_depth': 5, 'model__n_estimators': 200}\n",
"MAE: 1556.235766949439\n",
"MSE: 9320073.834850596\n",
"RMSE: 3052.879597175525\n",
"R²: 0.9392753732688899\n",
"\n",
"Результаты для задачи классификации:\n",
"Model: Logistic Regression\n",
"Best Parameters: {'model__C': 10, 'model__solver': 'liblinear'}\n",
"Accuracy: 0.8864864864864865\n",
"Precision: 1.0\n",
"Recall: 0.6204819277108434\n",
"F1-score: 0.7657992565055762\n",
"\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: Random Forest Classification\n",
"Best Parameters: {'model__max_depth': 20, 'model__n_estimators': 200}\n",
"Accuracy: 0.9801801801801802\n",
"Precision: 0.9874213836477987\n",
"Recall: 0.9457831325301205\n",
"F1-score: 0.9661538461538461\n",
"\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: Gradient Boosting Classification\n",
"Best Parameters: {'model__learning_rate': 0.1, 'model__max_depth': 5, 'model__n_estimators': 200}\n",
"Accuracy: 0.9621621621621622\n",
"Precision: 0.9738562091503268\n",
"Recall: 0.8975903614457831\n",
"F1-score: 0.9341692789968652\n",
"\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"from sklearn.model_selection import train_test_split, GridSearchCV\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.linear_model import LinearRegression, LogisticRegression\n",
"from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n",
"from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.compose import ColumnTransformer\n",
"from sklearn.preprocessing import OneHotEncoder\n",
"from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score, accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, ConfusionMatrixDisplay\n",
"\n",
"# Загружаем набор данных\n",
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
"\n",
"# Определяем категориальные и числовые столбцы\n",
"categorical_cols = ['sex', 'smoker', 'region']\n",
"numerical_cols = ['age', 'bmi', 'children']\n",
"\n",
"# Создаем преобразователь для категориальных и числовых столбцов\n",
"preprocessor = ColumnTransformer(\n",
" transformers=[\n",
" ('cat', OneHotEncoder(), categorical_cols),\n",
" ('num', StandardScaler(), numerical_cols)\n",
" ])\n",
"\n",
"# Список моделей и их гиперпараметров для задачи регрессии\n",
"models_reg = {\n",
" \"Linear Regression\": (LinearRegression(), {}),\n",
" \"Random Forest Regression\": (RandomForestRegressor(), {\n",
" 'model__n_estimators': [100, 200],\n",
" 'model__max_depth': [None, 10, 20]\n",
" }),\n",
" \"Gradient Boosting Regression\": (GradientBoostingRegressor(), {\n",
" 'model__n_estimators': [100, 200],\n",
" 'model__learning_rate': [0.01, 0.1],\n",
" 'model__max_depth': [3, 5]\n",
" })\n",
"}\n",
"\n",
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n",
"X_reg = df[categorical_cols + numerical_cols]\n",
"y_reg = df['charges']\n",
"\n",
"# Разделяем данные на обучающую и тестовую выборки для задачи регрессии\n",
"X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.2, random_state=42)\n",
"\n",
"# Обучаем и оцениваем модели для задачи регрессии\n",
"print(\"Результаты для задачи регрессии:\")\n",
"for name, (model, params) in models_reg.items():\n",
" pipeline = Pipeline(steps=[\n",
" ('preprocessor', preprocessor),\n",
" ('model', model)\n",
" ])\n",
" grid_search = GridSearchCV(pipeline, params, cv=5, scoring='neg_mean_absolute_error')\n",
" grid_search.fit(X_train_reg, y_train_reg)\n",
" best_model = grid_search.best_estimator_\n",
" y_pred_reg = best_model.predict(X_test_reg)\n",
" mae = mean_absolute_error(y_test_reg, y_pred_reg)\n",
" mse = mean_squared_error(y_test_reg, y_pred_reg)\n",
" rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)\n",
" r2 = r2_score(y_test_reg, y_pred_reg)\n",
" print(f\"Model: {name}\")\n",
" print(f\"Best Parameters: {grid_search.best_params_}\")\n",
" print(f\"MAE: {mae}\")\n",
" print(f\"MSE: {mse}\")\n",
" print(f\"RMSE: {rmse}\")\n",
" print(f\"R²: {r2}\")\n",
" print()\n",
"\n",
"# Список моделей и их гиперпараметров для задачи классификации\n",
"models_class = {\n",
" \"Logistic Regression\": (LogisticRegression(), {\n",
" 'model__C': [0.1, 1, 10],\n",
" 'model__solver': ['liblinear', 'lbfgs']\n",
" }),\n",
" \"Random Forest Classification\": (RandomForestClassifier(), {\n",
" 'model__n_estimators': [100, 200],\n",
" 'model__max_depth': [None, 10, 20]\n",
" }),\n",
" \"Gradient Boosting Classification\": (GradientBoostingClassifier(), {\n",
" 'model__n_estimators': [100, 200],\n",
" 'model__learning_rate': [0.01, 0.1],\n",
" 'model__max_depth': [3, 5]\n",
" })\n",
"}\n",
"\n",
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n",
"X_class = df[categorical_cols + numerical_cols]\n",
"y_class = (df['charges'] > df['charges'].mean()).astype(int)\n",
"\n",
"# Разделяем данные на обучающую и тестовую выборки для задачи классификации\n",
"X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.2, random_state=42)\n",
"\n",
"# Обучаем и оцениваем модели для задачи классификации\n",
"print(\"Результаты для задачи классификации:\")\n",
"for name, (model, params) in models_class.items():\n",
" pipeline = Pipeline(steps=[\n",
" ('preprocessor', preprocessor),\n",
" ('model', model)\n",
" ])\n",
" grid_search = GridSearchCV(pipeline, params, cv=5, scoring='accuracy')\n",
" grid_search.fit(X_train_class, y_train_class)\n",
" best_model = grid_search.best_estimator_\n",
" y_pred_class = best_model.predict(X_test_class)\n",
" accuracy = accuracy_score(y_test_class, y_pred_class)\n",
" precision = precision_score(y_test_class, y_pred_class)\n",
" recall = recall_score(y_test_class, y_pred_class)\n",
" f1 = f1_score(y_test_class, y_pred_class)\n",
" print(f\"Model: {name}\")\n",
" print(f\"Best Parameters: {grid_search.best_params_}\")\n",
" print(f\"Accuracy: {accuracy}\")\n",
" print(f\"Precision: {precision}\")\n",
" print(f\"Recall: {recall}\")\n",
" print(f\"F1-score: {f1}\")\n",
" print()\n",
"\n",
" # Визуализация матрицы ошибок\n",
" cm = confusion_matrix(y_test_class, y_pred_class)\n",
" disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['Less', 'More'])\n",
" disp.plot(cmap=plt.cm.Blues)\n",
" plt.title(f'Confusion Matrix for {name}')\n",
" plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Давайте проанализируем полученные значения метрик и определим, являются ли они нормальными или их можно улучшить.\n",
"\n",
"### Оценка смещения и дисперсии для задачи регрессии:\n",
"\n",
"### Вывод для задачи регрессии:\n",
"\n",
"- **Random Forest Regression** демонстрирует наилучшие результаты по метрикам MAE и R², что указывает на высокую точность и стабильность модели.\n",
"- **Linear Regression** и **Gradient Boosting Regression** также показывают хорошие результаты, но уступают случайному лесу.\n",
"\n",
"### Вывод для задачи классификации:\n",
"\n",
"- **Random Forest Classification** демонстрирует наилучшие результаты по всем метрикам (Accuracy, Precision, Recall, F1-score), что указывает на высокую точность и стабильность модели.\n",
"- **Logistic Regression** и **Gradient Boosting Classification** также показывают хорошие результаты, но уступают случайному лесу.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Для оценки смещения (bias) и дисперсии (variance) моделей можно использовать метод перекрестной проверки (cross-validation). Этот метод позволяет оценить, насколько хорошо модель обобщается на новых данных.\n",
"\n",
"Оценка смещения и дисперсии для задачи регрессии:\n",
"Для задачи регрессии мы будем использовать метрики MAE (Mean Absolute Error) и R² (R-squared) для оценки смещения и дисперсии.\n",
"\n",
"Оценка смещения и дисперсии для задачи классификации:\n",
"Для задачи классификации мы будем использовать метрики Accuracy, Precision, Recall и F1-score для оценки смещения и дисперсии.\n",
"\n",
"Пример кода для оценки смещения и дисперсии:"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Оценка смещения и дисперсии для задачи регрессии:\n",
"Model: Linear Regression\n",
"MAE (Cross-Validation): Mean = 4185.5421072063355, Std = 92.43821200753904\n",
"R² (Cross-Validation): Mean = 0.7497293059031158, Std = 0.008805026203658282\n",
"\n",
"Model: Random Forest Regression\n",
"MAE (Cross-Validation): Mean = 956.4848341519103, Std = 88.92646158556248\n",
"R² (Cross-Validation): Mean = 0.9768968000358168, Std = 0.003942950295159459\n",
"\n",
"Model: Gradient Boosting Regression\n",
"MAE (Cross-Validation): Mean = 2189.5694438069927, Std = 96.31677771605824\n",
"R² (Cross-Validation): Mean = 0.8873175260899913, Std = 0.011188839103376261\n",
"\n",
"Оценка смещения и дисперсии для задачи классификации:\n",
"Model: Logistic Regression\n",
"Accuracy (Cross-Validation): Mean = 0.8906956776270857, Std = 0.011756347754179863\n",
"Precision (Cross-Validation): Mean = 0.9965558019216555, Std = 0.0042291925480556145\n",
"Recall (Cross-Validation): Mean = 0.6516534480440919, Std = 0.038303791687037965\n",
"F1-score (Cross-Validation): Mean = 0.7873345301431043, Std = 0.027701698921697982\n",
"\n",
"Model: Random Forest Classification\n",
"Accuracy (Cross-Validation): Mean = 0.9978352359579796, Std = 0.001767524034697101\n",
"Precision (Cross-Validation): Mean = 0.9976878612716764, Std = 0.002831780049460347\n",
"Recall (Cross-Validation): Mean = 0.9953757225433526, Std = 0.004325615476039242\n",
"F1-score (Cross-Validation): Mean = 0.9965250705740019, Std = 0.002837294532624193\n",
"\n",
"Model: Gradient Boosting Classification\n",
"Accuracy (Cross-Validation): Mean = 0.9354219923895014, Std = 0.005560116809131367\n",
"Precision (Cross-Validation): Mean = 0.9873539623899337, Std = 0.011266123317032629\n",
"Recall (Cross-Validation): Mean = 0.803226240086033, Std = 0.017698107137353723\n",
"F1-score (Cross-Validation): Mean = 0.8856692810850337, Std = 0.01067664691021022\n",
"\n"
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.model_selection import cross_val_score\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.linear_model import LinearRegression, LogisticRegression\n",
"from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n",
"from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.compose import ColumnTransformer\n",
"from sklearn.preprocessing import OneHotEncoder\n",
"\n",
"# Загружаем набор данных\n",
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
"\n",
"# Определяем категориальные и числовые столбцы\n",
"categorical_cols = ['sex', 'smoker', 'region']\n",
"numerical_cols = ['age', 'bmi', 'children']\n",
"\n",
"# Создаем преобразователь для категориальных и числовых столбцов\n",
"preprocessor = ColumnTransformer(\n",
" transformers=[\n",
" ('cat', OneHotEncoder(), categorical_cols),\n",
" ('num', StandardScaler(), numerical_cols)\n",
" ])\n",
"\n",
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n",
"X_reg = df[categorical_cols + numerical_cols]\n",
"y_reg = df['charges']\n",
"\n",
"# Список моделей для задачи регрессии\n",
"models_reg = {\n",
" \"Linear Regression\": LinearRegression(),\n",
" \"Random Forest Regression\": RandomForestRegressor(),\n",
" \"Gradient Boosting Regression\": GradientBoostingRegressor()\n",
"}\n",
"\n",
"# Оценка смещения и дисперсии для задачи регрессии\n",
"print(\"Оценка смещения и дисперсии для задачи регрессии:\")\n",
"for name, model in models_reg.items():\n",
" pipeline = Pipeline(steps=[\n",
" ('preprocessor', preprocessor),\n",
" ('model', model)\n",
" ])\n",
" mae_scores = -cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='neg_mean_absolute_error')\n",
" r2_scores = cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='r2')\n",
" print(f\"Model: {name}\")\n",
" print(f\"MAE (Cross-Validation): Mean = {mae_scores.mean()}, Std = {mae_scores.std()}\")\n",
" print(f\"R² (Cross-Validation): Mean = {r2_scores.mean()}, Std = {r2_scores.std()}\")\n",
" print()\n",
"\n",
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n",
"X_class = df[categorical_cols + numerical_cols]\n",
"y_class = (df['charges'] > df['charges'].mean()).astype(int)\n",
"\n",
"# Список моделей для задачи классификации\n",
"models_class = {\n",
" \"Logistic Regression\": LogisticRegression(),\n",
" \"Random Forest Classification\": RandomForestClassifier(),\n",
" \"Gradient Boosting Classification\": GradientBoostingClassifier()\n",
"}\n",
"\n",
"# Оценка смещения и дисперсии для задачи классификации\n",
"print(\"Оценка смещения и дисперсии для задачи классификации:\")\n",
"for name, model in models_class.items():\n",
" pipeline = Pipeline(steps=[\n",
" ('preprocessor', preprocessor),\n",
" ('model', model)\n",
" ])\n",
" accuracy_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='accuracy')\n",
" precision_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='precision')\n",
" recall_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='recall')\n",
" f1_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='f1')\n",
" print(f\"Model: {name}\")\n",
" print(f\"Accuracy (Cross-Validation): Mean = {accuracy_scores.mean()}, Std = {accuracy_scores.std()}\")\n",
" print(f\"Precision (Cross-Validation): Mean = {precision_scores.mean()}, Std = {precision_scores.std()}\")\n",
" print(f\"Recall (Cross-Validation): Mean = {recall_scores.mean()}, Std = {recall_scores.std()}\")\n",
" print(f\"F1-score (Cross-Validation): Mean = {f1_scores.mean()}, Std = {f1_scores.std()}\")\n",
" print()"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1200x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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NtZuvpCQED399NPasGGDatSoIW9vbz344IP66quvUn0OkipatKjq1atn97hJt16XlSpVUsWKFR0uN3/+fFWtWlU+Pj4qUKCAnnvuOZ04cSLZfIsXL1bFihXl7e2tihUrOhzrkpSQkKCxY8fqoYcekre3twoWLKiXXnpJ//zzzx3vw53GAQDkJA0aNJB0a0eelHo/k5733hUrVqh+/frKlSuXAgICVL16dbv3WkfnaJo7d66qVq1qW6ZSpUr69NNPbben1Jel5TMm8X6dOHFCLVu2lL+/vwIDA/XGG28oPj4+1ccotX4gvZ/B33//vapVqyYfHx998cUXKW7z3XffVb58+TRt2jSHO7bCwsL09NNPp7j87t271a1bNz344IPy9vZWoUKF1KNHD50/f95uvsuXL+vVV1+19S5BQUF68skntX37dts8Bw4c0LPPPqtChQrJ29tbxYoVU4cOHXTp0iW7+5fYF6XWc6Z0jqY7jZe09NLdunXThAkTJMnua6KJHJ2jKT3978aNGxUREaHAwED5+fmpVatWtkAtLTp16qSdO3dq3759tmmnTp3S2rVrUzwy7cyZM3r++edVsGBBeXt7KzQ0VDNnzkw238WLF9WtWzflzp1befLkUXh4uC5evOhwnfv27VObNm2UL18+eXt7q1q1alqyZMkd60/LOADuhK/OIcuaNWuWWrduLU9PT3Xs2FETJ07UL7/8ourVq9vmuXLliurWrau9e/eqR48eqlKlis6dO6clS5bo77//VoECBRQfH6+nn35aUVFR6tChg/r376/Lly9r9erV+u2331SyZMl013bz5k2FhYWpTp06+vjjj22HoM+fP1/Xrl1Tr169lD9/fm3dulXjx4/X33//rfnz59uW3717t+rWrSsPDw+9+OKLCgkJ0aFDh/Tf//5XI0aM0OOPP67g4GDNmjVLrVq1Sva4lCxZUrVq1XJYW+vWrZUnTx699tpr6tixo5o2bSp/f39J0u+//666desqICBAb775pjw8PPTFF1/o8ccf1w8//JDsXFi9e/dWYGCghgwZkupezsQPrS5duqT7sUz06aefqkWLFurcubNu3LihuXPnqm3btlq6dKlt78/vv/+up59+Wg8//LCGDx8uLy8vHTx4UBs3brStZ8qUKXrllVfUpk0b9e/fX//++692796tLVu2pPjh/vXXX2vy5MnaunWrvvzyS0nSY4895nDetIy5mJgYffnll+rYsaN69uypy5cva+rUqQoLC9PWrVtVuXJlBQYGauLEierVq5datWql1q1bS5IefvjhFB+jF154QTNnzlSbNm30+uuva8uWLRo5cqT27t2bLKg5ePCg2rRpo+eff17h4eGaNm2aunXrpqpVq+qhhx5K03PSqVMn9e/fX1euXJG/v79u3ryp+fPnKyIiwuHX5mbMmKHu3burevXqGjlypE6fPq1PP/1UGzdu1I4dO2x7O1etWqVnn31WFSpU0MiRI3X+/Hl1797dYZj50ksv2db7yiuv6MiRI/rss8+0Y8cObdy4McWjze5mHABAdpa4cy1//vy2aSn1M2l9750xY4Z69Oihhx56SAMHDlSePHm0Y8cOrVy5MsX32tWrV6tjx45q2LChRo0aJUnau3evNm7cqP79+6dYf1o/YyQpPj5eYWFhqlmzpj7
"text/plain": [
"<Figure size 1200x1200 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.model_selection import cross_val_score\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.linear_model import LinearRegression, LogisticRegression\n",
"from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n",
"from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.compose import ColumnTransformer\n",
"from sklearn.preprocessing import OneHotEncoder\n",
"\n",
"# Загружаем набор данных\n",
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
"\n",
"# Определяем категориальные и числовые столбцы\n",
"categorical_cols = ['sex', 'smoker', 'region']\n",
"numerical_cols = ['age', 'bmi', 'children']\n",
"\n",
"# Создаем преобразователь для категориальных и числовых столбцов\n",
"preprocessor = ColumnTransformer(\n",
" transformers=[\n",
" ('cat', OneHotEncoder(), categorical_cols),\n",
" ('num', StandardScaler(), numerical_cols)\n",
" ])\n",
"\n",
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии\n",
"X_reg = df[categorical_cols + numerical_cols]\n",
"y_reg = df['charges']\n",
"\n",
"# Список моделей для задачи регрессии\n",
"models_reg = {\n",
" \"Linear Regression\": LinearRegression(),\n",
" \"Random Forest Regression\": RandomForestRegressor(),\n",
" \"Gradient Boosting Regression\": GradientBoostingRegressor()\n",
"}\n",
"\n",
"# Оценка смещения и дисперсии для задачи регрессии\n",
"mae_means = []\n",
"mae_stds = []\n",
"r2_means = []\n",
"r2_stds = []\n",
"\n",
"for name, model in models_reg.items():\n",
" pipeline = Pipeline(steps=[\n",
" ('preprocessor', preprocessor),\n",
" ('model', model)\n",
" ])\n",
" mae_scores = -cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='neg_mean_absolute_error')\n",
" r2_scores = cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='r2')\n",
" mae_means.append(mae_scores.mean())\n",
" mae_stds.append(mae_scores.std())\n",
" r2_means.append(r2_scores.mean())\n",
" r2_stds.append(r2_scores.std())\n",
"\n",
"# Визуализация результатов для задачи регрессии\n",
"fig, ax = plt.subplots(1, 2, figsize=(12, 6))\n",
"\n",
"ax[0].bar(models_reg.keys(), mae_means, yerr=mae_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n",
"ax[0].set_ylabel('MAE')\n",
"ax[0].set_title('Mean Absolute Error (MAE) for Regression Models')\n",
"ax[0].yaxis.grid(True)\n",
"\n",
"ax[1].bar(models_reg.keys(), r2_means, yerr=r2_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n",
"ax[1].set_ylabel('R²')\n",
"ax[1].set_title('R-squared (R²) for Regression Models')\n",
"ax[1].yaxis.grid(True)\n",
"\n",
"plt.tight_layout()\n",
"plt.show()\n",
"\n",
"# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации\n",
"X_class = df[categorical_cols + numerical_cols]\n",
"y_class = (df['charges'] > df['charges'].mean()).astype(int)\n",
"\n",
"# Список моделей для задачи классификации\n",
"models_class = {\n",
" \"Logistic Regression\": LogisticRegression(),\n",
" \"Random Forest Classification\": RandomForestClassifier(),\n",
" \"Gradient Boosting Classification\": GradientBoostingClassifier()\n",
"}\n",
"\n",
"# Оценка смещения и дисперсии для задачи классификации\n",
"accuracy_means = []\n",
"accuracy_stds = []\n",
"precision_means = []\n",
"precision_stds = []\n",
"recall_means = []\n",
"recall_stds = []\n",
"f1_means = []\n",
"f1_stds = []\n",
"\n",
"for name, model in models_class.items():\n",
" pipeline = Pipeline(steps=[\n",
" ('preprocessor', preprocessor),\n",
" ('model', model)\n",
" ])\n",
" accuracy_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='accuracy')\n",
" precision_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='precision')\n",
" recall_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='recall')\n",
" f1_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='f1')\n",
" accuracy_means.append(accuracy_scores.mean())\n",
" accuracy_stds.append(accuracy_scores.std())\n",
" precision_means.append(precision_scores.mean())\n",
" precision_stds.append(precision_scores.std())\n",
" recall_means.append(recall_scores.mean())\n",
" recall_stds.append(recall_scores.std())\n",
" f1_means.append(f1_scores.mean())\n",
" f1_stds.append(f1_scores.std())\n",
"\n",
"# Визуализация результатов для задачи классификации\n",
"fig, ax = plt.subplots(2, 2, figsize=(12, 12))\n",
"\n",
"ax[0, 0].bar(models_class.keys(), accuracy_means, yerr=accuracy_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n",
"ax[0, 0].set_ylabel('Accuracy')\n",
"ax[0, 0].set_title('Accuracy for Classification Models')\n",
"ax[0, 0].yaxis.grid(True)\n",
"\n",
"ax[0, 1].bar(models_class.keys(), precision_means, yerr=precision_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n",
"ax[0, 1].set_ylabel('Precision')\n",
"ax[0, 1].set_title('Precision for Classification Models')\n",
"ax[0, 1].yaxis.grid(True)\n",
"\n",
"ax[1, 0].bar(models_class.keys(), recall_means, yerr=recall_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n",
"ax[1, 0].set_ylabel('Recall')\n",
"ax[1, 0].set_title('Recall for Classification Models')\n",
"ax[1, 0].yaxis.grid(True)\n",
"\n",
"ax[1, 1].bar(models_class.keys(), f1_means, yerr=f1_stds, align='center', alpha=0.5, ecolor='black', capsize=10)\n",
"ax[1, 1].set_ylabel('F1-score')\n",
"ax[1, 1].set_title('F1-score for Classification Models')\n",
"ax[1, 1].yaxis.grid(True)\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
}
],
"metadata": {
"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
}