ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

机器学习增强的电商用户行为预测:从标签到上线全流程

机器学习增强的电商用户行为预测:从标签到上线全流程 简介这是一篇发表于2019年的机器学习参考文献研究如何利用机器学习增强电子商务平台的用户行为预测适合电商产品运营、数据分析人员及相关专业学生阅读。资源为PDF格式全文共1个文件压缩包大小约1.35MB。文章从电子商务用户行为分析入手梳理数据挖掘、深度学习、统计学等关键技术并重点介绍基于卷积神经网络CNN与循环神经网络RNN的预测模型包括数据清洗、特征构建、模型训练与泛化验证等完整流程阐明了用户行为预测对提升平台体验、购买率及竞争力的价值。作者还讨论了不同算法的集成思路为更精准预测消费者真实购买意图提供参考。目前已有120人学习内容兼具理论性与应用性可作为理解机器学习在电商场景落地、撰写相关论文或设计预测方案时的专业指导材料。1. 机器学习增强的电子商务平台用户行为预测先搞清楚你要预测什么做电商用户行为预测最容易翻车的不是模型精度不够而是从一开始就不知道自己到底要预测什么。很多团队拿到的是一堆点击、浏览、加购日志想用机器学习做“增强”但一上来就陷入算法竞赛思维刷 AUC、调参数、堆特征最后离线指标很好看上线后业务方却问“GMV 涨在哪”。我做过好几个电商平台的用户行为预测项目第一课永远是预测不是炫技而是把一个业务决策问题翻译成机器学习问题。这里说的用户行为预测指的是基于用户历史行为序列预测他在未来某个时间窗口内会不会发生某个目标行为。常见目标包括点击、加购、下单、支付、复购甚至退货。机器学习增强的意思是用数据驱动的方式替代人工规则让系统能捕捉到不同用户、不同场景下的差异化行为模式。适合谁一类是已经积累了行为日志、但还在用“最近7天活跃用户”这种规则做运营的团队另一类是推荐、营销系统已经上线想把行为预测作为独立模块接入的工程师和数据科学家。2. 把用户行为预测拆成可建模问题预测口径、标签生成与评估指标2.1 预测目标粒度用户级还是会话级下单还是复购做行为预测第一个要拍板的是预测粒度。用户级预测看的是“这个用户未来7天会不会下单”适合营销触达、流失预警会话级预测看的是“本次会话里用户下一步会不会点击/加购”适合实时推荐、页面调整。两者特征和模型差异很大不要混着做。我的建议是第一次做项目优先从用户级下单预测入手。原因很简单用户级预测的标签稳定、样本充足、评估清晰业务方也容易理解。会话级预测需要毫秒级推理还要处理短序列工程成本高收益大多体现在推荐位排序上不是新手友好入口。如果你是从推荐系统切入那可以以“会话内下一个行为”为目标但你要做好在线推理的性能预算。2.2 行为序列切窗与标签生成避免用未来信息预测的关键在于时间切分。我们需要定义一个观察窗口feature window和一个预测窗口label window。观察窗口用历史行为生成特征预测窗口用来打标签。比如“用过去14天行为预测未来7天是否下单”观察窗口就是T-14到T-1预测窗口是T到T6。注意T是同一个时间点不能错位。生成标签时最容易犯的错是样本时间穿越。比如你要预测“7月10日之后7天用户是否下单”却把用户7月15日的行为也当成特征算进去模型在离线评估里就会“开卷考试”成绩虚高。正确做法是严格按行为发生时间切分。下面是一段伪代码级别的样本生成逻辑实际跑批时我用Spark SQL实现# 伪代码生成用户级下单预测的训练样本 # 假设行为表 user_behavior: user_id, behavior_type, ts # 目标行为 behavior_typeorder for each day in training_days: T day # 当前预测参考日 feature_start T - 14 label_end T 6 # 观察窗口特征T-14 到 T-1 features sql(f SELECT user_id, COUNT(IF(behavior_typeclick, 1, NULL)) AS click_cnt, COUNT(IF(behavior_typecart, 1, NULL)) AS cart_cnt, COUNT(IF(behavior_typefav, 1, NULL)) AS fav_cnt, DATEDIFF({T}, MAX(ts)) AS days_since_last_active FROM user_behavior WHERE ts {feature_start} AND ts {T} GROUP BY user_id ) # 标签窗口T 到 T6 是否下单 labels sql(f SELECT DISTINCT user_id, 1 AS label FROM user_behavior WHERE behavior_typeorder AND ts {T} AND ts {label_end} ) # 左连接未下单用户补 0 sample features.left_join(labels, onuser_id).fillna(0)这段逻辑里的T是滑动的每一天可以生成一批样本。注意DATEDIFF({T}, MAX(ts))算的是用户在观察窗口内最后一次活跃距离 T 的天数这个特征对流失预测非常有效。实际操作中我不会用 Python 直接跑这种全量数据而是用 Hive SQL/Spark SQL 批量生成Python 脚本只负责把日期参数传进去。2.3 离线评估选AUC还是GAUC业务收益比分数更重要离线评估最常用的是 AUC但电商行为预测里我更看重 GAUCGroup AUC。原因是用户行为高度个性化有些人很容易下单有些人几乎不活跃全局 AUC 会被“容易预测的高活跃用户”带偏。GAUC 按用户分组计算 AUC再按每个用户的样本量加权平均能更好反映模型对不同类型用户的区分能力。还要注意一个残酷现实AUC 提升 0.01 在业务上可能毫无意义。我经历过一次离线 AUC 从 0.72 提到 0.75看起来不错但上线后 GMV 几乎没有变化。后来排查发现高 AUC 的增益主要来自那些本来就会下单的重度用户而营销触达真正需要的是“可能流失但可以被唤醒”的中低频用户。所以评估指标一定要和业务目标绑定。如果做的是流失召回就得多看召回率topK如果做的是推荐排序就得多看 GAUC 和实际点击率。3. 特征工程是效果上限从行为日志到特征集的落地步骤3.1 用户静态与统计特征RFM的工程化版本静态特征指不随时间变化的用户属性比如注册时长、性别如果有、会员等级、城市等级。这些特征虽然简单但在冷启动用户上没有行为数据时它们是唯一的信号。统计特征就是把 RFMRecency, Frequency, Monetary工程化最近一次活跃距今天数、各行为类型的计数、平均客单价、总消费金额、活跃天数占比等。一个容易忽略的细节是统计窗口的选择。不要只用“过去14天”一个窗口我一般会同时算 7/14/30/90 天四档因为不同商品类目的购买周期差异很大。高频快消品看 7 天就有区分度低频耐用品可能要拉长到 90 天。多窗口特征会增加训练数据量但对树模型来说特征多了不会线性增加训练时间反而能提供更丰富的形态。3.2 行为序列特征长度、间隔、时间衰减权重用户行为是一条带时间戳的序列最简单的序列特征是“最近一次行为距离今天的天数”“最近两次下单间隔”“7天内活跃天数”。这些特征是规则模型也能算的但机器学习模型可以利用它们做交叉。比如“最近一次加购是3天前且最近一次下单是30天前”可能比单独两个特征更有意义。时间衰减是另一个要点。同样是点击商品昨天的点击和三个月前的点击对预测未来下单的权重应该不同。常见做法是给行为计数加指数衰减权重weight exp(-alpha * days_since),其中 alpha 控制衰减速度。实际调参中我常用alpha 0.1 ~ 0.5具体取决于业务周期。快消品衰减快alpha 取大大家电衰减慢alpha 取小。这个特征在 LightGBM 里有非常明显的增益。3.3 商品与上下文特征价格带、品类偏好、实时场景用户行为预测不是只看用户还要看商品和上下文。比如用户正在浏览什么价位的商品、什么品类、什么品牌这些都会影响他下一步是否下单。常见特征包括用户最近点击/加购的商品价格均值、价格带分布低价/中价/高价各占比例、品类偏好 Top3、购物车总商品数、优惠券使用情况、当天是否大促、星期几、时间段等。上下文特征里“星期几”和“是否大促”往往被忽略但对电商来说这两个特征极其重要。周末的浏览行为和周一完全不同大促前用户会提前加购大促当天转化率陡增。如果不加这些时间上下文模型会把大促带来的高转化学习成所有时间的平均水平导致日常预测偏高、大促预测偏低。3.4 特征表设计与生成脚本一份可抄作业的SQL/Python骨架到了落地环节我最推荐的做法是维护一张“特征主表”每一行是 (user_id, feature_date)每一列是一个特征。每天跑批更新昨天的特征预测时直接读取最新特征。下面是一个用 Python 生成特征表的简化流程import pandas as pd import numpy as np def build_user_features(behavior_df, feature_date, windows[7, 14, 30]): 从原始行为表生成用户特征主表的一个分区 features {} # 基础信息注册天数 reg_info behavior_df.groupby(user_id)[reg_ts].min().reset_index() reg_info[reg_days] (feature_date - reg_info[reg_ts]).dt.days features[reg_days] reg_info.set_index(user_id)[reg_days] for w in windows: start feature_date - pd.Timedelta(daysw) seg behavior_df[(behavior_df[ts] start) (behavior_df[ts] feature_date)] for btype in [click, cart, fav, order]: cnt seg[seg[behavior_type] btype].groupby(user_id).size() features[f{btype}_cnt_{w}d] cnt # 最近一次活跃距今天数全局窗口用大值回填 last_active behavior_df[behavior_df[ts] feature_date].groupby(user_id)[ts].max() features[frecent_active_{w}d] (feature_date - last_active).dt.days feat_df pd.DataFrame(features).fillna(0) return feat_df这段代码有几个可调的决策点。windows列表决定特征的时间尺度如果你发现 90 天窗口特征重要性始终很低可以去掉减少训练数据体积。fillna(0)是对从未在该窗口出现行为的用户回填 0但对于“最近一次活跃距今天数”这种特征用 0 回填是错误的它应该回填一个大的惩罚值比如 999。我在实际项目中为此吃过亏后来把这类特征单独处理缺失代表从未活跃应该用999而不是0否则模型会以为该用户当天就活跃过。4. 模型选型与训练参数从逻辑回归到深度学习的分级路线4.1 基线模型逻辑回归与特征交叉怎么做先别上深度学习。我建议从逻辑回归开始不是为了效果而是为了建立一套可解释、可排查的基线。逻辑回归对特征尺度敏感需要做标准化或归一化。但电商行为特征大多是长尾分布直接用原始值效果很差。常见做法是对连续特征做 log 变换比如log1p(click_cnt)。逻辑回归的另一个问题是需要手工做特征交叉。例如“最近30天加购次数”和“最近7天下单次数”单独看都有用但它们交叉起来可能更有意义。在工程上你可以用 Featuretools 或者手动构造交叉特征但要控制数量避免维度爆炸。我的习惯是先用树模型跑一版拿到特征重要性 Top20再人工从这 Top20 里挑 5-6 个做两两交叉喂给逻辑回归。这比凭空猜特征交叉靠谱得多。4.2 树模型LightGBM在行为预测上的必调参数对大多数电商用户行为预测场景LightGBM 是性价比最高的模型。它不需要特征标准化对缺失值有原生处理训练快还能自动处理特征之间的非线性关系。以下是一份我在多个项目中验证过的参数起点import lightgbm as lgb params { objective: binary, metric: auc, learning_rate: 0.05, num_leaves: 31, max_depth: 6, min_child_samples: 50, subsample: 0.8, colsample_bytree: 0.8, reg_alpha: 0.5, reg_lambda: 1.0, n_estimators: 500, random_state: 42, } model lgb.LGBMClassifier(**params) model.fit( X_train, y_train, eval_set[(X_valid, y_valid)], callbacks[lgb.early_stopping(100), lgb.log_evaluation(50)] )关键参数解释num_leaves从 31 开始数据量过了百万级可以加到 63但小心过拟合min_child_samples设 50 能有效抑制低频特征带来的噪声读者实际操作时可以调到 100 看验证集变化subsample和colsample_bytree都设 0.8 是稳妥的防过拟合组合。我最开始犯的错是把learning_rate设成 0.1、n_estimators设 1000结果 300 轮就过拟合了。后来固定用 0.05 配合 early stopping让模型自己决定轮数稳定很多。4.3 深度序列模型DIN/GRU的轻量实现思路逻辑回归和树模型基本能解决 80% 的需求但如果你的业务有强序列模式比如用户浏览商品具有明显的多步递进关系可以考虑深度序列模型。DINDeep Interest Network是电商行为预测里很经典的方法它的核心是用注意力机制把用户历史行为中与当前目标商品相关的部分加权而不是把历史行为平均池化。GRU 则适合学习行为顺序本身比如“先看详情页再加入购物车”的路径模式。但我不建议新手自己从零写 DIN。一个轻量替代方案是用树模型处理统计特征把用户最近点击的商品 embedding 序列输入一个 GRU最后把 GRU 的输出和树模型的输出拼接进一个 MLP。工程上很多团队这么做效果稳定且比直接上 DIN 容易调。早期团队要克制先把 LightGBM 跑到性能极限再用深度模型去处理“树模型搞不定的序列信息”否则很容易陷入调参泥潭。5. 训练与上线的避坑指南样本偏差、时间穿越与延迟反馈5.1 全量数据训练导致时间穿越按时间切分样本现象离线验证 AUC 高达 0.85线上转化率反而下降。原因我把所有历史数据混在一起随机切分成训练集和验证集。同一个用户在 7 月的行为出现在训练集8 月的行为出现在验证集模型相当于见过“未来”的相似行为。解决必须按时间顺序切分训练集的时间段在前验证集在后中间还要留一段空窗期比如 7 天避免特征和标签的重叠。我的经验是设置T_train_end和T_valid_start之间间隔至少一周。如果预测窗口是 7 天空窗期也应该是对应的 7 天确保验证集里的标签不会用到训练集最后一天之前的行为特征。5.2 正样本延迟到达训练标签被低估现象模型预测的下单概率普遍偏低尤其对新用户。原因很多用户点击、加购之后过了好几天才真正下单。如果我们在“行为发生后第 7 天”就为 T 时刻打标签那些第 8 天才下单的用户会被错误地标记为负样本。这在电商大促期间特别严重用户提前加购、大促当天才支付。解决给标签留出足够长的观察时间或者用“延迟反馈校正”的方式训练。最简单的做法是把预测窗口和标签观察窗口区分开比如预测窗口设为 7 天但实际打标签时允许 T7 之后 3 天内下单也算作正样本然后训练时把样本的时间戳调整到“行为真实发生日标签观察窗口”。5.3 离线AUC高但线上无效果采样偏差与样本分布不一致现象离线 AUC 比上一个版本提升 0.02线上 A/B 实验没有显著差异。原因离线验证集是从全量用户中均匀采样但线上只对“高活跃或高潜力用户”做预测。如果离线训练时正负样本比例是 1:9线上实际遇到的正样本比例是 1:50模型输出的概率分布就会失真。解决上线前用线上真实流量分布重新构造验证集或者用“采样纠正”的方式训练。LightGBM 里可以用is_unbalance或设置scale_pos_weight但更根本的是保证训练样本分布和线上预测分布一致。5.4 特征漂移与模型老化定期重训与特征监控现象模型上线一个月后CTR/CVR 明显下滑。原因用户行为习惯会随着季节、促销、新品上架而改变。比如冬天上线时的特征分布到夏天已经完全不同。解决建立特征监控仪表盘统计每个重要特征的日内/周内分布当分布偏移超过阈值比如 KL 散度或 PSI 大于 0.2就触发重训。我实际操作中是每周自动重训一次保留训练数据最近 90 天超过 90 天的数据只用于做长周期特征统计不进入训练集。5.5 在线推理性能特征服务与模型打包现象模型能跑离线但线上接口要求 50ms 内返回单机 Python 推理扛不住。原因把特征工程埋在了推理请求里每次请求都实时计算几十个特征还用了 Pandas。解决特征计算提前到离线或近线用 Redis 或对象存储缓存特征主表线上推理只读缓存模型用 PMML/ONNX 导出或者直接用 LightGBM 的 C predict API。更简单的做法是每天凌晨跑批生成“用户特征表”预测时查表不实时计算。代价是特征更新滞后一天但对营销触达、流失召回这类非实时场景足够。6. 让模型真正产生GMV离线回放、A/B实验与灰度迭代6.1 离线回放用历史日志模拟线上决策在看 A/B 实验之前先做离线回放。方法很简单拿历史某一天的行为日志模拟当天线上系统如果用了新模型会给哪些用户打上高分然后看这些用户在未来 7 天的真实行为。这个步骤能快速筛掉“离线指标好但线上没效果”的模型。我的经验是回放结果的提升幅度至少要达到离线 AUC 提升幅度的三分之一这个模型才值得上 A/B。# 离线回放伪代码 candidate_users model.predict_proba(last_features)[:, 1] # 选择分数最高的 top 10% 用户作为触达对象 top_users candidate_users.sort_values(ascendingFalse)[:int(0.1 * len(candidate_users))].index # 统计这些用户在未来 7 天的真实下单率 real_order_rate historical_orders.loc[top_users, order_7d].mean() # 对比随机抽取 10% 用户的真实下单率 baseline_rate historical_orders.sample(frac0.1, random_state42)[order_7d].mean()注意这里top_users是从历史某一天的特征里选出来的但他们的未来下单行为已经在数据里了所以回放只能作为参考不能替代真正的 A/B。它最大的价值是评估“如果当时用了这个模型会不会选错人”。选错人的代价不仅仅是预算浪费还会因为频繁打扰用户导致流失。6.2 A/B实验最小配置分桶、样本量与决策规则真正上线前必须做 A/B 实验。最小配置是两组对照组继续用旧规则/旧模型实验组用新模型。分组最好按用户 ID 哈希分桶保证同一用户只会出现在一组。实验持续时间至少要覆盖一个完整的业务周期比如两个自然周因为电商有周末效应和促销日效应。样本量估算可以用简单的显著性测试但我通常直接设置每组 10 万用户以上跑 7 天然后看日均转化率、客单价和 GMV 的置信区间。这里要特别注意不要只看“转化率提升百分之几”要看“业务毛利”。我做过一个实验新模型转化率提升 5%但目标用户都是重度优惠券依赖者最后 GMV 没涨营销成本涨了。所以实验指标里必须加入CVR、GMV per user、营销成本 per user三个维度缺一不可。6.3 灰度迭代节奏周级重训与月度框架升级上线不是终点。我一般建议按“周级重训、月度框架评估、季度算法升级”的节奏迭代。每周六用过去 90 天数据重训一次模型周一发布到线上。每月对比一次新旧模型的特征重要性和离线回放结果如果发现某些特征重要性排名持续下降说明业务环境变了需要调整特征体系。每季度尝试一次算法框架的大改动比如从 LightGBM 升级到深度序列模型但要用 A/B 验证不接受“我觉得深度模型一定更好”的直觉。最后说一个我自己的习惯每次上线前都会保存一份模型的负面案例清单。具体做法是找出 A/B 实验里表现明显变差的用户群体比如“最近 30 天活跃但从未下单的用户”分析模型为什么对他们不友好。这个习惯救了我很多次——有一次线上整体指标提升但老客流失率悄悄上升如果不是看分群体分析可能要一个月后才能发现。电商用户行为预测没有一劳永逸的模型只有不断用数据修正假设的循环。希望这套从问题定义到灰度迭代的路径能帮你在自己的平台少踩几个坑。本文还有配套的精品资源点击获取
返回列表