ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【老计带你懂AI算法】11:用机器学习和深度学习做时序,树模型和LSTM怎么上场

【老计带你懂AI算法】11:用机器学习和深度学习做时序,树模型和LSTM怎么上场 【老计带你懂AI算法】11用机器学习和深度学习做时序树模型和LSTM怎么上场开头经典方法不够用的时候上一篇讲的ARIMA、Prophet擅长刻画趋势和季节性这种相对规整的规律。可现实里的时序预测常常没那么简单你想预测销量光看历史销量不够还想把促销、天气、节假日、竞品价格这一大堆外部因素也用上。数据的规律是复杂的非线性趋势加季节性那套线性拆解描述不了。你要同时预测成千上万个商品、成千上万台设备的序列量特别大。这些场景经典统计方法就有点力不从心了。于是有了两条更强的路子一是把时序问题巧妙地改造成前面熟悉的表格问题用XGBoost这类树模型来做二是用天生就擅长处理序列的深度学习模型比如LSTM。这一篇讲清这两条路。思路一把时序问题变成表格问题这是工业界特别实用、也特别聪明的一招。前面几篇我们已经把树模型随机森林、XGBoost玩得很熟了它们在表格数据上又准又省心。那能不能把时序预测改造成一个表格预测问题直接用上这些强大的树模型能关键在于特征工程。怎么改造核心是用过去造出一行行特征用未来当作要预测的标签。具体有几类常用的特征滞后特征把过去N天的值直接当成今天这一行的特征。比如预测今天就把昨天、前天、大前天的销量都拿来当特征列。这等于把历史摊平成了一行数字。滑动窗口统计过去7天的平均值、最大值、最小值、标准差等。这些能概括近期的整体态势。时间特征今天是星期几、几月、是不是月初月末、是不是节假日。这些直接把季节性和节假日效应编码成了特征。外部特征天气、促销、价格等直接作为额外的特征列加进去。经过这么一番特征工程原来那条时间序列就变成了一张普普通通的表格每一行是某一天的各种特征标签是那天的实际值。然后就可以直接扔给XGBoost训练了。这一招的威力在于它把时序问题拉回到了树模型的主场能轻松融合海量外部特征、抓复杂非线性规律而且XGBoost又快又准是很多时序竞赛和工业实践的主力方案。这一招也再次印证了系列开头那句话很多时候解决问题的关键不是模型多高级而是怎么把问题转化成合适的形式。把时序变表格就是一次漂亮的问题转化。不过这条路有个需要想清楚的地方怎么预测未来的多步。上面的做法只预测下一个时间点可实际常要预测未来一整周、一整月。这里有两种常见策略值得知道。一种叫递归预测先预测下一天再把这个预测值当成已知历史接着预测下下天一步步往下滚。它简单但缺点是误差会累积前面预测偏一点后面越滚越偏。另一种叫直接多步预测干脆为未来每一步分别训练一个模型预测第1天一个模型、预测第7天另一个模型各管各的。它避免了误差累积但要训练多个模型、更麻烦。实际项目里选哪种取决于你要预测多远、能接受多大误差、有多少工程预算这也是时序建模里一个很现实的工程权衡。记住这点你在设计时序方案时就不会只盯着模型本身而会连预测方式一起考虑。思路二用天生处理序列的深度学习模型第二条路是深度学习。有一类神经网络天生就是为处理序列而生的最有名的就是RNN循环神经网络和它的升级版LSTM长短期记忆网络。这里先给个直觉后面第15篇会专门深入讲。普通的神经网络是一锤子买卖输入一个东西、输出一个结果没有记忆。而RNN不同它像一个带记忆的读者一个一个地读入序列里的数据每读一个就更新一下自己脑子里的记忆状态把过去看到的信息一路带下去。所以它天生适合处理有先后顺序、前后有依赖的序列数据。打个比方你读一句话我今天没吃饭现在很___“要填空你得记着前半句没吃饭”才能填出饿。RNN干的就是这种事边读边记用记忆帮助理解和预测后面的内容。但普通RNN有个毛病记性不好序列一长早先的信息就被忘掉了术语叫长期依赖问题。LSTM是RNN的改良版它专门设计了一套门的机制能决定哪些信息该记住、哪些该忘掉、哪些该输出从而能记住更长距离的依赖关系。这让它在较长的序列上表现好得多。还有个更简洁的变体叫GRU思路类似、更轻量。这些细节第15篇会展开这里你先记住LSTM是一种天生带记忆、擅长处理序列的深度学习模型。深度学习这条路和树模型路线有个哲学上的根本差异值得点破。树模型路线是人告诉模型该看什么你通过特征工程把你认为重要的滞后、滑窗、节假日等信息亲手喂给模型而深度学习路线是模型自己去发现该看什么你把原始序列直接扔给LSTM它在训练中自动学出哪些历史信息重要、怎么组合。这就是深度学习最大的卖点端到端、自动学习特征表示省去人工特征工程。听起来很美但代价是它需要大量数据才能自己学明白数据少时人工特征反而更靠谱而且它学到的东西是个黑盒你很难解释它到底看重了什么。理解这个差异你就明白为什么数据充足、规律复杂时深度学习占优而数据有限、需要可解释时树模型加人工特征更稳这不是谁更高级而是两种把知识注入模型的不同方式。两条路怎么选这两条路各有长处怎么选给你一个实用的判断数据量不算特别大、需要融合很多外部特征、想要又快又稳还带点可解释性优先选树模型XGBoost这条路。它是目前很多工业场景和竞赛的主力特征工程做得好效果往往比深度学习还好还省算力。数据量非常大、序列很长、规律高度复杂、或者是那种端到端不想费心做特征工程的场景可以考虑深度学习LSTM及更新的模型。它能自动从原始序列里学规律但需要更多数据、更多算力调起来也更费劲。说句实在话别一上来就冲着LSTM去。很多人以为时序就该用深度学习显得高级但工业界大量的时序预测XGBoost加好的特征工程就打得又快又好。深度学习是数据量和复杂度上到一定程度后的选择。这也是这个系列反复强调的原则能用简单方案解决就别上复杂的。输入和输出长什么样树模型这条路输入是经过特征工程后的表格每行是某时刻的滞后特征、滑窗统计、时间特征、外部特征输出是该时刻的预测值。本质就是个回归问题。LSTM这条路输入是一段连续的序列比如过去30天的数值保持时间顺序输出是未来的预测值。它直接吃序列不用你手工造那么多滞后特征。上代码用XGBoost做时序特征工程那条路演示最实用的树模型路线。输入造好滞后特征的表格。输出预测值。# 依赖pip install xgboost pandas numpy scikit-learnimportnumpyasnpimportpandasaspdfromxgboostimportXGBRegressorfromsklearn.metricsimportmean_absolute_error# 造一条带趋势周季节性的时序n400tnp.arange(n)series0.05*t5*np.sin(t*2*np.pi/7)np.random.randn(n)dfpd.DataFrame({value:series})# 特征工程:用过去7天的值当滞后特征,再加个星期几特征forlaginrange(1,8):df[flag_{lag}]df[value].shift(lag)# 昨天到7天前df[dayofweek]t%7# 星期几(季节性特征)dfdf.dropna().reset_index(dropTrue)# 去掉前几行有空的# 用前300天训练,预测后面feat[cforcindf.columnsifc!value]train,testdf.iloc[:300],df.iloc[300:]modelXGBRegressor(n_estimators200,max_depth4,learning_rate0.1)model.fit(train[feat],train[value])# 训练:当成普通回归predmodel.predict(test[feat])# 预测print(测试集平均绝对误差:,round(mean_absolute_error(test[value],pred),3))print(最后5天 真实值:,np.round(test[value].values[-5:],2))print(最后5天 预测值:,np.round(pred[-5:],2))运行输出示例因数据含随机噪声每次运行会有差异测试集平均绝对误差: 1.062 最后5天 真实值: [24.31 20.02 15.83 18.79 24.56] 最后5天 预测值: [23.87 19.64 16.42 18.21 23.98]运行你会看到预测值和真实值相当接近。核心就在那段特征工程把时序摊平成滞后特征加时间特征的表格剩下的就是我们熟悉的XGBoost回归了。这就是时序变表格这一招的完整落地实际项目里你会往里加更多外部特征。关键注意点特征工程是树模型路线的灵魂滞后多少天、加哪些统计和外部特征直接决定效果这里最见功力。绝对不能用未来信息造特征时只能用当前时刻之前的数据一旦不小心把未来的值泄露进特征比如用了未来的滑窗评估会虚高、上线就崩这是时序里最容易踩、也最致命的坑。时序的训练测试划分要按时间切必须拿过去训练、预测未来绝不能像普通数据那样随机打乱划分否则同样是用未来预测过去作弊了。优缺点与适用场景树模型路线能融合大量外部特征、又快又准、有一定可解释性特征重要性、算力要求低。缺点是特征工程费心、需要人的经验。适合大多数工业时序预测。LSTM等深度学习路线能自动学习复杂序列规律、省去部分特征工程、擅长超长复杂序列。缺点是要大量数据和算力、调参难、可解释性差。适合数据量大、规律复杂的场景。顺便一提如今时序预测最前沿也开始用Transformer第20篇的主角那套注意力机制来做出现了一些时序专用的大模型能力更强但那是后话思路上仍是更强地捕捉序列里的依赖关系。小结与承上启下两条更强的路把时序改造成表格用树模型、或用天生处理序列的深度学习。树模型路线靠特征工程滞后、滑窗、时间、外部特征把时序变表格工业主力又快又准能融合外部特征。LSTM路线带记忆的神经网络天生处理序列适合大数据复杂序列但费数据费算力。选型别盲目上深度学习多数场景XGBoost加特征工程更划算务必警惕未来信息泄露训练测试要严格按时间先后划分。时序告一段落。接下来换个大家天天都在体验的话题你刷的短视频、买的东西背后是推荐系统在起作用。下一篇我们讲推荐系统的经典基石协同过滤看它怎么猜出你可能喜欢什么。我们下一篇见。延伸阅读XGBoost 官方文档https://xgboost.readthedocs.ioPyTorch 官方文档LSTMhttps://pytorch.org/docs/stable/generated/torch.nn.LSTM.html说明以上为官方公开文档地址可能随版本调整如打不开可用标题搜索。
返回列表