防止过拟合!Matlab也能利用PSO-XGboost一键实现时间序列预测啦!

        声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~

目录

原理简介与流程图

数据格式与替换方法

结果展示

部分代码展示

完整代码获取


以往XGBoost只能在Python中运行,虽然运行较快,但是无法结合自己的智能优化算法进行结合,因为大多数智能优化算法都是基于Matlab平台开发的,如果能够利用Matlab实现XGBoost,那么结合24年新算法或自己改进的算法将会非常方便,也会有更多的创新点

因此,今天给大家带来一期PSO-XGBoost实现时间序列预测的代码!最关键的是,XGBoost模型中附赠了五折交叉验证防止模型过拟合

学会这一篇,你也可以自己替换任何优化算法优化XGBoost!

图片

原理简介与流程图

以下原理简介是为了方便新手小白了解为什么可以选取这两个算法,以及为什么要用PSO优化XGBoost实现时间序列预测,没有任何公式,可放心阅读!

PSO算法是一种基于模拟鸟类觅食行为的群体智能优化算法。在有限维度的搜索空间内,将所有觅食的鸟类简化为一个粒子,将寻找的食物作为优化所得的最优解。经过每次寻优过程的迭代,找出每个粒子在时刻所对应的最优位置以及对应的种群最优位置,即Pbest与Gbest。

XGBoost算法基于boosting的算法,是目前最成功的机器学习算法之一,其特点包括具有较高精度,运行速率快且能防止过拟合。它是在Gradient Boosting Decision Tree(GBDT)算法的基础上优化而来,具有优秀的性能和速度。

XGBoost模型的主要超参数包括学习率(learning rate)、树的最大深度(max depth)、最大迭代次数(Max Iteration)。因为参数较多,且调参过程投机性、 随机性较大、计算量较大,所以采用粒子群优化算法和XGBoost模型相结合,通过PSO算法优化模型超参数的取值,减少参数选择过程中的随机性并提高计算速率,以此来提高模型的预测性能。

因此,流程图可绘制如下:

图片

1)设置时间步长,将数据集的70%作为训练集,30%作为测试集;

2)初始化粒子及其速度,将学习率、树的最大深度、最大迭代次数设为代求参数,将RMSE作为适应度数值。

3)更新粒子速度与位置,计算其适应度值,更新个体最优值与全局最优值,并在训练集中进行五折交叉验证,从而防止过拟合;

4)判断是否满足终止条件,若不满足则继续更新个体最优值与全局最优值;若满足则输出最优参数;

5)选取最优参数组合,构建参数优化的XGBoost回归模型。

数据格式与替换方法

本期推文采用的是经典的Excel时间序列数据集,非常方便!即代码中所用数据为测试数据,无实际含义,其中第一列为时间(可放可不放,非必须),第二列为数据。

图片

替换自己的数据集时,只需替换第二列数据即可,时间一列无需输入(因为代码不会识别时间),无需更改代码直接替换数据即可,非常方便,适合新手小白!

结果展示

这里设置训练集比例为70%,测试集比例为30%,种群数量为6,优化算法迭代次数为20,得到的结果如下所示(以上参数均可自行更改):

训练集预测结果图:

图片

测试集预测结果图:

图片

误差直方图:

图片

迭代曲线图:

图片

线性拟合图:

图片

误差指标结果显示:

图片

可以看到,真实值与预测值效果非常接近,且训练集和测试集误差不大,有效避免了过拟合的发生!

注意!Matlab实现XGBoost模型需要安装C++编译器,过程非常简单,文件夹内也附带了教程,不用担心!关键你的Matlab需要正版,没有的小伙伴可以去淘宝买一个,也就十几块,非常便宜!

部分代码展示

%%  清空环境变量
warning off             % 关闭报警信息
close all               % 关闭开启的图窗
clear                   % 清空变量
clc                     % 清空命令行

%%  导入数据(时间序列的单列数据)
result = xlsread('数据集.xlsx');

%%  数据分析
num_samples = length(result);  % 样本个数 
kim = 6;                       % 延时步长(kim个历史数据作为自变量)
zim =  1;                      % 跨zim个时间点进行预测

%%  划分数据集
for i = 1: num_samples - kim - zim + 1
    res(i, :) = [reshape(result(i: i + kim - 1), 1, kim), result(i + kim + zim - 1)];
