265 KiB
265 KiB
Лабораторная 7¶
Датасет: Набор данных для анализа и прогнозирования сердечного приступа
In [2]:
import pandas as pd
df = pd.read_csv(".//static//csv//heart_2020_cleaned.csv")
df
Out[2]:
Создадим лингвистические переменные и произведем их настройку
Входные: BMI (индекс массы тела) и SleepTime (продолжительность сна)
Выходные: PhysicalHealth (физическое здоровье)
In [3]:
import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
bmi = ctrl.Antecedent(np.arange(df["BMI"].min(), df["BMI"].max() + 0.1, 0.1), "BMI")
sleep_time = ctrl.Antecedent(np.arange(df["SleepTime"].min(), df["SleepTime"].max() + 0.1, 0.1), "SleepTime")
physical_health = ctrl.Consequent(np.arange(df["PhysicalHealth"].min(), df["PhysicalHealth"].max() + 1, 1), "PhysicalHealth")
bmi["low"] = fuzz.zmf(bmi.universe, 12, 18)
bmi["normal"] = fuzz.trapmf(bmi.universe, [16, 19, 24, 27])
bmi["high"] = fuzz.smf(bmi.universe, 25, 35)
sleep_time["short"] = fuzz.zmf(sleep_time.universe, 3, 5)
sleep_time["normal"] = fuzz.trapmf(sleep_time.universe, [4, 6, 8, 9])
sleep_time["long"] = fuzz.smf(sleep_time.universe, 8, 10)
physical_health["good"] = fuzz.zmf(physical_health.universe, 0, 5)
physical_health["moderate"] = fuzz.trapmf(physical_health.universe, [3, 7, 15, 20])
physical_health["poor"] = fuzz.smf(physical_health.universe, 15, 30)
bmi.view()
sleep_time.view()
physical_health.view()
Сформируем базу нечетких правил
In [4]:
rule1 = ctrl.Rule(bmi["low"] & sleep_time["short"], physical_health["moderate"])
rule2 = ctrl.Rule(bmi["low"] & sleep_time["normal"], physical_health["good"])
rule3 = ctrl.Rule(bmi["low"] & sleep_time["long"], physical_health["good"])
rule4 = ctrl.Rule(bmi["normal"] & sleep_time["short"], physical_health["moderate"])
rule5 = ctrl.Rule(bmi["normal"] & sleep_time["normal"], physical_health["good"])
rule6 = ctrl.Rule(bmi["normal"] & sleep_time["long"], physical_health["good"])
rule7 = ctrl.Rule(bmi["high"] & sleep_time["short"], physical_health["poor"])
rule8 = ctrl.Rule(bmi["high"] & sleep_time["normal"], physical_health["moderate"])
rule9 = ctrl.Rule(bmi["high"] & sleep_time["long"], physical_health["moderate"])
rule1.view()
Out[4]:
Создадим нечеткую систему и добавим созданные нечеткие правила в ее базу знаний
In [5]:
health_ctrl = ctrl.ControlSystem(
[
rule1,
rule2,
rule3,
rule4,
rule5,
rule6,
rule7,
rule8,
rule9
]
)
health_simulation = ctrl.ControlSystemSimulation(health_ctrl)
health_ctrl.view()
Проверка расчета выходной переменной
In [6]:
health_simulation.input["BMI"] = 26
health_simulation.input["SleepTime"] = 7
health_simulation.compute()
health_simulation.print_state()
health_simulation.output["PhysicalHealth"]
Out[6]:
In [7]:
physical_health.view(sim=health_simulation)
Сравним результаты работы системы с реальными данными
In [8]:
def fuzzy_pred(row):
health_simulation.input["BMI"] = row["BMI"]
health_simulation.input["SleepTime"] = row["SleepTime"]
health_simulation.compute()
return health_simulation.output["PhysicalHealth"]
result = df.copy()
result["PhysicalHealth_pred"] = result.apply(fuzzy_pred, axis=1)
result.loc[:20, ["BMI", "SleepTime", "PhysicalHealth", "PhysicalHealth_pred"]]
Out[8]:
Оценим результаты с помощью метрик регрессии
In [9]:
import math
from sklearn import metrics
rmetrics = {}
rmetrics["RMSE"] = math.sqrt(
metrics.mean_squared_error(result["PhysicalHealth"], result["PhysicalHealth_pred"])
)
rmetrics["RMAE"] = math.sqrt(
metrics.mean_absolute_error(result["PhysicalHealth"], result["PhysicalHealth_pred"])
)
rmetrics["R2"] = metrics.r2_score(
result["PhysicalHealth"], result["PhysicalHealth_pred"]
)
rmetrics
Out[9]:
Как можно заметить, нечеткая система с такими переменными и настройками со своей задачей справляется плохо