资讯动态

天池复购预测赛:特征工程与LightGBM实战全解析

发布时间:2026/8/29 1:56:12 来源:尧图企业网站定制
简介在电商场景中用户行为分析与购买意向预测是精准营销的核心技术之一。通过构建用户画像、挖掘行为序列中的时间衰减规律并结合品牌维度的交叉特征机器学习模型能够有效识别高复购概率人群。以LightGBM为代表的GBDT算法凭借对高维稀疏特征的良好支持和高效的训练性能成为此类预测任务的常用工具。本文基于天池复购预测赛题从数据探索、特征工程、模型调参到工程化落地系统梳理了完整的技术方案并分享了特征泄漏、内存优化等实战经验帮助读者掌握从业务理解到模型上线的全链路方法论。 这个天池学习赛的题目我印象挺深的它不像很多竞赛那样追求极致的模型精度反而更看重你对业务场景的理解和特征构造的基本功。我当时把官方给的baseline代码跑通之后又自己重构了一版完整的工程化代码加了不少特征和调参细节顺便写了一份比较详细的文档说明。今天就把这整套东西的源码逻辑和踩坑记录分享出来给准备入门数据挖掘竞赛或者想系统学习电商风控/复购预测的朋友做个参考。1. 项目背景与赛题理解1.1 复购预测的业务意义天猫复购预测这个赛题本质上要解决的问题是给定一个用户在过去一段时间内的购买行为和商品信息预测这个用户在接下来的时间里是否会对某个品牌再次下单。听起来好像只是一道机器学习题目但放在真实电商场景里这个能力直接关系到平台的精准营销成本和GMV增长策略。为什么各大平台都拼命做复购预测道理很简单获取一个新客的成本往往是维护一个老客的5到10倍。如果你的模型能提前识别出“这批用户大概率会对某品牌复购”那运营团队就可以针对性地发优惠券、做定向推送而不是在全站撒网烧钱。反过来如果模型预测某用户不太可能复购那营销预算就可以省下来。所以这个赛题不光是练手它背后是一套完整的商业逻辑。天池这个赛题属于学习赛数据量不算特别大但该有的坑一个不少类别特征多、时间跨度长、正负样本不均衡。官方给的数据主要包括用户信息表、商品信息表、品牌信息表、行为日志表和用户画像表其中行为日志表是核心记录了用户对商品的各种操作类型点击、加购、收藏、购买等。1.2 赛题数据核心字段解读先看数据层面整个数据集的核心字段大概是这样的数据表关键字段说明用户信息user_id, age, sex, user_lv_cd用户基础属性商品信息item_id, brand_id, item_price, item_sales商品与品牌映射行为日志user_id, item_id, type, visit_datetime用户对商品的操作记录用户画像user_id, brand_id, type, visit_datetime用户对品牌的偏好记录这里需要特别注意一个点复购预测的预测粒度是用户-品牌对不是用户维度也不是商品维度。也就是说你要预测的是“用户A会不会再次购买B品牌”而不是“用户A会不会再买东西”或者“商品C会不会被再买”。这个理解直接决定了你后面怎么构造训练样本和特征。再来看行为日志里的type字段它记录了用户行为类型点击、加购、收藏、购买。这四个行为在复购预测里的权重完全不一样购买行为的信号最强加购和收藏次之点击最弱但量最大。我在做特征的时候是把这四种行为分开统计的还额外构造了一些行为转化率特征比如“加购后购买率”“收藏后购买率”后面会细讲。1.3 评估指标为什么选AUC天池这个赛题用的评估指标是AUC也就是ROC曲线下的面积。AUC衡量的是模型把正样本排到负样本前面的概率它不依赖具体的分类阈值对正负样本比例不敏感。这一点很关键因为这个赛题的正样本比例非常低——6个月内对某个品牌复购的用户占比只有不到10%。如果换成准确率或者F1那模型只要全预测负样本就能拿到90%以上的准确率毫无意义。AUC的意义在于它能反映模型的排序能力模型给出的预测分数越高用户复购的概率越大。所以你在训练的时候不用纠结设多少阈值你只需要保证模型能给正样本打出比负样本更高的分数就行。实际部署的时候运营可以根据预算情况自由调整阈值——预算多就多圈一些用户预算少就只圈预测分最高的那一批。理解了这三点——预测粒度、行为类型、评估指标你就把这个赛题吃透了后面所有特征工程和建模工作都是围绕它们展开的。2. 数据探索与特征工程2.1 数据概况与缺失值处理拿到数据之后我做的第一件事不是急着写特征而是花了很长时间做数据探索。这一步很多人会跳过但我觉得是决定模型上限的关键环节。我当时的探索结果大概是这样用户数量大概在10万级别商品数量在30万级别行为日志记录是千万级的。品牌数量大约几千个但头部品牌的记录占比非常高长尾品牌样本稀少。部分用户画像表里存在缺失值主要集中在年龄段和性别字段。行为日志的类型分布极不均衡点击行为占了大头购买行为占比非常低。缺失值处理上我用的是比较常规的思路类别特征用众数填充数值特征如果缺失就用中位数。但这里有个小技巧我在填充年龄字段的时候不是直接填一个全局众数而是按用户等级分组后再填充。原因是有购买力的高等级用户和低等级用户的年龄分布其实不一样全局填充会引入噪声。2.2 用户维度特征构建用户维度特征是复购预测的基础因为一个用户的历史行为模式很大程度上决定了他接下来的购买倾向。我构造的用户维度特征主要包括用户总购买次数、总点击次数、总加购次数、总收藏次数这些是最基础的行为量特征反应了用户的整体活跃度。用户购买品牌数、购买商品数反应了用户消费的丰富度。用户平均购买间隔这个特征需要算两次购买之间相隔的天数再取平均。购买间隔短的用户往往是高频复购用户。用户最活跃时间段把行为日志按小时展开取用户行为最集中的小时段。这个特征在电商场景里很有意思晚上活跃的用户和白天活跃的用户的消费习惯有明显差异但单独用往往效果不显著可以作为交叉特征的一部分。这些都是用户维度的“总量型”特征。但光有总量还不够用户的消费习惯是会漂移的所以我又加了时间衰减的特征。2.3 时间衰减与行为序列特征时间衰减特征是我在这个项目里觉得提升最明显的一类特征。核心思想是用户最近的行为比很久以前的行为更能反映他当前的状态。比如一个用户三个月前疯狂购买某品牌但最近一个月完全没有行为那他的复购意愿可能已经下降了而另一个用户三个月前买了两次最近一周又开始频繁浏览该品牌那他复购的概率明显更高。我实现时间衰减的方式是给每个行为加一个权重衰减公式采用指数衰减$$weight \exp(-\lambda \cdot \Delta days)$$其中 $\Delta days$ 是行为发生时间到训练数据截止日期的天数差$\lambda$ 是衰减系数我试了0.01、0.05、0.1三组值最后在验证集上0.05的效果最好。这样算出来的特征已经不是简单计数了而是一个带权重的“活跃度分数”。行为序列特征方面我记录的是用户对同一品牌连续行为的时间间隔序列。具体做法是把用户对某品牌的行为按时间排序然后计算相邻行为之间的间隔天数再统计这个间隔序列的均值、方差、最大值。这个特征能刻画用户对品牌的“关注节奏”有的人是一时冲动频繁看一阵就消失了有的人是每隔几天固定关注一次后者复购概率明显更高。2.4 品牌维度与用户-品牌交叉特征用户维度特征之外品牌维度的特征同样重要。有些品牌本身复购率就高比如快消品、日用品有些品牌复购率天然就低比如大家电。我构造的品牌维度特征包括品牌总销量、品牌平均价格、品牌复购率、品牌下商品数量等。但真正让模型效果提升一个台阶的是用户-品牌交叉特征。这组特征在复购预测里其实是信号最强的部分因为预测本身就是针对用户-品牌对的该用户对该品牌的购买次数这个特征直接相关买过一次的用户比从没买过的用户复购概率不知道高到哪里去了。该用户对该品牌最近一次购买距今的天数时间越近复购概率越高极端情况下刚买完几天就再次购买的用户大概率是有持续需求。该用户对该品牌的点击/加购/收藏转化率比如用户浏览了10次该品牌商品加了3次购物车但只买了1次说明用户对该品牌有明确兴趣但可能卡在价格上如果有促销活动很容易转化。该用户对该品牌的购买金额占该用户总消费金额的比例这个占比高说明该品牌是用户的核心消费品牌复购理由充分。这组交叉特征的构造需要用到groupby操作我当时的数据量是千万级纯pandas跑起来比较慢所以用了一些并行处理的小技巧后面在常见问题部分会细说。3. 模型构建与训练调参3.1 模型选型对比模型选型上我在这个赛题里分别试了逻辑回归、XGBoost和LightGBM三个模型。逻辑回归作为baseline是必须跑的它虽然精度一般但能帮你快速验证特征有效性而且如果逻辑回归的AUC都不低说明特征构造得不错。XGBoost和LightGBM的对比就比较有意思了。两者都是GBDT框架但LightGBM在训练速度和内存占用上有明显优势处理高维稀疏特征的时候效果也更稳。XGBoost在特征数量少、数据量不大的时候也很强但一旦特征维度上来LightGBM的直方图算法优势就体现出来了。我最终选择了LightGBM原因有三训练速度快迭代试错成本低。原生支持类别特征省去了手动编码的麻烦。调参空间大性能上限高。3.2 训练集与验证集划分这里要重点强调一个容易踩坑的地方验证集的划分方式决定了你评估的可靠性。这个赛题是时间序列性质的如果随机划分训练集和验证集会出现“用未来的数据预测过去”的泄漏问题导致线上分数远低于线下。我当时的做法是严格按时间顺序划分以数据截止日为基准把最后一段时间内的用户-品牌对作为验证集前面的所有数据作为训练集。这样训练集里出现过的行为都发生在验证集时间之前模拟了真实线上场景。这也是为什么很多竞赛选手线下AUC能跑到0.95线上却只有0.7的原因——他们的验证集划分出了问题模型看到的“未来信息”太多了。我自己的实验数据显示随机划分的线下AUC比时间划分要高3~5个点但时间划分的线上表现才更接近真实水平。3.3 LightGBM参数调优经验参数调优这块我的经验是先粗调后细调。粗调阶段用较大的学习率0.1和较少的迭代次数200轮以内主要调的是树的复杂度参数import lightgbm as lgb params { objective: binary, metric: auc, learning_rate: 0.05, num_leaves: 63, max_depth: 7, min_child_samples: 20, feature_fraction: 0.8, bagging_fraction: 0.8, bagging_freq: 1, lambda_l1: 0.1, lambda_l2: 1.0, verbose: -1, seed: 42 }几个关键参数的调参思路num_leaves这个参数控制树的复杂度太大容易过拟合太小欠拟合。我在31到127之间用网格搜索试了一轮63的效果最佳。min_child_samples叶子节点最少样本数设置太大会导致模型过于保守太小则容易学噪声。20到50之间调最后用了20。feature_fraction每次迭代随机选取的特征比例0.8是为了增加模型的随机性防止过拟合。lambda_l1/lambda_l2正则化系数这个赛题特征比较多加正则化是必要的我调了好几组才找到合适的。粗调完成后进入细调阶段把学习率降到0.01用early_stopping控制迭代次数。我在验证集上观察到大概第300轮到500轮的时候AUC就趋于平稳了再加树反而会有轻微的过拟合。3.4 正负样本不均衡处理这个赛题的正样本比例低于10%属于典型的不均衡问题。我在处理的时候对比过几种方案不做任何处理LightGBM自带处理能力直接训练也能拿到不错的AUC但预测分数整体偏低。过采样/欠采样对正样本做SMOTE过采样或者对负样本做欠采样。我试了以后发现SMOTE在这个场景下提升有限反而增加了训练时间欠采样在样本量足够的情况下效果还行但会损失负样本信息。调整scale_pos_weight这个参数是LightGBM专门处理不平衡用的本质是给正样本的损失函数加权重。我用的是负样本数除以正样本数的比值来设置效果比采样方式更稳。最终我采用了scale_pos_weight方案结合early_stopping保证模型收敛稳定。赛后复盘的时候我看到一些选手用Focal Loss之类的方案我认为在这个量级的数据上其实没必要scale_pos_weight已经够用了。4. 完整代码结构与关键模块实现4.1 项目文件结构说明我整理这套代码的时候刻意按照工程化的标准来组织虽然只是个学习赛但养成良好的代码习惯对后续工作帮助很大。整个项目的文件结构如下~/tianchi_rebuy_prediction/ │ ├── data/ │ ├── raw/ # 原始数据存放处 │ ├── processed/ # 特征工程后的数据 │ └── submit/ # 预测结果输出 │ ├── src/ │ ├── config.py # 全局配置参数 │ ├── data_preprocess.py # 数据预处理 │ ├── feature_engineering.py # 特征工程主脚本 │ ├── train.py # 模型训练与评估 │ └── predict.py # 生成预测结果 │ ├── notebooks/ │ └── EDA.ipynb # 数据探索分析 │ ├── README.md # 项目文档说明 └── requirements.txt # 依赖包列表为什么要把代码拆成模块而不是一个大的ipynb我的体会是学习赛很多人喜欢用notebook一把梭但特征工程和模型训练一旦分开你想回去改某个特征的时候会非常痛苦。模块化之后改特征只需要调整feature_engineering.py里对应的函数重跑一遍就行效率高很多。4.2 特征工程核心代码解析特征工程的代码是整个项目的核心我在这里贴几段关键代码并说明思路。基础统计特征函数def gen_user_stats_feature(df, behavior_df): 生成用户维度的基本统计特征 :param df: 用户-品牌对样本表 :param behavior_df: 行为日志表 :return: 合并特征后的DataFrame # 按用户聚合行为数据 user_stats behavior_df.groupby(user_id).agg( total_browse(type, lambda x: (x 1).sum()), total_addcart(type, lambda x: (x 2).sum()), total_favorite(type, lambda x: (x 3).sum()), total_buy(type, lambda x: (x 4).sum()), total_behavior(type, count), buy_brands(brand_id, nunique), avg_interval(visit_datetime, lambda x: x.diff().mean()) ).reset_index() # 构造行为转化率特征 user_stats[browse_to_buy_ratio] user_stats[total_buy] / (user_stats[total_browse] 1) user_stats[addcart_to_buy_ratio] user_stats[total_buy] / (user_stats[total_addcart] 1) return pd.merge(df, user_stats, onuser_id, howleft)这里有一个容易被新手忽略的细节计算转化率的时候分母要加1这是为了平滑处理避免分母为0导致的结果无穷大。很多初学者会忘记这一步导致特征里出现infLightGBM虽然也能处理但会损失一部分信息。时间衰减特征代码def gen_time_decay_feature(df, behavior_df, decay_lambda0.05): 生成时间衰减特征越近的行为权重越高 # 计算每条行为距离截止日期的天数 behavior_df[days_diff] (cutoff_date - behavior_df[visit_datetime]).dt.days # 计算指数衰减权重 behavior_df[decay_weight] np.exp(-decay_lambda * behavior_df[days_diff]) # 按用户-品牌聚合带权重的行为特征 decay_feat behavior_df.groupby([user_id, brand_id]).agg( decay_browse(decay_weight, lambda x: (behavior_df.loc[x.index, type] 1) x.values), decay_addcart(decay_weight, lambda x: (behavior_df.loc[x.index, type] 2) x.values), decay_favorite(decay_weight, lambda x: (behavior_df.loc[x.index, type] 3) x.values), decay_buy(decay_weight, lambda x: (behavior_df.loc[x.index, type] 4) x.values), ).reset_index() return pd.merge(df, decay_feat, on[user_id, brand_id], howleft)这段代码里有几个计算细节值得展开说一下。lambda表达式里的(behavior_df.loc[x.index, type] 1) x.values前面的布尔数组转成0/1向量后面的x.values是权重向量两者做点积等价于求“该类型行为的加权次数”。这种写法比先筛选再求和要高效尤其是数据量大的时候能省不少时间。但要注意这段代码在小数据集上没问题数据集非常大时behavior_df.loc[x.index]的索引操作会比较慢groupby的agg里频繁调用lambda也有性能问题。我后面在内存优化部分会讲一种用向量化替代的方案。4.3 用户-品牌交叉特征构造交叉特征是复购预测的胜负手。我的代码实现如下def gen_user_brand_cross_feature(df, behavior_df): 生成用户-品牌维度的交叉特征 # 用户对品牌的行为汇总 ub_stats behavior_df.groupby([user_id, brand_id]).agg( ub_buy_count(type, lambda x: (x 4).sum()), ub_browse_count(type, lambda x: (x 1).sum()), ub_last_buy_time(visit_datetime, lambda x: x[x.type 4].max() if (x.type 4).any() else pd.NaT), ub_first_buy_time(visit_datetime, lambda x: x[x.type 4].min() if (x.type 4).any() else pd.NaT), ub_total_span(visit_datetime, lambda x: (x.max() - x.min()).days), ).reset_index() # 最近一次购买距今的天数 ub_stats[ub_last_buy_days] (cutoff_date - ub_stats[ub_last_buy_time]).dt.days ub_stats[ub_buy_span] (ub_stats[ub_last_buy_time] - ub_stats[ub_first_buy_time]).dt.days return pd.merge(df, ub_stats, on[user_id, brand_id], howleft)ub_last_buy_days这个特征我愿称之为全项目最重要的特征它直接刻画了用户离最近一次购买该品牌有多久。如果这个值很小说明用户近期刚买过复购概率高如果很大说明用户已经很久没买这个品牌了大概率已经流失。在我的验证集上单用这个特征就能达到0.72的AUC加上其他特征后整体提升到了0.85以上。4.4 模型训练核心代码解析模型训练的代码相对简单但有几个细节值得注意def train_model(train_df, valid_df, feature_cols): 使用LightGBM训练二分类模型采用AUC作为评估指标 X_train train_df[feature_cols] y_train train_df[label] X_valid valid_df[feature_cols] y_valid valid_df[label] dtrain lgb.Dataset(X_train, labely_train) dvalid lgb.Dataset(X_valid, labely_valid, referencedtrain) # 正负样本比例 pos_ratio (y_train 0).sum() / (y_train 1).sum() params { objective: binary, metric: auc, learning_rate: 0.05, num_leaves: 63, max_depth: 7, min_child_samples: 20, feature_fraction: 0.8, bagging_fraction: 0.8, bagging_freq: 1, lambda_l1: 0.1, lambda_l2: 1.0, scale_pos_weight: pos_ratio, verbose: -1, seed: 42 } model lgb.train( params, dtrain, num_boost_round2000, valid_sets[dvalid], callbacks[lgb.early_stopping(100), lgb.log_evaluation(50)] ) # 验证集AUC valid_pred model.predict(X_valid, num_iterationmodel.best_iteration) auc_score roc_auc_score(y_valid, valid_pred) print(fBest iteration: {model.best_iteration}, Valid AUC: {auc_score:.5f}) return model关于scale_pos_weight的取值我计算的是负样本数除以正样本数这个比值在本赛题数据下大概是12左右。使用后验证集AUC提升了大概1~2个点。4.5 预测与结果输出预测部分需要特别注意训练时和预测时特征口径的一致性def generate_submission(model, test_df, feature_cols): 生成提交结果 X_test test_df[feature_cols] # 预测复购概率 test_df[pred_prob] model.predict(X_test, num_iterationmodel.best_iteration) # 输出结果 result test_df[[user_id, brand_id, pred_prob]] result.to_csv(submit/prediction.csv, indexFalse, headerNone) return result一个容易犯的错误是训练时特征工程处理了训练集但预测时忘了对测试集做同样的处理。比如训练时给用户ID做了label encoding预测时直接用原始测试数据跑特征列就完全对不上了。所以我在代码里把特征处理封装成了一个个独立的函数训练和预测都调用相同的函数保证特征口径完全一致。5. 常见问题与排查技巧实录5.1 特征泄漏问题特征泄漏是这个赛题最容易踩的坑也是最隐蔽的坑。我复盘的时候发现不少同学线下AUC刷到0.9以上线上却只有0.7大概率就是泄漏了。特征泄漏最常见的两种形式全局统计参与特征比如计算用户总购买次数的时候如果把验证集时间的购买行为也统计进去了那模型等于“偷看”了未来的数据。这个问题在特征工程阶段就要警惕一定确保统计窗口截止在训练截止日期之前。时间穿越特征比如用用户在预测时间点之后的行为来构造特征。这在特征阶段不会直接报错但模型效果会虚高。排查泄漏的方法也不复杂做一个“负向测试”。把标签随机打乱然后重新训练。如果AUC还明显高于0.5那说明特征里存在泄漏信息。这个操作用不了几分钟但能帮你省下大量无效调参的时间。5.2 内存溢出与性能优化千万级行为日志做groupby聚合如果代码写得不好很容易内存溢出。我在这个项目里踩过几次坑总结了几条优化经验用categorical dtype替代object把用户ID、品牌ID、商品ID这些高基数类别列转成category类型内存占用能减少50%以上。避免groupby里的自定义lambda能向量化计算就向量化比如求购买次数可以(behavior_df[type] 4).groupby(behavior_df[user_id]).sum()代替groupby([...]).agg(lambda x: (x 4).sum())后者每次apply都有Python函数调用的开销。分块处理如果数据实在太大按用户ID分块处理再合并结果避免一次性加载全部数据。以下是我实际用的一种向量化替代方案比groupbylambda方式快了很多# 高效方式先生成行为类型指示矩阵再groupby求和 type_dummies pd.get_dummies(behavior_df[type], prefixtype) behavior_df pd.concat([behavior_df[[user_id, brand_id]], type_dummies], axis1) eff_feat behavior_df.groupby([user_id, brand_id]).sum().reset_index()5.3 训练集和验证集分布不一致这个问题的表现是模型在训练集上AUC很高验证集上AUC掉得厉害。主要原因往往是你的训练集和验证集来自不同的时间段而用户行为模式在这段时间里发生了变化。比如训练集覆盖的是双十一前后用户购买行为明显比其他时间段活跃而验证集恰好是双十一之后的平淡期模型在训练集学到的高购买倾向自然就失灵了。应对方法尝试扩大训练集的时间范围让模型学到更多稳定的模式。增加时间相关的特征比如“距离上次购买天数”“行为发生在星期几/几点”让模型自己学会时间因素的影响。如果条件允许用滑动窗口法做多折交叉验证综合评估模型稳定性。5.4 模型效果的上限探索在我自己的实践中把特征工程做到位之后单模型的LightGBM AUC大概能到0.86~0.88。这个成绩在当时的排行榜上已经能排进前列了。但如果你想再往上冲方向有几个多模型融合LightGBM XGBoost CatBoost做加权平均或者stacking通常能再提升1~2个点。我当时试过把三个模型的预测概率做简单平均AUC大概提升了0.8个点。深度学习模型用DeepFM、AutoInt这类模型处理高维稀疏特征在行为序列建模上有时比GBDT更有优势。但要求特征工程做得足够精细不然深度学习也发挥不出来。特征扩展还可以引入更多的交互特征、序列embedding等。我在后面参考了一些开源方案把用户行为序列切分成时间窗口内外的两组分别统计又榨出了零点几个点的收益。6. 项目文档说明与使用指南6.1 README文档要点整套代码配套的README文档我写得比较详细核心包括几部分内容项目简介与赛题背景说明让新接手的人知道这个项目在干什么。数据文件的放置位置和格式说明。运行环境的依赖说明Python 3.7、pandas、numpy、scikit-learn、lightgbm。一键运行的脚本说明按顺序执行数据预处理→特征工程→模型训练→预测生成。各模块的功能说明和核心函数介绍方便二次开发。文档的价值不在于长篇大论而在于能让一个完全没接触过这个项目的人在半小时内跑通整套流程。6.2 从baseline到高分的工程化改进清单我在文档最后总结了一份改进清单方便后续迭代参考改进方向具体操作效果评估基础特征用户行为统计 品牌统计基线AUC约0.75交叉特征用户-品牌维度行为统计AUC提升至0.80以上时间衰减指数衰减加权行为特征AUC提升1~2个点调参优化scale_pos_weight 网格搜索AUC提升1个点模型融合XGB/LGB/CatBoost集成AUC再提升1个点左右深度模型DeepFM/序列建模视数据量而定这份清单也适合你自己做项目复盘用每改动一步就记录一下AUC变化你会很清楚哪些工作真正推动了效果。6.3 如何把竞赛方案落地到实际业务最后想聊一点题外话。很多人打完竞赛就把代码丢一边了觉得竞赛和实际业务是两个世界。但我觉得天猫复购预测这个赛题的可迁移性非常强核心的套路——用户维度特征 交叉特征 时间衰减 GBDT排序——几乎可以直接套用到任意电商平台的复购、流失预警、营销响应预测场景。你只需要做两步适配第一步把数据字段名替换成你们公司的字段第二步把行为类型映射成你们业务的转化路径。剩下的模型训练、验证、调参流程几乎是通用的。这也是为什么我建议初学者多打这类贴近真实业务的竞赛因为它帮你训练的不是解题技巧而是可迁移的建模方法论。根据我自己的参赛和复盘经验这个项目最大的收获不是最终那个AUC分数而是对“特征工程不是堆特征而是理解业务后提炼信号”的深刻体会。很多人问为什么同样的LightGBM参数别人跑出来AUC就是比你高差距往往不在模型而在特征工程里对业务细节的把握——比如是否区分了点击和加购的信号强度是否考虑了行为的时间衰减是否理解了预测粒度是用户-品牌对。把这些细节想透了哪怕模型简单一点效果也不会差到哪里去。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价