381 KiB
Начало лабораторной работы¶
import pandas as pd
df = pd.read_csv("..//static//csv//Medical_insurance.csv")
print(df.columns)
import pandas as pd
df = pd.read_csv("..//static//csv//Medical_insurance.csv")
df
Создание лингвистических переменных
Входные X: age (возраст) и bmi (индекс массы тела)
Выходные Y: charges (расходы)
import numpy as np
from skfuzzy import control as ctrl
age = ctrl.Antecedent(np.arange(0, 100, 1), "age")
bmi = ctrl.Antecedent(np.arange(10, 50, 0.1), "bmi")
charges = ctrl.Consequent(np.arange(0, 60000, 100), "charges")
Формирование нечетких переменных для лингвистических переменных и их визуализация
import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
import matplotlib.pyplot as plt
age = ctrl.Antecedent(np.arange(0, 100, 1), "age")
bmi = ctrl.Antecedent(np.arange(10, 50, 0.1), "bmi")
charges = ctrl.Consequent(np.arange(0, 60000, 100), "charges")
age["young"] = fuzz.trapmf(age.universe, [0, 0, 18, 30])
age["middle_aged"] = fuzz.trapmf(age.universe, [25, 35, 45, 55])
age["old"] = fuzz.trapmf(age.universe, [50, 65, 100, 100])
age.view()
bmi["underweight"] = fuzz.trapmf(bmi.universe, [10, 10, 18.5, 20])
bmi["normal"] = fuzz.trapmf(bmi.universe, [18.5, 20, 24.9, 25])
bmi["overweight"] = fuzz.trapmf(bmi.universe, [25, 27, 30, 35])
bmi["obese"] = fuzz.trapmf(bmi.universe, [30, 35, 50, 50])
bmi.view()
charges["low"] = fuzz.trapmf(charges.universe, [0, 0, 10000, 20000])
charges["average"] = fuzz.trapmf(charges.universe, [15000, 25000, 35000, 45000])
charges["high"] = fuzz.trapmf(charges.universe, [40000, 50000, 60000, 60000])
charges.view()
plt.show()
Формирование и визуализация базы нечетких правил
import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
import matplotlib.pyplot as plt
age = ctrl.Antecedent(np.arange(0, 100, 1), "age")
bmi = ctrl.Antecedent(np.arange(10, 50, 0.1), "bmi")
charges = ctrl.Consequent(np.arange(0, 60000, 100), "charges")
age["young"] = fuzz.trapmf(age.universe, [0, 0, 18, 30])
age["middle_aged"] = fuzz.trapmf(age.universe, [25, 35, 45, 55])
age["old"] = fuzz.trapmf(age.universe, [50, 65, 100, 100])
bmi["underweight"] = fuzz.trapmf(bmi.universe, [10, 10, 18.5, 20])
bmi["normal"] = fuzz.trapmf(bmi.universe, [18.5, 20, 24.9, 25])
bmi["overweight"] = fuzz.trapmf(bmi.universe, [25, 27, 30, 35])
bmi["obese"] = fuzz.trapmf(bmi.universe, [30, 35, 50, 50])
charges["low"] = fuzz.trapmf(charges.universe, [0, 0, 10000, 20000])
charges["average"] = fuzz.trapmf(charges.universe, [15000, 25000, 35000, 45000])
charges["high"] = fuzz.trapmf(charges.universe, [40000, 50000, 60000, 60000])
rules = []
rules.append(ctrl.Rule(age["young"] & bmi["underweight"], charges["low"]))
rules.append(ctrl.Rule(age["young"] & bmi["normal"], charges["average"]))
rules.append(ctrl.Rule(age["young"] & bmi["overweight"], charges["average"]))
rules.append(ctrl.Rule(age["young"] & bmi["obese"], charges["high"]))
rules.append(ctrl.Rule(age["middle_aged"] & bmi["underweight"], charges["low"]))
rules.append(ctrl.Rule(age["middle_aged"] & bmi["normal"], charges["average"]))
rules.append(ctrl.Rule(age["middle_aged"] & bmi["overweight"], charges["high"]))
rules.append(ctrl.Rule(age["middle_aged"] & bmi["obese"], charges["high"]))
rules.append(ctrl.Rule(age["old"] & bmi["underweight"], charges["average"]))
rules.append(ctrl.Rule(age["old"] & bmi["normal"], charges["high"]))
rules.append(ctrl.Rule(age["old"] & bmi["overweight"], charges["high"]))
rules.append(ctrl.Rule(age["old"] & bmi["obese"], charges["high"]))
charges_ctrl = ctrl.ControlSystem(rules)
charges_sim = ctrl.ControlSystemSimulation(charges_ctrl)
rule1 = ctrl.Rule(age["young"] & bmi["underweight"], charges["low"])
rule1.view()
Создание нечеткой системы и добавление нечетких правил в базу знаний нечеткой системы
import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
import matplotlib.pyplot as plt
# Создание системы управления
charges_ctrl = ctrl.ControlSystem(
[
rule1,
rule2,
rule3,
rule4,
rule5,
rule6,
rule7,
rule8,
rule9,
rule10,
rule11,
rule12,
]
)
charges_sim = ctrl.ControlSystemSimulation(charges_ctrl)
charges_sim.input['age'] = 45
charges_sim.input['bmi'] = 28
charges_sim.compute()
plt.figure()
charges.view(sim=charges_sim)
plt.show()
Пример расчета выходной переменной charges на основе входных переменных age и bmi
Система также формирует подробный журнал выполнения процесса нечеткого логического вывода
import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
age = ctrl.Antecedent(np.arange(0, 100, 1), "age")
bmi = ctrl.Antecedent(np.arange(10, 50, 0.1), "bmi")
charges = ctrl.Consequent(np.arange(0, 60000, 100), "charges")
charges_sim.input['age'] = 45
charges_sim.input['bmi'] = 28
charges_sim.compute()
charges_sim.print_state()
result = charges_sim.output['charges']
print(f"Предполагаемые расходы: {result:.2f}")
import pandas as pd
train_data = pd.read_csv("..//static//csv//Medical_insurance.csv", sep=",", decimal=",")
test_data = pd.read_csv("..//static//csv//Medical_insurance.csv", sep=",", decimal=",")
display(train_data.head(3))
display(test_data.head(3))
Инициализация лингвистических переменных и автоматическое формирование нечетких переменных
import pandas as pd
import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
import matplotlib.pyplot as plt
if 'age' in density_data.columns and 'bmi' in density_data.columns and 'charges' in density_data.columns:
age = ctrl.Antecedent(density_data["age"].sort_values().unique(), "age")
bmi = ctrl.Antecedent(density_data["bmi"].sort_values().unique(), "bmi")
charges = ctrl.Consequent(np.arange(density_data["charges"].min(), density_data["charges"].max(), 100), "charges")
age.automf(3, variable_type="quant")
bmi.automf(3, variable_type="quant")
charges.automf(5, variable_type="quant")
age.view()
bmi.view()
charges.view()
plt.show()
Нечеткие правила
import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
import matplotlib.pyplot as plt
age = ctrl.Antecedent(np.arange(0, 100, 1), "age")
bmi = ctrl.Antecedent(np.arange(10, 50, 0.1), "bmi")
charges = ctrl.Consequent(np.arange(0, 60000, 100), "charges")
age["young"] = fuzz.trapmf(age.universe, [0, 0, 18, 30])
age["middle_aged"] = fuzz.trapmf(age.universe, [25, 35, 45, 55])
age["old"] = fuzz.trapmf(age.universe, [50, 65, 100, 100])
bmi["underweight"] = fuzz.trapmf(bmi.universe, [10, 10, 18.5, 20])
bmi["normal"] = fuzz.trapmf(bmi.universe, [18.5, 20, 24.9, 25])
bmi["overweight"] = fuzz.trapmf(bmi.universe, [25, 27, 30, 35])
bmi["obese"] = fuzz.trapmf(bmi.universe, [30, 35, 50, 50])
charges["low"] = fuzz.trapmf(charges.universe, [0, 0, 10000, 20000])
charges["average"] = fuzz.trapmf(charges.universe, [15000, 25000, 35000, 45000])
charges["high"] = fuzz.trapmf(charges.universe, [40000, 50000, 60000, 60000])
rule1 = ctrl.Rule(
age["young"] & bmi["underweight"],
charges["low"],
)
rule2 = ctrl.Rule(
age["young"] & bmi["normal"],
charges["average"],
)
rule3 = ctrl.Rule(
age["young"] & bmi["overweight"],
charges["average"],
)
rule4 = ctrl.Rule(
age["young"] & bmi["obese"],
charges["high"],
)
rule5 = ctrl.Rule(
age["middle_aged"] & bmi["underweight"],
charges["average"],
)
rule6 = ctrl.Rule(
age["middle_aged"] & bmi["normal"],
charges["average"],
)
rule7 = ctrl.Rule(
age["middle_aged"] & bmi["overweight"],
charges["high"],
)
rule8 = ctrl.Rule(
age["middle_aged"] & bmi["obese"],
charges["high"],
)
rule9 = ctrl.Rule(
age["old"] & bmi["underweight"],
charges["high"],
)
rule10 = ctrl.Rule(
age["old"] & bmi["normal"],
charges["high"],
)
rule11 = ctrl.Rule(
age["old"] & bmi["overweight"],
charges["high"],
)
rule12 = ctrl.Rule(
age["old"] & bmi["obese"],
charges["high"],
)
Создание нечеткой системы
import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
age = ctrl.Antecedent(np.arange(0, 100, 1), "age")
bmi = ctrl.Antecedent(np.arange(10, 50, 0.1), "bmi")
charges = ctrl.Consequent(np.arange(0, 60000, 100), "charges")
age["young"] = fuzz.trapmf(age.universe, [0, 0, 18, 30])
age["middle_aged"] = fuzz.trapmf(age.universe, [25, 35, 45, 55])
age["old"] = fuzz.trapmf(age.universe, [50, 65, 100, 100])
bmi["underweight"] = fuzz.trapmf(bmi.universe, [10, 10, 18.5, 20])
bmi["normal"] = fuzz.trapmf(bmi.universe, [18.5, 20, 24.9, 25])
bmi["overweight"] = fuzz.trapmf(bmi.universe, [25, 27, 30, 35])
bmi["obese"] = fuzz.trapmf(bmi.universe, [30, 35, 50, 50])
charges["low"] = fuzz.trapmf(charges.universe, [0, 0, 10000, 20000])
charges["average"] = fuzz.trapmf(charges.universe, [15000, 25000, 35000, 45000])
charges["high"] = fuzz.trapmf(charges.universe, [40000, 50000, 60000, 60000])
rule11 = ctrl.Rule(age["young"] & bmi["underweight"], charges["low"])
rule12 = ctrl.Rule(age["young"] & bmi["normal"], charges["average"])
rule13 = ctrl.Rule(age["young"] & bmi["overweight"], charges["average"])
rule21 = ctrl.Rule(age["young"] & bmi["obese"], charges["high"])
rule22 = ctrl.Rule(age["middle_aged"] & bmi["underweight"], charges["average"])
rule23 = ctrl.Rule(age["middle_aged"] & bmi["normal"], charges["average"])
rule31 = ctrl.Rule(age["middle_aged"] & bmi["overweight"], charges["high"])
rule32 = ctrl.Rule(age["middle_aged"] & bmi["obese"], charges["high"])
rule41 = ctrl.Rule(age["old"] & bmi["underweight"], charges["high"])
rule42 = ctrl.Rule(age["old"] & bmi["normal"], charges["high"])
rule43 = ctrl.Rule(age["old"] & bmi["overweight"], charges["high"])
rule51 = ctrl.Rule(age["old"] & bmi["obese"], charges["high"])
fuzzy_rules = [
rule11,
rule12,
rule13,
rule21,
rule22,
rule23,
rule31,
rule32,
rule41,
rule42,
rule43,
rule51,
]
density_cntrl = ctrl.ControlSystem(fuzzy_rules)
sim = ctrl.ControlSystemSimulation(density_cntrl)
fuzzy_rules
Пример использования полученной нечеткой системы
import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
import matplotlib.pyplot as plt
sim.input["age"] = 25
sim.input["bmi"] = 22
sim.compute()
sim.print_state()
result = sim.output["charges"]
print(f"Estimated Charges: {result}")
Функция для автоматизации вычисления целевой переменной Y на основе вектора признаков X
def fuzzy_pred(row):
sim.input["age"] = row["age"]
sim.input["bmi"] = row["bmi"]
sim.compute()
return sim.output["charges"]
import pandas as pd
data = {
"age": [25, 40, 60],
"bmi": [22, 28, 32]
}
df = pd.DataFrame(data)
df["predicted_charges"] = df.apply(fuzzy_pred, axis=1)
print(df)
Оценка результатов на основе метрик для задачи регрессии
import numpy as np
import pandas as pd
data_train = {
'Density': [1.0, 2.0, 3.0, 4.0, 5.0],
'DensityPred': [1.1, 1.9, 2.5, 3.5, 5.2]
}
data_test = {
'Density': [1.5, 2.5, 3.5, 4.5, 5.5],
'DensityPred': [1.6, 2.4, 3.6, 4.2, 5.7]
}
result_train = pd.DataFrame(data_train)
result_test = pd.DataFrame(data_test)
rmetrics = {}
rmetrics["RMSE_train"] = np.sqrt(((result_train["Density"] - result_train["DensityPred"]) ** 2).mean())
rmetrics["RMSE_test"] = np.sqrt(((result_test["Density"] - result_test["DensityPred"]) ** 2).mean())
rmetrics["RMAE_test"] = (result_test["Density"] - result_test["DensityPred"]).abs().mean()
ss_res = ((result_test["Density"] - result_test["DensityPred"]) ** 2).sum()
ss_tot = ((result_test["Density"] - result_test["Density"].mean()) ** 2).sum()
rmetrics["R2_test"] = 1 - (ss_res / ss_tot)
print(rmetrics)