50 KiB
50 KiB
- Бизнес цели - опредение наличия заболивания у человека
- Подготовка данных
In [171]:
import matplotlib.pyplot as plt
import pandas as pd
from prompt_toolkit.shortcuts.progress_bar import Percentage
df = pd.read_csv("healthcare-dataset-stroke-data.csv")
print(df.columns)
print(df)
In [172]:
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10, 6))
sns.boxplot(x=df['age'])
plt.title('Box Plot для age')
plt.xlabel('age')
plt.show()
In [173]:
import pandas as pd
# Количество пустых значений признаков
print(df.isnull().sum())
print()
# Есть ли пустые значения признаков
print(df.isnull().any())
print()
# Процент пустых значений признаков
for i in df.columns:
null_rate = df[i].isnull().sum() / len(df) * 100
if null_rate > 0:
print(f"{i} процент пустых значений: %{null_rate:.2f}")
In [174]:
# Замена пустых данных на медиану
df["bmi"] = df["bmi"].fillna(df["bmi"].median())
# Процент пустых значений признаков
for i in df.columns:
null_rate = df[i].isnull().sum() / len(df) * 100
if null_rate > 0:
print(f"{i} процент пустых значений: %{null_rate:.2f}")
- Унитарное кодирование
In [175]:
from sklearn.preprocessing import OneHotEncoder
import numpy as np
encoder = OneHotEncoder(sparse_output=False, drop="first")
df = df[["age", "gender", "hypertension", "work_type", "avg_glucose_level", "bmi", "smoking_status"]]
df = df.query('gender == "Male" or gender == "Female"')
encoded_values = encoder.fit_transform(df[["gender", "work_type", "smoking_status"]])
encoded_columns = encoder.get_feature_names_out(["gender", "work_type", "smoking_status"])
encoded_values_df = pd.DataFrame(encoded_values, columns=encoded_columns)
df = pd.concat([df, encoded_values_df], axis=1)
df
Out[175]:
- Дискретизация признаков
In [176]:
df["age"] = pd.qcut(df["age"], q=5, labels=False)
df
Out[176]:
- Разбиение данных
In [177]:
# Функция для создания выборок
from sklearn.model_selection import train_test_split
dropna_df = df.dropna()
df_input = dropna_df[[
"age",
"hypertension",
"avg_glucose_level",
"bmi",
"gender_Male",
"work_type_Never_worked",
"work_type_Private",
"work_type_Self-employed",
"work_type_children",
"smoking_status_formerly smoked",
"smoking_status_never smoked",
"smoking_status_smokes",
]]
print(df_input.head())
train_df, temp_df = train_test_split(df_input, test_size=0.4, random_state=42)
# Разделение остатка на контрольную и тестовую выборки
val_df, test_df = train_test_split(temp_df, test_size=0.5, random_state=42)
# Проверка размеров выборок
print("Размер обучающей выборки:", len(train_df))
print("Размер контрольной выборки:", len(val_df))
print("Размер тестовой выборки:", len(test_df))
# Сохранение выборок в файлы
train_df.to_csv(".//static//csv//train_data.csv", index=False)
val_df.to_csv(".//static//csv//val_data.csv", index=False)
test_df.to_csv(".//static//csv//test_data.csv", index=False)
In [178]:
train_df = pd.read_csv(".//static//csv//train_data.csv")
val_df = pd.read_csv(".//static//csv//val_data.csv")
test_df = pd.read_csv(".//static//csv//test_data.csv")
def check_balance(df, name):
print(f"Распределение gender в {name}:")
print(f"Процент gender_Male: {df["gender_Male"].value_counts()[1.0] / len(df) * 100:.2f}%")
print(f"Процент gender_Female: {(len(df) - df["gender_Male"].value_counts()[1.0]) / len(df) * 100:.2f}%")
print()
check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
Выборка сбалансирована