AIM-PIbd-32-Bulatova-K-R/lab_4/lab_4.ipynb
2024-11-09 11:45:34 +04:00

318 KiB
Raw Permalink Blame History

Начало лабораторной работы

In [6]:
import pandas as pd
df = pd.read_csv("..//static//csv//Medical_insurance.csv")
print(df.columns)
Index(['age', 'sex', 'bmi', 'children', 'smoker', 'region', 'charges'], dtype='object')

Бизнес-цели

  1. Прогнозирование стоимости страховых взносов:

Цель: Разработать модель, которая будет предсказывать стоимость страховых взносов для новых клиентов на основе их характеристик (возраст, пол, ИМТ, количество детей, статус курения, регион проживания).

Применение: Клиенты могут получить представление о примерной стоимости страховки до обращения в компанию.

  1. Оптимизация тарифной сетки:

Цель: Определить оптимальные коэффициенты для различных факторов, влияющих на стоимость страховки (например, возраст, ИМТ, статус курения), чтобы максимизировать прибыль компании при сохранении конкурентоспособных тарифов.

Применение: Страховые компании могут использовать эти коэффициенты для корректировки тарифной сетки и повышения эффективности бизнеса.

  1. Прогнозирование стоимости страховых взносов:
In [8]:
import pandas as pd

# Загружаем набор данных
df = pd.read_csv("..//static//csv//Medical_insurance.csv")

# Устанавливаем случайное состояние
random_state = 42

# Рассчитываем среднее значение стоимости страховых взносов
average_charges = df['charges'].mean()
print(f"Среднее значение поля 'charges': {average_charges}")

# Создаем новую переменную, указывающую, превышает ли стоимость страховых взносов среднюю
df['above_average_charges'] = (df['charges'] > average_charges).astype(int)

# Рассчитываем волатильность (разницу между максимальной и минимальной стоимостью страховых взносов)
df['charges_volatility'] = df['charges'].max() - df['charges'].min()

# Выводим первые строки измененной таблицы для проверки
print(df.head())
Среднее значение поля 'charges': 13261.369959046897
   age     sex     bmi  children smoker     region      charges  \
0   19  female  27.900         0    yes  southwest  16884.92400   
1   18    male  33.770         1     no  southeast   1725.55230   
2   28    male  33.000         3     no  southeast   4449.46200   
3   33    male  22.705         0     no  northwest  21984.47061   
4   32    male  28.880         0     no  northwest   3866.85520   

   above_average_charges  charges_volatility  
0                      1         62648.55411  
1                      0         62648.55411  
2                      0         62648.55411  
3                      1         62648.55411  
4                      0         62648.55411  
  1. Оптимизация тарифной сетки:
In [24]:
import pandas as pd

# Загружаем набор данных
df = pd.read_csv("..//static//csv//Medical_insurance.csv")

# Устанавливаем случайное состояние
random_state = 42

# Рассчитываем среднюю стоимость страховых взносов для каждого значения каждого признака
for column in ['age', 'sex', 'bmi', 'children', 'smoker', 'region']:
    print(f"Средняя стоимость страховых взносов для '{column}':")
    print(df.groupby(column)['charges'].mean())
    print()

# Рассчитываем среднюю стоимость страховых взносов для комбинаций признаков
# для комбинации 'age' и 'smoker'
print("Средняя стоимость страховых взносов для комбинации 'age' и 'smoker':")
print(df.groupby(['age', 'smoker'])['charges'].mean())
print()

# Рассчитываем среднюю стоимость страховых взносов для комбинации 'bmi' и 'smoker'
print("Средняя стоимость страховых взносов для комбинации 'bmi' и 'smoker':")
print(df.groupby(['bmi', 'smoker'])['charges'].mean())
print()

# Рассчитываем среднюю стоимость страховых взносов для комбинации 'region' и 'smoker'
print("Средняя стоимость страховых взносов для комбинации 'region' и 'smoker':")
print(df.groupby(['region', 'smoker'])['charges'].mean())
print()
Средняя стоимость страховых взносов для 'age':
age
18     6714.267794
19     9634.641344
20    10159.697736
21     5349.737625
22    10675.132648
23    12050.721224
24    10648.015962
25     9610.781531
26     5955.403311
27    13130.462272
28     8757.474523
29    10430.158727
30    13580.480238
31    10196.980573
32    10071.740266
33    12118.482617
34    11613.528121
35    11307.182031
36    12204.476138
37    17595.511688
38     8102.733674
39    11468.895088
40    11772.251310
41     9533.603123
42    13061.038669
43    19267.278653
44    16439.727524
45    14404.055995
46    14201.069951
47    18153.128652
48    14632.500445
49    12696.006264
50    15663.003301
51    15452.800438
52    18951.581034
53    15795.645012
54    18252.834139
55    16164.545488
56    14727.018377
57    16283.671944
58    13815.290525
59    18639.637165
60    21979.418507
61    22024.457609
62    18926.646066
63    19884.998461
64    24419.101775
Name: charges, dtype: float64

Средняя стоимость страховых взносов для 'sex':
sex
female    12486.831977
male      14013.872721
Name: charges, dtype: float64

Средняя стоимость страховых взносов для 'bmi':
bmi
15.960     1694.796400
16.815     4904.000350
17.195    14455.644050
17.290     7813.353433
17.385     2775.192150
              ...     
48.070     9432.925300
49.060    11381.325400
50.380     2438.055200
52.580    44501.398200
53.130     1163.462700
Name: charges, Length: 548, dtype: float64

Средняя стоимость страховых взносов для 'children':
children
0    12317.920881
1    12722.650521
2    15268.182723
3    15304.070620
4    13550.983876
5     8706.036629
Name: charges, dtype: float64

Средняя стоимость страховых взносов для 'smoker':
smoker
no      8417.874411
yes    32223.139764
Name: charges, dtype: float64

Средняя стоимость страховых взносов для 'region':
region
northeast    13475.874737
northwest    12463.129315
southeast    14748.777706
southwest    12164.196435
Name: charges, dtype: float64

Средняя стоимость страховых взносов для комбинации 'age' и 'smoker':
age  smoker
18   no         3083.404099
     yes       25473.730221
19   no         3492.047133
     yes       26445.951817
20   no         3673.112925
                   ...     
62   yes       37084.607312
63   no        14205.335706
     yes       40331.784380
64   no        15805.350545
     yes       40569.885331
Name: charges, Length: 94, dtype: float64

