为什么你的销量预测不准?80%的问题出在特征工程上。本文从真实订单数据出发,一步步构建出模型可用的23维特征向量,附完整代码。

一、为什么特征工程决定预测上限?

很多初学者拿到销量预测任务后,直接对历史销量序列上ARIMA或LSTM。这忽略了零售场景中最重要的信息:外部因素——星期几、节假日、促销、天气、价格变化等。

机器学习模型(如LightGBM、XGBoost)的优势在于可以灵活融合这些异构特征。我开发的销量预测API,最终采用23维特征(调优模型)和31维特征(进阶模型),全部从原始销售记录中通过特征工程自动生成。

本文以典型的零售订单数据为例,一步步演示如何构建这23个特征。

二、原始数据长什么样?

假设我们有一张销售明细表 sales_detail:

字段 说明 示例
date 日期 2024-01-01
sku_id 商品ID SKU10086
sales_qty 当日销量 23
price 当日单价 9.9
is_promotion 是否促销 0/1
holiday 节假日类型 0:无, 1:周末, 2:法定假日

目标:预测每个SKU未来1-7天的销量。

三、23维特征全解析

我将23个特征分为四类,每类对应一段生成代码。

3.1 时间特征(3维)

· 星期几(one‑hot编码保留5维?实际模型会处理,这里只提)
· 是否周末(0/1)
· 距最近法定假日的天数(-3表示三天后是假日,提前备货)

def create_time_features(df):
    df['dow'] = df['date'].dt.dayofweek  # 0=周一
    df['is_weekend'] = (df['dow'] >= 5).astype(int)
    # 假日表需提前维护
    df['days_to_holiday'] = (df['holiday_date'] - df['date']).dt.days
    return df[['dow', 'is_weekend', 'days_to_holiday']]

3.2 历史销量滞后特征(7维)

过去7天每天的销量(lag_1, lag_2, …, lag_7)。这是模型捕捉短期依赖的核心。

for lag in range(1, 8):
    df[f'lag_{lag}'] = df.groupby('sku_id')['sales_qty'].shift(lag)

3.3 滚动统计特征(6维)

· 过去7天销量均值、标准差
· 过去14天销量均值、标准差
· 过去30天销量均值、标准差

这些特征刻画了销量的平稳性和波动性。

for window in [7, 14, 30]:
    df[f'mean_{window}d'] = df.groupby('sku_id')['sales_qty'].transform(
        lambda x: x.rolling(window, min_periods=1).mean()
    )
    df[f'std_{window}d'] = df.groupby('sku_id')['sales_qty'].transform(
        lambda x: x.rolling(window, min_periods=1).std().fillna(0)
    )

3.4 价格与促销特征(7维)

· 当前价格
· 价格变化率(与7天前相比)
· 是否促销(0/1)
· 促销强度(若有多档,可设折扣率)
· 价格弹性系数(离线计算,存入静态表)

df['price_change_rate'] = (df['price'] - df.groupby('sku_id')['price'].shift(7)) / df.groupby('sku_id')['price'].shift(7)
df['is_promotion'] = df['is_promotion'].astype(int)
# 静态特征从商品主表关联
df = df.merge(sku_static[['sku_id', 'price_elasticity']], on='sku_id', how='left')

以上合计:时间3 + 滞后7 + 滚动6 + 价格促销4(价格、变化率、促销标识、弹性) = 20,再加节假日类型、季节性得分、历史同期销量3个,共23维。实际模型还有交互特征,但主体如此。

四、从原始表到模型输入矩阵(完整Pipeline)

import pandas as pd
import numpy as np

def build_features(sales_detail, sku_static, holiday_calendar):
    df = sales_detail.copy()
    # 时间特征
    df['date'] = pd.to_datetime(df['date'])
    df['dow'] = df['date'].dt.dayofweek
    df['is_weekend'] = (df['dow'] >= 5).astype(int)
    # 滞后特征(需按SKU分组排序)
    df = df.sort_values(['sku_id', 'date'])
    for lag in range(1, 8):
        df[f'lag_{lag}'] = df.groupby('sku_id')['sales_qty'].shift(lag)
    # 滚动统计
    for window in [7, 14, 30]:
        df[f'mean_{window}d'] = df.groupby('sku_id')['sales_qty'].transform(
            lambda x: x.rolling(window, min_periods=1).mean()
        )
        df[f'std_{window}d'] = df.groupby('sku_id')['sales_qty'].transform(
            lambda x: x.rolling(window, min_periods=1).std().fillna(0)
        )
    # 价格特征
    df['price_change'] = df['price'] - df.groupby('sku_id')['price'].shift(1)
    df = df.merge(sku_static[['sku_id', 'price_elasticity']], on='sku_id', how='left')
    # 节假日信息(合并)
    df = df.merge(holiday_calendar, on='date', how='left')
    df['holiday_type'] = df['holiday_type'].fillna(0).astype(int)
    # 选择最终特征列
    feature_cols = ['dow', 'is_weekend', 'price', 'price_change', 'is_promotion', 'price_elasticity',
                    'lag_1','lag_2','lag_3','lag_4','lag_5','lag_6','lag_7',
                    'mean_7d','std_7d','mean_14d','std_14d','mean_30d','std_30d',
                    'holiday_type']
    X = df[feature_cols].values
    y = df['sales_qty'].values
    return X, y, feature_cols

五、实战技巧与避坑指南

  1. 缺失值处理:滞后和滚动特征初期会产生NaN,用0或均值填充。
  2. 特征归一化:树模型对尺度不敏感,但如果有深度学习部分建议做标准化。
  3. 避免未来信息:生成滞后特征时,确保只用过去数据,不要泄露“未来销量”。
  4. 季节性分解:对于强周期商品(如冰淇淋),可额外加入“去年同期销量”作为特征(例如lag_365)。

六、如何使用我的API直接获取预测?

如果你不想自己写特征工程,可以直接调用我训练好的模型。API内部已经实现了上述23维(及31维)特征的自动构建。你只需传入最基础的销售明细(日期、销量),API会自动生成所有特征并返回预测。

免费试用500次,欢迎体验:
官网:http://retail-forecast.oss-cn-beijing.aliyuncs.com/
API文档和示例代码见官网。

七、下篇预告

下一篇将分享《模型迭代实战:如何将准确率从75%提升到89%》,包括LightGBM调参、特征选择、模型融合等经验,敬请关注。


本文完整代码已上传至GitHub,链接见官网。有任何问题欢迎评论区交流。


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