私有排行榜得分:0.17525
私有排行榜名次:第三名
Notebook链接
介绍
大家好,Kaggle成员们!
我要感谢主办方举办这场比赛,感谢Kaggle为比赛提供平台。感谢Kaggle的同事们提供的公开代码,让我受益匪浅。特别感谢@raddar和@verracodeguacas提供的代码对我的帮助。向这场精彩比赛的决赛选手和获胜者表示祝贺!
背景
我是一名机器学习工程师,拥有3年专业经验,这是我第一次参加这个比赛,过去我曾预测过其他体育赛事的结果。
数据集
在最终方案中,我只使用了NCAATourneyDetailedResults、NCAATourneySeeds和RegularSeasonDetailedResults的数据。我尝试过使用MasseyOrdinals数据,但最终放弃了,因为没有发现明显的提升。我认为有必要重新研究这些数据,因为我还没有充分挖掘它们的价值。
特征工程
最终模型训练使用的特征包括:'Score', 'FGM', 'FGA', 'FGM3', 'FGA3', 'OR', 'Ast', 'TO', 'Stl', 'PF', 'seed'及其衍生特征。测试过程中我排除了其他特征,因为它们无法提升预测质量。当特征数量超过70个时,预测质量开始下降。
我添加了针对最近3个赛季的数据提取函数。该函数获取当前赛季及前两个赛季的该特征值,并按降序分配权重(当前赛季权重最高)。计算加权平均值并写入新特征,这有助于平滑球队表现异常的情况。在某些情况下,这能将预测提升0.001-0.003。该函数目前研究较少,已应用于'Score'、'FGA'、'FGA3'、'quality'和'seed'参数。
数据缩放
我尝试了Normalizer、MinMaxScaler和StandardScaler,最终选择效果最好的Normalizer。
模型选择
测试了XGBoost、ElasticNet和LogisticRegression,XGBoost表现最佳。最终参数设置:xgb.cv, repeat_cv=4, max_depth=3, folds=KFold, n_splits=5。
当repeat_cv设置为7-10时,相比多赛季平均值有0.003-0.005的提升。但如果算法确信能赢的球队爆冷输掉,分数反而会更差——这在本届比赛中确实发生了。对于本届比赛,repeat_cv=7的结果比4更差。我也测试了预测胜负概率(1/0)和预测得分两种方式,未发现显著差异。
结果处理
我没有对模型预测结果进行后处理,直接使用原始预测值。后来检查了1-3号种子和14-16号种子的情况,但未明显改善结果。我不建议使用手动调整,因为这会将预测变成基于排名和个人偏好的主观预测。虽然我认为适当调整可能提升预测效果并增加比赛趣味性。
参数优化采用除最后一季外所有赛季训练,最后一季验证的方式。男女队分开训练,女子比赛预测效果更好(约0.145-0.151 vs 0.187-0.192)。我认为男子队伍实力更接近,更难预测。赛季平均结果约0.172-0.173,单赛季差异在0.169-0.177之间。我预期比赛结果在0.174-0.176区间,虽然觉得可能有人能做到0.169以下。
提交的两个最佳方案结果:0.17525(第3名)和0.1763(第6名)。虽然对强队的某些预测出错,但其他比赛预测一致,因此排名变化不大。我对最终结果非常满意。
参考来源
@raddar:2018年原始R代码。@raddar的指南 - Darius Barušauskas,YouTube演示
@verracodeguacas 2023年Python notebooks:1: 男子组,2: 女子组,3: 混合方案