180 KiB
180 KiB
In [ ]:
import pandas as pd
df = pd.read_csv("../data/kc_house_data.csv")
df = df[~df['bedrooms'].between(10, 34)]
df.columns
Out[ ]:
In [120]:
import skfuzzy as fuzz
from skfuzzy import control as ctrl
col_bedrooms = ctrl.Antecedent(df["bedrooms"].sort_values(), "col_bedrooms")
sqft_living = ctrl.Antecedent(df["sqft_living"].sort_values(), "sqft_living")
price = ctrl.Consequent(df["price"].sort_values(), "price")
Формирование нечетких переменных для лингвистических переменных и их визуализация¶
In [121]:
col_bedrooms['low'] = fuzz.zmf(col_bedrooms.universe, 0,4)
col_bedrooms['medium'] = fuzz.trapmf(col_bedrooms.universe, [1, 4, 5, 8])
col_bedrooms['high'] = fuzz.trimf(col_bedrooms.universe, [5,9,9])
col_bedrooms.view()
sqft_living['low'] = fuzz.zmf(sqft_living.universe, 0, 6000)
sqft_living['medium'] = fuzz.trapmf(sqft_living.universe, [3400, 5500, 7800, 9640])
sqft_living['high'] = fuzz.trimf(sqft_living.universe, [8000, 13540,13540])
sqft_living.view()
# price['low'] = fuzz.zmf(price.universe, 0, 2000000)
# price['medium'] = fuzz.trapmf(price.universe, [2000000, 3000000, 4000000, 5500000])
# price['high'] = fuzz.smf(price.universe, 5000000, 7700000)
price.automf(5, variable_type="quant")
price.view()
Формирование и визуализация базы нечетких правил¶
In [122]:
#col_bedrooms sqft_living price
rule1 = ctrl.Rule(col_bedrooms['low'] & sqft_living['low'], price['lower'])
rule2 = ctrl.Rule(col_bedrooms['low'] & sqft_living['medium'], price['low'])
rule3 = ctrl.Rule(col_bedrooms['low'] & sqft_living['high'], price['average'])
rule4 = ctrl.Rule(col_bedrooms['medium'] & sqft_living['low'], price['lower'])
rule5 = ctrl.Rule(col_bedrooms['medium'] & sqft_living['medium'], price['average'])
rule6 = ctrl.Rule(col_bedrooms['medium'] & sqft_living['high'], price['high'])
rule7 = ctrl.Rule(col_bedrooms['high'] & sqft_living['low'], price['average'])
rule8 = ctrl.Rule(col_bedrooms['high'] & sqft_living['medium'], price['high'])
rule9 = ctrl.Rule(col_bedrooms['high'] & sqft_living['high'], price['higher'])
rule1.view()
Out[122]:
Создание нечеткой системы и добавление нечетких правил в базу знаний нечеткой системы¶
In [123]:
price_ctrl = ctrl.ControlSystem(
[
rule1,
rule2,
rule3,
rule4,
rule5,
rule6,
rule7,
rule8,
rule9,
]
)
prices = ctrl.ControlSystemSimulation(price_ctrl)
Пример расчета выходной переменной price на основе входных переменных col_bedrooms и sqft_living¶
In [124]:
prices.input['col_bedrooms'] = 3
prices.input['sqft_living'] = 2570
prices.compute()
prices.print_state()
print(prices.output['price'])
Тестирование нечеткой системы¶
In [125]:
def fuzzy_pred(row):
prices.input['col_bedrooms'] = row['bedrooms']
prices.input['sqft_living'] = row['sqft_living']
prices.compute()
return prices.output['price']
res = df[['bedrooms', 'sqft_living', 'price']].head(100)
res['Pred'] = res.apply(fuzzy_pred, axis=1)
res.head(15)
Out[125]:
Оценка результатов на основе метрик для задачи регрессии¶
In [126]:
import math
from sklearn import metrics
rmetrics = {}
rmetrics["RMSE"] = math.sqrt(metrics.mean_squared_error(res['price'], res['Pred']))
rmetrics["RMAE"] = math.sqrt(metrics.mean_absolute_error(res['price'], res['Pred']))
rmetrics["R2"] = metrics.r2_score(res['price'], res['Pred'])
rmetrics
Out[126]: