2024-12-17 15:42:49 +04:00

334 KiB
Raw Blame History

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

In [130]:
import pandas as pd

df = pd.read_csv(
    ".//static//csv///world-population-by-country-2020.csv", index_col="no"
)

df["Population2020"] = df["Population2020"].apply(lambda x: int("".join(x.split(","))))
df["NetChange"] = df["NetChange"].apply(lambda x: int("".join(x.split(","))))
df["Yearly Change"] = df["Yearly Change"].apply(lambda x: float("".join(x.rstrip("%"))))
df["LandArea"] = df["LandArea"].apply(lambda x: int("".join(x.split(","))))

df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 235 entries, 1 to 235
Data columns (total 11 columns):
 #   Column                   Non-Null Count  Dtype  
---  ------                   --------------  -----  
 0   Country (or dependency)  235 non-null    object 
 1   Population2020           235 non-null    int64  
 2   Yearly Change            235 non-null    float64
 3   NetChange                235 non-null    int64  
 4   Density                  235 non-null    object 
 5   LandArea                 235 non-null    int64  
 6   Migrants (net)           201 non-null    object 
 7   Fert. Rate               235 non-null    object 
 8   Med. Age                 235 non-null    object 
 9   Urban Pop %              235 non-null    object 
 10  World Share              235 non-null    object 
dtypes: float64(1), int64(3), object(7)
memory usage: 22.0+ KB

Бизнес-цели

  1. Прогнозирование популяции в странах:

Цель: Разработать модель, которая будет предсказывать популяцию в странах Применение: Погнозировать глобальную мировую экономику

  1. Оптимизация характеристик: Цель: Определить оптимальные характеристик по увеличению популяции. Применение: Понять, какие характеристики соответствуют увеличению популяцию
  1. Прогнозирование популяции
In [131]:
import pandas as pd

df = pd.read_csv(
    ".//static//csv///world-population-by-country-2020.csv", index_col="no"
)

df["Population2020"] = df["Population2020"].apply(lambda x: int("".join(x.split(","))))
df["NetChange"] = df["NetChange"].apply(lambda x: int("".join(x.split(","))))
df["Yearly Change"] = df["Yearly Change"].apply(lambda x: float("".join(x.rstrip("%"))))
df["LandArea"] = df["LandArea"].apply(lambda x: int("".join(x.split(","))))

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

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

# Создаем новую переменную, указывающую, превышает ли популяция среднее
df["above_average_Population2020"] = (df["Population2020"] > average_count).astype(int)

# Рассчитываем волатильность (разницу между максимальной и минимальной популяцией)
df["Population2020_volatility"] = df["Population2020"].max() - df["Population2020"].min()

# Выводим первые строки измененной таблицы для проверки
print(df.head())
Среднее значение поля 'Population2020: 33171202.680851065
   Country (or dependency)  Population2020  Yearly Change  NetChange Density  \
no                                                                             
1                    China      1439323776           0.39    5540090     153   
2                    India      1380004385           0.99   13586631     464   
3            United States       331002651           0.59    1937734      36   
4                Indonesia       273523615           1.07    2898047     151   
5                 Pakistan       220892340           2.00    4327022     287   

    LandArea Migrants (net) Fert. Rate Med. Age Urban Pop % World Share  \
no                                                                        
1    9388211       -348,399        1.7       38         61%      18.47%   
2    2973190       -532,687        2.2       28         35%      17.70%   
3    9147420        954,806        1.8       38         83%       4.25%   
4    1811570        -98,955        2.3       30         56%       3.51%   
5     770880       -233,379        3.6       23         35%       2.83%   

    above_average_Population2020  Population2020_volatility  
no                                                           
1                              1                 1439322975  
2                              1                 1439322975  
3                              1                 1439322975  
4                              1                 1439322975  
5                              1                 1439322975  
  1. Оптимизация параметров магазина:
In [132]:
import pandas as pd

# Загружаем набор данных
df = pd.read_csv(
    ".//static//csv///world-population-by-country-2020.csv", index_col="no"
)

