基于LASSO分位数回归时间序列区间预测

1、LASSO

LASSO回归的特点是在拟合广义线性模型的同时进行变量筛选(variable selection)和复杂度调整(regularization)。因此,不论因变量是连续的(continuous),还是二元或者多元离散的(discrete),都可以用 LASSO 回归建模然后预测。算法中的复杂度调整是指通过一系列参数控制模型的复杂度,从而避免过度拟合(overfitting)。对于线性模型来说,复杂度与模型的变量数有直接关系,变量数越多,模型复杂度就越高。更多的变量在拟合时往往可以给出一个看似更好的模型,但是同时也面临过度拟合的危险。此时如果用全新的数据去验证模型(validation),通常效果很差。一般来说,变量数大于数据点数量很多,或者某一个离散变量有太多独特值时,都有可能过度拟合。LASSO 回归复杂度调整的程度由参数 λ 来控制,λ越大对变量较多的线性模型的惩罚力度就越大,从而最终获得一个变量较少,而且比较有代表性的变量组合。

LASSO可以有效的避免过拟合,什么是过拟合,让我们看看下图,从左往右依次是欠拟合,拟合效果良好和过拟合。建模的过程就是模型对数据的普遍规律的总结,例如在线性模型中,输入自变量的数值,通过线性公式的转换,让最终得到的因变量的值和实际的因变量的值相差尽量小,这就是模型的拟合过程。欠拟合情况下,模型没有正确认识到数据体现的普遍规律,无法对作出良好的预测。过拟合情况下,模型将数据中的全部信息都当做普遍规律,在训练集样本可以达到完美的效果,但用于样本外的测试情况就不行了,因为它可能将一些片面的、只体现于小部分样本的规律误认为是复合总体样本的普遍规律了,这种的模型最终效果也是不好的,我们要避免这两种情况,一般来说,欠拟合可以用复杂的算法来避免,但随着模型复杂度增大,其学习率也增强,很容易出现过拟合现象。LASSO回归加入了正则项,对不蕴含有用信息的特征进行减小权重的操作,从而达到减小过拟合的目的。

2、代码实战

% 变量选择算法
clc
close all
clear
data = load('load24.mat').x;
%%
% 参数说明
percent = 0.8;         % 数据比列
mse =[];
% 取两个月数据
data = data(2:15*4*60,:);                                                  % 两个月数据
%%
norm = 0;                                                                  % 是否归一化预测
count = 1;   
FileWrite = 4;
FeatureMean = 3;
for k = 10:-1:1                                                            % 不同特征预测
    
    figure(1)
    for i =1:4
                                                                            % 采样间隔
        Data = SampleData(data,i);                                          % 数据采样
        [Train,Test] = DataDivide(Data,percent,k,FeatureMean);              % 不同特征子集数据集
        [Train,Test,Xopt,Yopt] = Norm(Train,Test);                          % 数据集归一化划分    
                                                                             
        if norm == 0                                                       % 两种方式预测 归一化或者不归一化
            model = LinearModel.fit(Train.x,Train.y);
            Ypre = model.predict(Test.x);
            QuanYpre = Quantile(Train,Test,model,norm);
        else                                                               % 归一化预测
            model = LinearModel.fit(Train.xnorm,Train.ynorm);
            Ypre = model.predict(Test.xnorm);
            QuanYpre = Quantile(Train,Test,model,norm);
        end
        subplot(2,2,i)
        x =1:length(Test.y);
        fill([x,x(end:-1:1)],[QuanYpre{1}',...
            QuanYpre{end}(end:-1:1)'],'r','FaceColor',[1 0.8 0.8],'EdgeColor','none')
        hold on 
        plot(Ypre)
        if norm == 0 
            Yactual = Test.y;
            plot(Yactual)
        else
            Yactual = Test.ynorm;
            plot(Yactual)
        end
        hold off
        %plot(Test.ynorm);
        title(['采样间隔',num2str(i*15),'分钟'])
        legend('预测80%间隔','预测均值','实际值')
        xlabel(['归一化',num2str(norm)]);
        mse(i,count) = model.MSE;
        Loss(i,count) = Mse(Ypre,Yactual)*100;
    end
    
    count = count + 1;
    pause(0.5)
    
end

3、结果展示

完整代码 

猜你喜欢

转载自blog.csdn.net/qq_45013535/article/details/129597520
今日推荐