Causal ML Feature Engineering — 因果驱动的特征工程:消除混淆提升模型可靠性
Skill-Causal-ML-Feature-Engineering · 12-ML基础
causalexperimentforecastingoptimizationpricing广告与投放供应链与补货客服与VOC定价与利润WF-A 智能补货WF-B 广告优化WF-C 客服分诊WF-E Review监控WF-F 动态定价
年化 ROI¥10-40 万
实现难度⭐⭐☆☆☆
业务视角
适用角色数据分析师 / 数据工程师 · 运营负责人 · 产品经理
适用平台选品评分 · 差评预测 · 用户流失预警 · 广告出价预测
什么情况下用想用机器学习解决业务问题,但不知道该选什么模型;模型上线后效果越来越差不知道为什么
成功是什么样的选对算法工具减少 50% 试错时间,模型上线后可监控可解释,数据团队和业务团队建立共同语言
业务痛点
1. 解决的问题
需求预测模型加入广告花费特征后大促期预测严重失真——因果DAG识别广告花费是混淆变量而非需求原因,去除后大促期预测误差降低30-50%,年化减少备货决策失误10-40万元
2. 核心算法逻辑
因果 DAG(有向无环图) 引导特征选择:
3. 业务应用场景
业务问题:吸奶器需求预测模型加入了广告花费、评论数量、BSR 排名等特征,训练集 R² = 0.87 很好——但实际预测时大促期间预测严重低估(促销期广告花费暴增,但销量增长比模型预测低)。
根本原因:广告花费是混淆变量(促销日历同时决定广告花费和销量),BSR 是下游变量(被销量决定),加入后模型学到了虚假相关。
数据要求: - 历史销量 + 候选特征(广告花费/BSR/评论数/价格/季节) - 至少 6 个月数据
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- ROI 预估:
- 大促期需求预测误差降低 30-50%:减少备货失误 ¥10-30 万/年
- 财务预测模型去除混淆变量:P&L 预测偏差减少,资金规划更准确
- 避免"特征泄漏"导致的模型过拟合:减少模型维护成本
- 年化综合 ROI:¥10-40 万
- 实施难度:⭐⭐☆☆☆(特征分类是思维工具,不需要复杂算法;DAG 绘制约 1 天,模型对比 1 周)
7. 代码模板
代码块数量:2 · 路径:未检测到
"""
Causal ML Feature Engineering
因果特征工程:识别混淆/碰撞变量,提升模型可靠性
"""
import numpy as np
from dataclasses import dataclass
from typing import Literal
@dataclass
class CausalFeature:
"""因果特征元数据"""
name: str
causal_role: Literal['direct_cause', 'confounder', 'collider', 'proxy', 'irrelevant']
include_in_model: bool
note: str
# 母婴电商需求预测的因果特征分类
DEMAND_FORECAST_FEATURES = [
CausalFeature('price', 'direct_cause', True, '价格直接影响销量'),
CausalFeature('seasonality', 'direct_cause', True, '季节直接影响需求'),
CausalFeature('inventory_level', 'direct_cause', True, '库存可用量限制销量'),
CausalFeature('promo_event', 'direct_cause', True, '促销活动直接驱动销量'),
CausalFeature('holiday_flag', 'confounder', True, '节假日同时影响广告和销量,需控制'),
CausalFeature('ad_spend', 'confounder', False, '广告花费与销量共同受促销预算驱动,不加入'),
CausalFeature('bsr_rank', 'proxy', False, 'BSR是销量下游,非原因'),
CausalFeature('review_count', 'proxy', False, '评论数是历史销量代理,非原因'),
CausalFeature('return_rate', 'collider', False, '退货率被销量和质量共同决定,加入会产生碰撞偏差'),
]
def validate_causal_features(features: list[CausalFeature]) -> dict:
"""验证特征集合并生成报告"""
included = [f for f in features if f.include_in_model]
excluded = [f for f in features if not f.include_in_model]
confounders_uncontrolled = [
f for f in features
if f.causal_role == 'confounder' and not f.include_in_model
]
return {
'included_features': [f.name for f in included],
'excluded_features': [f.name for f in excluded],
'causal_roles': {f.name: f.causal_role for f in features},
'warnings': [
f"WARNING: 混淆变量 '{f.name}' 未被控制,可能导致估计偏差"
for f in confounders_uncontrolled
],
}
def simulate_model_comparison(n_train: int = 500, n_promo: int = 100, seed: int = 42):
"""
模拟对比:
- 相关特征集(包含 ad_spend, bsr)
- 因果特征集(只含直接原因和受控混淆)
在大促期预测误差对比
"""
np.random.seed(seed)
8. 论文来源
- 2405.11833