我在 FATEC Sorocaba 的毕业论文,指导老师是 Maria das Graças J. M. Tomazela 教授。研究问题只有一个:按位置(门将、后卫、中场、前锋)分别训练的随机森林模型,能否比单一的通用模型以更小的误差在赛前预测球员的 Sofascore 评分?
流程
分三个阶段,每个阶段只从磁盘读取上一阶段的输出,因此任何一个阶段都可以单独重跑。
- 采集。 一个"有礼貌"的 Sofascore 内部 API 爬虫:限速、带退避的重试、断点续爬,并对每一行数据做 Pydantic 校验。共采集 11,977 条球员单场记录,覆盖 2025 年巴西甲级联赛全部 380 场比赛。
- 清洗。 每个步骤一个函数。有意思的是,一个空单元格可能代表三种不同的含义,每种都有各自的处理规则。
- 建模。 只使用赛前特征:主客场、对手实力,以及球员截至被预测比赛之前的历史表现。在最后 80 场比赛上做前向滚动验证,以整场比赛为单位做 bootstrap 置信区间,并计算置换重要性。
结果
按位置专门建模并没有降低误差。通用模型比"按位置取平均"的基线好 6%(MAE 0.374 对 0.398),而门将的评分在赛前几乎无法预测。一场比赛的评分,大部分是在比赛过程中才决定的。
笔记
按顺序讲完整个过程:数据里的陷阱,第一个好得不真实的模型,以及当模型只能看到过去时得出的结果。
技术栈:Python、httpx、tenacity、Pydantic v2、pandas、scikit-learn、pytest。