Средняя стоимость страховых взносов для комбинации 'bmi' и 'smoker':
bmi     smoker
15.960  no         1694.79640
16.815  no         4904.00035
17.195  yes       14455.64405
17.290  no         5305.30260
        yes       12829.45510
                     ...     
48.070  no         9432.92530
49.060  no        11381.32540
50.380  no         2438.05520
52.580  yes       44501.39820
53.130  no         1163.46270
Name: charges, Length: 701, dtype: float64

Средняя стоимость страховых взносов для комбинации 'region' и 'smoker':
region     smoker
northeast  no         9225.395851
           yes       29790.212814
northwest  no         8681.948181
           yes       29959.103039
southeast  no         7887.181702
           yes       35262.090761
southwest  no         7956.579615
           yes       32346.494062
Name: charges, dtype: float64

Выбор ориентира для каждой задачи:

  1. Прогнозирование стоимости страховых взносов: Ориентир:

R² (коэффициент детерминации): 0.75 - 0.85

MAE (средняя абсолютная ошибка): 2000 - 3000 долларов

RMSE (среднеквадратичная ошибка): 3000 - 5000 долларов

Объяснение:

R²: Значение 0.75 - 0.85 будет означать, что модель объясняет 75-85% вариации стоимости страховых взносов, что является хорошим результатом для задачи регрессии.

MAE: Значение 2000 - 3000 долларов будет означать, что в среднем модель ошибается на 2000 - 3000 долларов при прогнозировании стоимости страховых взносов.

RMSE: Значение 3000 - 5000 долларов будет означать, что среднеквадратичная ошибка модели составляет 3000 - 4000 долларов.

  1. Оптимизация тарифной сетки: Ориентир:

Увеличение прибыли компании: 5% - 10%

Сохранение конкурентоспособных тарифов:

Средняя стоимость страховых взносов не должна увеличиваться более чем на 5% по сравнению с текущими тарифами.

Доля клиентов, считающих тарифы дорогими, не должна увеличиваться более чем на 2%.

Объяснение:

Увеличение прибыли компании: Цель оптимизации тарифной сетки - максимизировать прибыль компании. Ориентир в 5% - 10% увеличения прибыли является реалистичным и достижимым.

Сохранение конкурентоспособных тарифов: Важно, чтобы оптимизация тарифной сетки не привела к значительному увеличению стоимости страховых взносов для клиентов. Ориентир в 5% увеличения средней стоимости страховых взносов и 2% увеличения доли клиентов, считающих тарифы дорогими, позволяет сохранить конкурентоспособность компании.

In [25]:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

# Загружаем набор данных
df = pd.read_csv("..//static//csv//Medical_insurance.csv")

# Преобразуем категориальные переменные в числовые
df = pd.get_dummies(df, columns=['sex', 'smoker', 'region'], drop_first=True)

# Разделяем данные на признаки (X) и целевую переменную (y)
X = df.drop('charges', axis=1)
y = df['charges']

# Разделяем данные на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Стандартизируем признаки
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# Обучаем модель линейной регрессии
model = LinearRegression()
model.fit(X_train, y_train)

# Делаем предсказания на тестовой выборке
y_pred = model.predict(X_test)

# Оцениваем качество модели
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = mean_squared_error(y_test, y_pred, squared=False)
r2 = r2_score(y_test, y_pred)

print(f"MAE: {mae}")
print(f"MSE: {mse}")
print(f"RMSE: {rmse}")
print(f"R²: {r2}")

# Проверяем, достигнуты ли ориентиры
if r2 >= 0.75 and mae <= 3000 and rmse <= 5000:
    print("Ориентиры для прогнозирования стоимости страховых взносов достигнуты!")
else:
    print("Ориентиры для прогнозирования стоимости страховых взносов не достигнуты.")

# Оптимизация тарифной сетки
# Убедитесь, что столбцы существуют
columns_to_group = ['age', 'bmi', 'children', 'sex_male', 'smoker_yes', 'region_northwest', 'region_southeast', 'region_southwest']

# Рассчитываем среднюю стоимость страховых взносов для каждого значения каждого признака
for column in columns_to_group:
    print(f"Средняя стоимость страховых взносов для '{column}':")
    print(df.groupby(column)['charges'].mean())
    print()

# Рассчитываем среднюю стоимость страховых взносов для комбинаций признаков
# Например, для комбинации 'age' и 'smoker_yes'
print("Средняя стоимость страховых взносов для комбинации 'age' и 'smoker_yes':")
print(df.groupby(['age', 'smoker_yes'])['charges'].mean())
print()

# Рассчитываем среднюю стоимость страховых взносов для комбинации 'bmi' и 'smoker_yes'
print("Средняя стоимость страховых взносов для комбинации 'bmi' и 'smoker_yes':")
print(df.groupby(['bmi', 'smoker_yes'])['charges'].mean())
print()

# Рассчитываем среднюю стоимость страховых взносов для комбинации 'region_northwest' и 'smoker_yes'
print("Средняя стоимость страховых взносов для комбинации 'region_northwest' и 'smoker_yes':")
print(df.groupby(['region_northwest', 'smoker_yes'])['charges'].mean())
print()
MAE: 4160.247974762991
MSE: 39933194.54805147
RMSE: 6319.271678607549
R²: 0.73981661775643
Ориентиры для прогнозирования стоимости страховых взносов не достигнуты.
Средняя стоимость страховых взносов для 'age':
age
18     6714.267794
19     9634.641344
20    10159.697736
21     5349.737625
22    10675.132648
23    12050.721224
24    10648.015962
25     9610.781531
26     5955.403311
27    13130.462272
28     8757.474523
29    10430.158727
30    13580.480238
31    10196.980573
32    10071.740266
33    12118.482617
34    11613.528121
35    11307.182031
36    12204.476138
37    17595.511688
38     8102.733674
39    11468.895088
40    11772.251310
41     9533.603123
42    13061.038669
43    19267.278653
44    16439.727524
45    14404.055995
46    14201.069951
47    18153.128652
48    14632.500445
49    12696.006264
50    15663.003301
51    15452.800438
52    18951.581034
53    15795.645012
54    18252.834139
55    16164.545488
56    14727.018377
57    16283.671944
58    13815.290525
59    18639.637165
60    21979.418507
61    22024.457609
62    18926.646066
63    19884.998461
64    24419.101775
Name: charges, dtype: float64

