942 KiB
942 KiB
Загрузка и подготовка данных для анализа¶
In [ ]:
import pandas as pd
df = pd.read_csv("data/cardio_cleared.csv", index_col="id")
df.info()
Изучение особенностей данных¶
In [20]:
df.describe().T
Out[20]:
Подготовка набора данных для логистической регрессии¶
In [21]:
from sklearn.model_selection import train_test_split
random_state = 111
y = df['cardio']
X = df.drop(['cardio'], axis=1).copy()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15, random_state=random_state)
Обучение модели логистической регрессии¶
In [22]:
import statsmodels.api as sm
log_model = sm.Logit(y_train, sm.add_constant(X_train))
log_result = log_model.fit()
log_result.summary2()
Out[22]:
Вычисление экспоненты значения для колонки Coef. признаков¶
In [23]:
import numpy as np
np.exp(log_result.params).sort_values(ascending=False)
Out[23]:
Предсказание результатов для тестового набора¶
In [24]:
y_pred = log_result.predict(sm.add_constant(X_test)).to_numpy()
y_pred
Out[24]:
Оценка качества классификации¶
In [25]:
from sklearn import metrics
y_pred_bin = (y_pred > 0.5).astype(int)
f1 = metrics.f1_score(y_test, y_pred_bin)
f1
Out[25]:
Результат конкретного случая № 68325¶
In [26]:
current_id = 68325
hl_index = X_test.index.get_loc(current_id)
display(X_test.iloc[hl_index])
display(y_pred[hl_index])
Получение данных для определения границы решения¶
Построение графиков зависимости параметров для определения границы решения
In [40]:
import matplotlib.pyplot as plt
from plots import create_decision_plot
filter = {
"age": (30, 35),
"gender": (1, 2),
"height": (165, 40),
"weight": (57, 50),
"ap_hi": (115, 60),
"ap_lo": (75, 40),
"cholesterol": (1, 3),
"gluc": (1, 3),
"smoke": (0, 2),
"alco": (0, 2),
"active": (1, 2),
}
plt.rcParams.update({"font.size": 14})
fig, axarr = plt.subplots(2, 2, figsize=(12, 8), sharex=True, sharey=False)
create_decision_plot(
X_test,
y_test,
log_result,
["ap_hi", "age"],
["ap_hi мм рт. ст.", "возраст, годы"],
hl_index,
filter,
ax=axarr.flat[0],
)
create_decision_plot(
X_test,
y_test,
log_result,
["ap_hi", "cholesterol"],
["ap_hi, мм рт. ст.", "холестерин [1-3]"],
hl_index,
filter,
ax=axarr.flat[1],
)
create_decision_plot(
X_test,
y_test,
log_result,
["ap_hi", "ap_lo"],
["ap_hi, мм рт. ст.", "ap_lo, мм рт. ст."],
hl_index,
filter,
ax=axarr.flat[2],
)
create_decision_plot(
X_test,
y_test,
log_result,
["ap_hi", "weight"],
["ap_hi, мм рт. ст.", "вес, кг"],
hl_index,
filter,
ax=axarr.flat[3],
)
plt.subplots_adjust(top=1, bottom=0, hspace=0.2, wspace=0.2)
plt.show()
Построение графика для определения зависимости между ростом и весом¶
In [41]:
fig, ax = plt.subplots(1, 1, figsize=(8, 6))
create_decision_plot(
X_test,
y_test,
log_result,
["height", "weight"],
["рост, см", "вес, кг"],
hl_index,
filter,
ax=ax,
)
plt.show()
Добавление расчета индекса массы тела¶
In [29]:
X2 = df.drop(["cardio"], axis=1).copy()
X2["bmi"] = X2["weight"] / (X2["height"] / 100) ** 2
X2_train, X2_test, _, _ = train_test_split(X2, y, test_size=0.15, random_state=random_state)
Визуализация зависимости роста, веса и ИМТ¶
In [30]:
fig, axs = plt.subplots(1,3, figsize=(15,4))
axs[0].scatter(X2["weight"], X2["bmi"], color='black', s=2)
axs[0].set_xlabel('вес [кг]')
axs[0].set_ylabel('ИМТ')
axs[1].scatter(X2["height"], X2["weight"], color='black', s=2)
axs[1].set_xlabel('рост, см')
axs[1].set_ylabel('вес, кг')
axs[2].scatter(X2["bmi"], X2["height"], color='black', s=2)
axs[2].set_xlabel('ИМТ')
axs[2].set_ylabel('рост, см')
plt.subplots_adjust(top = 1, bottom=0, hspace=0.2, wspace=0.3)
plt.show()
Обучение новой модели с учетом ИМТ¶
In [31]:
log_model2 = sm.Logit(y_train, sm.add_constant(X2_train))
log_result2 = log_model2.fit()
Визуализация зависимости давления ap_hi от ИМТ¶
In [46]:
X2_filter = {
"age": (60, 35),
"gender": (1, 2),
"height": (160, 120),
"weight": (60, 150),
"ap_hi": (120, 140),
"ap_lo": (80, 70),
"cholesterol": (1, 3),
"gluc": (1, 3),
"smoke": (0, 2),
"alco": (0, 2),
"active": (1, 2),
"bmi": (20, 60),
}
fig, ax = plt.subplots(1, 1, figsize=(12, 8))
create_decision_plot(
X2_test,
y_test,
log_result2,
["ap_hi", "bmi"],
["ap_hi, мм рт.ст.", "ИМТ"],
hl_index,
X2_filter,
ax=ax,
)
plt.show()