df["Population2020"] = df["Population2020"].apply(lambda x: int("".join(x.split(","))))
df["NetChange"] = df["NetChange"].apply(lambda x: int("".join(x.split(","))))
df["Yearly Change"] = df["Yearly Change"].apply(lambda x: float("".join(x.rstrip("%"))))
df["LandArea"] = df["LandArea"].apply(lambda x: int("".join(x.split(","))))

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

# Рассчитываем среднюю популяцию для каждого значения каждого признака
for column in ["NetChange", "Yearly Change", "LandArea", "Density"]:
    print(f"Средняя популяция для '{column}':")
    print(df.groupby(column)["Population2020"].mean())
    print()


print("Средняя популяция для комбинации 'NetChange' и 'LandArea':")
print(df.groupby(["NetChange", "LandArea"])["Population2020"].mean())
print()


print("Средняя популяция для комбинации 'LandArea' и 'Density':")
print(df.groupby(["LandArea", "Density"])["Population2020"].mean())
print()
Средняя популяция для 'NetChange':
NetChange
-383840      1.264765e+08
-259876      4.373376e+07
-126866      1.923769e+07
-88249       6.046183e+07
-79889       2.843594e+07
                 ...     
 2898047     2.735236e+08
 4327022     2.208923e+08
 5175990     2.061396e+08
 5540090     1.439324e+09
 13586631    1.380004e+09
Name: Population2020, Length: 234, dtype: float64

Средняя популяция для 'Yearly Change':
Yearly Change
-2.47     2860853.0
-1.69       11239.0
-1.35     2722289.0
-1.08     1886198.0
-0.74     6948445.0
            ...    
 3.27    32866272.0
 3.32    45741007.0
 3.47     1402985.0
 3.68     1701575.0
 3.84    24206644.0
Name: Population2020, Length: 174, dtype: float64

Средняя популяция для 'LandArea':
LandArea
0           8.010000e+02
1           3.924200e+04
10          1.752400e+04
20          1.082400e+04
21          9.877000e+03
                ...     
8358140     2.125594e+08
9093510     3.774215e+07
9147420     3.310027e+08
9388211     1.439324e+09
16376870    1.459345e+08
Name: Population2020, Length: 226, dtype: float64

Средняя популяция для 'Density':
Density
0            30125.0
1,246        62278.0
1,261        42876.0
1,265    164689383.0
1,380       441543.0
            ...     
93        40222493.0
94        50263037.0
95        17109811.5
96           71986.0
99        32365999.0
Name: Population2020, Length: 165, dtype: float64

Средняя популяция для комбинации 'NetChange' и 'LandArea':
NetChange  LandArea
-383840    364555      1.264765e+08
-259876    579320      4.373376e+07
-126866    230170      1.923769e+07
-88249     294140      6.046183e+07
-79889     882050      2.843594e+07
                           ...     
 2898047   1811570     2.735236e+08
 4327022   770880      2.208923e+08
 5175990   910770      2.061396e+08
 5540090   9388211     1.439324e+09
 13586631  2973190     1.380004e+09
Name: Population2020, Length: 235, dtype: float64

Средняя популяция для комбинации 'LandArea' и 'Density':
LandArea  Density
0         2,003      8.010000e+02
1         26,337     3.924200e+04
10        136        1.357000e+03
          3,369      3.369100e+04
20        541        1.082400e+04
                         ...     
8358140   25         2.125594e+08
9093510   4          3.774215e+07
9147420   36         3.310027e+08
9388211   153        1.439324e+09
16376870  9          1.459345e+08
Name: Population2020, Length: 235, dtype: float64

Выбор ориентира:

  1. Прогнозирование стоимости акций взносов: Ориентир:

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

MAE (средняя абсолютная ошибка): 1000000 - 1500000 продаж

RMSE (среднеквадратичная ошибка): 1200000 - 1600000 продаж

In [133]:
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///world-population-by-country-2020.csv", index_col="no"
)

df["Population2020"] = df["Population2020"].apply(lambda x: int("".join(x.split(","))))
df["NetChange"] = df["NetChange"].apply(lambda x: int("".join(x.split(","))))
df["Yearly Change"] = df["Yearly Change"].apply(lambda x: float("".join(x.rstrip("%"))))
df["LandArea"] = df["LandArea"].apply(lambda x: int("".join(x.split(","))))
df["Density"] = df["Density"].apply(lambda x: int("".join(x.split(","))))

