当前位置: 首页 > news >正文

机器学习实战项目中,回归与分类模型中该如何科学定义目标变量Y?

前言

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

本文分两大场景:

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

本篇将针对每个场景,给出多种 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=Salest1Salest1 或者 Yt=SalestSalest−P−1 Y_t = \frac{Sales_t}{Sales_{t - P}} - 1 Yt=SalestPSalest1(P 为周期,如 52 周、12 月)弱化趋势与季节性影响;更关注变化/促销/市场事件的影响增长率极端值问题(基期小或为零);对业务解释性下降;未来预测可能不稳定如果你的业务关心“相对提升”多于“绝对销量”,如促销、预算评估、增长指标
方案 A4:差分销量(绝对变化量)本期销量减去上期销量Yt=Salest−Salest−1 Y_t = Sales_t - Sales_{t-1} Yt=SalestSalest1强调绝对变化;可捕捉向上的“需求增量”或下滑;便于用差分方法处理非平稳性噪声大;上下波动可能互相抵消;趋势 /季节性仍可能残留;如果滞后太短可能误导快消品、促销频繁的品类;补货周期短
方案 A5:未来窗口内销量总和预测未来 (k) 个时间单位(天/周/月)之和Yt=∑i=1kSalest+i Y_t = \sum_{i=1}^k Sales_{t+i} Yt=i=1kSalest+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)=Salestk

    可以取多个滞后值 ( 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=1kSalesti

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

    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=1k(SalestiXma(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,tPricediscounted,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=SalestSalest1

  • 或者进行去趋势 + 季节性分解 (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_0T0时间内
  • 确定未来窗口大小 ( 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=T0tlast 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=ordersT0Amount

  • 购买间隔特征

    • 平均购买间隔(如果有多次购买)
      Δ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=Fi11j=2Fi(tjtj1)if Fi2

    • 最后两次购买间隔

  • 品类/产品偏好特征

    • 买过哪些产品/品类的分布: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_0T0 时间购买行为中使用未来标签窗口的信息,要避免

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
A1次2次1
B3次0次0

2.3.2 滚动切片设计

切片编号训练时间窗口预测时间窗口
12025-07-01~07-312025-08-01~08-31
22025-07-08~08-072025-08-08~09-07
32025-07-15~08-142025-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)=Salestk

  • 滚动平均:
    Xma(k)=1k∑i=1kSalest−i X_{ma(k)} = \frac{1}{k} \sum_{i=1}^k Sales_{t-i} Xma(k)=k1i=1kSalesti

  • 差分销量:
    ΔSalest=Salest−Salest−1 \Delta Sales_t = Sales_t - Sales_{t-1} ΔSalest=SalestSalest1

  • 对数变换销量:
    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)=1Npurchases 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)=1orders(T0,T0+W]AmountM

  • 回购速度标签:
    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 repeatD)


五、结语

定义 Y 看起来是一个基础问题,但它实际上蕴含多重业务假设。一个好的 Y 不仅能让模型训练与调参更稳定、预测误差更低,也能确保预测结果被业务方理解、接纳、用于决策。

希望你/你的团队在供应链销量预测或营销回购预测中,能从上述方案中挑出适合自己的 Y 定义,并配合上述特征工程流程设计一个健壮可用的模型。如果你有具体数据/业务情况,我也可以帮你一对一定制 Y 定义 + 特征方案。


文章转载自:

http://P5qQytEO.qcymf.cn
http://XEN9tDbk.qcymf.cn
http://yS447jG1.qcymf.cn
http://OWopGLuL.qcymf.cn
http://YN82yPJx.qcymf.cn
http://Reif80Nm.qcymf.cn
http://ZlmaIZY8.qcymf.cn
http://IE5gs1Kh.qcymf.cn
http://fKgrxh41.qcymf.cn
http://zVtY7UCi.qcymf.cn
http://foOERLQl.qcymf.cn
http://9jQdi6GK.qcymf.cn
http://bZlePSdo.qcymf.cn
http://p4xfBoVi.qcymf.cn
http://RmrIb4Qq.qcymf.cn
http://72CMUQww.qcymf.cn
http://oLlSM26v.qcymf.cn
http://wtVCgRsA.qcymf.cn
http://31whl8BF.qcymf.cn
http://MmYmzqAW.qcymf.cn
http://vegYISsy.qcymf.cn
http://a6MVqtFM.qcymf.cn
http://eAcW0HA4.qcymf.cn
http://a800Va2B.qcymf.cn
http://7surCxmS.qcymf.cn
http://vFki5bCD.qcymf.cn
http://S8m1B66n.qcymf.cn
http://sb6IGtAf.qcymf.cn
http://mPx03uDz.qcymf.cn
http://NEyIVgFj.qcymf.cn
http://www.dtcms.com/a/384206.html

相关文章:

  • 【Docker】docker容器的使用
  • 【Pywinauto库】13.3 pywinauto.xml_helpers内部模块
  • vue3 基本教程-运行一个最小demo
  • [JavaWeb]在学习Servlet的过程中一个经典面试题
  • 安全测试技能 | web、app、PC应用测试面试题梳理
  • 金融数据--集思录可转债等权指数
  • ruoyi分布式在module下新建服务排坑指南
  • prometheus-2.42.0.linux-amd64.tar.gz 安装配置展示
  • 1台SolidWorks服务器能带8-10人并发使用
  • 中国制造难点在哪里?
  • 网编_HW_9.15
  • 前端基础知识---10 Node.js(一)
  • C语言:求三个整数中的最大值
  • AI 赋能大前端电商应用:智能尺码推荐与搭配建议,重构购物体验
  • 跨境通信合规新解:Z世代多模态交互技术突破
  • SpringBoot返回前端时间格式化处理
  • 高系分四:网络分布式
  • Python 3.9.21 升级到 Python >=3.10
  • 在运维工作中,FTP主动和被动的区别有哪些?
  • CE-Agent 多智能体系统流程图文档
  • 数据结构——逻辑结构物理结构
  • RuoYi-Vue3-FastAPI框架的功能实现(下)
  • PySpark简化数据处理的高效函数有哪些?
  • 哈尔滨云前沿服务器租用托管
  • React项目 新闻发布系统 项目初始化与路由搭建
  • 数字经济专业核心课程解析与职业发展指南
  • Spring Boot 全栈优化:服务器、数据、缓存、日志的场景应用!
  • 三色标记算法
  • Apache IoTDB(5):深度解析时序数据库 IoTDB 在 AINode 模式单机和集群的部署与实践
  • 【Java后端】Spring Security配置对应的账号密码访问