阿里云天池新人实战赛o2o优惠券使用预测实践总结


一、实践目的和要求完成O2O优惠券使用天池平台线上测评。二、实践设备1.操作系统:Archlinux/NixOS2.基本硬件配置要求:处理器AMD Ryzen™ 7 7840HS、内存16G;3.Python及其组件版本1Python 3.13及以上Pandas 2.3.3及以上xgboost 3.1.2及以上chinesecalendar 1.11.0及以上jupyter 1.1.1及以上lightgbm 4.6.0及以上pyarrow 22.0.0及以上pyproject.toml文件如下 [project]name = "my-o2o"version = "0.1.0"description = "code for aliyun tianchi o2o"readme = "README.md"requires-python = ">=3.13"dependencies = [ "chinesecalendar>=1.11.0", "jupyter>=1.1.1", "lightgbm>=4.6.0", "pandas>=2.3.3", "pyarrow>=22.0.0", "xgboost>=3.1.2",]三、实践内容从0.7206到0.8175整个十二月,我在数据集划分、特征工程、模型融合等多方面齐头并进,实现了测试AUC从0.7206跃升到0.8175的进展。使用Git进行版本控制,全部代码变更记录可参考git log,云端代码仓库https://github.com/TwinklerG/my_o2o数据集划分放弃middle段,给history段更丰富的信息,在测试集上了到了更好的效果。# 训练集train_history_field = off_train[ off_train["date_received"].isin(pd.date_range("2016/1/16", periods=75))] # [2016/1/16,2016/3/31)_ = off_train[ off_train["date"].isin(pd.date_range("2016/3/16", periods=15))] # [2016/3/16,2016/3/31)1依据pyproject.toml文件train_label_field = off_train[ off_train["date_received"].isin(pd.date_range("2016/3/31", periods=31))] # [2016/3/31,2016/5/1)# 验证集validate_history_field = off_train[ off_train["date_received"].isin(pd.date_range("2016/3/2", periods=75))] # [2016/3/2,2016/5/16)_ = off_train[ off_train["date"].isin(pd.date_range("2016/5/1", periods=15))] # [2016/5/1,2016/5/16)validate_label_field = off_train[ off_train["date_received"].isin(pd.date_range("2016/5/16", periods=31))] # [2016/5/16,2016/6/16)# 测试集test_history_field = off_train[ off_train["date_received"].isin(pd.date_range("2016/4/17", periods=75))] # [2016/4/17,2016/7/1)_ = off_train[ off_train["date"].isin(pd.date_range("2016/6/16", periods=15))] # [20160616,20160701)test_label_field = off_test.copy() # [20160701,20160801)特征工程特征工程是本项目中花费时间和精力最多的部分,也是代码量最多的部分,完整代码main.py历史段特征用户用户历史领券数用户历史核销数用户历史核销率用户历史15天核销数用户历史15天核销率用户领券核销平均间隔(天)用户领券核销最小间隔(天)用户领券核销最大间隔(天)用户领券的平均距离用户领券的最大距离用户领券的最小距离用户领券的平均折扣率用户领券的最高折扣率用户领券的最低折扣率用户核销优惠券的平均折扣率用户核销优惠券的最高折扣率用户核销优惠券的最低折扣率用户历史核销优惠券的平均距离用户历史核销优惠券的最大距离用户历史核销优惠券的最小距离用户核销满减券次数用户核销非满减券次数用户上旬领券次数用户上旬核销次数用户上旬核销率用户中旬领券次数用户中旬核销次数用户中旬核销率用户下旬领券次数用户下旬核销次数用户下旬核销率用户领券的商家种类用户核销的商家种类数用户领券种类数用户核销券种类商家商家被领券次数商家被领满减券次数商家被领非满减券次数商家被核销次数商户被核销满减券次数商家被核销非满减券次数商家优惠券核销率商家领券客户个数商家核销客户个数商家提供优惠券种数商家的优惠券平均折扣率商家的优惠券最高折扣率商家的优惠券最低折扣率商家的核销优惠券平均距离商家的核销优惠券最大距离商家的核销优惠券最小距离优惠券优惠券被领取次数优惠券被核销次数优惠券被核销率优惠券领取平均距离优惠券领取最大距离优惠券领取最小距离优惠券被核销平均距离优惠券被核销最大距离优惠券被核销最小距离优惠券15天核销数优惠券15天核销率用户+商家用户在特定商家的历史领券次数用户在特定商家的历史核销次数用户在指定商家历史核销率用户在指定商家历史15天核销次数用户在指定商家历史15天核销率用户在特定商家领券核销平均间隔(天)用户在特定商家领券核销最小间隔(天)用户在特定商家领券核销最大间隔(天)商家+优惠券数据分析发现,由于优惠券对应唯一的商家,所以“商家+优惠券”特征和“优惠券”特征重复。商家此优惠券被领取次数商家此优惠券被核销次数商家此优惠券被核销率商家此优惠券被15天核销次数商家此优惠券被15天核销率商家此优惠券被核销平均距离商家此优惠券被核销最小距离商家此优惠券被核销最大距离用户+优惠券用户领此券数用户核销此券数用户核销此券率用户15天核销此券数用户15天核销此券率用户领券核销平均间隔(天)用户领券核销最小间隔(天)用户领券核销最大间隔(天)用户领取此券平均距离用户领取此券最大距离用户领取此券最小距离用户核销此券平均距离用户核销此券最大距离用户核销此券最小距离用户+商家+优惠券数据分析发现,由于优惠券对应唯一的商家,所以“用户+商家+优惠券”特征和“用户+优惠券”特征重复。用户领此商家此券数用户核销此商家此券数用户核销此商家此券率用户领券核销平均间隔(天)用户领券核销最小间隔(天)用户领券核销最大间隔(天)标记段特征时间领券day of week(整型+sin+cos+one hot)领券day of month(整型+sin+cos+one hot)领券month(整型)是否是休息日是否是周末是否是工作日第一天是否是工作日最后一天是否是休息日第一天是否是休息日最后一天是否是工作日是否是上旬是否是中旬是否是下旬用户用户领券数用户领券种类用户领取满减券数用户领取满减券种类用户领券平均距离用户领券最小距离用户领券最大距离用户领券与平均距离差值商户商户发放的优惠券种类数商户优惠券被领取的数量用户+商家用户领取特定商家优惠券数用户是否重复领商家券用户领取商家满减券数用户领取特定商家券种类用户领商家券平均距离用户领商家券最少距离用户领商家券最大距离用户+优惠券用户领取特定优惠券数用户是否重复领特定券商户+优惠券商户特定优惠券被领取次数用户+商户+优惠券与“用户+优惠券”特征重复用户领取特定商家特定优惠券数用户是否重复领特定商家特定券用户+领券日期用户是否在同一天重复领取消费券用户当天领券数用户这天前领券数用户这天后领券数用户+优惠券+领券日期用户是否在同一天重复领取特定消费券用户当天领特定券数用户这天前领特定券数用户这天后领特定券数用户+商家+领券日期用户是否在当天重复领券特定商家券用户当天领特定商家券数用户这天前领特定商家券数用户这天后领特定商家券数用户+商家+优惠券+领券日期与“用户+优惠券+领券日期”特征重复。但剔除后模型表现显著下降。用户是否在当天重复领券特定商家特定券用户当天领特定商家特定券数用户这天前领特定商家特定券数用户这天后领特定商家特定券数在线特征用户线上总操作次数用户线上点击次数用户线上购买次数用户线上领券次数用户线上点击率用户线上购买率用户线上领券率用户线上fixed记录数用户线上fixed记录率线上线下综合特征用户线下领券次数与线上领券次数之比用户总领特定商家券数用户线下消费占线上消费比率全数据特征用户是否从未核销模型融合使用XGBoostLightGBM双模型,采用Rank融合。权重设置为LightGBM: 0.8; XGBoost: 0.2。完整代码参见model.py历史更改所有更改都可由Git Commit追溯部分Commit此处不列举所有的变更记录,所有变更均记录在Git Commit中。例如可以通过VS Code的内置Git功能查看Commit中的变更VS Code内置Git功能云端仓库也可以很方便地查看CommitGitHub查看Commit四、学习心得数据决定了机器学习的上限,而模型和算法只是逼近这个上限项目初期,通过对线上/线下的数据分析,我发现数据中存在的一些规律,如消费距离和核销率的负相关关系、不同折扣(满减、非满减、限时低价(线上))对消费者决策的差异化影响。这让我在后期打标和特征提取中有了更多的方向和关注点。特征工程是本项目耗时最久、产出最高的环节。在追求AUC从0.7206向0.8175跃升的过程中,我构建了涵盖用户、商家、优惠券三个维度及其两两、三三交叉的多维特征体系。除了基础特征,我还深挖了一些综合特征,例如线上线下综合行为比率、全局是否核销。我也学会了通过数据实验进行特征筛选,剔除冗余或与优惠券强绑定的重复特征,以确保模型的泛化能力和计算效率。每个消费券ID对应唯一的商家ID,因此在标记段,“用户+商家+优惠券+领券日期”与“用户+优惠券+领券日期”特征重复。但剔除后模型表现显著下降,只能放弃。(玄学模型融合阶段,除了Baseline中很不错的XGBoost,我还选择了LightGBM。我深深感受到集成学习的强大,通过数据预处理+特征工程产生的大量数据,在模型中得到淬炼,实现了数据挖掘。我采用采基于Rank的加权融合方案(LightGBM 0.8 + XGBoost 0.2),但在最终版本中,由于LightGBM在测试集的表现显著好于XGBoost,融合后表现变差,于是我是选择直接使用LightGBM的预测结果。最后,先进的开发环境与版本控制工具极大提升了我的研发效率。本次实践我使用了Archlinux/NixOS系统,并基于Python 3.13等最新版本的组件进行开发。通过Git进行严格的版本控制,我能够清晰地追踪AUC每一次小幅提升背后的代码变更。我个人认为,这种严谨的工程思维,与算法层面的创新同等重要。本次实践中,我还探索使用微软官方出品的VS Code插件Data Wrangler,。这款插件提供极快的CSV读取功能,能自动计算mean,max,min,distinct等并绘制相应的图表,让可视化分析触手可及,极大提升了我数据分析的效率。感谢微软团队!