机器学习常见的分类与回归模型目标变量系统性设计与实践(一)

几篇关联度高的:


文章目录

  • 前言
  • [1 场景一:销量预测回归模型](#1 场景一:销量预测回归模型)
    • [1.1 多种 Y 的设定方案(目标变量)](#1.1 多种 Y 的设定方案(目标变量))
    • [1.2 特征工程教程](#1.2 特征工程教程)
      • [1.2.1 步骤 1:数据准备 &清洗](#1.2.1 步骤 1:数据准备 &清洗)
      • [1.2.2 步骤 2:时间序列特征](#1.2.2 步骤 2:时间序列特征)
      • [1.2.3 步骤 3:促销、价格与市场活动特征](#1.2.3 步骤 3:促销、价格与市场活动特征)
      • [1.2.4 步骤 4:外部变量](#1.2.4 步骤 4:外部变量)
      • [1.2.5 步骤 5:处理趋势与平稳性](#1.2.5 步骤 5:处理趋势与平稳性)
      • [1.2.6 步骤 6:划分训练 /验证与防止数据泄露](#1.2.6 步骤 6:划分训练 /验证与防止数据泄露)
      • [1.2.7 步骤 7:模型指标与评估](#1.2.7 步骤 7:模型指标与评估)
  • [2 场景二:营销中高潜力回购用户分类模型](#2 场景二:营销中高潜力回购用户分类模型)
    • [2.1 多种 Y=1 定义方案("会回购"的客户)](#2.1 多种 Y=1 定义方案(“会回购”的客户))
    • [2.2. 特征工程流程](#2.2. 特征工程流程)
      • [2.2.1 步骤 1:样本集定义 &标签生成](#2.2.1 步骤 1:样本集定义 &标签生成)
      • [2.2.2 步骤 2:客户历史行为特征(基于 \( \le T_0 \) 时间段)](#2.2.2 步骤 2:客户历史行为特征(基于 \le T_0 时间段))
      • [2.2.3 步骤 3:特征处理与标准化](#2.2.3 步骤 3:特征处理与标准化)
      • [2.2.4 步骤 4:训练 /验证划分与防止泄露](#2.2.4 步骤 4:训练 /验证划分与防止泄露)
      • [2.2.5 步骤 5:模型评价指标](#2.2.5 步骤 5:模型评价指标)
    • [2.3 模拟未来一个月消费者回购概率模型](#2.3 模拟未来一个月消费者回购概率模型)
      • [2.3.1 Y变量设计](#2.3.1 Y变量设计)
      • [2.3.2 滚动切片设计](#2.3.2 滚动切片设计)
      • [2.3.3 滚动切片模拟代码](#2.3.3 滚动切片模拟代码)
      • [2.3.4 交叉验证方法](#2.3.4 交叉验证方法)
      • [2.3.5 特征泄露风险与案例](#2.3.5 特征泄露风险与案例)
  • [4 对比 &实战建议](#4 对比 &实战建议)
  • [5 公式汇总](#5 公式汇总)

前言

在机器学习项目里,目标变量 (Y) 的定义决定了你能解答什么问题,以及模型能给业务带来什么价值。选择不当不仅可能导致模型误差大、偏差严重,还可能让业务决策方向偏离。

本文分两大场景:

  1. 供应链项目中的 销量预测(回归问题)
  2. 营销项目中的 高潜力回购用户预测(分类问题)

本篇将针对每个场景,给出多种 Y 的设定方案 ,是比较 通俗易懂的方案,每种方案的优缺点与适用情形;然后给出详尽的 特征工程流程与技巧


1 场景一:销量预测回归模型

1.1 多种 Y 的设定方案(目标变量)

以下是常见的不同定义方式:

方案编号 Y 定义 数学表达 优点 风险 / 注意点 典型适用情境
方案 A1:原始销量 当期销量数值 Y t = S a l e s t Y_t = Sales_t Yt=Salest 易解释;直接与库存/补货/生产规划对应 分布可能有长尾,极端值/促销衰退期/零销量期噪声大;误差度量敏感 产品稳定、历史销量记录丰富、促销波动较小
方案 A2:对数变换后的销量 用 log 或类似变换平滑销量 Y t = log ⁡ ( S a l e s t + c ) Y_t = \log(Sales_t + c) Yt=log(Salest+c)(例如 (c = 1) 平滑零销量) 缩小长尾影响;使误差分布近似正态;对比例误差敏感性降低 反变换后解释比较复杂;零或负销量需处理;业务方可能不喜欢"对数销量"这个概念 零销量/低销量很多,销量跨度大(small SKUs + large SKUs 混在一起)
方案 A3:环比/同比增长率 与上期/同期相比的变化 Y t = S a l e s t S a l e s t − 1 − 1 Y_t = \frac{Sales_t}{Sales_{t-1}} - 1 Yt=Salest−1Salest−1 或者 Y t = S a l e s t S a l e s t − P − 1 Y_t = \frac{Sales_t}{Sales_{t - P}} - 1 Yt=Salest−PSalest−1(P 为周期,如 52 周、12 月) 弱化趋势与季节性影响;更关注变化/促销/市场事件的影响 增长率极端值问题(基期小或为零);对业务解释性下降;未来预测可能不稳定 如果你的业务关心"相对提升"多于"绝对销量",如促销、预算评估、增长指标
方案 A4:差分销量(绝对变化量) 本期销量减去上期销量 Y t = S a l e s t − S a l e s t − 1 Y_t = Sales_t - Sales_{t-1} Yt=Salest−Salest−1 强调绝对变化;可捕捉向上的"需求增量"或下滑;便于用差分方法处理非平稳性 噪声大;上下波动可能互相抵消;趋势 /季节性仍可能残留;如果滞后太短可能误导 快消品、促销频繁的品类;补货周期短
方案 A5:未来窗口内销量总和 预测未来 (k) 个时间单位(天/周/月)之和 Y t = ∑ i = 1 k S a l e s t + 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:时间序列特征

为捕捉过去销量对未来的影响,常用以下特征:

  • 滞后销量:

    X l a g ( k ) = S a l e s t − k X_{lag(k)} = Sales_{t-k} Xlag(k)=Salest−k

    可以取多个滞后值 ( k=1,2,3,\dots )

  • 滚动统计(滑动窗口):

    X m a ( k ) = 1 k ∑ i = 1 k S a l e s t − i X_{ma(k)} = \frac{1}{k} \sum_{i=1}^k Sales_{t-i} Xma(k)=k1i=1∑kSalest−i

  • 滚动最大/最小/标准差:

    X s t d ( k ) = 1 k ∑ i = 1 k ( S a l e s t − i − X m a ( 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):

      X s i n = sin ⁡ ( 2 π ⋅ d a y O f Y e a r 365 ) , X c o s = cos ⁡ ( 2 π ⋅ d a y O f Y e a r 365 ) 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:促销、价格与市场活动特征

  • 折扣率/促销强度:

    D i s c o u n t R a t e t = P r i c e original , t − P r i c e discounted , t P r i c e original , 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:处理趋势与平稳性

  • 若销量序列整体趋势明显,可用差分(如一阶差分):

    Δ S a l e s t = S a l e s t − S a l e s t − 1 \Delta Sales_t = Sales_t - Sales_{t-1} ΔSalest=Salest−Salest−1

  • 或者进行去趋势 + 季节性分解 (seasonal decomposition)

1.2.6 步骤 6:划分训练 /验证与防止数据泄露

  • 用时间切片(time-based split):训练集的时间晚于验证集要早,未来窗口不能被提前泄露
  • 若用未来窗口预测 ∑ i = 1 k S a l e s t + 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),所有 "潜在客户" 的历史行为均在 ≤ T 0 \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) 的时间间隔
      R i = T 0 − t last purchase by customer i R_i = T_0 - t_{\text{last purchase by customer i}} Ri=T0−tlast purchase by customer i

    • Frequency: 在历史期内购买次数
      F i = N orders by i in history F_i = N_{\text{orders by i in history}} Fi=Norders by i in history

    • Monetary: 历史期总消费金额
      M i = ∑ o r d e r s ≤ T 0 A m o u n t M_i = \sum_{orders \le T_0} Amount Mi=orders≤T0∑Amount

  • 购买间隔特征

    • 平均购买间隔(如果有多次购买)
      Δ t ˉ i = 1 F i − 1 ∑ j = 2 F i ( t j − t j − 1 ) if F i ≥ 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 ) 的行为与特征,标签由 ( T 0 , T 0 + W ] (T_0, T_0 + W] (T0,T0+W]决定
  • 若客户在 ≤ T 0 \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 滚动切片模拟代码

python 复制代码
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 = 7

slices = []
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示例:
python 复制代码
from sklearn.model_selection import TimeSeriesSplit

tscv = 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 公式汇总

为了便于快速应用以下是常见公式:

  • 滞后特征:
    X l a g ( k ) = S a l e s t − k X_{lag(k)} = Sales_{t-k} Xlag(k)=Salest−k

  • 滚动平均:
    X m a ( k ) = 1 k ∑ i = 1 k S a l e s t − i X_{ma(k)} = \frac{1}{k} \sum_{i=1}^k Sales_{t-i} Xma(k)=k1i=1∑kSalest−i

  • 差分销量:
    Δ S a l e s t = S a l e s t − S a l e s t − 1 \Delta Sales_t = Sales_t - Sales_{t-1} ΔSalest=Salest−Salest−1

  • 对数变换销量:
    Y t = log ⁡ ( S a l e s t + c ) Y_t = \log(Sales_t + c) Yt=log(Salest+c)

  • 回购频次阈值标签:
    Y ( 2 ) = 1    ⟺    N purchases in ( T 0 , T 0 + 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    ⟺    ∑ o r d e r s ∈ ( T 0 , T 0 + W ] A m o u n t ≥ 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 ( T 0 , T 0 + W ] ) ∧ ( Δ t first 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 不仅能让模型训练与调参更稳定、预测误差更低,也能确保预测结果被业务方理解、接纳、用于决策。

相关推荐
丰年稻香7 小时前
神经网络核心机制深度解析:链式法则驱动下的梯度流动与参数优化
深度学习·神经网络·机器学习
Thomas21438 小时前
MinMaxScaler Scikit-learn sparkml 稀疏向量
人工智能·机器学习·scikit-learn
饕餮怪程序猿8 小时前
(5)机器学习-模型训练的数学原理
人工智能·机器学习
字节高级特工8 小时前
蓝耘智算与DeepSeekR1:低成本高能AI模型
c++·人工智能·机器学习·计算机视觉
jie*8 小时前
小杰机器学习(seven)——贝叶斯分类
人工智能·python·深度学习·神经网络·机器学习·分类·scikit-learn
寒月霜华11 小时前
机器学习-深度神经网络架构
人工智能·机器学习·dnn
B站_计算机毕业设计之家11 小时前
✅ Python房源数据采集+分析+预测平台 requests爬虫+sklearn回归 大数据实战项目(建议收藏)机器学习(附源码)
大数据·爬虫·python·机器学习·数据采集·sklearn·房源
盼小辉丶12 小时前
Transformer实战(19)——微调Transformer语言模型进行词元分类
深度学习·语言模型·分类·transformer
0xCode 小新13 小时前
鸿蒙ArkTS Canvas实战:转盘抽奖程序开发教程(基础到进阶)
人工智能·深度学习·机器学习·华为·ai·harmonyos·canvas组件