时间序列数据预处理的12个关键步骤与实战策略

发布时间:2026/6/7 6:26:34

时间序列数据预处理的12个关键步骤与实战策略 1. 项目概述为什么时间序列数据准备比建模本身更耗神“Statistical Modeling of Time Series Data Part 1 : Data Preparation and Preprocessing”——这个标题里藏着一个绝大多数新手根本意识不到的真相时间序列建模的成败80%取决于Part 1而不是Part 2或Part 3。我带过二十多个工业级时序项目从风电功率预测、电商GMV波动归因到医院ICU床位占用率推演无一例外——模型调参花三天数据清洗和特征工程干了三周。不是我们故意拖进度而是原始时序数据就像刚从田里拔出来的红薯表面沾着泥、带着须、还可能发芽变质不经过系统性“去泥、分拣、切片、晾晒”直接扔进烤箱模型结果只能是焦黑一块连糊味都难闻出层次。标题里的“Data Preparation and Preprocessing”绝不是教科书里轻描淡写的“缺失值填充标准化”八个字。它是一整套面向时间依赖性、非平稳性、多尺度周期性、业务语义嵌入的对抗式操作体系。比如你拿到一份每5分钟记录一次的服务器CPU使用率日志表面看是规整的等间隔数值流但实际打开原始CSV会发现凌晨2:17到2:23这6条记录全为-1监控探针掉线周三下午3点开始连续4小时数值恒定在99.99%其实是监控采样溢出导致的假饱和而所有周末的0点数据都比平日低30%不是因为服务器真闲了而是运维团队习惯在周末零点批量执行磁盘清理脚本——这个“业务脉冲”必须被识别、标记、隔离否则任何ARIMA或LSTM都会把它学成“周末必然低负载”的伪规律。核心关键词“Statistical Modeling”“Time Series Data”“Data Preparation”“Preprocessing”共同指向一个现实这不是Python pandas教程而是用统计思维重构原始观测的过程。你要像老中医搭脉一样感知数据的“气”趋势、“血”波动、“痰湿”异常、“瘀滞”缺失再用数学工具施以“针灸”差分、“拔罐”去噪、“导引”重采样。适合谁适合所有正在被“模型跑出来R²0.98上线后误差翻倍”折磨的算法工程师适合手握销售日报却看不懂“为什么Q3环比涨12%但客户投诉量暴增40%”的业务分析师也适合刚学完《时间序列分析》教材、对着真实数据束手无策的研究生——因为课本教你怎么解微分方程但没人告诉你真实世界的数据连方程的“自变量”都可能是错的。2. 整体设计思路构建三层防御式预处理流水线2.1 为什么不能按“缺失→异常→平稳→标准化”线性流程走我见过太多人把预处理当成流水线作业先用df.fillna(methodffill)填缺失再用IQR法剔异常接着对全序列做一阶差分最后StandardScaler归一化。结果呢某次给一家物流公司的运单时效预测建模他们按这个流程处理后模型在历史回测中MAPE仅8.2%但上线首周就崩了——实际预测偏差平均达35%。复盘发现问题出在第一步用前向填充ffill处理运输途中GPS信号丢失导致的缺失值等于强行把“车辆在隧道里失联30分钟”篡改成“车辆以失联前速度匀速直行30分钟”而真实情况是车辆在隧道口堵了25分钟出隧道后才加速。这种填充不是修复数据是在制造更隐蔽的谎言。所以我的整体设计是三层防御式流水线每一层解决一类根本矛盾且层间存在强依赖关系第一层业务语义校准层Business Semantics Calibration目标不是“让数据看起来干净”而是“让数据忠于业务事实”。核心动作包括识别并标注已知业务事件如促销活动、系统维护窗口、节假日调休、解析时间戳中的隐含语义如“2023-04-05T00:00:00Z”中的Z代表UTC时区但业务系统实际按本地时区记录需做时区对齐、将离散事件编码为时序特征如把“是否为大促首日”转化为0/1序列。这一层不做任何数值变换只做“事实对齐”。第二层统计结构净化层Statistical Structure Purification在业务语义对齐的基础上针对性处理统计缺陷。关键原则是异常检测必须基于局部动态基准而非全局静态阈值缺失填充必须匹配缺失机制MAR/MNAR而非简单插值平稳化必须保留业务可解释性避免过度差分导致信息湮灭。例如对电商GMV序列我们不用ADF检验全序列平稳性而是分段检验工作日白天强周期、夜间弱周期、周末独立模式每段用不同差分阶数。第三层建模适配增强层Modeling-Adaptive Enhancement这一层才涉及传统意义上的“特征工程”但目标明确为后续统计模型ARIMA/SARIMAX/ETS提供结构友好的输入。包括构造滞后特征lag_1, lag_7, lag_30时对节假日做特殊偏移如春节前3天的lag_7实际指向节前第10天需人工修正生成滚动统计量rolling_mean_7时用指数加权ewm替代简单均值以增强近期数据权重对多源时序如销量天气舆情做协整检验确保联合建模的统计有效性。这个三层结构不是理论炫技。2022年我帮一家光伏电站做发电功率预测原始SCADA数据包含大量传感器漂移缓慢偏移和瞬时尖峰雷击干扰。若按线性流程先用中位数滤波去尖峰再用滑动窗口校准漂移结果是漂移被误判为趋势而过度差分损失了设备老化的真实信号。改用三层结构后第一层标注所有已知雷击告警时间点第二层对非告警时段用小波阈值去噪对告警时段直接截断并标记为“不可信区间”第三层构造特征时将“最近一次雷击距今小时数”作为独立协变量。最终模型在雷雨季的预测稳定性提升47%。2.2 工具链选型为什么坚持用Statsmodels Pandas Numpy拒绝AutoML黑盒市面上有太多“一键时序预处理”工具包比如PyCaret的time_series模块或者Darts库的自动pipeline。它们能30秒完成缺失填充、异常检测、差分看起来很美。但我坚持手写Statsmodels Pandas Numpy组合原因很实在预处理不是计算任务是诊断任务。当你看到一段序列的ADF检验p值0.06勉强非平稳而KPSS检验p值0.01显著平稳黑盒工具会强制给你一阶差分但资深从业者会立刻意识到这大概率是季节性未被充分建模导致的伪非平稳该做的不是差分而是先提取季节性成分用STL分解再对残差序列检验平稳性。Statsmodels的优势在于其诊断函数全部开源可追溯。比如adfuller()返回的不仅是p值还有icbest最优信息准则对应的滞后阶数、usedlag实际使用的滞后项数这些参数直接暴露了检验过程的“思考路径”。你可以用plot_acf()和plot_pacf()可视化自相关结构肉眼判断AR/MA阶数而不是让AutoML随机试100种组合。Pandas的resample()和rolling()虽基础但配合apply()自定义函数能实现业务定制化操作——比如对金融tick数据要求“每15分钟窗口内仅保留最后一笔成交价”这用resample(15T).last()一行搞定而黑盒工具往往只提供“均值/中位数”等通用聚合无法满足“最后一笔”这种强业务逻辑。Numpy则是底层肌肉。所有预处理的性能瓶颈都在向量化计算上。比如对千万级时序做滚动标准差pd.Series.rolling().std()在数据量超50万时会明显变慢而np.lib.stride_tricks.sliding_window_view()配合np.std()可提速3倍以上。更重要的是Numpy让你完全掌控内存布局——当处理跨年高频数据如每秒1000点的IoT传感器数据时用np.memmap映射大文件避免一次性加载导致内存爆炸这是任何高级封装库都不愿暴露给用户的底层能力。提示永远不要用sklearn.preprocessing.StandardScaler直接处理时序它对训练集和测试集分别计算均值/标准差破坏了时序的“未来不可知”原则。正确做法是用训练集的均值/标准差参数统一转换全量数据含测试集并在预测阶段用相同参数反向转换。这个细节90%的AutoML工具默认做错。3. 核心细节解析从原始CSV到建模就绪数据集的12个生死关卡3.1 关卡1时间索引重建——为什么“parse_datesTrue”是最大陷阱几乎所有教程都教你用pd.read_csv(data.csv, parse_dates[timestamp])读取时间序列。这在理想世界没问题但在真实场景中这是第一个也是最致命的陷阱。某次处理某银行信用卡交易流原始文件中timestamp列是字符串格式2023-04-05 14:23:18.123但部分记录因日志截断变成2023-04-05 14:23:1毫秒缺失。parse_datesTrue会静默地将后者解析为2023-04-05 14:23:01补零而真实时间可能是2023-04-05 14:23:18丢弃了毫秒。更糟的是当遇到2023-04-05T14:23:18ZISO格式和04/05/2023 14:23:18美式格式混存时parse_dates会随机失败或错误解析。我的实操方案是三步强制校验法先以字符串读入不解析df pd.read_csv(data.csv, dtype{timestamp: str})用正则精准提取时间组件# 定义多种时间格式的正则模式 patterns [ (r(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})\.(\d{3}), %Y-%m-%d %H:%M:%S.%f), (r(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z, %Y-%m-%dT%H:%M:%SZ), (r(\d{2})/(\d{2})/(\d{4}) (\d{2}):(\d{2}):(\d{2}), %m/%d/%Y %H:%M:%S) ] # 对每行尝试匹配记录匹配成功与否 df[ts_parsed] df[timestamp].apply(lambda x: parse_with_patterns(x, patterns))构建索引并强制时区对齐# 将解析结果转为datetime显式指定时区如业务系统所在时区 df[datetime] pd.to_datetime(df[ts_parsed], errorscoerce, utcFalse) df df.dropna(subset[datetime]) # 删除解析失败行 df df.set_index(datetime).tz_localize(Asia/Shanghai, nonexistentshift_forward)这个过程看似繁琐但它把“时间解析”从黑盒操作变成了白盒诊断。你能清楚看到哪一行解析失败、失败原因是什么格式不符/非法日期/时区冲突从而决定是修复原始数据还是在后续步骤中打上“时间可疑”标签。而parse_datesTrue只会默默给你一个NaT你连问题在哪都不知道。3.2 关卡2缺失机制辨识——MAR、MNAR、MCAR哪个在搞鬼缺失值处理是预处理的核心战场但90%的人连缺失类型都分不清。教科书说“用均值填充”实战中这常是灾难源头。关键在于先辨识缺失机制MCAR完全随机缺失缺失与任何变量无关纯属运气差。如硬盘坏道导致某几行数据永久丢失。此时均值/中位数填充相对安全。MAR随机缺失缺失与其他观测到的变量有关但与缺失变量自身无关。如温度传感器在湿度90%时易故障缺失值出现与湿度相关但与真实温度无关。此时可用回归填充用湿度预测温度。MNAR非随机缺失缺失与缺失变量自身有关。如患者因高烧不愿配合体温测量缺失值集中在高温区间。此时任何插值都会系统性低估峰值。如何实操辨识我用三重证据法可视化分布对比# 绘制缺失值指示变量0/1与关键变量的箱线图 df[is_missing] df[target].isnull().astype(int) sns.boxplot(datadf, xis_missing, yhumidity) # 若湿度箱线图在is_missing1时显著右偏则倾向MAR统计检验对数值变量用t检验比较缺失/非缺失组均值对分类变量用卡方检验。p0.05表明存在关联排除MCAR。业务逻辑交叉验证查系统日志。某次处理医疗设备数据统计显示缺失与心率强相关p0.001但日志显示缺失时段恰是设备固件升级窗口——说明是MNAR升级导致采集中断而非心率本身导致缺失。辨识清楚后填充策略立判MCAR用SimpleImputer(strategymean)但要限制填充比例30%缺失建议删除该列。MAR用IterativeImputer多重插补以其他相关变量为特征预测缺失值。MNAR绝不填充而是创建二元特征is_missing_target并将缺失本身作为业务信号如“设备故障预警”。注意对时序数据MNAR常表现为成片缺失如传感器连续2小时无数据。此时应构造missing_streak_length特征当前缺失连续时长它比填充后的数值更能反映系统健康度。3.3 关卡3异常值检测——为什么IQR和Z-Score在时序中集体失效IQR四分位距和Z-Score是异常检测入门标配但在时序中它们会大规模误杀。原因很简单时序的“正常”是动态的不是静态的。某电商APP的每小时DAU在工作日午间稳定在50万±5万但大促首日午间会跳到200万。用全局IQRQ145万Q355万IQR10万会把200万标为异常而它恰恰是业务最关注的峰值。我的解决方案是局部自适应窗口法Local Adaptive Windowing动态基线构建对每个时间点t取其前后w个点如w24即前后一天构成滑动窗口计算该窗口内的滚动中位数med_t和中位数绝对偏差mad_t比标准差更鲁棒。自适应阈值异常阈值设为med_t ± k * mad_t其中k根据业务容忍度调整通常k3。这样大促日的基线自动抬升200万不会被误判。时序一致性校验单点异常不一定是噪声可能是真实突变。需检查其前后n点如n3是否也偏离基线。若只有t点异常而t-1、t1均正常则极可能是噪声若t-2到t2连续异常则是真实事件如服务器宕机。代码实现精要def detect_anomalies_adaptive(series, window24, k3, n_consistent3): # 计算滚动中位数和MAD rolling_med series.rolling(windowwindow, centerTrue).median() rolling_mad series.rolling(windowwindow, centerTrue).apply( lambda x: np.median(np.abs(x - np.median(x))) ) # 计算自适应上下界 upper_bound rolling_med k * rolling_mad lower_bound rolling_med - k * rolling_mad # 标记异常点 is_anomaly (series upper_bound) | (series lower_bound) # 一致性校验要求连续n点异常才确认 anomaly_streak is_anomaly.astype(int).groupby((~is_anomaly).cumsum()).cumsum() confirmed_anomaly anomaly_streak n_consistent return confirmed_anomaly这个方法在某快递公司路由优化项目中效果显著原始Z-Score将所有“双十一凌晨爆仓”时段标为异常导致模型忽略真实拥堵模式改用自适应窗口后仅标记出真正的传感器故障如某分拣机连续5分钟无数据而将业务高峰保留在训练集中。3.4 关卡4平稳化处理——差分不是万能药何时该用Box-CoxARIMA等经典模型要求序列平稳但“平稳”常被误解为“看起来没趋势”。实际上弱平稳Weak Stationarity要求均值、方差、自协方差不随时间变化。很多序列有趋势但方差爆炸如股票价格一阶差分能消除趋势却可能放大波动使方差非平稳。这时要祭出Box-Cox变换。它通过幂变换y(λ) (y^λ - 1)/λλ≠0或log(y)λ0来稳定方差。关键是找到最优λ。Statsmodels的boxcox函数用极大似然估计但要注意Box-Cox要求输入严格为正。若序列含零或负值如温度、利润需先平移y_shifted y - min(y) 1。但Box-Cox不是银弹。我踩过的坑是对某制造业良品率序列0-100%直接Box-Cox后λ≈0.1变换后序列方差稳定但模型预测值反变换回原空间时由于y^λ对小值极度敏感导致0.1%的预测误差被放大为5%的实际误差。后来改用Yeo-Johnson变换支持负值和零λ≈1.5反变换更平缓误差控制在1%内。更重要的是差分与变换的顺序有讲究。原则是先处理方差非平稳用Box-Cox再处理均值非平稳用差分。因为差分会改变数据分布形态影响Box-Cox的λ估计。实操流程检查方差平稳性画rolling_std图若呈喇叭形方差随均值增大优先Box-Cox。应用Box-Cox得到y_bc。对y_bc做ADF检验若仍非平稳再差分。差分后再次检验直至平稳。某次处理某城市PM2.5数据原始序列方差随均值增大污染越重波动越大直接差分后残差仍呈喇叭形先Box-Coxλ0.33再一阶差分残差方差完全平稳后续ARIMA拟合AIC降低22%。3.5 关卡5周期性分解——STL为何比Seasonal Decompose更抗噪statsmodels.tsa.seasonal.seasonal_decompose是常用工具但它基于移动平均对异常值极其敏感。某次处理某连锁超市日销售额原始序列含一个大促日销售额是均值5倍seasonal_decompose将整个季节性曲线向上扭曲导致后续建模严重偏差。STLSeasonal-Trend decomposition using Loess是更优选择。它的核心是用局部多项式回归Loess分别拟合趋势和季节性Loess对异常值鲁棒且可调节robustTrue参数启用迭代加权进一步抑制噪声影响。STL有三个关键参数period必须准确指定。对日度数据若存在周周期period7若还有月周期如发薪日效应需用period30或更高频分解。错误period会导致季节性泄漏到趋势中。seasonal_deg季节性拟合的多项式阶数。seasonal_deg1线性适合平缓周期seasonal_deg0常数适合强固定周期如每周五固定促销。trend_deg趋势拟合阶数。trend_deg1适合线性趋势trend_deg2适合二次趋势如技术扩散曲线。我的经验是先用seasonal_decompose快速看大致周期再用STL精调。对某在线教育平台周活数据seasonal_decompose显示period7但STL用period7时趋势仍有残留周期性尝试period14双周课程周期趋势变得平滑证实了业务侧“双周结课”的节奏。分解后不要直接丢弃残差。残差序列蕴含重要信息若残差自相关显著plot_acf(resid)有长拖尾说明模型未捕获的动态若残差含明显异常点说明原始异常检测不彻底。我常把残差作为新特征输入后续模型它比原始序列更能反映“不可预测的扰动”。3.6 关卡6重采样与聚合——如何避免“时间压缩”导致的信息失真高频数据如秒级IoT常需降频为分钟/小时级用于建模。但简单resample(1H).mean()会抹杀关键模式。某风力发电机功率数据秒级采样显示每分钟有数次短时切出叶片避风但小时均值完全掩盖了这一现象导致模型无法预测功率骤降风险。正确做法是多维度聚合为每个重采样窗口生成一组特征中心趋势均值、中位数、众数对离散状态有效离散程度标准差、变异系数标准差/均值、四分位距极值行为最大值、最小值、最大值发生时间如“峰值出现在窗口后15分钟”分布形态偏度、峰度、超过阈值的次数如“功率80%额定值的秒数”代码模板def hourly_features(series): def agg_func(x): return pd.Series({ mean_power: x.mean(), std_power: x.std(), max_power: x.max(), min_power: x.min(), peak_time_ratio: (x.idxmax() - x.index[0]) / len(x), # 峰值相对位置 high_power_seconds: (x 0.8 * x.max()).sum(), # 高载荷时长 skewness: x.skew(), }) return series.resample(1H).apply(agg_func) # 结果是MultiIndex DataFrame每小时一行多列特征 hourly_df hourly_features(power_series)这个方法在某数据中心PUE能源使用效率优化中至关重要原始分钟级PUE波动剧烈但hourly_features生成的high_power_seconds特征精准刻画了空调压缩机频繁启停的“喘振”模式成为预测PUE飙升的关键前置指标。3.7 关卡7滞后特征构造——为什么lag_1不等于“昨天同一时刻”对日度数据“lag_1”自然是前一天但对含节假日的业务序列lag_1可能指向法定假日如周一的lag_1是周日但周日是调休工作日。若模型学到“周日销量总是低于周一”却不知周日是调休就会在真实周日休息日做出错误预测。解决方案是业务日历对齐。我维护一个business_calendar.csv包含date: 日期is_holiday: 是否法定假日is_workday: 是否实际工作日含调休week_of_month: 第几周用于捕捉月度效应days_since_last_holiday: 距上次假日天数捕捉假日后消费延迟然后构造滞后特征时不按自然日历而按业务日历索引# 创建业务日历索引 bus_cal pd.read_csv(business_calendar.csv, parse_dates[date]).set_index(date) # 合并到主数据 df df.join(bus_cal, ondate) # 构造“上一个工作日”的销量而非“前一天” df[lag_1_workday] df.sort_values(date)[sales].shift(1, fill_value0) df.loc[~df[is_workday], lag_1_workday] np.nan # 非工作日不参与滞后某次处理某航空公司机票预订数据用自然lag_1模型总在节假日后第一天预测过高因lag_1是假日销量低模型误以为“假日后必爆发”改用业务日历lag_1_workday指向假日前最后一个工作日预测准确率提升31%。3.8 关卡8外生变量整合——如何让天气、舆情等“杂音”变成“信号”SARIMAX等模型支持外生变量exog但直接把原始天气数据温度、湿度、气压拼接进来效果往往很差。问题在于外生变量与目标变量的时间尺度、因果延迟、非线性关系未被建模。我的处理流程是三阶转化尺度对齐天气是小时级销量是日级。不简单取日均值而是计算“当日最高温”、“当日累计降雨量”、“当日平均湿度”因为这些物理量对消费行为有明确影响高温促冷饮销售降雨抑止出行。延迟建模天气影响有滞后。如“今日高温”可能刺激“明日冷饮销量”而非今日。我用cross_correlation函数计算天气变量与销量的互相关找出峰值延迟如温度与销量互相关在lag1处最大然后构造temp_lag_1特征。非线性编码温度与销量非线性。25°C和30°C对销量影响相似但35°C会引发爆发。因此将温度分段编码temp_bin_025°C、temp_bin_125-30°C、temp_bin_230°C比原始温度值更有效。某快消品公司区域销量预测原始加入温度均值模型R²仅0.62经三阶转化后R²升至0.79且temp_bin_2系数显著为正验证了“高温驱动”假设。3.9 关卡9缺失值填充——为什么线性插值在时序中常是毒药线性插值interpolate(methodlinear)假设缺失前后数据呈线性变化这在物理过程如匀速运动中成立但在业务时序中荒谬。某共享单车订单量在早高峰7-9点呈陡峭上升线性插值会把8:15的缺失值填为7:00和9:00的均值而真实值应接近9:00的峰值。更鲁棒的方法是基于相似时段的KNN填充。思路每个缺失点找历史上最相似的K个时段如同样为周二早高峰用它们的均值填充。相似性用余弦距离计算对时间序列形状敏感from sklearn.metrics.pairwise import cosine_similarity def knn_impute(series, k5, window24): # 构建滑动窗口矩阵每行是一个长度为window的子序列 windows np.array([series[i:iwindow].values for i in range(len(series)-window1)]) # 对缺失点t计算其前后window点与所有历史窗口的余弦相似度 t series.isnull().idxmax() # 找第一个缺失点 if t window or t len(series)-window: return series # 边界点不处理 target_vec series[t-window:t].values.reshape(1, -1) similarities cosine_similarity(target_vec, windows)[0] # 取相似度最高的k个窗口的中心点值即t-windowk*window//2 top_k_idx np.argsort(similarities)[-k:] filled_val np.mean([windows[i][window//2] for i in top_k_idx]) series.iloc[t] filled_val return series此法在某地铁客流预测中效果突出原始线性插值使早高峰预测MAE达12%KNN填充后降至4.3%因为它捕捉到了“工作日早高峰形状高度一致”的业务本质。3.10 关卡10数据分割——为什么时间序列不能用train_test_splitsklearn.model_selection.train_test_split随机打乱数据对时序是自杀行为。它会让模型看到“未来”数据测试集中的点出现在训练集之前导致乐观偏差。正确做法是前向链式分割Forward Chaining训练集t1 to tn验证集tn1 to tnm测试集tnm1 to end但更关键的是验证集设计。我坚持用滚动式验证Rolling Forecast Origin固定训练窗口大小如365天每次向前滚动1天重新训练模型并预测下1天。这样得到N个预测点可计算滚动MAE、RMSE比单次分割更能反映模型在真实部署中的衰减表现。某次为某期货公司构建价格预测模型用单次分割前80%训练后20%测试模型R²0.85改用滚动验证窗口365天滚动1天R²降至0.42暴露出模型在长期预测中的脆弱性避免了上线后巨额亏损。3.11 关卡11特征缩放——为什么MinMaxScaler在时序中比StandardScaler更危险MinMaxScaler将数据缩放到[0,1]但它的min/max来自训练集。当测试集出现训练集未见的极值如黑天鹅事件缩放后值会超出[0,1]导致模型输入溢出。StandardScaler虽也有类似问题但正态分布假设下3σ外的值概率低而MinMaxScaler对极值零容忍。我的方案是分位数缩放Quantile Scaling用训练集的5%和95%分位数作为缩放边界而非min/max。这样即使测试集出现新极值也能被压缩到[0,1]内且保留了分布形状from sklearn.preprocessing import QuantileTransformer qt QuantileTransformer(output_distributionuniform, random_state42) # fit only on training set X_train_scaled qt.fit_transform(X_train) # transform test set with same parameters X_test_scaled qt.transform(X_test) # 安全某次处理某加密货币价格MinMaxScaler在测试期遇到单日暴涨200%缩放后输入为1.8模型输出NaNQuantileTransformer5%-95%将暴涨压缩到[0.95,1.0]区间模型稳定运行。3.12 关卡12标签工程——为什么“预测下一个值”是最差的目标多数教程教“用前n步预测下一步”即监督学习中的X [y_t-1, y_t-2, ..., y_t-n],y y_t。这在短期预测尚可但对业务决策无效。业务真正需要的是“未来7天总销量是否超阈值”、“下个月峰值是否突破容量”、“未来24小时是否有连续3小时低于安全线”。因此我坚持业务目标导向的标签工程总量预测y sum(y_t to y_t6)未来7天总和极值预测y max(y_t to y_t30)下月峰值事件预测y 1 if any(y_t to y_t23) threshold else 0未来24小时是否告警某医院急诊室原始目标是“预测下一小时就诊人数”模型MAE8改为“预测未来4小时是否超承载量120人”用逻辑回归AUC达0.91真正指导了人力调度。实操心得在构造业务标签前

相关新闻