# Разделяем данные на признаки (X) и целевую переменную (y)

X = df.drop(
    columns=[
        "Population2020",
        "Country (or dependency)",
        "Migrants (net)",
        "Fert. Rate",
        "Med. Age",
        "Urban Pop %",
        "World Share",
        "Density",
    ],
    axis=1,
)

y = df["Population2020"]

# Разделяем данные на обучающую и тестовую выборки
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 <= 1500000 and rmse <= 1700000:
    print("Ориентиры для прогнозирования достигнуты!")
else:
    print("Ориентиры для прогнозирования не достигнуты.")


columns_to_group = [

    "LandArea",
    "NetChange", "Density"
]

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

# Рассчитываем средняя популяция для комбинаций признаков


print(df.groupby(["NetChange", "LandArea"])["Population2020"].mean())
print()


print(df.groupby(["LandArea", "Density"])["Population2020"].mean())
print()
MAE: 18325226.004086882
MSE: 1372712018411057.2
RMSE: 37050128.453367844
R²: -0.22943866941880264
Ориентиры для прогнозирования не достигнуты.
Средняя популяция 'LandArea':
LandArea
0           8.010000e+02
1           3.924200e+04
10          1.752400e+04
20          1.082400e+04
21          9.877000e+03
                ...     
8358140     2.125594e+08
9093510     3.774215e+07
9147420     3.310027e+08
9388211     1.439324e+09
16376870    1.459345e+08
Name: Population2020, Length: 226, dtype: float64

Средняя популяция 'NetChange':
NetChange
-383840      1.264765e+08
-259876      4.373376e+07
-126866      1.923769e+07
-88249       6.046183e+07
-79889       2.843594e+07
                 ...     
 2898047     2.735236e+08
 4327022     2.208923e+08
 5175990     2.061396e+08
 5540090     1.439324e+09
 13586631    1.380004e+09
Name: Population2020, Length: 234, dtype: float64

Средняя популяция 'Density':
Density
0        3.012500e+04
2        1.937814e+06
3        9.460677e+06
4        8.106156e+06
5        4.649658e+06
             ...     
3369     3.369100e+04
7140     7.496981e+06
8358     5.850342e+06
21645    6.493350e+05
26337    3.924200e+04
Name: Population2020, Length: 165, dtype: float64

NetChange  LandArea
-383840    364555      1.264765e+08
-259876    579320      4.373376e+07
-126866    230170      1.923769e+07
-88249     294140      6.046183e+07
-79889     882050      2.843594e+07
                           ...     
 2898047   1811570     2.735236e+08
 4327022   770880      2.208923e+08
 5175990   910770      2.061396e+08
 5540090   9388211     1.439324e+09
 13586631  2973190     1.380004e+09
Name: Population2020, Length: 235, dtype: float64

LandArea  Density
0         2003       8.010000e+02
1         26337      3.924200e+04
10        136        1.357000e+03
          3369       3.369100e+04
20        541        1.082400e+04
                         ...     
8358140   25         2.125594e+08
9093510   4          3.774215e+07
9147420   36         3.310027e+08
9388211   153        1.439324e+09
16376870  9          1.459345e+08
Name: Population2020, Length: 235, dtype: float64

d:\3_КУРС_ПИ\МИИ\aisenv\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 [134]:
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///world-population-by-country-2020.csv", index_col="no"
)

df["Population2020"] = df["Population2020"].apply(lambda x: int("".join(x.split(","))))
df["NetChange"] = df["NetChange"].apply(lambda x: int("".join(x.split(","))))
df["Yearly Change"] = df["Yearly Change"].apply(lambda x: float("".join(x.rstrip("%"))))
df["LandArea"] = df["LandArea"].apply(lambda x: int("".join(x.split(","))))


# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии
X_reg = df.drop(
    columns=[
        "Population2020",
        "Country (or dependency)",
        "Migrants (net)",
        "Fert. Rate",
        "Med. Age",
        "Urban Pop %",
        "World Share",
        "Density",
    ],
    axis=1,
)
y_reg = df["Population2020"]

