用Prophet+LGBM复现Kaggle Rossmann销量预测:从冠军方案到我的0.11273分实战复盘

用Prophet+LGBM复现Kaggle Rossmann销量预测:从冠军方案到我的0.11273分实战复盘 从冠军方案到0.11273分ProphetLGBM在Rossmann销量预测中的实战优化1. 竞赛背景与数据洞察Rossmann销售预测竞赛是Kaggle平台上经典的时序预测案例要求参赛者预测德国1115家药店未来6周的每日销售额。原始数据集包含以下关键字段基础时序特征Date日期、DayOfWeek星期几、Sales销售额预测目标运营状态Open是否营业、Promo是否促销、SchoolHoliday学校假期店铺属性StoreType店铺类型、Assortment商品分类等级、CompetitionDistance竞对距离通过EDA分析可发现几个关键规律周日闭店率高达89%但持续营业的店铺平均销售额比其他店铺高37%促销期间单店日均销售额提升19%但促销对长期趋势无显著影响店铺类型B的月均销售额比类型A高63%且呈现明显上升趋势关键发现虽然整体销售额序列平稳但细分到店铺级别时不同类别店铺存在显著差异趋势2. 冠军方案的技术拆解当年的冠军方案采用了多阶段融合策略其核心架构如下2.1 特征工程框架# 冠军方案的特征生成逻辑简化版 def generate_features(df): # 时序分解 prophet_features Prophet().fit(df).predict(future_df) # 近期数据统计 recent_stats df.groupby(Store).rolling(30D)[Sales].agg([ mean,median,std,skew ]) # 促销周期编码 promo_features pd.get_dummies(df[PromoInterval].str.split(,)) return pd.concat([prophet_features, recent_stats, promo_features], axis1)2.2 模型融合策略模型类型数量特征子集权重系数XGBoost120随机50个特征0.4LightGBM80Prophet特征近期统计0.3CatBoost50店铺属性促销组合0.2线性回归1关键10个特征0.13. 我的优化路径与关键转折3.1 初始复现的困境直接复现冠军方案时遇到的主要挑战计算资源消耗1115家店铺的Prophet拟合耗时超过8小时300特征导致内存占用达32GB模型表现瓶颈在本地验证集上RMSPE为0.12468线上提交成绩仅排名12993.2 突破性优化策略3.2.1 数据清洗的魔法通过分析发现了三个关键改进点# 关键预处理代码 def data_cleaning(df): # 剔除测试集不存在的店铺 df df[df[Store].isin(test_stores)] # 去除极端离群点按店铺分组处理 q1 df.groupby(Store)[Sales].transform(quantile, 0.25) q3 df.groupby(Store)[Sales].transform(quantile, 0.75) iqr q3 - q1 return df[(df[Sales] q3 2*iqr) (df[Sales] q1 - 2*iqr)]3.2.2 特征工程的简化对比实验证明特征组合验证集RMSPE训练时间完整冠军特征(300)0.124686.2hProphet核心特征(6个)0.117311.5hProphetlog(day)0.112731.8h3.3 最终模型架构# 最优单模型配置 lgb_params { n_estimators: 4000, learning_rate: 0.03, subsample: 0.9, colsample_bytree: 0.7, max_depth: 10, metric: rmse, early_stopping_rounds: 50 } # 特征重要性排名Top5 1. sales_trendProphet趋势项 2. StoreType店铺类型 3. log_day日期对数变换 4. customers_weekly周客流 5. Promo促销标志4. 实战经验总结4.1 关键收获简单即有效单个LightGBM精选特征的组合超越复杂模型融合数据质量优先剔除5%的离群点带来RMSPE提升0.008业务逻辑导向log(day)特征捕获了月末销售冲高的业务规律4.2 避坑指南不要过度依赖自动特征筛选Null Importance方法可能误删强特征人工验证特征相关性更可靠警惕冠军方案的陷阱复杂方案可能过拟合特定竞赛数据集需通过AB测试验证每个组件的实际效果基准模型先行# 推荐首先建立的基准模型 baseline_model LGBMRegressor( n_estimators100, max_depth3 ).fit(train[[StoreType,Promo]], y)5. 扩展应用建议将本方案迁移到其他销售预测场景时建议关注店铺聚类分析# 使用销售模式聚类店铺 from sklearn.cluster import KMeans cluster_features df.pivot_table( indexStore, columnsDate, valuesSales ).fillna(0) clusters KMeans(4).fit_predict(cluster_features)促销效果量化# 计算促销提升系数 promo_lift (df[df[Promo]1][Sales].mean() / df[df[Promo]0][Sales].mean() - 1)节假日效应建模# 节假日前后对比特征 df[days_to_holiday] df[Date].apply( lambda x: min([(x-h).days for h in holidays]) )