paper2skills Playbook

Supply Chain ML Feature Engineering — 供应链 ML 特征工程:时序+图+统计三维

Skill-Supply-Chain-ML-Features · 12-ML基础

causalexperimentforecasting广告与投放供应链与补货WF-A 智能补货WF-B 广告优化
年化 ROI供应链 ML 模型准确率提升 15-20%,减少缺货/积压成本
实现难度⭐⭐☆☆☆
业务优先级⭐⭐⭐⭐☆
业务视角
适用角色数据分析师 / 数据工程师 · 运营负责人 · 产品经理
适用平台选品评分 · 差评预测 · 用户流失预警 · 广告出价预测
什么情况下用想用机器学习解决业务问题,但不知道该选什么模型;模型上线后效果越来越差不知道为什么
成功是什么样的选对算法工具减少 50% 试错时间,模型上线后可监控可解释,数据团队和业务团队建立共同语言
业务痛点
不知道该用什么模型模型准确率不稳定业务不相信模型结果模型黑盒说不清为什么这么预测

1. 解决的问题

1. 稀疏性:长尾 SKU 历史销量不足(< 30 天),传统特征工程无法直接应用

2. 核心算法逻辑

供应链数据的特殊性

3. 业务应用场景

业务背景:预测 SKU 未来 14 天补货需求量,特征工程决定模型上限。

效果:加入供应链特征后,RMSE 从 23.5 降至 19.2(提升 18%)。

业务背景:构建供应商风险评分,输入 SCM Attribution 模型识别高风险供应商。

4. 输入数据要求

请查看原始代码模板获取输入规格。

5. 输出结果

请查看原始代码模板获取输出规格。

6. 业务价值 / ROI

  • 跨域:Skill-Inventory-Health-Aging-Attribution

7. 代码模板

代码块数量:4 · 路径:paper2skills-code/supply_chain/supply_chain_ml_features

"""
Supply Chain ML Feature Engineering — 供应链 ML 特征工程
Python 标准库实现,无 sklearn/pandas 依赖,Python 3.14 兼容
"""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Optional
import math
import statistics


# ─────────────────────────────────────────────
# 数据结构
# ─────────────────────────────────────────────

@dataclass
class SupplyChainRecord:
    """供应链时序记录(单 SKU 单天)"""
    sku_id: str
    timestamp: float          # Unix timestamp(天级别,取当天 00:00 的 ts)
    demand: float             # 当日需求量(件数)
    lead_time: float          # 供应商交货期(天)
    is_promotion: bool = False  # 是否为促销日
    supplier_id: str = ""     # 供应商ID
    category: str = ""        # 品类


# ─────────────────────────────────────────────
# 时序特征构建器
# ─────────────────────────────────────────────

class TemporalFeatureBuilder:
    """
    时序特征构建器:滞后特征、滚动统计、季节分解。
    严格无数据泄露:t 时刻特征只使用 t-1 及以前的数据。
    """

    def __init__(self, lag_windows: list[int] = None, roll_windows: list[int] = None):
        """
        Args:
            lag_windows: 滞后步数列表,如 [7, 14, 28]
            roll_windows: 滚动窗口大小列表,如 [7, 14, 30]
        """
        self.lag_windows = lag_windows or [7, 14, 28]
        self.roll_windows = roll_windows or [7, 14, 30]

    def build(self, records: list[SupplyChainRecord]) -> list[dict]:
        """
        为每条记录构建时序特征(使用严格的历史窗口,避免未来信息)。

        Returns:
            list of feature dicts,与 records 等长
        """
        # 按 sku_id 分组后按时间排序
        sku_records: dict[str, list[SupplyChainRecord]] = {}
        for r in records:
            sku_records.setdefault(r.sku_id, []).append(r)
        for sku in sku_records:
            sku_records[sku].sort(key=lambda x: x.timestamp)

8. 论文来源

未自动抽取;请查看原始 Skill 卡片。