# Разделяем данные на обучающую и тестовую выборки для задачи регрессии
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(
    columns=[
        "Population2020",
        "Country (or dependency)",
        "Migrants (net)",
        "Fert. Rate",
        "Med. Age",
        "Urban Pop %",
        "World Share",
        "Density",
    ],
    axis=1,
)
y_class = (df["Population2020"] > df["Population2020"].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: 18325226.004086882
MSE: 1372712018411057.2
RMSE: 37050128.453367844
R²: -0.22943866941880264

d:\3_КУРС_ПИ\МИИ\aisenv\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(
d:\3_КУРС_ПИ\МИИ\aisenv\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(
d:\3_КУРС_ПИ\МИИ\aisenv\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: 8668932.614893615
MSE: 406442910254215.25
RMSE: 20160429.31720987
R²: 0.63597854169292

Model: Gradient Boosting Regression
MAE: 8278621.445813501
MSE: 351479677103981.1
RMSE: 18747791.259345222
R²: 0.6852051262385974

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

Model: Random Forest Classification
Accuracy: 0.9574468085106383

Model: Gradient Boosting Classification
Accuracy: 0.8936170212765957

  1. Прогнозирование стоимости акций: Конвейер для задачи регрессии:
In [135]:
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///world-population-by-country-2020.csv", index_col="no"
)

df["Population2020"] = df["Population2020"].apply(lambda x: int("".join(x.split(","))))
df["NetChange"] = df["NetChange"].apply(lambda x: int("".join(x.split(","))))
df["Yearly Change"] = df["Yearly Change"].apply(lambda x: float("".join(x.rstrip("%"))))
df["LandArea"] = df["LandArea"].apply(lambda x: int("".join(x.split(","))))
df["Density"] = df["Density"].apply(lambda x: int("".join(x.split(","))))


numerical_cols = ["NetChange", "Yearly Change", "LandArea", "Density"]


preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), numerical_cols)
    ])

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

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

# Разделяем данные на обучающую и тестовую выборки для задачи регрессии
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: 18355084.060291413
MSE: 1373553690261338.5
RMSE: 37061485.26788071
R²: -0.23019249389605534

d:\3_КУРС_ПИ\МИИ\aisenv\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(
d:\3_КУРС_ПИ\МИИ\aisenv\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: 8360523.173191491
MSE: 433344291612551.56
RMSE: 20816923.20235033
R²: 0.6118849240519788

Model: Gradient Boosting Regression
MAE: 7374600.833694444
MSE: 279881158669974.12
RMSE: 16729649.089863604
R²: 0.7493307301928449

d:\3_КУРС_ПИ\МИИ\aisenv\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 [136]:
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///world-population-by-country-2020.csv", index_col="no"
)

df["Population2020"] = df["Population2020"].apply(lambda x: int("".join(x.split(","))))
df["NetChange"] = df["NetChange"].apply(lambda x: int("".join(x.split(","))))
df["Yearly Change"] = df["Yearly Change"].apply(lambda x: float("".join(x.rstrip("%"))))
df["LandArea"] = df["LandArea"].apply(lambda x: int("".join(x.split(","))))
df["Density"] = df["Density"].apply(lambda x: int("".join(x.split(","))))

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

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

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации
X_class = df[numerical_cols]
y_class = (df["Population2020"] > df["Population2020"].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.8936170212765957

Model: Random Forest Classification
Accuracy: 0.9361702127659575

Model: Gradient Boosting Classification
Accuracy: 0.9148936170212766

  1. Прогнозирование популяции:

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

In [137]:
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///world-population-by-country-2020.csv", index_col="no"
)

df["Population2020"] = df["Population2020"].apply(lambda x: int("".join(x.split(","))))
df["NetChange"] = df["NetChange"].apply(lambda x: int("".join(x.split(","))))
df["Yearly Change"] = df["Yearly Change"].apply(lambda x: float("".join(x.rstrip("%"))))
df["LandArea"] = df["LandArea"].apply(lambda x: int("".join(x.split(","))))
df["Density"] = df["Density"].apply(lambda x: int("".join(x.split(","))))

# Определяем категориальные и числовые столбцы

numerical_cols = ["NetChange", "Yearly Change", "LandArea", "Density"]

