前言
在机器学习项目里,目标变量 (Y) 的定义决定了你能解答什么问题,以及模型能给业务带来什么价值。选择不当不仅可能导致模型误差大、偏差严重,还可能让业务决策方向偏离。
本文分两大场景:
- 供应链项目中的 销量预测(回归问题)
- 营销项目中的 高潜力回购用户预测(分类问题)
本篇将针对每个场景,给出多种 Y 的设定方案,是比较 通俗易懂的方案,每种方案的优缺点与适用情形;然后给出详尽的 特征工程流程与技巧。
1 场景一:销量预测回归模型
1.1 多种 Y 的设定方案(目标变量)
以下是常见的不同定义方式:
方案编号 | Y 定义 | 数学表达 | 优点 | 风险 / 注意点 | 典型适用情境 |
---|---|---|---|---|---|
方案 A1:原始销量 | 当期销量数值 | Yt=Salest Y_t = Sales_t Yt=Salest | 易解释;直接与库存/补货/生产规划对应 | 分布可能有长尾,极端值/促销衰退期/零销量期噪声大;误差度量敏感 | 产品稳定、历史销量记录丰富、促销波动较小 |
方案 A2:对数变换后的销量 | 用 log 或类似变换平滑销量 | Yt=log(Salest+c) Y_t = \log(Sales_t + c) Yt=log(Salest+c)(例如 (c = 1) 平滑零销量) | 缩小长尾影响;使误差分布近似正态;对比例误差敏感性降低 | 反变换后解释比较复杂;零或负销量需处理;业务方可能不喜欢“对数销量”这个概念 | 零销量/低销量很多,销量跨度大(small SKUs + large SKUs 混在一起) |
方案 A3:环比/同比增长率 | 与上期/同期相比的变化 | Yt=SalestSalest−1−1 Y_t = \frac{Sales_t}{Sales_{t-1}} - 1 Yt=Salest−1Salest−1 或者 Yt=SalestSalest−P−1 Y_t = \frac{Sales_t}{Sales_{t - P}} - 1 Yt=Salest−PSalest−1(P 为周期,如 52 周、12 月) | 弱化趋势与季节性影响;更关注变化/促销/市场事件的影响 | 增长率极端值问题(基期小或为零);对业务解释性下降;未来预测可能不稳定 | 如果你的业务关心“相对提升”多于“绝对销量”,如促销、预算评估、增长指标 |
方案 A4:差分销量(绝对变化量) | 本期销量减去上期销量 | Yt=Salest−Salest−1 Y_t = Sales_t - Sales_{t-1} Yt=Salest−Salest−1 | 强调绝对变化;可捕捉向上的“需求增量”或下滑;便于用差分方法处理非平稳性 | 噪声大;上下波动可能互相抵消;趋势 /季节性仍可能残留;如果滞后太短可能误导 | 快消品、促销频繁的品类;补货周期短 |
方案 A5:未来窗口内销量总和 | 预测未来 (k) 个时间单位(天/周/月)之和 | Yt=∑i=1kSalest+i Y_t = \sum_{i=1}^k Sales_{t+i} Yt=i=1∑kSalest+i | 与业务补货/生产周期一致;可适用于中短期计划;减少每天的波动 | 窗口大小敏感;若窗口大,预测延迟;特征滞后要处理好;可能 data leakage 问题 | 补货周期为月或数周的供应链;对于季节性商品或物流周期长的情况 |
1.2 特征工程教程
为不同 Y 定义准备特征,下面是一个详细流程与技巧,包含公式和步骤:
1.2.1 步骤 1:数据准备 &清洗
- 收集历史销量数据 (Sales_t),包括产品/SKU/店铺/区域维度
- 收集与销量可能相关的辅助变量:价格、促销活动、节假日、天气、库存水平、广告投放 etc.
- 处理缺失值与零销量:如果大量零销量,可能需要平滑(如对数变换 + 常数),或考虑零销量与非零销量分开建模
1.2.2 步骤 2:时间序列特征
为捕捉过去销量对未来的影响,常用以下特征:
-
滞后销量:
Xlag(k)=Salest−k X_{lag(k)} = Sales_{t-k} Xlag(k)=Salest−k
可以取多个滞后值 ( k=1,2,3,\dots )
-
滚动统计(滑动窗口):
Xma(k)=1k∑i=1kSalest−i X_{ma(k)} = \frac{1}{k} \sum_{i=1}^k Sales_{t-i} Xma(k)=k1i=1∑kSalest−i
-
滚动最大/最小/标准差:
Xstd(k)=1k∑i=1k(Salest−i−Xma(k))2 X_{std(k)} = \sqrt{\frac{1}{k} \sum_{i=1}^k (Sales_{t-i} - X_{ma(k)})^2} Xstd(k)=k1i=1∑k(Salest−i−Xma(k))2
-
周期性 / 日期特征:
-
日、周、月指标
-
周几 / 月份 /季度 one-hot 编码
-
年/季节周期正余弦编码(sine / cosine):
Xsin=sin(2π⋅dayOfYear365),Xcos=cos(2π⋅dayOfYear365) X_{sin} = \sin\left(\frac{2\pi \cdot dayOfYear}{365}\right), \quad X_{cos} = \cos\left(\frac{2\pi \cdot dayOfYear}{365}\right) Xsin=sin(3652π⋅dayOfYear),Xcos=cos(3652π⋅dayOfYear)
-
1.2.3 步骤 3:促销、价格与市场活动特征
-
折扣率/促销强度:
DiscountRatet=Priceoriginal,t−Pricediscounted,tPriceoriginal,t DiscountRate_t = \frac{Price_{\text{original}, t} - Price_{\text{discounted}, t}}{Price_{\text{original}, t}} DiscountRatet=Priceoriginal,tPriceoriginal,t−Pricediscounted,t
-
是否有促销事件:
Binary 特征 ( Promo_t = 1 ) if 有活动 else 0
-
广告投入 /市场预算 /竞争者活动等
1.2.4 步骤 4:外部变量
- 天气(温度、降水、节气 etc.)
- 节假日/公共假期前后影响
- 宏观经济指标(若适用,如零售业可能关心消费者购买力、人口变动 etc.)
1.2.5 步骤 5:处理趋势与平稳性
-
若销量序列整体趋势明显,可用差分(如一阶差分):
ΔSalest=Salest−Salest−1 \Delta Sales_t = Sales_t - Sales_{t-1} ΔSalest=Salest−Salest−1
-
或者进行去趋势 + 季节性分解 (seasonal decomposition)
1.2.6 步骤 6:划分训练 /验证与防止数据泄露
- 用时间切片(time-based split):训练集的时间晚于验证集要早,未来窗口不能被提前泄露
- 若用未来窗口预测 ∑i=1kSalest+i\sum_{i=1}^k Sales_{t+i}∑i=1kSalest+i,要确保特征都是在时间 ( t ) 或之前的,不含未来信息
1.2.7 步骤 7:模型指标与评估
- 常用指标:MAE(平均绝对误差)、RMSE、MAPE(平均绝对百分比误差)
- 如果对大额/高销量 SKU 更在乎,可以加权评估(按销量权重或按利润权重)
- 做残差分析,检查季节或促销期预测误差是否系统性偏高或低
2 场景二:营销中高潜力回购用户分类模型
2.1 多种 Y=1 定义方案(“会回购”的客户)
下面是常见的不同方式来定义 “回购”/“高潜力回购用户”:
方案编号 | Y = 1 的定义 | 优点 | 风险 / 注意点 | |
---|---|---|---|---|
方案 B1:未来窗口内至少一次回购 | 客户在基准时间 (T_0) 之后的未来窗口大小为 (W)(如 3 个月/6 个月)内有一次或以上购买 | 定义明确;多数客户样本可获取;易于计算与解释 | 窗口选得太短可能漏掉潜在的慢购物客;太长可能标签延迟;样本不平衡;业务方可能要求频次或金额更高的“回购” | |
方案 B2:回购频次阈值 | 在 (W) 窗口内购买次数 ≥ (K)(例如 ≥ 2 次/3 次等) | 能区分更忠诚/高频客户;营销资源更值得投入在这些客户上 | 如果 K 阈值太高客户少;频次受产品类别/客单价影响;可能忽略高价值但少次购买者 | |
方案 B3:回购金额阈值 | 在未来窗口内总消费金额 ≥ 阈值 (M) | 聚焦高价值用户;对营收贡献重;能和销售/利润目标对齐 | 金额阈值敏感;受品类价格变动的影响;少次但金额高 vs 多次但金额低可能被偏向;业务方可能难设置合理阈值 | |
方案 B4:回购速度/间隔限制 | 在未来窗口内有回购,且首次到回购间隔 ≤ 某阈值 (D)(例如 ≤ 30 天/90 天等) | 更能捕捉“活跃度高的潜力客户”;早期反应快的用户;有利于短期营销策略 | 若客户自然购买周期长的产品,可能误判;间隔的阈值需要业务与数据双重调优;可能忽略稳定但周期长的复购用户 | |
方案 B5:组合定义 | 比如频次 + 金额 + 时间间隔综合规则 | 更精细区分;高潜力用户定义更符合业务标准;营销投入回报率可能更高 | 定义复杂,标签样本可能很少;解释与沟通成本高;可能会忽略某些边缘客户;需要进行阈值调优与验证 |
2.2. 特征工程流程
2.2.1 步骤 1:样本集定义 &标签生成
- 确定基准时间 (T_0)(cut-off date),所有 “潜在客户” 的历史行为均在≤T0\le T_0≤T0时间内
- 确定未来窗口大小 ( W ) 用于标签定义
- 根据所选方案(B1~B5),为每个客户在训练集中生成标签 Y∈{0,1}Y \in \{0,1\}Y∈{0,1}
2.2.2 步骤 2:客户历史行为特征(基于 ( \le T_0 ) 时间段)
-
RFM 特征:
-
Recency: 最近一次购买到 (T_0) 的时间间隔
Ri=T0−tlast purchase by customer i R_i = T_0 - t_{\text{last purchase by customer i}} Ri=T0−tlast purchase by customer i -
Frequency: 在历史期内购买次数
Fi=Norders by i in history F_i = N_{\text{orders by i in history}} Fi=Norders by i in history -
Monetary: 历史期总消费金额
Mi=∑orders≤T0Amount M_i = \sum_{orders \le T_0} Amount Mi=orders≤T0∑Amount
-
-
购买间隔特征:
-
平均购买间隔(如果有多次购买)
Δtˉi=1Fi−1∑j=2Fi(tj−tj−1)if Fi≥2 \bar{\Delta t}_i = \frac{1}{F_i - 1} \sum_{j=2}^{F_i} (t_j - t_{j-1}) \quad \text{if } F_i \ge 2 Δtˉi=Fi−11j=2∑Fi(tj−tj−1)if Fi≥2 -
最后两次购买间隔
-
-
品类/产品偏好特征:
- 买过哪些产品/品类的分布:one‐hot 或 count
- 客单价分布:平均/中位数/最大/最小
-
行为特征(若有行为数据):
- 浏览量、加购未付、促销点击率/优惠券领取情况
- 市场活动/邮件/Push 响应情况
-
时间/周期特征:
- 过去购买的时间分布:是否偏向某些月/节假日/周末
- 客户注册时间/首购时间:新客户 vs 老客户
2.2.3 步骤 3:特征处理与标准化
- 对数变换:对于如消费金额这类正偏分布的特征可做 log 转换
- 缩放(standardization / min-max)
- 类别变量编码:one-hot 或 target encoding
2.2.4 步骤 4:训练 /验证划分与防止泄露
- 用时间切片 split:训练集含所有 ( \le T_0 ) 的行为与特征,标签由 (T0,T0+W](T_0, T_0 + W](T0,T0+W]决定
- 若客户在≤T0\le T_0≤T0 时间购买行为中使用未来标签窗口的信息,要避免
2.2.5 步骤 5:模型评价指标
- 二分类常用指标:ROC‐AUC,Precision, Recall, F1‐score
- 针对业务,也看 Precision@K、Lift(提升率)准则:你可能只对 top-10% 的潜力客户做营销投入
- 可区分不同阈值设定下的召回 vs 精确度 Trade-off
2.3 模拟未来一个月消费者回购概率模型
2.3.1 Y变量设计
- 预测目标:预测未来一个月(9月 → 10月)是否回购。
- Y = 1:用户在预测窗口内至少一次购买。
- Y = 0:用户在预测窗口内无购买。
- 正样本选择:所有在预测窗口内有回购的用户。
示例:
用户ID | 训练窗口内交易 | 预测窗口内交易 | Y |
---|---|---|---|
A | 1次 | 2次 | 1 |
B | 3次 | 0次 | 0 |
2.3.2 滚动切片设计
切片编号 | 训练时间窗口 | 预测时间窗口 |
---|---|---|
1 | 2025-07-01~07-31 | 2025-08-01~08-31 |
2 | 2025-07-08~08-07 | 2025-08-08~09-07 |
3 | 2025-07-15~08-14 | 2025-08-15~09-14 |
说明:每次训练用过去30天数据预测未来30天回购,步长可设为7天或其他。
2.3.3 滚动切片模拟代码
import pandas as pd
import numpy as np# 模拟用户每日交易数据
dates = pd.date_range("2025-06-01", "2025-09-30")
users = range(1, 101)
data = pd.DataFrame([(u, d) for u in users for d in dates], columns=['user_id', 'date'])
np.random.seed(42)
data['purchase'] = np.random.binomial(1, 0.05, len(data)) # 5%概率购买# 滚动切片参数
train_window = 30
predict_window = 30
step = 7slices = []
start_date = data['date'].min()
end_date = data['date'].max()while start_date + pd.Timedelta(days=train_window+predict_window-1) <= end_date:slices.append({'train_start': start_date,'train_end': start_date + pd.Timedelta(days=train_window-1),'pred_start': start_date + pd.Timedelta(days=train_window),'pred_end': start_date + pd.Timedelta(days=train_window+predict_window-1)})start_date += pd.Timedelta(days=step)pd.DataFrame(slices).head(3)
2.3.4 交叉验证方法
-
时间序列交叉验证(TimeSeriesSplit):
- 保持时间顺序,训练集总是早于验证集
- sklearn示例:
from sklearn.model_selection import TimeSeriesSplittscv = TimeSeriesSplit(n_splits=3)
for train_index, test_index in tscv.split(data):print("TRAIN:", train_index, "TEST:", test_index)
2.3.5 特征泄露风险与案例
-
易泄露特征:
- 未来购买金额、未来交易次数
- 未来优惠券使用情况
-
案例:
- 用“未来30天消费金额总和”作为训练特征 → 模型预测几乎完美,但不可落地
- 用“优惠券领取后是否使用”预测回购,如果领取在预测窗口内 → 泄露未来信息
4 对比 &实战建议
在实际项目中,要根据你的业务与数据情况来选择哪一种 Y 定义方案:
- 如果你在供应链里关心 绝对销量 与库存/生产计划,则方案 A1 或 A5 较好
- 如果销量分布长尾、促销/季节性强,则 A2 或 A3 更稳健
- 在回购预测中,如果营销预算有限且希望集中资源,则 B2/B3/B4(频次/金额/速度)更合适
- 若目标是宽泛识别潜在客户,则 B1 简单且覆盖面广
5 公式汇总
为了便于快速应用以下是常见公式:
-
滞后特征:
Xlag(k)=Salest−k X_{lag(k)} = Sales_{t-k} Xlag(k)=Salest−k -
滚动平均:
Xma(k)=1k∑i=1kSalest−i X_{ma(k)} = \frac{1}{k} \sum_{i=1}^k Sales_{t-i} Xma(k)=k1i=1∑kSalest−i -
差分销量:
ΔSalest=Salest−Salest−1 \Delta Sales_t = Sales_t - Sales_{t-1} ΔSalest=Salest−Salest−1 -
对数变换销量:
Yt=log(Salest+c) Y_t = \log(Sales_t + c) Yt=log(Salest+c) -
回购频次阈值标签:
Y(2)=1 ⟺ Npurchases in (T0,T0+W]≥K Y^{(2)} = 1 \iff N_{\text{purchases in }(T_0, T_0+W]} \ge K Y(2)=1⟺Npurchases in (T0,T0+W]≥K -
回购金额阈值标签:
Y(3)=1 ⟺ ∑orders∈(T0,T0+W]Amount≥M Y^{(3)} = 1 \iff \sum_{orders \in (T_0, T_0 + W]} Amount \ge M Y(3)=1⟺orders∈(T0,T0+W]∑Amount≥M -
回购速度标签:
Y(4)=1 ⟺ (exists purchase in (T0,T0+W])∧(Δtfirst repeat≤D) Y^{(4)} = 1 \iff (\text{exists purchase in } (T_0, T_0 + W] ) \land (\Delta t_{\text{first repeat}} \le D) Y(4)=1⟺(exists purchase in (T0,T0+W])∧(Δtfirst repeat≤D)
五、结语
定义 Y 看起来是一个基础问题,但它实际上蕴含多重业务假设。一个好的 Y 不仅能让模型训练与调参更稳定、预测误差更低,也能确保预测结果被业务方理解、接纳、用于决策。