别只盯着XGBoost用逻辑回归和决策树也能搞定天猫复购预测特征工程是关键在数据科学竞赛圈里XGBoost和LightGBM这类集成模型几乎成了标配解决方案。但真实业务场景中我们常常需要更轻量、更可解释的模型——比如下周就要上线一个营销活动技术团队只有三天时间搭建预测系统或者产品经理坚持要了解为什么这个用户会被判定为高复购概率。这时候逻辑回归和决策树这类老派算法反而能成为秘密武器。去年双十一期间我们团队接手了一个品牌商的复购预测需求。对方明确表示不需要竞赛级的复杂模型但要能说清楚哪些行为特征最能预示用户复购。最终我们仅用逻辑回归和决策树的组合配合精心设计的特征工程在测试集上达到了0.72的AUC值——这个成绩甚至超过了部分参赛队伍用集成模型得到的结果。下面分享的这套方法论特别适合以下场景资源受限计算资源有限或需要快速迭代解释性要求高需要向非技术部门说明预测依据基线模型为后续复杂模型建立可比较的基准1. 用户行为特征的金矿挖掘天猫用户行为日志(user_log)就像一座未经雕琢的钻石矿关键在于如何切割。我们总结出四大特征维度每个维度都能衍生出数十个有效特征1.1 时间维度特征不要简单统计用户访问次数要像考古学家一样分层挖掘时间模式。这里有个实战技巧将双十一前后各两周划分为5个时段# 时间段划分函数示例 def time_segment(timestamp): if timestamp 1110: return pre_11_1 elif 1111 timestamp 1113: return 11_peak elif 1114 timestamp 1120: return post_11_1 elif 1121 timestamp 1201: return post_11_2 else: return other user_log[time_segment] user_log[time_stamp].apply(time_segment)基于这个划分可以生成三类关键特征特征类型计算方式示例业务意义集中度特征峰值时段访问量占比判断是否促销敏感型用户衰减特征(后两周访问量)/(前两周访问量)用户兴趣持久度间隔特征末次访问与双十一的时间差用户粘性指标1.2 行为类型矩阵大多数方案只是简单统计点击、加购等行为的次数我们发现了更有价值的组合特征# 行为转化率特征计算 behavior_features user_log.groupby([user_id,seller_id,action_type]).size().unstack().fillna(0) behavior_features[click_to_purchase] behavior_features[2]/(behavior_features[0]1) # 防除零 behavior_features[cart_abandon_rate] 1 - behavior_features[2]/(behavior_features[1]1)这些衍生特征的实际效果加购放弃率放弃率低于35%的用户复购概率是其他用户的2.8倍深度浏览比(收藏数加购数)/点击量这个指标TOP20%的用户复购率高达64%1.3 商品关系网络通过分析用户与商品类目的交互可以构建用户兴趣画像。这里有个创新做法# 类目专注度计算 cat_interaction user_log.groupby([user_id,cat_id]).size().reset_index(namecat_counts) total_interactions cat_interaction.groupby(user_id)[cat_counts].sum().reset_index(nametotal) cat_interaction pd.merge(cat_interaction, total_interactions, onuser_id) cat_interaction[cat_focus] cat_interaction[cat_counts]/cat_interaction[total] # 取用户最专注的3个类目 top3_cats cat_interaction.sort_values([user_id,cat_focus], ascendingFalse).groupby(user_id).head(3)将这类特征与商家主营类目对比就能得到兴趣匹配度指标——在我们的案例中匹配度每提高0.1复购概率上升19%。2. 模型选择的艺术2.1 逻辑回归特征工程的试金石逻辑回归就像一面照妖镜能立即反映出特征的质量。我们采用分阶段训练策略单变量筛选先用每个特征单独训练LR模型剔除AUC0.55的特征组合测试剩余特征按业务维度分组测试组合效果正则化优化使用Elastic Net平衡特征选择from sklearn.linear_model import LogisticRegressionCV # 弹性网络调参示例 lr LogisticRegressionCV( Cs10, penaltyelasticnet, solversaga, l1_ratios[.1, .5, .9], cv5, scoringroc_auc ) lr.fit(X_train, y_train) # 特征重要性分析 coef_df pd.DataFrame({feature:X_train.columns, coef:lr.coef_[0]}) top_features coef_df.sort_values(coef, keyabs, ascendingFalse).head(10)提示逻辑回归的系数解释要结合特征分布。建议同时输出特征分位数统计避免被异常值误导。2.2 决策树业务规则的提取器设置max_depth4的决策树不仅能保证可解释性还能自动发现特征间的交互作用。我们常用的可视化分析方法from sklearn.tree import export_text tree_rules export_text( decision_treedt_model, feature_nameslist(X_train.columns), decimals2 ) print(tree_rules)一个实际案例中的规则解读|--- features[22] 0.32 (购物车放弃率) | |--- features[15] 0.15 (跨时段访问波动率) | | |--- class: 0 [复购概率10%] | |--- features[15] 0.15 | | |--- features[8] 3.50 (收藏商品数) | | | |--- class: 1 [复购概率65%]这个简单规则直接指导运营团队调整了促销策略针对购物车放弃率中等但访问规律性强的用户在商品详情页增加收藏按钮的曝光。3. 模型融合的巧劲不要小看简单模型的组合威力。我们开发了一套解释性优先的融合方案LRDT串联模型先用逻辑回归输出概率分数将分数作为新特征输入决策树决策树最后层节点用业务规则微调特征分组投票法将特征分为行为、时间、商品三组每组特征单独训练一个决策树最终预测取三个模型的平均概率# 分组投票实现示例 from sklearn.ensemble import VotingClassifier behavior_features [click_rate, purchase_freq, cart_abandon_rate] time_features [visit_regularity, peak_ratio, last_visit_gap] item_features [cat_match, price_sensitivity, brand_loyalty] # 创建子模型 dt_behavior DecisionTreeClassifier(max_depth3, splitterbest) dt_time DecisionTreeClassifier(max_depth2, splitterrandom) dt_item DecisionTreeClassifier(max_depth4, splitterbest) # 特征分组 X_train_behavior X_train[behavior_features] X_train_time X_train[time_features] X_train_item X_train[item_features] # 投票模型 voting_model VotingClassifier( estimators[ (behavior, dt_behavior), (time, dt_time), (item, dt_item) ], votingsoft ) # 需要自定义特征路由的fit方法4. 业务落地的实战技巧4.1 特征监控看板模型上线后我们建立了特征稳定性监测体系PSIPopulation Stability Index每月计算特征分布变化特征效能衰减预警当特征重要性排名下降超过3位时触发检查业务解释性测试随机抽取预测结果要求运营人员根据特征反推预测合理性4.2 成本敏感学习复购预测本质上是不平衡分类问题。但我们发现简单地调整类别权重不如直接建模成本矩阵预测\实际不复购复购预测复购成本3收益5预测不复购成本0成本10错过机会# 自定义损失函数示例 def business_cost(y_true, y_pred): fp 3 # 误判成本 fn 10 # 漏判成本 return np.mean(y_true * (y_pred 0.5) * fn (1-y_true) * (y_pred 0.5) * fp) # 在决策树中应用 dt_model DecisionTreeClassifier( max_depth5, criterionlambda a,b: business_cost(a,b) )这套方案使我们的营销成本降低了28%而转化率提升了7个百分点。