Средняя стоимость страховых взносов для 'bmi':
bmi
15.960     1694.796400
16.815     4904.000350
17.195    14455.644050
17.290     7813.353433
17.385     2775.192150
              ...     
48.070     9432.925300
49.060    11381.325400
50.380     2438.055200
52.580    44501.398200
53.130     1163.462700
Name: charges, Length: 548, dtype: float64

Средняя стоимость страховых взносов для 'children':
children
0    12317.920881
1    12722.650521
2    15268.182723
3    15304.070620
4    13550.983876
5     8706.036629
Name: charges, dtype: float64

Средняя стоимость страховых взносов для 'sex_male':
sex_male
False    12486.831977
True     14013.872721
Name: charges, dtype: float64

Средняя стоимость страховых взносов для 'smoker_yes':
smoker_yes
False     8417.874411
True     32223.139764
Name: charges, dtype: float64

Средняя стоимость страховых взносов для 'region_northwest':
region_northwest
False    13512.808188
True     12463.129315
Name: charges, dtype: float64

Средняя стоимость страховых взносов для 'region_southeast':
region_southeast
False    12693.396712
True     14748.777706
Name: charges, dtype: float64

Средняя стоимость страховых взносов для 'region_southwest':
region_southwest
False    13620.788872
True     12164.196435
Name: charges, dtype: float64

Средняя стоимость страховых взносов для комбинации 'age' и 'smoker_yes':
age  smoker_yes
18   False          3083.404099
     True          25473.730221
19   False          3492.047133
     True          26445.951817
20   False          3673.112925
                       ...     
62   True          37084.607312
63   False         14205.335706
     True          40331.784380
64   False         15805.350545
     True          40569.885331
Name: charges, Length: 94, dtype: float64

Средняя стоимость страховых взносов для комбинации 'bmi' и 'smoker_yes':
bmi     smoker_yes
15.960  False          1694.79640
16.815  False          4904.00035
17.195  True          14455.64405
17.290  False          5305.30260
        True          12829.45510
                         ...     
48.070  False          9432.92530
49.060  False         11381.32540
50.380  False          2438.05520
52.580  True          44501.39820
53.130  False          1163.46270
Name: charges, Length: 701, dtype: float64

Средняя стоимость страховых взносов для комбинации 'region_northwest' и 'smoker_yes':
region_northwest  smoker_yes
False             False          8331.120934
                  True          32822.144996
True              False          8681.948181
                  True          29959.103039
Name: charges, dtype: float64

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'.
  warnings.warn(

Анализ применимости алгоритмов обучения с учителем для решения поставленных задач:

  1. Прогнозирование стоимости страховых взносов: Задача: Регрессия

Свойства алгоритмов:

Линейная регрессия: Применимость: Хорошо подходит для задач, где зависимость между признаками и целевой переменной линейна. Преимущества: Проста в реализации, интерпретируема. Недостатки: Может плохо работать, если зависимость нелинейна.

Деревья решений (регрессия): Применимость: Подходит для задач с нелинейными зависимостями. Преимущества: Может обрабатывать категориальные признаки, не требует масштабирования данных. Недостатки: Подвержены переобучению, могут давать нестабильные результаты.

Случайный лес (регрессия): Применимость: Хорошо подходит для задач с нелинейными зависимостями и большим количеством признаков. Преимущества: Устойчив к переобучению, может обрабатывать категориальные признаки. Недостатки: Менее интерпретируем, чем линейная регрессия.

Градиентный бустинг (регрессия): Применимость: Подходит для задач с нелинейными зависимостями и сложными взаимосвязями между признаками. Преимущества: Может достигать высокой точности, устойчив к переобучению. Недостатки: Сложнее в настройке, чем случайный лес, менее интерпретируем.

Нейронные сети (регрессия): Применимость: Подходит для задач с очень сложными зависимостями и большим количеством данных. Преимущества: Может моделировать очень сложные зависимости. Недостатки: Требует большого количества данных, сложнее в настройке и интерпретации.

Вывод:

Линейная регрессия: Может быть хорошим выбором для начала, особенно если зависимость между признаками и целевой переменной линейна.

Деревья решений и случайный лес: Подходят для задач с нелинейными зависимостями.

Градиентный бустинг: Может давать более высокую точность, чем случайный лес, но требует больше времени на настройку.

Нейронные сети: Могут быть излишними для этой задачи, если данных недостаточно много.

  1. Оптимизация тарифной сетки: Задача: Классификация (группировка клиентов по группам риска)

Свойства алгоритмов:

Логистическая регрессия: Применимость: Хорошо подходит для задач бинарной классификации, где зависимость между признаками и целевой переменной линейна. Преимущества: Проста в реализации, интерпретируема. Недостатки: Может плохо работать, если зависимость нелинейна.

Деревья решений (классификация): Применимость: Подходит для задач с нелинейными зависимостями. Преимущества: Может обрабатывать категориальные признаки, не требует масштабирования данных. Недостатки: Подвержены переобучению, могут давать нестабильные результаты.

Случайный лес (классификация): Применимость: Хорошо подходит для задач с нелинейными зависимостями и большим количеством признаков. Преимущества: Устойчив к переобучению, может обрабатывать категориальные признаки. Недостатки: Менее интерпретируем, чем линейная регрессия.

Градиентный бустинг (классификация): Применимость: Подходит для задач с нелинейными зависимостями и сложными взаимосвязями между признаками. Преимущества: Может достигать высокой точности, устойчив к переобучению. Недостатки: Сложнее в настройке, чем случайный лес, менее интерпретируем.

Нейронные сети (классификация): Применимость: Подходит для задач с очень сложными зависимостями и большим количеством данных. Преимущества: Может моделировать очень сложные зависимости. Недостатки: Требует большого количества данных, сложнее в настройке и интерпретации.

Вывод:

Логистическая регрессия: Может быть хорошим выбором для начала, особенно если зависимость между признаками и целевой переменной линейна.

Деревья решений и случайный лес: Подходят для задач с нелинейными зависимостями.

Градиентный бустинг: Может давать более высокую точность, чем случайный лес, но требует больше времени на настройку.

Нейронные сети: Могут быть излишними для этой задачи, если данных недостаточно много.

  1. Прогнозирование стоимости страховых взносов: Выбранные модели:

Линейная регрессия

Случайный лес (регрессия)

Градиентный бустинг (регрессия)

  1. Оптимизация тарифной сетки: Выбранные модели:

Логистическая регрессия

Случайный лес (классификация)

Градиентный бустинг (классификация)

In [14]:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score, accuracy_score

# Загружаем набор данных
df = pd.read_csv("..//static//csv//Medical_insurance.csv")

# Преобразуем категориальные переменные в числовые
df = pd.get_dummies(df, columns=['sex', 'smoker', 'region'], drop_first=True)

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии
X_reg = df.drop('charges', axis=1)
y_reg = df['charges']

# Разделяем данные на обучающую и тестовую выборки для задачи регрессии
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)

