当前位置:   article > 正文

基于LASSO分位数回归时间序列区间预测_能用lasso回归提取时间序列数据特征吗

能用lasso回归提取时间序列数据特征吗

1、LASSO

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

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

2、代码实战

  1. % 变量选择算法
  2. clc
  3. close all
  4. clear
  5. data = load('load24.mat').x;
  6. %%
  7. % 参数说明
  8. percent = 0.8; % 数据比列
  9. mse =[];
  10. % 取两个月数据
  11. data = data(2:15*4*60,:); % 两个月数据
  12. %%
  13. norm = 0; % 是否归一化预测
  14. count = 1;
  15. FileWrite = 4;
  16. FeatureMean = 3;
  17. for k = 10:-1:1 % 不同特征预测
  18. figure(1)
  19. for i =1:4
  20. % 采样间隔
  21. Data = SampleData(data,i); % 数据采样
  22. [Train,Test] = DataDivide(Data,percent,k,FeatureMean); % 不同特征子集数据集
  23. [Train,Test,Xopt,Yopt] = Norm(Train,Test); % 数据集归一化划分
  24. if norm == 0 % 两种方式预测 归一化或者不归一化
  25. model = LinearModel.fit(Train.x,Train.y);
  26. Ypre = model.predict(Test.x);
  27. QuanYpre = Quantile(Train,Test,model,norm);
  28. else % 归一化预测
  29. model = LinearModel.fit(Train.xnorm,Train.ynorm);
  30. Ypre = model.predict(Test.xnorm);
  31. QuanYpre = Quantile(Train,Test,model,norm);
  32. end
  33. subplot(2,2,i)
  34. x =1:length(Test.y);
  35. fill([x,x(end:-1:1)],[QuanYpre{1}',...
  36. QuanYpre{end}(end:-1:1)'],'r','FaceColor',[1 0.8 0.8],'EdgeColor','none')
  37. hold on
  38. plot(Ypre)
  39. if norm == 0
  40. Yactual = Test.y;
  41. plot(Yactual)
  42. else
  43. Yactual = Test.ynorm;
  44. plot(Yactual)
  45. end
  46. hold off
  47. %plot(Test.ynorm);
  48. title(['采样间隔',num2str(i*15),'分钟'])
  49. legend('预测80%间隔','预测均值','实际值')
  50. xlabel(['归一化',num2str(norm)]);
  51. mse(i,count) = model.MSE;
  52. Loss(i,count) = Mse(Ypre,Yactual)*100;
  53. end
  54. count = count + 1;
  55. pause(0.5)
  56. end

3、结果展示

完整代码 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
  

闽ICP备14008679号