手把手带你打 Kaggle!F1 进站预测实战
前言为什么要打 KaggleKaggle 是全球最大的数据科学竞赛平台也是数据科学领域最实际的刷题场。不同于 LeetCode 刷算法、Kaggle 让你从头到尾体验一个真实的 ML 工作流程下载真实数据阅读高手 Notebook 学招式提交预测结果看排名拿到Medal奖牌放进履历或作品集不管你是要推甄研究所、找数据科学实习还是纯粹想提升实力打 Kaggle 永远是 CP 值最高的方式之一。 Step 0注册 Kaggle 帐号前往 kaggle.com点右上角Sign In或Register用 Google 帐号直接一键登入。⚠️第一次参加比赛的必要步骤进入比赛页面后先点选Rules分页点Join Competition / Accept Rules。 没做这步就看不到下载按钮也无法提交结果 Step 1选定比赛——Predicting F1 Pit StopsS6E5本次选定的比赛是 Kaggle Playground Series Season 6 Episode 5 Predicting F1 Pit Stops | Kaggle为什么选这场表格理由说明适合入门Playground Series 是 Kaggle 官方每月举办的练习赛难度适中Tabular 数据表格型数据不需要深度学习统计背景可直接上手有 MedalPlayground 比赛有正式奖牌制度Top 10% 得铜牌、Top 5% 得银牌有趣的领域F1 赛车策略比预测房价有意思得多 Step 2下载数据进入比赛页面 → 点Data分页 → 点Download All下载压缩包。解压缩后你会看到3 个档案plaintextplayground-series-s6e5/ ├── train.csv ← 训练集有标签 ├── test.csv ← 测试集要预测这个 └── sample_submission.csv ← 提交格式范本️ Step 3先搞懂规则再开始建模下载数据后千万不要立刻开始写模型就像打英雄联盟要先知道蓝 Buff 和红 Buff 的位置打 Kaggle 也要先搞清楚这三件事① 任务目标 → ② 评分方式 → ③ 数据型态这三步做好了之后的每一个决策都会更有方向。① 任务目标这是什么问题→ 二元分类Binary Classification比赛要你预测每一圈赛车下一圈是否会进站目标栏位是PitNextLap表格值意义1这辆车下一圈会进站0这辆车下一圈不会进站但注意你提交的不是 0 或 1 的硬预测而是进站的机率0.0 到 1.0 之间的小数。plaintext# sample_submission.csv 长这样 id,PitNextLap 439140,0 ← Kaggle 给的 dummy baseline全部填 0 439141,0 439142,0 ...你的任务把这些 0 换成真实的机率预测例如plaintext439140,0.0823 439141,0.4156 439142,0.0341② 评分方式Leaderboard 怎么算分→ ROC AUCArea Under the ROC CurveAUC 是二元分类机率预测最常用的指标分数从 0 到 1表格AUC 分数代表意义0.50跟乱猜一样0.80还不错的水准0.90很强0.95目前 Leaderboard 顶尖水准1.00完美预测AUC 的关键特性直接影响你的策略AUC 只看排名顺序不看绝对值你预测 A0.9、B0.1和 A0.6、B0.4对 AUC 的贡献是一样的只要 A 排在 B 前面所以「让进站和不进站的机率差距更大」比「把机率校准到完美」更重要类别不平衡不会直接惩罚 AUC赛车一场比赛 50 圈进站只有 1-3 圈正例比例约 5-15%AUC 对这种不平衡有天然的抵抗力但训练模型时仍要处理为什么 Blending模型融合特别有效不同模型看到的「排名顺序」不同融合后互补AUC 就能提升这也是为什么 Kaggle 高手最后几天都在疯狂融合模型③ 数据型态数据长什么样→ 表格型时间序列数据Tabular Sequential这份数据是以「一圈一列」为单位的 F1 赛事记录共33 个栏位。下载数据后立刻执行这段 EDA 诊断码pythonimport pandas as pd train pd.read_csv(train.csv) test pd.read_csv(test.csv) # 基本形状 print(fTrain: {train.shape}) print(fTest: {test.shape}) # 目标分布 print(\n目标栏位分布) print(train[PitNextLap].value_counts()) print(f进站比例: {train[PitNextLap].mean():.2%}) # 栏位型态 print(\n栏位与数据型态) print(train.dtypes) # 缺失值 print(\n缺失值统计) missing train.isnull().sum() print(missing[missing 0] if missing.any() else 无缺失值) # 数值统计 print(\n描述统计) print(train.describe())根据原始 F1 Strategy Dataset预期看到的栏位大致分为表格栏位类型包含栏位对预测的重要性 识别栏id,RaceID,DriverID不直接用但分组用️ 赛况LapNumber,Position,Stint高轮胎最重要Compound,TyreLife已被移除极高⏱️ 圈速LapTime,Sector1/2/3Time高退化信号 位置差距GapToLeader,IntervalToNext中 赛况旗帜TrackStatus安全车中 目标PitNextLap只在 train 有⚠️ 比赛的关键陷阱被刻意拿掉的 Normalized_TyreLife这场比赛最大的挑战在官方说明里就写了We intentionally removeNormalized_TyreLifewhich makes the prediction trivial.我们刻意移除了Normalized_TyreLife因为有了这个栏位预测就太简单了。轮胎寿命是 F1 进站决策最核心的因素——轮胎跑越久越退化圈速变慢就该进站换胎。Kaggle 刻意拿掉这个栏位让你用其他特征自己重建「轮胎寿命」的代理变数。这是这场比赛的破关关键我们会在下一篇详细讲特征工程的方法。 本篇总结三件事搞清楚了吗表格问题答案这是什么任务二元分类预测下一圈进站机率怎么评分ROC AUC越接近 1 越好数据是什么型态表格型时间序列33 栏需要重建轮胎寿命特征 下一篇预告第二篇EDA 实作 特征工程——如何重建被偷走的「轮胎寿命」我们会用 Python 实际跑完整的探索性数据分析并设计以下特征用累积圈数重建轮胎寿命代理变数滚动圈速趋势退化信号安全车旗帜的进站时机特征与队友的策略差异特征 互动区你也在打 Kaggle 吗欢迎在评论区告诉我你目前的 Kaggle Rank 是什么第一次提交时最大的困惑是什么觉得有帮助的话点个 或收藏吧这个系列会持续更新到拿到奖牌为止。 相关链接比赛页面Predicting F1 Pit StopsS6E5原始数据集F1 Strategy DatasetKaggle Playground Series 总览标签Kaggle机器学习数据科学PythonF1赛车二元分类ROC AUC竞赛实战特征工程LightGBM