# Стандартизируем признаки для задачи регрессии
scaler_reg = StandardScaler()
X_train_reg = scaler_reg.fit_transform(X_train_reg)
X_test_reg = scaler_reg.transform(X_test_reg)

# Список моделей для задачи регрессии
models_reg = {
    "Linear Regression": LinearRegression(),
    "Random Forest Regression": RandomForestRegressor(),
    "Gradient Boosting Regression": GradientBoostingRegressor()
}

# Обучаем и оцениваем модели для задачи регрессии
print("Результаты для задачи регрессии:")
for name, model in models_reg.items():
    model.fit(X_train_reg, y_train_reg)
    y_pred_reg = model.predict(X_test_reg)
    mae = mean_absolute_error(y_test_reg, y_pred_reg)
    mse = mean_squared_error(y_test_reg, y_pred_reg)
    rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)
    r2 = r2_score(y_test_reg, y_pred_reg)
    print(f"Model: {name}")
    print(f"MAE: {mae}")
    print(f"MSE: {mse}")
    print(f"RMSE: {rmse}")
    print(f"R²: {r2}")
    print()

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации
X_class = df.drop('charges', axis=1)
y_class = (df['charges'] > df['charges'].mean()).astype(int)

# Разделяем данные на обучающую и тестовую выборки для задачи классификации
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)

# Стандартизируем признаки для задачи классификации
scaler_class = StandardScaler()
X_train_class = scaler_class.fit_transform(X_train_class)
X_test_class = scaler_class.transform(X_test_class)

# Список моделей для задачи классификации
models_class = {
    "Logistic Regression": LogisticRegression(),
    "Random Forest Classification": RandomForestClassifier(),
    "Gradient Boosting Classification": GradientBoostingClassifier()
}

# Обучаем и оцениваем модели для задачи классификации
print("Результаты для задачи классификации:")
for name, model in models_class.items():
    model.fit(X_train_class, y_train_class)
    y_pred_class = model.predict(X_test_class)
    accuracy = accuracy_score(y_test_class, y_pred_class)
    print(f"Model: {name}")
    print(f"Accuracy: {accuracy}")
    print()
Результаты для задачи регрессии:
Model: Linear Regression
MAE: 4160.247974762991
MSE: 39933194.54805147
RMSE: 6319.271678607549
R²: 0.73981661775643

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'.
  warnings.warn(
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'.
  warnings.warn(
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'.
  warnings.warn(
Model: Random Forest Regression
MAE: 1303.0047135437117
MSE: 7810682.767902057
RMSE: 2794.759876608732
R²: 0.9491097598580805

Model: Gradient Boosting Regression
MAE: 2297.7789526178262
MSE: 19231434.89568898
RMSE: 4385.365993356652
R²: 0.8746982345593103

Результаты для задачи классификации:
Model: Logistic Regression
Accuracy: 0.8864864864864865

Model: Random Forest Classification
Accuracy: 0.9765765765765766

Model: Gradient Boosting Classification
Accuracy: 0.9225225225225225

  1. Прогнозирование стоимости страховых взносов: Конвейер для задачи регрессии:
In [15]:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

# Загружаем набор данных
df = pd.read_csv("..//static//csv//Medical_insurance.csv")

# Определяем категориальные и числовые столбцы
categorical_cols = ['sex', 'smoker', 'region']
numerical_cols = ['age', 'bmi', 'children']

# Создаем преобразователь для категориальных и числовых столбцов
preprocessor = ColumnTransformer(
    transformers=[
        ('cat', OneHotEncoder(), categorical_cols),
        ('num', StandardScaler(), numerical_cols)
    ])

# Список моделей для задачи регрессии
models_reg = {
    "Linear Regression": LinearRegression(),
    "Random Forest Regression": RandomForestRegressor(),
    "Gradient Boosting Regression": GradientBoostingRegressor()
}

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии
X_reg = df[categorical_cols + numerical_cols]
y_reg = df['charges']

# Разделяем данные на обучающую и тестовую выборки для задачи регрессии
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)

# Обучаем и оцениваем модели для задачи регрессии
print("Результаты для задачи регрессии:")
for name, model in models_reg.items():
    pipeline = Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('model', model)
    ])
    pipeline.fit(X_train_reg, y_train_reg)
    y_pred_reg = pipeline.predict(X_test_reg)
    mae = mean_absolute_error(y_test_reg, y_pred_reg)
    mse = mean_squared_error(y_test_reg, y_pred_reg)
    rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)
    r2 = r2_score(y_test_reg, y_pred_reg)
    print(f"Model: {name}")
    print(f"MAE: {mae}")
    print(f"MSE: {mse}")
    print(f"RMSE: {rmse}")
    print(f"R²: {r2}")
    print()
Результаты для задачи регрессии:
Model: Linear Regression
MAE: 4158.694987099099
MSE: 39908584.112821
RMSE: 6317.32412599045
R²: 0.7399769662171334

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'.
  warnings.warn(
Model: Random Forest Regression
MAE: 1302.1428312961073
MSE: 7363635.134840652
RMSE: 2713.6018747857343
R²: 0.9520224836336337

Model: Gradient Boosting Regression
MAE: 2304.718628546955
MSE: 19256343.733882822
RMSE: 4388.205069716184
R²: 0.8745359418641633

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'.
  warnings.warn(
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'.
  warnings.warn(
  1. Оптимизация тарифной сетки: Конвейер для задачи классификации:
In [16]:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
from sklearn.metrics import accuracy_score

# Загружаем набор данных
df = pd.read_csv("..//static//csv//Medical_insurance.csv")

# Определяем категориальные и числовые столбцы
categorical_cols = ['sex', 'smoker', 'region']
numerical_cols = ['age', 'bmi', 'children']

# Создаем преобразователь для категориальных и числовых столбцов
preprocessor = ColumnTransformer(
    transformers=[
        ('cat', OneHotEncoder(), categorical_cols),
        ('num', StandardScaler(), numerical_cols)
    ])

# Список моделей для задачи классификации
models_class = {
    "Logistic Regression": LogisticRegression(),
    "Random Forest Classification": RandomForestClassifier(),
    "Gradient Boosting Classification": GradientBoostingClassifier()
}

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации
X_class = df[categorical_cols + numerical_cols]
y_class = (df['charges'] > df['charges'].mean()).astype(int)

# Разделяем данные на обучающую и тестовую выборки для задачи классификации
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)

# Обучаем и оцениваем модели для задачи классификации
print("Результаты для задачи классификации:")
for name, model in models_class.items():
    pipeline = Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('model', model)
    ])
    pipeline.fit(X_train_class, y_train_class)
    y_pred_class = pipeline.predict(X_test_class)
    accuracy = accuracy_score(y_test_class, y_pred_class)
    print(f"Model: {name}")
    print(f"Accuracy: {accuracy}")
    print()
