
1. 时间序列数据的核心特征解析时间序列数据就像一本记录世间万物的日记本每一页都按时间顺序记载着各种变化。我在处理电力负荷预测项目时曾经对着屏幕上的波浪线发呆了一整天——那些起伏的曲线背后藏着怎样的秘密后来才发现读懂这些特征就是建模成功的关键钥匙。周期性是最容易识别的特征就像人体生物钟一样规律。电力数据中早晚用电高峰就像潮汐般准时出现交通流量数据工作日和周末的差异更是明显。但要注意的是周期性往往嵌套存在电力数据既有以天为单位的小周期又存在以年为单位的季节性大周期。用Python的statsmodels库可以快速检验from statsmodels.tsa.seasonal import seasonal_decompose result seasonal_decompose(Electricity[OT], modeladditive, period24) result.plot()趋势性则像人生轨迹有的持续向上有的逐渐衰落。流感数据就展现出明显的逐年上升趋势而某些商品销量可能呈现生命周期曲线。检测趋势最简单的方法是移动平均# 7天移动平均 Electricity[MA7] Electricity[OT].rolling(window7).mean()异常值就像平静水面突然溅起的水花。电力数据中那些突然的尖峰可能是设备故障而交通数据的异常波动往往对应着节假日。处理它们不能简单删除我在某次项目中就因为粗暴剔除异常天气数据导致模型完全忽略了极端气候的影响。更稳妥的做法是使用分位数检测Q1 Electricity[OT].quantile(0.25) Q3 Electricity[OT].quantile(0.75) IQR Q3 - Q12. 从特征分析到模型设计的实战路径第一次用LSTM预测外汇汇率惨败的经历让我明白模型不是万能的关键要看特征本质。外汇数据的随机游走特性让传统时序模型屡屡碰壁而电力数据的强周期性却能让简单模型表现出色。对于强周期数据我在变压器温度预测中验证过在LSTM前加入傅里叶变换提取周期项能使模型收敛速度提升3倍。具体操作是from scipy.fft import fft fft_series fft(Electricity[OT].values) frequencies fftfreq(len(fft_series))趋势显著的数据需要特别处理。就像处理流感数据时先用差分消除趋势# 一阶差分 ILI[diff] ILI[OT].diff().fillna(0)多周期嵌套的情况更复杂。交通数据同时存在早晚高峰和周末效应这时分层采样效果惊人。我的做法是提取小时、星期等时间特征为不同周期创建独立输入通道在模型最后层进行特征融合3. 特征工程中的避坑指南曾经因为忽略数据特性我连续三周都在调整模型超参却毫无进展。后来才醒悟问题出在特征理解上。这里分享几个血泪教训周期误判是最常见的坑。有次把半年的电力数据周期误判为24小时实际应该是以周为单位。检验周期不能只看自相关图还要结合业务逻辑# 多周期检验 from statsmodels.graphics.tsaplots import plot_acf plot_acf(Electricity[OT], lags200)趋势处理不当会导致灾难性后果。有次直接用原始交通数据训练模型竟然把年份当成了预测依据正确的做法是先做平稳性检验from statsmodels.tsa.stattools import adfuller adf_test adfuller(Traffic[OT])异常值处理更需要谨慎。那次天气预测项目中我把所有低温值都当作异常剔除结果模型完全不会预测寒潮。后来改用MCD鲁棒算法才解决问题from sklearn.covariance import MinCovDet robust_cov MinCovDet().fit(Weather.iloc[:,1:])4. 创新模型设计思路传统ARIMA在简单数据集上表现尚可但面对现代复杂数据就显得力不从心。经过多个项目实战我总结出几个有效策略混合模型架构往往能出奇制胜。在电力预测中我将Transformer的注意力机制与STL分解结合先用STL分解出趋势、周期、残差三项用Transformer处理残差项最后重组三项输出多尺度特征提取对交通数据特别有效。我的做法是1D CNN提取局部小时级特征LSTM捕捉天级依赖全连接层融合周特征# 多尺度模型框架示例 hour_branch Conv1D(filters32, kernel_size3)(input_layer) day_branch LSTM(64)(input_layer) merged concatenate([hour_branch, day_branch])外部特征融合常被忽视。那次天气预测比赛夺冠的关键就是引入了太阳高度角这个外部特征。具体实现计算每小时太阳高度作为额外通道输入模型设计特征交叉层5. 评估与调优的实战技巧模型评估不能只看RMSE特别是对周期性数据。我的经验是分时段评估才能发现问题。有次模型整体准确率很高但夜间预测完全错误。后来改用分段评估night_mask (Electricity[hour]0) (Electricity[hour]5) night_score mean_squared_error(y_true[night_mask], y_pred[night_mask])误差分析要结合特征。画出误差与主要特征的关系图往往能发现模型盲区plt.scatter(Electricity[temperature], errors)损失函数设计更需要匠心。对电力预测这种需求我设计了分段加权损失函数高峰时段误差权重加倍突变点附近增加惩罚项周期性相关正则项def custom_loss(y_true, y_pred): peak_mask K.cast(y_true threshold, float32) return mse*(1 peak_mask*2)