手把手带你打 Kaggle!F1 进站预测实战
📌 前言:为什么要打 Kaggle?
Kaggle 是全球最大的数据科学竞赛平台,也是数据科学领域最实际的"刷题场"。不同于 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 Stops(S6E5)
本次选定的比赛是 Kaggle Playground Series Season 6 Episode 5:
🔗 Predicting F1 Pit Stops | Kaggle
为什么选这场?
表格
| 理由 | 说明 |
|---|---|
| 🎯适合入门 | Playground Series 是 Kaggle 官方每月举办的练习赛,难度适中 |
| 📊Tabular 数据 | 表格型数据,不需要深度学习,统计背景可直接上手 |
| 🏆有 Medal | Playground 比赛有正式奖牌制度,Top 10% 得铜牌、Top 5% 得银牌 |
| 🧠有趣的领域 | F1 赛车策略,比预测房价有意思得多 |
📥 Step 2:下载数据
进入比赛页面 → 点Data分页 → 点Download All,下载压缩包。
解压缩后你会看到3 个档案:
plaintext
playground-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 换成真实的机率预测,例如:
plaintext
439140,0.0823 439141,0.4156 439142,0.0341② 评分方式:Leaderboard 怎么算分?
→ ROC AUC(Area Under the ROC Curve)
AUC 是二元分类机率预测最常用的指标,分数从 0 到 1:
表格
| AUC 分数 | 代表意义 |
|---|---|
| 0.50 | 跟乱猜一样 |
| 0.80 | 还不错的水准 |
| 0.90 | 很强 |
| 0.95+ | 目前 Leaderboard 顶尖水准 |
| 1.00 | 完美预测 |
AUC 的关键特性(直接影响你的策略):
AUC 只看排名顺序,不看绝对值
- 你预测 A=0.9、B=0.1,和 A=0.6、B=0.4,对 AUC 的贡献是一样的(只要 A 排在 B 前面)
- 所以「让进站和不进站的机率差距更大」比「把机率校准到完美」更重要
类别不平衡不会直接惩罚 AUC
- 赛车一场比赛 50 圈,进站只有 1-3 圈,正例比例约 5-15%
- AUC 对这种不平衡有天然的抵抗力,但训练模型时仍要处理
为什么 Blending(模型融合)特别有效?
- 不同模型看到的「排名顺序」不同,融合后互补,AUC 就能提升
- 这也是为什么 Kaggle 高手最后几天都在疯狂融合模型
③ 数据型态:数据长什么样?
→ 表格型时间序列数据(Tabular + Sequential)
这份数据是以「一圈一列」为单位的 F1 赛事记录,共33 个栏位。
下载数据后,立刻执行这段 EDA 诊断码:
python
import pandas as pd train = pd.read_csv('train.csv') test = pd.read_csv('test.csv') # 基本形状 print(f"Train: {train.shape}") print(f"Test: {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 Stops(S6E5)
- 原始数据集:F1 Strategy Dataset
- Kaggle Playground Series 总览
标签:
Kaggle机器学习数据科学PythonF1赛车二元分类ROC AUC竞赛实战特征工程LightGBM