Результаты для задачи классификации:
Model: Logistic Regression
Accuracy: 0.8846846846846846

Model: Random Forest Classification
Accuracy: 0.9801801801801802

Model: Gradient Boosting Classification
Accuracy: 0.9243243243243243

  1. Прогнозирование стоимости страховых взносов:

Настройка гиперпараметров для задачи регрессии:

In [17]:
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

# Загружаем набор данных
df = pd.read_csv("..//static//csv//Medical_insurance.csv")

# Определяем категориальные и числовые столбцы
categorical_cols = ['sex', 'smoker', 'region']
numerical_cols = ['age', 'bmi', 'children']

# Создаем преобразователь для категориальных и числовых столбцов
preprocessor = ColumnTransformer(
    transformers=[
        ('cat', OneHotEncoder(), categorical_cols),
        ('num', StandardScaler(), numerical_cols)
    ])

# Список моделей и их гиперпараметров для задачи регрессии
models_reg = {
    "Linear Regression": (LinearRegression(), {}),
    "Random Forest Regression": (RandomForestRegressor(), {
        'model__n_estimators': [100, 200],
        'model__max_depth': [None, 10, 20]
    }),
    "Gradient Boosting Regression": (GradientBoostingRegressor(), {
        'model__n_estimators': [100, 200],
        'model__learning_rate': [0.01, 0.1],
        'model__max_depth': [3, 5]
    })
}

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии
X_reg = df[categorical_cols + numerical_cols]
y_reg = df['charges']

# Разделяем данные на обучающую и тестовую выборки для задачи регрессии
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)

# Обучаем и оцениваем модели для задачи регрессии
print("Результаты для задачи регрессии:")
for name, (model, params) in models_reg.items():
    pipeline = Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('model', model)
    ])
    grid_search = GridSearchCV(pipeline, params, cv=5, scoring='neg_mean_absolute_error')
    grid_search.fit(X_train_reg, y_train_reg)
    best_model = grid_search.best_estimator_
    y_pred_reg = best_model.predict(X_test_reg)
    mae = mean_absolute_error(y_test_reg, y_pred_reg)
    mse = mean_squared_error(y_test_reg, y_pred_reg)
    rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)
    r2 = r2_score(y_test_reg, y_pred_reg)
    print(f"Model: {name}")
    print(f"Best Parameters: {grid_search.best_params_}")
    print(f"MAE: {mae}")
    print(f"MSE: {mse}")
    print(f"RMSE: {rmse}")
    print(f"R²: {r2}")
    print()
Результаты для задачи регрессии:
Model: Linear Regression
Best Parameters: {}
MAE: 4158.694987099099
MSE: 39908584.112821
RMSE: 6317.32412599045
R²: 0.7399769662171334

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'.
  warnings.warn(
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'.
  warnings.warn(
Model: Random Forest Regression
Best Parameters: {'model__max_depth': None, 'model__n_estimators': 200}
MAE: 1292.4041719905688
MSE: 7345926.566814439
RMSE: 2710.3369839956135
R²: 0.9521378632113484

Model: Gradient Boosting Regression
Best Parameters: {'model__learning_rate': 0.1, 'model__max_depth': 5, 'model__n_estimators': 200}
MAE: 1556.4693865098072
MSE: 9320749.44024657
RMSE: 3052.990245684806
R²: 0.9392709713847187

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'.
  warnings.warn(
  1. Оптимизация тарифной сетки:

Настройка гиперпараметров для задачи классификации:

In [18]:
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
from sklearn.metrics import accuracy_score

# Загружаем набор данных
df = pd.read_csv("..//static//csv//Medical_insurance.csv")

# Определяем категориальные и числовые столбцы
categorical_cols = ['sex', 'smoker', 'region']
numerical_cols = ['age', 'bmi', 'children']

# Создаем преобразователь для категориальных и числовых столбцов
preprocessor = ColumnTransformer(
    transformers=[
        ('cat', OneHotEncoder(), categorical_cols),
        ('num', StandardScaler(), numerical_cols)
    ])

# Список моделей и их гиперпараметров для задачи классификации
models_class = {
    "Logistic Regression": (LogisticRegression(), {
        'model__C': [0.1, 1, 10],
        'model__solver': ['liblinear', 'lbfgs']
    }),
    "Random Forest Classification": (RandomForestClassifier(), {
        'model__n_estimators': [100, 200],
        'model__max_depth': [None, 10, 20]
    }),
    "Gradient Boosting Classification": (GradientBoostingClassifier(), {
        'model__n_estimators': [100, 200],
        'model__learning_rate': [0.01, 0.1],
        'model__max_depth': [3, 5]
    })
}

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации
X_class = df[categorical_cols + numerical_cols]
y_class = (df['charges'] > df['charges'].mean()).astype(int)

# Разделяем данные на обучающую и тестовую выборки для задачи классификации
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)

# Обучаем и оцениваем модели для задачи классификации
print("Результаты для задачи классификации:")
for name, (model, params) in models_class.items():
    pipeline = Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('model', model)
    ])
    grid_search = GridSearchCV(pipeline, params, cv=5, scoring='accuracy')
    grid_search.fit(X_train_class, y_train_class)
    best_model = grid_search.best_estimator_
    y_pred_class = best_model.predict(X_test_class)
    accuracy = accuracy_score(y_test_class, y_pred_class)
    print(f"Model: {name}")
    print(f"Best Parameters: {grid_search.best_params_}")
    print(f"Accuracy: {accuracy}")
    print()
Результаты для задачи классификации:
Model: Logistic Regression
Best Parameters: {'model__C': 10, 'model__solver': 'liblinear'}
Accuracy: 0.8864864864864865

