别只盯着模型!复盘天猫复购预测:特征工程才是提分的关键(附EDA代码)

张开发
2026/4/20 12:00:17 15 分钟阅读

分享文章

别只盯着模型!复盘天猫复购预测:特征工程才是提分的关键(附EDA代码)
特征工程的艺术从天猫复购预测竞赛看数据价值的深度挖掘在机器学习竞赛中我们常常被各种炫目的模型架构所吸引却忽视了数据本身蕴含的巨大潜力。天猫用户复购预测竞赛向我们揭示了一个重要事实当模型性能遇到瓶颈时精心设计的特征工程往往比更换更复杂的模型更能带来显著提升。本文将带您深入探索如何从原始用户行为数据中榨取每一分价值构建具有预测力的特征体系。1. 理解数据用户行为背后的商业逻辑天猫复购预测竞赛的数据集包含了四种核心数据表用户基本信息表user_info_format1.csv用户行为日志表user_log_format1.csv训练集train_format1.csv测试集test_format1.csv这些数据看似简单却蕴含着丰富的用户行为模式。让我们先理解几个关键字段的商业含义# 用户行为日志关键字段解析 user_log_columns { user_id: 用户唯一标识, seller_id: 商家标识, item_id: 商品ID, cat_id: 商品类别, action_type: 行为类型(0:点击,1:加购,2:购买,3:收藏), time_stamp: 行为时间戳 }提示在特征工程开始前建议先对每个字段进行业务解读这能帮助我们发现更有价值的特征组合方向。2. 基础特征构建从原始数据到特征矩阵2.1 用户行为统计特征用户行为日志是最丰富的特征来源。我们可以从多个维度进行统计# 基础行为统计特征生成示例 def create_basic_features(user_log): # 按用户-商家分组统计 grouped user_log.groupby([user_id, seller_id]) # 基础计数特征 features grouped.agg({ item_id: [ (total_actions, count), # 总行为次数 (unique_items, nunique) # 浏览不同商品数 ], cat_id: [(unique_cats, nunique)], # 浏览商品类目数 time_stamp: [(active_days, nunique)] # 活跃天数 }) features.columns [_.join(col).strip() for col in features.columns.values] return features.reset_index()2.2 行为类型细分特征不同行为类型点击、加购、收藏、购买的重要性各不相同需要分别统计行为类型特征名称商业意义点击(0)click_ratio用户浏览深度指标加购(1)cart_rate购买意向强度收藏(3)fav_rate长期兴趣指标购买(2)purchase_cnt实际转化行为# 行为类型细分统计 action_features (user_log .groupby([user_id, seller_id, action_type]) .size() .unstack(fill_value0) .rename(columns{ 0: clicks, 1: add_to_cart, 2: purchases, 3: favorites }))3. 高阶特征工程挖掘深层行为模式3.1 时间序列特征用户行为的时间模式往往包含重要信息# 时间窗口行为统计 def create_time_features(logs): logs[date] pd.to_datetime(logs[time_stamp], format%H%M%S).dt.date last_date logs[date].max() # 计算最近7天行为 mask_7d logs[date] (last_date - pd.Timedelta(days7)) recent_7d (logs[mask_7d] .groupby([user_id, seller_id]) .size() .rename(actions_7d)) # 计算行为间隔特征 time_gaps (logs.groupby([user_id, seller_id])[date] .apply(lambda x: x.sort_values().diff().dt.days.mean()) .rename(avg_action_gap)) return pd.concat([recent_7d, time_gaps], axis1).reset_index()3.2 交叉特征与比率特征单一特征的预测能力有限但特征间的组合往往能产生惊喜转化率特征购买次数/总行为次数浏览深度浏览商品数/浏览类目数行为集中度最常浏览类目的占比时间效率购买行为所用天数/总活跃天数# 创建比率特征示例 def create_ratio_features(features): features[purchase_ratio] features[purchases] / (features[clicks] 1e-6) features[cart_conversion] features[purchases] / (features[add_to_cart] 1e-6) features[fav_per_action] features[favorites] / (features[total_actions] 1e-6) return features4. 特征选择与评估构建高效特征体系4.1 特征重要性分析使用决策树模型分析特征重要性是常见方法from sklearn.ensemble import RandomForestClassifier # 训练随机森林评估特征重要性 model RandomForestClassifier(n_estimators100, random_state42) model.fit(X_train, y_train) # 获取特征重要性 importance pd.DataFrame({ feature: X_train.columns, importance: model.feature_importances_ }).sort_values(importance, ascendingFalse)4.2 特征组合效果验证通过交叉验证评估不同特征组合的效果特征组合CV Score提升幅度基础行为统计0.682-行为类型细分0.7032.1%时间序列特征0.7121.9%全部比率特征0.7281.6%注意特征组合并非越多越好需要平衡模型复杂度和性能提升。5. 实战技巧避免特征工程中的常见陷阱在实际操作中有几个关键点需要特别注意数据泄露问题确保测试集数据不参与任何特征统计计算稀疏特征处理对低频行为进行适当平滑或分箱特征缩放树模型不需要但线性模型必须进行类别特征编码高基数类别需要特殊处理# 避免数据泄露的正确做法 # 错误方式在整个数据集上计算统计量 # 正确方式只在训练集上计算然后应用到测试集 train_stats train_logs.groupby(user_id)[actions].mean() # 只在训练集计算 test_logs[user_avg_actions] test_logs[user_id].map(train_stats) # 映射到测试集6. 特征工程自动化构建可复用的特征管道对于大规模特征工程建议构建自动化管道from sklearn.base import BaseEstimator, TransformerMixin class ActionAggregator(BaseEstimator, TransformerMixin): def __init__(self): self.feature_names [] def fit(self, X, yNone): return self def transform(self, logs): # 实现各种聚合逻辑 features create_basic_features(logs) self.feature_names features.columns.tolist() return features def get_feature_names(self): return self.feature_names # 构建完整特征管道 from sklearn.pipeline import FeatureUnion feature_pipeline FeatureUnion([ (basic, ActionAggregator()), (time, TimeFeatureGenerator()), (ratio, RatioFeatureCreator()) ])在实际项目中我发现最有效的特征往往不是最复杂的那些而是能够清晰反映用户行为模式的简单组合。例如加购后购买比例这个简单特征在多个场景中都表现出极强的预测力。

更多文章