245 KiB
Начало лабы №7¶
Загрузка даанных
import pandas as pd
df = pd.read_csv("..//static//csv//FINAL_USO.csv")
print(df.columns)
display(df.head())
Создание лингвистических переменных
Входные переменные: OF_Price (цены на нефть) и SF_Price (цена на серебро) .
Выходная переменная: Adj Close (цена).
import numpy as np
from skfuzzy import control as ctrl
# Инициализация лингвистических переменных
oil_price = ctrl.Antecedent(np.arange(df['OF_Price'].min(), df['OF_Price'].max(), 10), "oil_price")
silver_price = ctrl.Antecedent(np.arange(df['SF_Price'].min(), df['SF_Price'].max(), 1000), "silver_price")
adj_close = ctrl.Consequent(np.arange(df['Adj Close'].min(), df['Adj Close'].max(), 10), "adj_close")
Формирование нечетких переменных для лингвистических переменных и их визуализация
import skfuzzy as fuzz
oil_price['low'] = fuzz.zmf(oil_price.universe, 40, 50)
oil_price['average'] = fuzz.trapmf(oil_price.universe, [60, 70, 80, 90])
oil_price['high'] = fuzz.smf(oil_price.universe, 100, 120)
silver_price['low'] = fuzz.zmf(silver_price.universe, 35000, 45000)
silver_price['average'] = fuzz.trapmf(silver_price.universe, [35000, 45000, 50000, 60000])
silver_price['high'] = fuzz.smf(silver_price.universe, 50000, 60000)
adj_close['low'] = fuzz.zmf(adj_close.universe,110, 120)
adj_close['average'] = fuzz.trapmf(adj_close.universe, [135, 145, 155, 165])
adj_close['high'] = fuzz.smf(adj_close.universe, 160, 170)
oil_price.view()
silver_price.view()
adj_close.view()
Формирование и визуализация базы нечетких правил
import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
# Нечеткие правила
rule1 = ctrl.Rule(silver_price["low"] & oil_price["low"], adj_close["low"])
rule2 = ctrl.Rule(silver_price["low"] & oil_price["average"], adj_close["low"])
rule3 = ctrl.Rule(silver_price["low"] & oil_price["high"], adj_close["low"])
rule4 = ctrl.Rule(silver_price["average"] & oil_price["low"], adj_close["low"])
rule5 = ctrl.Rule(silver_price["average"] & oil_price["average"], adj_close["low"])
rule6 = ctrl.Rule(silver_price["average"] & oil_price["high"], adj_close["low"])
rule7 = ctrl.Rule(silver_price["high"] & oil_price["low"], adj_close["average"])
rule8 = ctrl.Rule(silver_price["high"] & oil_price["average"], adj_close["high"])
rule9 = ctrl.Rule(silver_price["high"] & oil_price["high"], adj_close["high"])
rule1.view()
Создание нечеткой системы и добавление нечетких правил в базу знаний нечеткой системы
price_ctrl = ctrl.ControlSystem(
[
rule1,
rule2,
rule3,
rule4,
rule5,
rule6,
rule7,
rule8,
rule9,
]
)
# Создание симулятора нечеткой системы
price_sim = ctrl.ControlSystemSimulation(price_ctrl)
Пример расчета выходной переменной adj_close на основе входных переменных silver_price и oil_price
Система также формирует подробный журнал выполнения процесса нечеткого логического вывода
price_sim.input['silver_price'] = 60000
price_sim.input['oil_price'] = 30
price_sim.compute()
price_sim.print_state()
price_sim.output["adj_close"]
Визуализация функции принадлежности для выходной переменной adj_close
Функция получена в процессе аккумуляции и используется для дефаззификации значения выходной переменной influx
adj_close.view(sim=price_sim)
Функция для автоматизации вычисления целевой переменной Y на основе вектора признаков X
def fuzzy_pred(row):
price_sim.input["silver_price"] = row["SF_Price"]
price_sim.input["oil_price"] = row["OF_Price"]
price_sim.compute()
return price_sim.output["adj_close"]
Создадим выборки
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split
from imblearn.over_sampling import RandomOverSampler
df=pd.read_csv("..//static//csv//FINAL_USO.csv")
# Разделение данных на обучающую и временную выборки
train_df, temp_df = train_test_split(df, 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)
Тестирование нечеткой системы на обучающей выборке¶
import pandas as pd
train_df = pd.read_csv("..//static//csv//train_data.csv")
result_train = train_df.copy()
result_train["Adj_Pred"] = result_train.apply(fuzzy_pred, axis=1)
selected_cm=result_train[['Adj Close','Adj_Pred']]
selected_cm.head(15)
Тестирование нечеткой системы на тестовой выборке¶
import pandas as pd
test_df=pd.read_csv("..//static//csv//test_data.csv")
result_test = test_df.copy()
result_test["Adj_Pred"] = result_test.apply(fuzzy_pred, axis=1)
selected_cm=result_test[['Adj Close','Adj_Pred']]
selected_cm.head(25)
Тестирование нечёткой системы на контрольной выборке¶
import pandas as pd
val_df=pd.read_csv("..//static//csv//val_data.csv")
result_val = val_df.copy()
result_val["Adj_Pred"] = result_val.apply(fuzzy_pred, axis=1)
selected_cm=result_val[['Adj Close','Adj_Pred']]
selected_cm.head(25)
Оценка результатов на основе метрик для задачи регрессии¶
import math
from sklearn import metrics
rmetrics = {}
rmetrics["RMSE_train"] = math.sqrt(
metrics.mean_squared_error(result_train["Adj Close"], result_train["Adj_Pred"])
)
rmetrics["RMSE_test"] = math.sqrt(
metrics.mean_squared_error(result_test["Adj Close"], result_test["Adj_Pred"])
)
rmetrics["RMAE_test"] = math.sqrt(
metrics.mean_absolute_error(result_test["Adj Close"], result_test["Adj_Pred"])
)
rmetrics["R2_test"] = metrics.r2_score(
result_test["Adj Close"], result_test["Adj_Pred"]
)
rmetrics