end

%%  数据集分析
outdim = 1;                                  % 最后一列为输出
num_size = 0.7;                              % 训练集占数据集比例
num_train_s = round(num_size * num_samples); % 训练集样本个数
f_ = size(res, 2) - outdim;                  % 输入特征维度

%%  划分训练集和测试集
P_train = res(1: num_train_s, 1: f_)';
T_train = res(1: num_train_s, f_ + 1: end)';
M = size(P_train, 2);

P_test = res(num_train_s + 1: end, 1: f_)';
T_test = res(num_train_s + 1: end, f_ + 1: end)';
N = size(P_test, 2);

%%  数据归一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);

[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);

%%  数据转置 为适应模型的建立
p_train = p_train'; p_test = p_test';
t_train = t_train'; t_test = t_test';

%%  参数设置
fun = @getObjValue;                 % 目标函数
dim = 3;                            % 优化参数个数
lb  = [100, 3, 0.0001];             % 优化参数目标下限(最大迭代次数,深度,学习率)
ub  = [800,  10,  0.1];             % 优化参数目标上限(最大迭代次数,深度,学习率)
SearchAgents_no = 6;                % 种群数量
Max_iteration = 20;                 % 最大迭代次数
params.objective = 'reg:linear';    % 回归函数

%%  优化算法
[Best_score ,Best_pos, curve] = PSO(SearchAgents_no, Max_iteration, lb, ub, dim, fun);

可以看到,代码注释非常清晰,也方便大家换成自己的算法!

完整代码获取

本文为时间序列单列预测模型,如果想要多变量回归或分类预测可售前后台私信我免费更换~

如果完整代码,可点击下方小卡片,再后台回复关键词:

PSOXGB

其他更多需求或想要的代码均可点击下方小卡片,再后台私信,看到后会秒回~

更多代码链接:更多代码链接

在使用 PSO 优化 XGBoost 参数之前,我们需要先定义 XGBoost 的参数空间和目标函数。 1. 参数空间 常用的 XGBoost 参数包括学习率(`learning_rate`)、树的深度(`max_depth`)、子采样率(`subsample`)、列采样率(`colsample_bytree`)等等。我们需要给出这些参数的取值范围,这就是参数空间。 2. 目标函数 在使用 PSO 优化 XGBoost 参数时,我们需要定义一个目标函数,评价模型在某个参数取值下的性能。通常情况下,我们可以使用交叉验证来评价模型的性能,具体步骤如下: - 将数据集随机划分为 $k$ 个子集; - 对于每个子集 $i$,使用其他 $k-1$ 个子集来训练模型,并在子集 $i$ 上进行测试,记录测试得分; - 重复上述步骤 $k$ 次,得到 $k$ 个测试得分,计算平均得分作为目标函数的值。 我们可以将 PSO 算法看作是在参数空间中搜索最优解的过程,每次迭代都会更新粒子的位置和速度,并计算目标函数值。最终,算法会输出参数的最优取值。 下面是使用 scikit-optimize 和 XGBoost 进行参数优化的示例代码: ```python import xgboost as xgb from sklearn import datasets from sklearn.model_selection import cross_val_score from skopt import gp_minimize from skopt.space import Real, Integer from skopt.utils import use_named_args # 加载数据集 data = datasets.load_breast_cancer() X, y = data.data, data.target # 定义参数空间 space = [ Integer(1, 10, name='max_depth'), Real(0.01, 1, name='learning_rate'), Real(0.1, 1, name='subsample'), Real(0.1, 1, name='colsample_bytree'), Real(0.1, 10, name='min_child_weight'), ] # 定义目标函数 @use_named_args(space) def objective(**params): clf = xgb.XGBClassifier(**params) score = cross_val_score(clf, X, y, cv=5).mean() return -score # 使用贝叶斯优化器进行参数搜索 result = gp_minimize(objective, space, n_calls=50) # 输出最优参数 print("Best score: %.3f" % (-result.fun)) print("Best parameters: ", result.x) ``` 在上述代码中,我们先定义了参数空间和目标函数,然后使用 `gp_minimize` 函数进行参数搜索。`n_calls` 参数表示搜索的次数。最终,该算法会输出最优参数的取值和对应的得分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值