Model: Random Forest Classification
Best Parameters: {'model__max_depth': None, 'model__n_estimators': 100}
Accuracy: 0.9783783783783784

Model: Gradient Boosting Classification
Best Parameters: {'model__learning_rate': 0.1, 'model__max_depth': 5, 'model__n_estimators': 200}
Accuracy: 0.9621621621621622

  1. Прогнозирование стоимости страховых взносов: Задача: Регрессия

Выбор метрик:

MAE (Mean Absolute Error): Средняя абсолютная ошибка. Показывает среднее отклонение предсказанных значений от фактических. Эта метрика легко интерпретируется, так как она измеряется в тех же единицах, что и целевая переменная (доллары).

MSE (Mean Squared Error): Среднеквадратичная ошибка. Показывает среднее квадратичное отклонение предсказанных значений от фактических. Эта метрика чувствительна к выбросам, так как ошибки возводятся в квадрат.

RMSE (Root Mean Squared Error): Квадратный корень из среднеквадратичной ошибки. Показывает среднее отклонение предсказанных значений от фактических в тех же единицах, что и целевая переменная. Эта метрика также чувствительна к выбросам, но легче интерпретируется, чем MSE.

R² (R-squared): Коэффициент детерминации. Показывает, какую долю дисперсии целевой переменной объясняет модель. Значение R² близкое к 1 указывает на хорошее качество модели.

Обоснование:

MAE: Хорошо подходит для задач, где важно понимать среднее отклонение предсказаний от фактических значений.

MSE и RMSE: Полезны для задач, где важно минимизировать влияние выбросов, так как они возводят ошибки в квадрат.

R²: Позволяет оценить, насколько хорошо модель объясняет вариацию целевой переменной.

  1. Оптимизация тарифной сетки: Задача: Классификация

Выбор метрик:

Accuracy: Доля правильных предсказаний среди всех предсказаний. Эта метрика показывает общую точность модели.

Precision: Доля правильных положительных предсказаний среди всех положительных предсказаний. Эта метрика важна, если важно минимизировать количество ложноположительных результатов.

Recall (Sensitivity): Доля правильных положительных предсказаний среди всех фактических положительных случаев. Эта метрика важна, если важно минимизировать количество ложноотрицательных результатов.

F1-score: Гармоническое среднее между precision и recall. Эта метрика показывает баланс между precision и recall.

Обоснование:

Accuracy: Хорошо подходит для задач, где классы сбалансированы.

Precision и Recall: Важны для задач, где важно минимизировать ошибки определенного типа (ложноположительные или ложноотрицательные).

F1-score: Позволяет оценить баланс между precision и recall.

In [21]:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score, accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, ConfusionMatrixDisplay

# Загружаем набор данных
df = pd.read_csv("..//static//csv//Medical_insurance.csv")

# Определяем категориальные и числовые столбцы
categorical_cols = ['sex', 'smoker', 'region']
numerical_cols = ['age', 'bmi', 'children']

# Создаем преобразователь для категориальных и числовых столбцов
preprocessor = ColumnTransformer(
    transformers=[
        ('cat', OneHotEncoder(), categorical_cols),
        ('num', StandardScaler(), numerical_cols)
    ])

# Список моделей и их гиперпараметров для задачи регрессии
models_reg = {
    "Linear Regression": (LinearRegression(), {}),
    "Random Forest Regression": (RandomForestRegressor(), {
        'model__n_estimators': [100, 200],
        'model__max_depth': [None, 10, 20]
    }),
    "Gradient Boosting Regression": (GradientBoostingRegressor(), {
        'model__n_estimators': [100, 200],
        'model__learning_rate': [0.01, 0.1],
        'model__max_depth': [3, 5]
    })
}

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии
X_reg = df[categorical_cols + numerical_cols]
y_reg = df['charges']

# Разделяем данные на обучающую и тестовую выборки для задачи регрессии
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)

# Обучаем и оцениваем модели для задачи регрессии
print("Результаты для задачи регрессии:")
for name, (model, params) in models_reg.items():
    pipeline = Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('model', model)
    ])
    grid_search = GridSearchCV(pipeline, params, cv=5, scoring='neg_mean_absolute_error')
    grid_search.fit(X_train_reg, y_train_reg)
    best_model = grid_search.best_estimator_
    y_pred_reg = best_model.predict(X_test_reg)
    mae = mean_absolute_error(y_test_reg, y_pred_reg)
    mse = mean_squared_error(y_test_reg, y_pred_reg)
    rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)
    r2 = r2_score(y_test_reg, y_pred_reg)
    print(f"Model: {name}")
    print(f"Best Parameters: {grid_search.best_params_}")
    print(f"MAE: {mae}")
    print(f"MSE: {mse}")
    print(f"RMSE: {rmse}")
    print(f"R²: {r2}")
    print()

# Список моделей и их гиперпараметров для задачи классификации
models_class = {
    "Logistic Regression": (LogisticRegression(), {
        'model__C': [0.1, 1, 10],
        'model__solver': ['liblinear', 'lbfgs']
    }),
    "Random Forest Classification": (RandomForestClassifier(), {
        'model__n_estimators': [100, 200],
        'model__max_depth': [None, 10, 20]
    }),
    "Gradient Boosting Classification": (GradientBoostingClassifier(), {
        'model__n_estimators': [100, 200],
        'model__learning_rate': [0.01, 0.1],
        'model__max_depth': [3, 5]
    })
}

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации
X_class = df[categorical_cols + numerical_cols]
y_class = (df['charges'] > df['charges'].mean()).astype(int)

# Разделяем данные на обучающую и тестовую выборки для задачи классификации
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)

# Обучаем и оцениваем модели для задачи классификации
print("Результаты для задачи классификации:")
for name, (model, params) in models_class.items():
    pipeline = Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('model', model)
    ])
    grid_search = GridSearchCV(pipeline, params, cv=5, scoring='accuracy')
    grid_search.fit(X_train_class, y_train_class)
    best_model = grid_search.best_estimator_
    y_pred_class = best_model.predict(X_test_class)
    accuracy = accuracy_score(y_test_class, y_pred_class)
    precision = precision_score(y_test_class, y_pred_class)
    recall = recall_score(y_test_class, y_pred_class)
    f1 = f1_score(y_test_class, y_pred_class)
    print(f"Model: {name}")
    print(f"Best Parameters: {grid_search.best_params_}")
    print(f"Accuracy: {accuracy}")
    print(f"Precision: {precision}")
    print(f"Recall: {recall}")
    print(f"F1-score: {f1}")
    print()

    # Визуализация матрицы ошибок
    cm = confusion_matrix(y_test_class, y_pred_class)
    disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['Less', 'More'])
    disp.plot(cmap=plt.cm.Blues)
    plt.title(f'Confusion Matrix for {name}')
    plt.show()