# Создаем преобразователь для категориальных и числовых столбцов
preprocessor = ColumnTransformer(
    transformers=[
        ('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[numerical_cols]
y_reg = df['Population2020']

# Разделяем данные на обучающую и тестовую выборки для задачи регрессии
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: 18355084.060291413
MSE: 1373553690261338.5
RMSE: 37061485.26788071
R²: -0.23019249389605534

d:\3_КУРС_ПИ\МИИ\aisenv\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(
d:\3_КУРС_ПИ\МИИ\aisenv\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: 8240284.800957445
MSE: 400813836952793.8
RMSE: 20020335.585418988
R²: 0.6410200946894263

Model: Gradient Boosting Regression
Best Parameters: {'model__learning_rate': 0.1, 'model__max_depth': 3, 'model__n_estimators': 200}
MAE: 7008860.588160669
MSE: 275375287564661.78
RMSE: 16594435.439769013
R²: 0.7533663123848768

d:\3_КУРС_ПИ\МИИ\aisenv\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 [138]:
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///world-population-by-country-2020.csv", index_col="no"
)

df["Population2020"] = df["Population2020"].apply(lambda x: int("".join(x.split(","))))
df["NetChange"] = df["NetChange"].apply(lambda x: int("".join(x.split(","))))
df["Yearly Change"] = df["Yearly Change"].apply(lambda x: float("".join(x.rstrip("%"))))
df["LandArea"] = df["LandArea"].apply(lambda x: int("".join(x.split(","))))
df["Density"] = df["Density"].apply(lambda x: int("".join(x.split(","))))

# Определяем категориальные и числовые столбцы

numerical_cols = ["NetChange", "Yearly Change", "LandArea", "Density"]

# Создаем преобразователь для категориальных и числовых столбцов
preprocessor = ColumnTransformer(
    transformers=[
        ('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[numerical_cols]
y_class = (df['Population2020'] > df['Population2020'].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': 1, 'model__solver': 'liblinear'}
Accuracy: 0.8936170212765957

Model: Random Forest Classification
Best Parameters: {'model__max_depth': None, 'model__n_estimators': 200}
Accuracy: 0.9574468085106383

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

  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 [139]:
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 import metrics
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///world-population-by-country-2020.csv", index_col="no"
)

df["Population2020"] = df["Population2020"].apply(lambda x: int("".join(x.split(","))))
df["NetChange"] = df["NetChange"].apply(lambda x: int("".join(x.split(","))))
df["Yearly Change"] = df["Yearly Change"].apply(lambda x: float("".join(x.rstrip("%"))))
df["LandArea"] = df["LandArea"].apply(lambda x: int("".join(x.split(","))))
df["Density"] = df["Density"].apply(lambda x: int("".join(x.split(","))))

numerical_cols = ["NetChange", "Yearly Change", "LandArea", "Density"]

# Создаем преобразователь для категориальных и числовых столбцов
preprocessor = ColumnTransformer(
    transformers=[
        ('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[numerical_cols]
y_reg = df['Population2020']

# Разделяем данные на обучающую и тестовую выборки для задачи регрессии
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[numerical_cols]
y_class = (df['Population2020'] > df['Population2020'].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()

    fpr, tpr, _ = metrics.roc_curve(y_test_class, y_pred_class)
# построение ROC кривой
plt.plot(fpr, tpr)
plt.ylabel("True Positive Rate")
plt.xlabel("False Positive Rate")
plt.show()
Результаты для задачи регрессии:
Model: Linear Regression
Best Parameters: {}
MAE: 18355084.060291413
MSE: 1373553690261338.5
RMSE: 37061485.26788071
R²: -0.23019249389605534

d:\3_КУРС_ПИ\МИИ\aisenv\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(
d:\3_КУРС_ПИ\МИИ\aisenv\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: 8207608.10893617
MSE: 390570064659169.6
RMSE: 19762845.560778175
R²: 0.6501946991290963

d:\3_КУРС_ПИ\МИИ\aisenv\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': 3, 'model__n_estimators': 200}
MAE: 7140734.77304005
MSE: 290599190343546.25
RMSE: 17046970.122093435
R²: 0.7397313659978713

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

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

No description has been provided for this image
Model: Gradient Boosting Classification
Best Parameters: {'model__learning_rate': 0.01, 'model__max_depth': 5, 'model__n_estimators': 200}
Accuracy: 0.9148936170212766
Precision: 0.8571428571428571
Recall: 0.6666666666666666
F1-score: 0.75

No description has been provided for this image
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 [140]:
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///world-population-by-country-2020.csv", index_col="no"
)

df["Population2020"] = df["Population2020"].apply(lambda x: int("".join(x.split(","))))
df["NetChange"] = df["NetChange"].apply(lambda x: int("".join(x.split(","))))
df["Yearly Change"] = df["Yearly Change"].apply(lambda x: float("".join(x.rstrip("%"))))
df["LandArea"] = df["LandArea"].apply(lambda x: int("".join(x.split(","))))
df["Density"] = df["Density"].apply(lambda x: int("".join(x.split(","))))

# Определяем категориальные и числовые столбцы

numerical_cols = ["NetChange", "Yearly Change", "LandArea", "Density"]

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

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

# Список моделей для задачи регрессии
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[numerical_cols]
y_class = (df['Population2020'] > df['Population2020'].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 = 29840383.42279941, Std = 27144603.41689917
R² (Cross-Validation): Mean = -21089.965883559045, Std = 41156.25923282549

Model: Random Forest Regression
MAE (Cross-Validation): Mean = 26665786.071446814, Std = 46081535.77323325
R² (Cross-Validation): Mean = -363.4188861822276, Std = 719.8191512710059

Model: Gradient Boosting Regression
MAE (Cross-Validation): Mean = 25735773.24094847, Std = 45055407.0307318
R² (Cross-Validation): Mean = -457.52444446928376, Std = 910.2095956390277

Оценка смещения и дисперсии для задачи классификации:
d:\3_КУРС_ПИ\МИИ\aisenv\Lib\site-packages\sklearn\metrics\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, f"{metric.capitalize()} is", len(result))
Model: Logistic Regression
Accuracy (Cross-Validation): Mean = 0.8553191489361703, Std = 0.05613151471605499
Precision (Cross-Validation): Mean = 0.6947368421052632, Std = 0.40276055725703136
Recall (Cross-Validation): Mean = 0.40555555555555556, Std = 0.4034381559533162
F1-score (Cross-Validation): Mean = 0.3924603174603175, Std = 0.31860013632010536

Model: Random Forest Classification
Accuracy (Cross-Validation): Mean = 0.8340425531914895, Std = 0.21714639697315868
Precision (Cross-Validation): Mean = 0.8457142857142858, Std = 0.3085714285714286
Recall (Cross-Validation): Mean = 0.7277777777777777, Std = 0.18604891166267057
F1-score (Cross-Validation): Mean = 0.7121367521367521, Std = 0.20909441956885236

Model: Gradient Boosting Classification
Accuracy (Cross-Validation): Mean = 0.8340425531914895, Std = 0.2179786974445225
Precision (Cross-Validation): Mean = 0.8486486486486486, Std = 0.3027027027027027
Recall (Cross-Validation): Mean = 0.725, Std = 0.2549509756796392
F1-score (Cross-Validation): Mean = 0.7126265039308517, Std = 0.21811324450544675

In [141]:
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///world-population-by-country-2020.csv", index_col="no"
)

df["Population2020"] = df["Population2020"].apply(lambda x: int("".join(x.split(","))))
df["NetChange"] = df["NetChange"].apply(lambda x: int("".join(x.split(","))))
df["Yearly Change"] = df["Yearly Change"].apply(lambda x: float("".join(x.rstrip("%"))))
df["LandArea"] = df["LandArea"].apply(lambda x: int("".join(x.split(","))))
df["Density"] = df["Density"].apply(lambda x: int("".join(x.split(","))))

# Определяем категориальные и числовые столбцы
numerical_cols = ["NetChange", "Yearly Change", "LandArea", "Density"]

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

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

# Список моделей для задачи регрессии
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[numerical_cols]
y_class = (df['Population2020'] > df['Population2020'].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
d:\3_КУРС_ПИ\МИИ\aisenv\Lib\site-packages\sklearn\metrics\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, f"{metric.capitalize()} is", len(result))
No description has been provided for this image