257 KiB
257 KiB
Лабораторная 7
Информация о диабете индейцев Пима
In [7]:
import pandas as pd
import numpy as np
import skfuzzy as fuzz
import matplotlib.pyplot as plt
from skfuzzy import control as ctrl
df = pd.read_csv(".//scv//diabetes.csv")
print(df.columns)
df
Out[7]:
Создаем лингвистические переменные
Входные: age(возраст) и bmi(ИМТ)
Выходные: glucose(давление)
In [8]:
age = ctrl.Antecedent(np.arange(df["Age"].min(), df["Age"].max() + 1, 1), "age")
bmi = ctrl.Antecedent(np.arange(df["BMI"].min(), df["BMI"].max() + 0.1, 0.1), "bmi")
glucose = ctrl.Consequent(np.arange(df["Glucose"].min(), df["Glucose"].max() + 0.1, 0.1), "glucose")
Настраиваем их
In [15]:
age["young"] = fuzz.zmf(age.universe, 20, 30)
age["middle-aged"] = fuzz.trapmf(age.universe, [18, 30, 45, 60])
age["old"] = fuzz.smf(age.universe, 45, 85)
age.view()
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, 27)
bmi.view()
glucose["low"] = fuzz.zmf(glucose.universe, 0, 80)
glucose["normal"] = fuzz.trapmf(glucose.universe, [70, 80, 90, 100])
glucose["high"] = fuzz.smf(glucose.universe, 90, 180)
glucose.view()
База нечетких правил:
In [ ]:
import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
rule1 = ctrl.Rule(age["young"] & bmi["low"], glucose["low"])
rule2 = ctrl.Rule(age["young"] & bmi["normal"], glucose["normal"])
rule3 = ctrl.Rule(age["young"] & bmi["high"], glucose["normal"])
rule4 = ctrl.Rule(age["middle-aged"] & bmi["low"], glucose["normal"])
rule5 = ctrl.Rule(age["middle-aged"] & bmi["normal"], glucose["normal"])
rule6 = ctrl.Rule(age["middle-aged"] & bmi["high"], glucose["high"])
rule7 = ctrl.Rule(age["old"] & bmi["low"], glucose["low"])
rule8 = ctrl.Rule(age["old"] & bmi["normal"], glucose["normal"])
rule9 = ctrl.Rule(age["old"] & bmi["high"], glucose["high"])
rule1.view()
Out[ ]:
Создание нечеткой системы и добавление нечетких правил в базу знаний нечеткой системы
In [17]:
glucose_ctrl = ctrl.ControlSystem(
[
rule1,
rule2,
rule3,
rule4,
rule5,
rule6,
rule7,
rule8,
rule9,
]
)
glucose_simulation = ctrl.ControlSystemSimulation(glucose_ctrl)
glucose_ctrl.view()
Проверка расчета выходной переменной
In [19]:
glucose_simulation.input["age"] = 31
glucose_simulation.input["bmi"] = 25
glucose_simulation.compute()
glucose_simulation.print_state()
glucose_simulation.output["glucose"]
Out[19]:
Визуализации функции принадлежности
In [20]:
glucose.view(sim=glucose_simulation)
Оценка качества
In [25]:
def fuzzy_pred(row):
glucose_simulation.input["age"] = row["Age"]
glucose_simulation.input["bmi"] = row["BMI"]
glucose_simulation.compute()
return glucose_simulation.output["glucose"]
result = df.copy()
result["glucose_pred"] = result.apply(fuzzy_pred, axis=1)
result.loc[115:130, ["Age", "BMI", "Glucose", "glucose_pred"]]
Out[25]:
In [29]:
import math
from sklearn import metrics
rmetrics = {}
rmetrics["RMSE"] = math.sqrt(
metrics.mean_squared_error(result["Glucose"], result["glucose_pred"])
)
rmetrics["RMAE"] = math.sqrt(
metrics.mean_absolute_error(result["Glucose"], result["glucose_pred"])
)
rmetrics["R2"] = metrics.r2_score(
result["Glucose"], result["glucose_pred"]
)
rmetrics
Out[29]:
Вывод: данные прогнозируются с низкой точностью и допускается множество ошибок