Результаты для задачи регрессии:
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'.
  warnings.warn(
Model: Linear Regression
Best Parameters: {}
MAE: 4158.694987099099
MSE: 39908584.112821
RMSE: 6317.32412599045
R²: 0.7399769662171334

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'.
  warnings.warn(
Model: Random Forest Regression
Best Parameters: {'model__max_depth': None, 'model__n_estimators': 100}
MAE: 1309.2968994795137
MSE: 7399293.51911523
RMSE: 2720.164244878465
R²: 0.9517901526335497

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'.
  warnings.warn(
Model: Gradient Boosting Regression
Best Parameters: {'model__learning_rate': 0.1, 'model__max_depth': 5, 'model__n_estimators': 200}
MAE: 1556.235766949439
MSE: 9320073.834850596
RMSE: 3052.879597175525
R²: 0.9392753732688899

Результаты для задачи классификации:
Model: Logistic Regression
Best Parameters: {'model__C': 10, 'model__solver': 'liblinear'}
Accuracy: 0.8864864864864865
Precision: 1.0
Recall: 0.6204819277108434
F1-score: 0.7657992565055762

No description has been provided for this image
Model: Random Forest Classification
Best Parameters: {'model__max_depth': 20, 'model__n_estimators': 200}
Accuracy: 0.9801801801801802
Precision: 0.9874213836477987
Recall: 0.9457831325301205
F1-score: 0.9661538461538461

No description has been provided for this image
Model: Gradient Boosting Classification
Best Parameters: {'model__learning_rate': 0.1, 'model__max_depth': 5, 'model__n_estimators': 200}
Accuracy: 0.9621621621621622
Precision: 0.9738562091503268
Recall: 0.8975903614457831
F1-score: 0.9341692789968652

No description has been provided for this image

Давайте проанализируем полученные значения метрик и определим, являются ли они нормальными или их можно улучшить.

Оценка смещения и дисперсии для задачи регрессии:

Вывод для задачи регрессии:

  • Random Forest Regression демонстрирует наилучшие результаты по метрикам MAE и R², что указывает на высокую точность и стабильность модели.
  • Linear Regression и Gradient Boosting Regression также показывают хорошие результаты, но уступают случайному лесу.

Вывод для задачи классификации:

  • Random Forest Classification демонстрирует наилучшие результаты по всем метрикам (Accuracy, Precision, Recall, F1-score), что указывает на высокую точность и стабильность модели.
  • Logistic Regression и Gradient Boosting Classification также показывают хорошие результаты, но уступают случайному лесу.

Для оценки смещения (bias) и дисперсии (variance) моделей можно использовать метод перекрестной проверки (cross-validation). Этот метод позволяет оценить, насколько хорошо модель обобщается на новых данных.

Оценка смещения и дисперсии для задачи регрессии: Для задачи регрессии мы будем использовать метрики MAE (Mean Absolute Error) и R² (R-squared) для оценки смещения и дисперсии.

Оценка смещения и дисперсии для задачи классификации: Для задачи классификации мы будем использовать метрики Accuracy, Precision, Recall и F1-score для оценки смещения и дисперсии.

Пример кода для оценки смещения и дисперсии:

In [23]:
import pandas as pd
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

# Загружаем набор данных
df = pd.read_csv("..//static//csv//Medical_insurance.csv")

# Определяем категориальные и числовые столбцы
categorical_cols = ['sex', 'smoker', 'region']
numerical_cols = ['age', 'bmi', 'children']

# Создаем преобразователь для категориальных и числовых столбцов
preprocessor = ColumnTransformer(
    transformers=[
        ('cat', OneHotEncoder(), categorical_cols),
        ('num', StandardScaler(), numerical_cols)
    ])

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии
X_reg = df[categorical_cols + numerical_cols]
y_reg = df['charges']

# Список моделей для задачи регрессии
models_reg = {
    "Linear Regression": LinearRegression(),
    "Random Forest Regression": RandomForestRegressor(),
    "Gradient Boosting Regression": GradientBoostingRegressor()
}

# Оценка смещения и дисперсии для задачи регрессии
print("Оценка смещения и дисперсии для задачи регрессии:")
for name, model in models_reg.items():
    pipeline = Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('model', model)
    ])
    mae_scores = -cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='neg_mean_absolute_error')
    r2_scores = cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='r2')
    print(f"Model: {name}")
    print(f"MAE (Cross-Validation): Mean = {mae_scores.mean()}, Std = {mae_scores.std()}")
    print(f"R² (Cross-Validation): Mean = {r2_scores.mean()}, Std = {r2_scores.std()}")
    print()

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации
X_class = df[categorical_cols + numerical_cols]
y_class = (df['charges'] > df['charges'].mean()).astype(int)

# Список моделей для задачи классификации
models_class = {
    "Logistic Regression": LogisticRegression(),
    "Random Forest Classification": RandomForestClassifier(),
    "Gradient Boosting Classification": GradientBoostingClassifier()
}

# Оценка смещения и дисперсии для задачи классификации
print("Оценка смещения и дисперсии для задачи классификации:")
for name, model in models_class.items():
    pipeline = Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('model', model)
    ])
    accuracy_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='accuracy')
    precision_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='precision')
    recall_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='recall')
    f1_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='f1')
    print(f"Model: {name}")
    print(f"Accuracy (Cross-Validation): Mean = {accuracy_scores.mean()}, Std = {accuracy_scores.std()}")
    print(f"Precision (Cross-Validation): Mean = {precision_scores.mean()}, Std = {precision_scores.std()}")
    print(f"Recall (Cross-Validation): Mean = {recall_scores.mean()}, Std = {recall_scores.std()}")
    print(f"F1-score (Cross-Validation): Mean = {f1_scores.mean()}, Std = {f1_scores.std()}")
    print()
Оценка смещения и дисперсии для задачи регрессии:
Model: Linear Regression
MAE (Cross-Validation): Mean = 4185.5421072063355, Std = 92.43821200753904
R² (Cross-Validation): Mean = 0.7497293059031158, Std = 0.008805026203658282

