[{"data":1,"prerenderedAt":254},["ShallowReactive",2],{"note-pre-match-ratings-zh":3,"titles-zh":249},{"note":4,"project":178},{"id":5,"title":6,"body":7,"date":161,"description":162,"draft":163,"extension":164,"kind":165,"meta":166,"navigation":167,"path":168,"pinned":163,"project":150,"seo":169,"stem":171,"summary":172,"tags":173,"__hash__":177,"translated":167},"notes\u002Fnotes\u002Fpre-match-ratings.md","一场比赛的评分，大部分无法预测",{"type":8,"value":9,"toc":152},"minimark",[10,22,106,110,118,121,124,127,130,133,136,139,142],[11,12,13,14,21],"p",{},"沿用 ",[15,16,20],"a",{"href":17,"className":18},"\u002Fzh\u002Fnotes\u002Fr2-too-good",[19],"wikilink","当 R² 好得过头"," 中的设定：在开球前预测每名球员的 Sofascore 评分，只使用主客场、对手实力和球员自己的历史数据。在 2025 年巴西甲级联赛的最后 80 场比赛上做前向滚动验证，共 2,494 人次出场。",[23,24,25,41],"table",{},[26,27,28],"thead",{},[29,30,31,35,38],"tr",{},[32,33,34],"th",{},"模型",[32,36,37],{},"MAE",[32,39,40],{},"R²",[42,43,44,56,67,78,89],"tbody",{},[29,45,46,50,53],{},[47,48,49],"td",{},"球员近 5 场平均",[47,51,52],{},"0.412",[47,54,55],{},"-0.06",[29,57,58,61,64],{},[47,59,60],{},"位置平均",[47,62,63],{},"0.398",[47,65,66],{},"0.01",[29,68,69,72,75],{},[47,70,71],{},"球员赛季平均",[47,73,74],{},"0.389",[47,76,77],{},"0.05",[29,79,80,83,86],{},[47,81,82],{},"位置专用模型",[47,84,85],{},"0.375",[47,87,88],{},"0.10",[29,90,91,97,102],{},[47,92,93],{},[94,95,96],"strong",{},"通用随机森林",[47,98,99],{},[94,100,101],{},"0.374",[47,103,104],{},[94,105,88],{},[107,108,109],"h2",{"id":109},"位置专用模型没有帮助",[11,111,112,113,117],{},"通用模型的 MAE 减去位置专用模型的 MAE 为 -0.0014，95% 置信区间为 ",[114,115,116],"span",{},"-0.0036, 0.0008","。这个区间来自 2,000 次 bootstrap 重抽样，每次抽取的是整场比赛而不是单行数据，因为同一场比赛中的球员并不相互独立。区间包含零，所以两者打平。决策规则在看到任何结果之前就已确定：如果打平，保留通用模型，因为一个模型比四个更简单。位置专用模型在任何一个位置上都没有胜出。",[107,119,120],{"id":120},"近期状态是噪声",[11,122,123],{},"球员近 5 场的平均评分，表现甚至不如完全不看这名球员、直接猜该位置的平均值。整个赛季的平均值则比两者都好。在五场比赛的尺度上，手感好或差大多只是噪声。置换重要性也印证了这一点：通用模型主要依赖两个特征，主客场和球员本赛季的平均评分。其余 61 项数据的历史几乎没有贡献。",[107,125,126],{"id":126},"门将",[11,128,129],{},"对门将来说，没有任何模型能明显胜过基线（通用模型和位置平均的 MAE 都是 0.559，R² 略低于零）。门将的评分取决于这场比赛中的扑救和失球，而在开球前，根本无法知道他会面对 2 次射门还是 12 次。",[107,131,132],{"id":132},"预测值紧贴平均值",[11,134,135],{},"测试集中真实评分的范围是 3.0 到 9.7，标准差为 0.54。通用模型的预测值范围是 6.63 到 7.41，标准差为 0.16。测试集中有 108 人次的评分在 8.0 或以上，模型的预测从来没有接近过其中任何一个。它会在主场比赛、以及本赛季表现好的球员身上把预测值往上调一点，但无法预见一场格外好或格外差的比赛。",[107,137,138],{"id":138},"答案",[11,140,141],{},"按位置专门建模并没有降低误差。通用模型比位置平均好 6.0%，比球员自己的赛季平均好 3.9%，而第二个差距是真实存在的（它的置信区间不包含零）。数字不大，但这就是信号的真实大小：一场比赛的评分，大部分是在比赛过程中决定的。",[11,143,144,145,151],{},"代码和完整方法：",[15,146,150],{"href":147,"rel":148},"https:\u002F\u002Fgithub.com\u002Falmeidaota\u002Fsofascore-rating-prediction",[149],"nofollow","sofascore-rating-prediction","。",{"title":153,"searchDepth":154,"depth":154,"links":155},"",2,[156,157,158,159,160],{"id":109,"depth":154,"text":109},{"id":120,"depth":154,"text":120},{"id":126,"depth":154,"text":126},{"id":132,"depth":154,"text":132},{"id":138,"depth":154,"text":138},"2026-10-22","The setup from When R² is too good: predict each player's Sofascore rating before kickoff, using only home\u002Faway, opponent strength and the player's own history. Walk-forward validation over the last 80 matches of the 2025 Brasileirão, 2,494 appearances.",false,"md","article",{},true,"\u002Fnotes\u002Fpre-match-ratings",{"title":170,"description":162},"Most of a match rating can't be predicted","notes\u002Fpre-match-ratings","按位置专门建模没有胜过单一的通用模型，近期状态还不如完全没有信息，而门将的评分谁也预测不了。论文的答案是否定的。",[174,175,176],"ml","random-forest","football","lRXhmendunPnntPdV0Kyh7MYFU2L_Af49JqWx0-YMFc",{"id":179,"title":180,"body":181,"cover":234,"date":235,"demo":234,"description":236,"draft":163,"extension":164,"featured":167,"meta":237,"navigation":167,"order":238,"path":239,"repo":147,"seo":240,"status":242,"stem":243,"summary":244,"tags":245,"__hash__":248,"translated":167},"projects\u002Fprojects\u002Fsofascore-rating-prediction.md","Sofascore 球员评分预测",{"type":8,"value":182,"toc":229},[183,186,189,192,214,217,220,223,226],[11,184,185],{},"我在 FATEC Sorocaba 的毕业论文，指导老师是 Maria das Graças J. M. Tomazela 教授。研究问题只有一个：按位置（门将、后卫、中场、前锋）分别训练的随机森林模型，能否比单一的通用模型以更小的误差在赛前预测球员的 Sofascore 评分？",[107,187,188],{"id":188},"流程",[11,190,191],{},"分三个阶段，每个阶段只从磁盘读取上一阶段的输出，因此任何一个阶段都可以单独重跑。",[193,194,195,202,208],"ul",{},[196,197,198,201],"li",{},[94,199,200],{},"采集。"," 一个\"有礼貌\"的 Sofascore 内部 API 爬虫：限速、带退避的重试、断点续爬，并对每一行数据做 Pydantic 校验。共采集 11,977 条球员单场记录，覆盖 2025 年巴西甲级联赛全部 380 场比赛。",[196,203,204,207],{},[94,205,206],{},"清洗。"," 每个步骤一个函数。有意思的是，一个空单元格可能代表三种不同的含义，每种都有各自的处理规则。",[196,209,210,213],{},[94,211,212],{},"建模。"," 只使用赛前特征：主客场、对手实力，以及球员截至被预测比赛之前的历史表现。在最后 80 场比赛上做前向滚动验证，以整场比赛为单位做 bootstrap 置信区间，并计算置换重要性。",[107,215,216],{"id":216},"结果",[11,218,219],{},"按位置专门建模并没有降低误差。通用模型比\"按位置取平均\"的基线好 6%（MAE 0.374 对 0.398），而门将的评分在赛前几乎无法预测。一场比赛的评分，大部分是在比赛过程中才决定的。",[107,221,222],{"id":222},"笔记",[11,224,225],{},"按顺序讲完整个过程：数据里的陷阱，第一个好得不真实的模型，以及当模型只能看到过去时得出的结果。",[11,227,228],{},"技术栈：Python、httpx、tenacity、Pydantic v2、pandas、scikit-learn、pytest。",{"title":153,"searchDepth":154,"depth":154,"links":230},[231,232,233],{"id":188,"depth":154,"text":188},{"id":216,"depth":154,"text":216},{"id":222,"depth":154,"text":222},null,"2026-08-27","My undergraduate thesis at FATEC Sorocaba, supervised by Prof. Dr. Maria das Graças J. M. Tomazela. One question: can Random Forest models specialized by position (goalkeeper, defender, midfielder, forward) predict a player's Sofascore rating before the match with lower error than a single generic model?",{},3,"\u002Fprojects\u002Fsofascore-rating-prediction",{"title":241,"description":236},"Sofascore rating prediction","active","projects\u002Fsofascore-rating-prediction","我的毕业论文。按位置分别训练的随机森林模型，能否比一个通用模型更准确地在赛前预测球员的 Sofascore 评分？答案是否定的。",[246,247,174,175],"python","scraping","IcTcWXpYn5Kpmy9fqNl7cIFEbUs7Jrm8SMXO46pBHt8",{"\u002Fnotes\u002Fva-longe-mas-va-acompanhado":250,"\u002Fnotes\u002Fpre-match-ratings":6,"\u002Fnotes\u002Fr2-too-good":20,"\u002Fnotes\u002Fsofascore-data-traps":251,"\u002Fprojects\u002Fargus-maximus":252,"\u002Fprojects\u002Frobbie":253,"\u002Fprojects\u002Fsofascore-rating-prediction":180},"走得远，就要结伴同行","一个赛季的 Sofascore 数据，以及它在哪里说谎","Argus Maximus","robbie",1793409193252]