10- 天猫用户复购预测实战:从数据清洗到XGBoost/LightGBM模型优化

张开发
2026/4/11 12:47:05 15 分钟阅读

分享文章

10- 天猫用户复购预测实战:从数据清洗到XGBoost/LightGBM模型优化
1. 项目背景与数据准备电商平台最头疼的问题之一就是如何判断哪些用户会再次购买。天猫作为国内头部电商平台每天产生海量用户行为数据这些数据里藏着预测用户复购的密码。我去年参与过天猫复购预测竞赛最终排名前5%今天就把从数据清洗到模型优化的完整流程拆解给大家。先说说数据准备。原始数据通常包含四种核心表用户行为日志user_log记录用户点击、加购、购买等行为用户画像user_info包含性别、年龄段等基本信息训练集train_data带标注的历史数据测试集test_data需要预测的数据加载数据时有个坑要注意天猫原始数据的列名用的是seller_id而不是merchant_id需要先统一命名user_log.rename(columns{seller_id:merchant_id}, inplaceTrue)数据类型转换是影响内存使用的关键。比如item_id从默认的int64转为int32内存占用直接减半user_log[item_id] user_log[item_id].astype(int32)2. 特征工程实战2.1 用户行为特征构建用户维度特征是预测复购的核心。我通常会计算这些指标用户总交互次数u1浏览过的商品数u2涉及的商品类目数u3交互商家数量u4品牌接触数u5用groupby实现特别高效groups user_log.groupby([user_id]) temp groups.size().reset_index().rename(columns{0:u1}) all_data all_data.merge(temp, onuser_id, howleft)时间特征也很重要。比如计算用户首次和末次交互的时间差小时temp groups[time_stamp].agg([(F_time, min), (B_time, max)]).reset_index() temp[u6] (temp[B_time] - temp[F_time]).dt.seconds/36002.2 商家特征工程商家侧特征能反映店铺吸引力店铺总交互量m1触达用户数m2商品丰富度m3类目覆盖度m4这里有个技巧用nunique()统计唯一值比count()更有意义temp groups[user_id, item_id].nunique().reset_index().rename( columns{user_id:m2, item_id:m3})2.3 用户-商家交叉特征用户与特定商家的交互特征最具预测力用户在店铺的交互次数um1浏览商品数um2购买点击比um7/um5计算购买转化率时要注意除零问题all_data[r3] all_data[um7]/(all_data[um5]1e-5) # 加极小值防除零3. 模型构建与调优3.1 LightGBM实战配置LightGBM的优势在于处理高维特征且训练速度快。这是我的核心参数配置model_lgb lgb.LGBMClassifier( max_depth10, # 控制树复杂度 n_estimators5000, # 树的数量 min_child_weight100, # 防止过拟合 colsample_bytree0.7, # 特征采样比例 subsample0.9, # 数据采样比例 learning_rate0.1, # 学习率 metricauc) # 评估指标早停机制early_stopping能自动找到最佳迭代次数model_lgb.fit(X_train, y_train, eval_set[(X_valid, y_valid)], early_stopping_rounds10)3.2 XGBoost调优技巧XGBoost对参数更敏感这几个参数需要重点调整max_depth从6开始尝试不超过12min_child_weight根据样本量调整我设为200-300gamma增加会保守分裂通常0.1-0.3model_xgb xgb.XGBClassifier( max_depth10, n_estimators5000, min_child_weight300, gamma0.2, subsample0.8)3.3 交叉验证策略单次验证可能存在偏差我采用分层交叉验证StratifiedKFold将数据分成10份轮流用9份训练1份验证取10次预测结果的平均值skf StratifiedKFold(n_splits10) for train_idx, valid_idx in skf.split(X_train, y_train): model.fit(X_train[train_idx], y_train[train_idx]) preds model.predict_proba(X_test)[:,1]/10 # 概率平均4. 效果提升关键点4.1 特征组合技巧除了基础统计特征这些组合特征效果显著用户活跃度 × 商家转化率用户品类偏好与商家主营品类的匹配度时间衰减权重近期行为加权# 时间衰减系数示例 user_log[weight] np.exp(-0.1*(30 - user_log[day_diff]))4.2 模型融合策略单个模型总有局限我常用的融合方法加权平均LGBM和XGB按6:4比例融合Stacking用第一层模型的输出作为第二层特征概率校准用Platt Scaling调整输出概率final_prob 0.6*lgb_prob 0.4*xgb_prob # 简单加权4.3 业务指标对齐竞赛评估用AUC但实际业务更关注高概率用户的准确率PrecisionTopK召回率与成本平衡不同用户分层的预测表现建议在验证时添加业务相关指标from sklearn.metrics import precision_recall_curve precision, recall, _ precision_recall_curve(y_valid, probas)5. 避坑指南内存优化处理大数据时每完成一个步骤就del临时变量并gc.collect()类别特征不要直接用LabelEncoder建议统计编码如用户购买频次目标编码Target Encoding嵌入表示Embedding线上线下一致性验证集效果提升但测试集下降时可能是数据泄露导致特征重要性用SHAP值分析比默认的feature_importance更可靠import shap explainer shap.TreeExplainer(model) shap_values explainer.shap_values(X_valid)这个项目让我深刻体会到好的特征工程比模型选择更重要。特别是在处理用户行为序列时如何捕捉行为模式中的时序规律往往是提升效果的关键。在实际业务中还需要持续跟踪预测结果建立反馈闭环来迭代优化模型。

更多文章