import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingRegressor, AdaBoostRegressor
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
from sklearn.metrics import mean_squared_error
from pyswarm import pso
import pandas as pd
import math
from data_read import date_process
train_x,train_y=date_process()
train_x=train_y.reshape(train_x.shape[0],-1)
X_train, X_test, y_train, y_test = train_test_split(np.array(train_x), np.array(train_y), test_size=0.2,shuffle=False,random_state=15)
# 定义粒子群优化的目标函数
def objective_function(params):
# 解析超参数
xgb_learning_rate, xgb_n_estimators, xgb_max_depth = params[:3]
ab_n_estimators, ab_learning_rate = params[3:5]
lgb_learning_rate, lgb_n_estimators, lgb_max_depth = params[5:]
# 初始化回归模型
xgb_model = XGBRegressor(learning_rate=xgb_learning_rate, n_estimators=int(xgb_n_estimators),
max_depth=int(xgb_max_depth))
ab_model = AdaBoostRegressor(n_estimators=int(ab_n_estimators), learning_rate=ab_learning_rate)
lgb_model = LGBMRegressor(learning_rate=lgb_learning_rate, n_estimators=int(lgb_n_estimators),
max_depth=int(lgb_max_depth))
# 训练模型
xgb_model.fit(X_train, y_train)
ab_model.fit(X_train, y_train)
lgb_model.fit(X_train, y_train)
# 预测
y_pred_xgb = xgb_model.predict(X_test)
y_pred_ab = ab_model.predict(X_test)
y_pred_lgb = lgb_model.predict(X_test)
# 合并预测结果
y_pred_ensemble = (y_pred_xgb + y_pred_ab + y_pred_lgb) / 3.0
# 计算均方根误差作为目标函数值
mse = mean_squared_error(y_test, y_pred_ensemble)
return mse
# 定义超参数搜索范围
lower_bound = [0.01, 50, 3, 50, 0.01, 0.01, 50, 3]
upper_bound = [0.02, 51, 4, 51, 0.02, 0.02, 51, 4]
# upper_bound = [0.1, 200, 10, 200, 0.1, 0.1, 200, 10]
# 使用粒子群优化算法进行超参数优化
best_params, _ = pso(objective_function, lower_bound, upper_bound, swarmsize=10, maxiter=50)
# 输出最佳超参数
print("Best Hyperparameters:", best_params)
# 使用最佳超参数训练模型
best_learning_rate_xgb, best_n_estimators_xgb, best_max_depth_xgb = best_params[:3]
best_n_estimators_ab, best_learning_rate_ab = best_params[3:5]
best_learning_rate_lgb, best_n_estimators_lgb, best_max_depth_lgb = best_params[5:]
best_xgb_model = XGBRegressor(learning_rate=best_learning_rate_xgb, n_estimators=math.ceil(best_n_estimators_xgb),
max_depth=math.ceil(best_max_depth_xgb))
best_ab_model = AdaBoostRegressor(n_estimators=math.ceil(best_n_estimators_ab), learning_rate=best_learning_rate_ab)
best_lgb_model =LGBMRegressor(learning_rate=best_learning_rate_lgb, n_estimators=math.ceil(best_n_estimators_lgb),
max_depth=math.ceil(best_max_depth_lgb))
best_xgb_model.fit(X_train, y_train)
best_ab_model.fit(X_train, y_train)
best_lgb_model.fit(X_train, y_train)
# 进行预测
y_pred_xgb = best_xgb_model.predict(X_test)
y_pred_ab = best_ab_model.predict(X_test)
y_pred_lgb = best_lgb_model.predict(X_test)
# 合并预测结果
y_pred_ensemble = (y_pred_xgb + y_pred_ab + y_pred_lgb) / 3.0
from metra import metric
mae, mse, rmse, mape, mspe,r2=metric(np.array(y_pred_ensemble), np.array(y_test))
print('mae, mse, rmse, mape, mspe,r2')
print(mae, mse, rmse, mape, mspe,r2)
# 设置Seaborn样式
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.plot(y_test, label='True Values', color='b')
plt.plot(y_pred_ensemble, label='Predicted Values', color='r', linestyle='--')
plt.xlabel('Sample Index')
plt.ylabel('Value')
plt.title('True Values vs Predicted Values')
plt.legend()
plt.grid(True)
plt.show()