Model: Random Forest Regression
MAE (Cross-Validation): Mean = 956.4848341519103, Std = 88.92646158556248
R² (Cross-Validation): Mean = 0.9768968000358168, Std = 0.003942950295159459

Model: Gradient Boosting Regression
MAE (Cross-Validation): Mean = 2189.5694438069927, Std = 96.31677771605824
R² (Cross-Validation): Mean = 0.8873175260899913, Std = 0.011188839103376261

Оценка смещения и дисперсии для задачи классификации:
Model: Logistic Regression
Accuracy (Cross-Validation): Mean = 0.8906956776270857, Std = 0.011756347754179863
Precision (Cross-Validation): Mean = 0.9965558019216555, Std = 0.0042291925480556145
Recall (Cross-Validation): Mean = 0.6516534480440919, Std = 0.038303791687037965
F1-score (Cross-Validation): Mean = 0.7873345301431043, Std = 0.027701698921697982

Model: Random Forest Classification
Accuracy (Cross-Validation): Mean = 0.9978352359579796, Std = 0.001767524034697101
Precision (Cross-Validation): Mean = 0.9976878612716764, Std = 0.002831780049460347
Recall (Cross-Validation): Mean = 0.9953757225433526, Std = 0.004325615476039242
F1-score (Cross-Validation): Mean = 0.9965250705740019, Std = 0.002837294532624193

Model: Gradient Boosting Classification
Accuracy (Cross-Validation): Mean = 0.9354219923895014, Std = 0.005560116809131367
Precision (Cross-Validation): Mean = 0.9873539623899337, Std = 0.011266123317032629
Recall (Cross-Validation): Mean = 0.803226240086033, Std = 0.017698107137353723
F1-score (Cross-Validation): Mean = 0.8856692810850337, Std = 0.01067664691021022

In [26]:
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

# Загружаем набор данных
df = pd.read_csv("..//static//csv//Medical_insurance.csv")

# Определяем категориальные и числовые столбцы
categorical_cols = ['sex', 'smoker', 'region']
numerical_cols = ['age', 'bmi', 'children']

# Создаем преобразователь для категориальных и числовых столбцов
preprocessor = ColumnTransformer(
    transformers=[
        ('cat', OneHotEncoder(), categorical_cols),
        ('num', StandardScaler(), numerical_cols)
    ])

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии
X_reg = df[categorical_cols + numerical_cols]
y_reg = df['charges']

# Список моделей для задачи регрессии
models_reg = {
    "Linear Regression": LinearRegression(),
    "Random Forest Regression": RandomForestRegressor(),
    "Gradient Boosting Regression": GradientBoostingRegressor()
}

# Оценка смещения и дисперсии для задачи регрессии
mae_means = []
mae_stds = []
r2_means = []
r2_stds = []

for name, model in models_reg.items():
    pipeline = Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('model', model)
    ])
    mae_scores = -cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='neg_mean_absolute_error')
    r2_scores = cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='r2')
    mae_means.append(mae_scores.mean())
    mae_stds.append(mae_scores.std())
    r2_means.append(r2_scores.mean())
    r2_stds.append(r2_scores.std())

# Визуализация результатов для задачи регрессии
fig, ax = plt.subplots(1, 2, figsize=(12, 6))

ax[0].bar(models_reg.keys(), mae_means, yerr=mae_stds, align='center', alpha=0.5, ecolor='black', capsize=10)
ax[0].set_ylabel('MAE')
ax[0].set_title('Mean Absolute Error (MAE) for Regression Models')
ax[0].yaxis.grid(True)

ax[1].bar(models_reg.keys(), r2_means, yerr=r2_stds, align='center', alpha=0.5, ecolor='black', capsize=10)
ax[1].set_ylabel('R²')
ax[1].set_title('R-squared (R²) for Regression Models')
ax[1].yaxis.grid(True)

plt.tight_layout()
plt.show()

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации
X_class = df[categorical_cols + numerical_cols]
y_class = (df['charges'] > df['charges'].mean()).astype(int)

# Список моделей для задачи классификации
models_class = {
    "Logistic Regression": LogisticRegression(),
    "Random Forest Classification": RandomForestClassifier(),
    "Gradient Boosting Classification": GradientBoostingClassifier()
}

# Оценка смещения и дисперсии для задачи классификации
accuracy_means = []
accuracy_stds = []
precision_means = []
precision_stds = []
recall_means = []
recall_stds = []
f1_means = []
f1_stds = []

for name, model in models_class.items():
    pipeline = Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('model', model)
    ])
    accuracy_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='accuracy')
    precision_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='precision')
    recall_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='recall')
    f1_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='f1')
    accuracy_means.append(accuracy_scores.mean())
    accuracy_stds.append(accuracy_scores.std())
    precision_means.append(precision_scores.mean())
    precision_stds.append(precision_scores.std())
    recall_means.append(recall_scores.mean())
    recall_stds.append(recall_scores.std())
    f1_means.append(f1_scores.mean())
    f1_stds.append(f1_scores.std())

# Визуализация результатов для задачи классификации
fig, ax = plt.subplots(2, 2, figsize=(12, 12))

ax[0, 0].bar(models_class.keys(), accuracy_means, yerr=accuracy_stds, align='center', alpha=0.5, ecolor='black', capsize=10)
ax[0, 0].set_ylabel('Accuracy')
ax[0, 0].set_title('Accuracy for Classification Models')
ax[0, 0].yaxis.grid(True)

ax[0, 1].bar(models_class.keys(), precision_means, yerr=precision_stds, align='center', alpha=0.5, ecolor='black', capsize=10)
ax[0, 1].set_ylabel('Precision')
ax[0, 1].set_title('Precision for Classification Models')
ax[0, 1].yaxis.grid(True)

ax[1, 0].bar(models_class.keys(), recall_means, yerr=recall_stds, align='center', alpha=0.5, ecolor='black', capsize=10)
ax[1, 0].set_ylabel('Recall')
ax[1, 0].set_title('Recall for Classification Models')
ax[1, 0].yaxis.grid(True)

ax[1, 1].bar(models_class.keys(), f1_means, yerr=f1_stds, align='center', alpha=0.5, ecolor='black', capsize=10)
ax[1, 1].set_ylabel('F1-score')
ax[1, 1].set_title('F1-score for Classification Models')
ax[1, 1].yaxis.grid(True)

plt.tight_layout()
plt.show()
No description has been provided for this image
No description has been provided for this image