[{"data":1,"prerenderedAt":262},["ShallowReactive",2],{"note-pre-match-ratings-pt":3,"titles-pt":257},{"note":4,"project":183},{"id":5,"title":6,"body":7,"date":166,"description":167,"draft":168,"extension":169,"kind":170,"meta":171,"navigation":172,"path":173,"pinned":168,"project":155,"seo":174,"stem":176,"summary":177,"tags":178,"__hash__":182,"translated":172},"notes\u002Fnotes\u002Fpre-match-ratings.md","A maior parte da nota de uma partida não dá pra prever",{"type":8,"value":9,"toc":157},"minimark",[10,22,106,111,119,123,126,130,133,137,140,144,147],[11,12,13,14,21],"p",{},"O cenário de ",[15,16,20],"a",{"href":17,"className":18},"\u002Fpt\u002Fnotes\u002Fr2-too-good",[19],"wikilink","Quando o R² é bom demais",": prever a nota de cada jogador no Sofascore antes do apito inicial, usando só mando de campo, força do adversário e o histórico do próprio jogador. Validação walk-forward nas últimas 80 partidas do Brasileirão 2025, 2.494 atuações.",[23,24,25,41],"table",{},[26,27,28],"thead",{},[29,30,31,35,38],"tr",{},[32,33,34],"th",{},"Modelo",[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",{},"Média dos últimos 5 jogos do jogador",[47,51,52],{},"0,412",[47,54,55],{},"-0,06",[29,57,58,61,64],{},[47,59,60],{},"Média da posição",[47,62,63],{},"0,398",[47,65,66],{},"0,01",[29,68,69,72,75],{},[47,70,71],{},"Média da temporada do jogador",[47,73,74],{},"0,389",[47,76,77],{},"0,05",[29,79,80,83,86],{},[47,81,82],{},"Especialistas por posição",[47,84,85],{},"0,375",[47,87,88],{},"0,10",[29,90,91,97,102],{},[47,92,93],{},[94,95,96],"strong",{},"Random Forest genérico",[47,98,99],{},[94,100,101],{},"0,374",[47,103,104],{},[94,105,88],{},[107,108,110],"h2",{"id":109},"os-especialistas-não-ajudaram","Os especialistas não ajudaram",[11,112,113,114,118],{},"O MAE do modelo genérico menos o MAE dos especialistas deu -0,0014, com intervalo de confiança de 95% de ",[115,116,117],"span",{},"-0,0036; 0,0008",". O intervalo vem de um bootstrap com 2.000 reamostragens, sorteando partidas inteiras em vez de linhas soltas, já que jogadores do mesmo jogo não são independentes. Ele inclui o zero, então é empate. A regra de decisão foi definida antes de ver qualquer resultado: em caso de empate, fica o modelo genérico, porque um modelo é mais simples que quatro. Os especialistas não venceram em nenhuma posição.",[107,120,122],{"id":121},"fase-recente-é-ruído","Fase recente é ruído",[11,124,125],{},"A média do jogador nos últimos 5 jogos se saiu pior do que ignorar o jogador por completo e chutar a média da posição. A média da temporada inteira se saiu melhor que as duas. Em cinco jogos, uma fase boa ou ruim é quase só ruído. A importância por permutação concorda: o modelo genérico se apoiou em duas features, o mando de campo e a nota média do jogador na temporada. O histórico das outras 61 estatísticas contribuiu com quase nada.",[107,127,129],{"id":128},"goleiros","Goleiros",[11,131,132],{},"Pros goleiros, nenhum modelo superou a baseline de forma relevante (MAE 0,559 tanto pro modelo genérico quanto pra média da posição, R² um pouco abaixo de zero). A nota de um goleiro é decidida pelas defesas e pelos gols sofridos naquela partida, e antes do jogo não tem como saber se ele vai enfrentar 2 finalizações ou 12.",[107,134,136],{"id":135},"as-previsões-grudam-na-média","As previsões grudam na média",[11,138,139],{},"As notas reais no conjunto de teste foram de 3,0 a 9,7, com desvio padrão de 0,54. As previsões do modelo genérico foram de 6,63 a 7,41, com desvio padrão de 0,16. No conjunto de teste, 108 atuações tiveram nota 8,0 ou mais. O modelo nunca chegou perto de nenhuma delas. Ele empurra as previsões pra cima em jogos em casa e pra jogadores com boa temporada até ali, mas não consegue ver chegando um jogo fora do comum, pra melhor ou pra pior.",[107,141,143],{"id":142},"a-resposta","A resposta",[11,145,146],{},"A especialização por posição não reduziu o erro. O modelo genérico superou a média da posição em 6,0% e a média da temporada do próprio jogador em 3,9%, e essa segunda diferença é real (o intervalo de confiança dela não inclui o zero). Números pequenos, mas esse é o tamanho honesto do sinal: a maior parte da nota de uma partida se decide durante a partida.",[11,148,149,150,156],{},"Código e método completo: ",[15,151,155],{"href":152,"rel":153},"https:\u002F\u002Fgithub.com\u002Falmeidaota\u002Fsofascore-rating-prediction",[154],"nofollow","sofascore-rating-prediction",".",{"title":158,"searchDepth":159,"depth":159,"links":160},"",2,[161,162,163,164,165],{"id":109,"depth":159,"text":110},{"id":121,"depth":159,"text":122},{"id":128,"depth":159,"text":129},{"id":135,"depth":159,"text":136},{"id":142,"depth":159,"text":143},"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":175,"description":167},"Most of a match rating can't be predicted","notes\u002Fpre-match-ratings","Os especialistas por posição não superaram um único modelo genérico, a fase recente foi pior do que nenhuma informação, e ninguém consegue prever um goleiro. A resposta do TCC foi não.",[179,180,181],"ml","random-forest","football","lRXhmendunPnntPdV0Kyh7MYFU2L_Af49JqWx0-YMFc",{"id":184,"title":185,"body":186,"cover":242,"date":243,"demo":242,"description":244,"draft":168,"extension":169,"featured":172,"meta":245,"navigation":172,"order":246,"path":247,"repo":152,"seo":248,"status":250,"stem":251,"summary":252,"tags":253,"__hash__":256,"translated":172},"projects\u002Fprojects\u002Fsofascore-rating-prediction.md","Previsão de notas do Sofascore",{"type":8,"value":187,"toc":237},[188,191,195,198,220,224,227,231,234],[11,189,190],{},"Meu TCC na FATEC Sorocaba, orientado pela Profa. Dra. Maria das Graças J. M. Tomazela. Uma pergunta: modelos Random Forest especializados por posição (goleiro, defensor, meio-campista, atacante) conseguem prever a nota de um jogador no Sofascore antes da partida com erro menor que um único modelo genérico?",[107,192,194],{"id":193},"pipeline","Pipeline",[11,196,197],{},"Três etapas, cada uma lendo do disco só a saída da etapa anterior, então qualquer uma pode ser rodada de novo sozinha.",[199,200,201,208,214],"ul",{},[202,203,204,207],"li",{},[94,205,206],{},"Coleta."," Um crawler educado pra API interna do Sofascore: limite de requisições, novas tentativas com backoff, checkpoint\u002Fretomada e validação com Pydantic em cada linha. 11.977 registros de jogador por partida, de todos os 380 jogos do Brasileirão Série A 2025.",[202,209,210,213],{},[94,211,212],{},"Limpeza."," Uma função por etapa. A parte interessante é que uma célula vazia pode significar três coisas diferentes, cada uma com sua própria regra.",[202,215,216,219],{},[94,217,218],{},"Modelagem."," Só features pré-jogo: mando de campo, força do adversário e o histórico do próprio jogador até a partida sendo prevista. Validação walk-forward nas últimas 80 partidas, intervalos de confiança por bootstrap sobre partidas inteiras, importância por permutação.",[107,221,223],{"id":222},"resultado","Resultado",[11,225,226],{},"A especialização não reduziu o erro. O modelo genérico superou em 6% uma baseline de média por posição (MAE 0,374 contra 0,398), e prever goleiros antes do jogo se mostrou um caso perdido. A maior parte da nota de uma partida se decide durante a partida.",[107,228,230],{"id":229},"notas","Notas",[11,232,233],{},"A história em ordem: as armadilhas dos dados, o primeiro modelo, bom demais pra ser verdade, e o que saiu quando o modelo só podia ver o passado.",[11,235,236],{},"Stack: Python, httpx, tenacity, Pydantic v2, pandas, scikit-learn, pytest.",{"title":158,"searchDepth":159,"depth":159,"links":238},[239,240,241],{"id":193,"depth":159,"text":194},{"id":222,"depth":159,"text":223},{"id":229,"depth":159,"text":230},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":249,"description":244},"Sofascore rating prediction","active","projects\u002Fsofascore-rating-prediction","Meu TCC. Modelos Random Forest especializados por posição preveem a nota de um jogador no Sofascore antes do jogo melhor do que um modelo genérico? A resposta foi não.",[254,255,179,180],"python","scraping","IcTcWXpYn5Kpmy9fqNl7cIFEbUs7Jrm8SMXO46pBHt8",{"\u002Fnotes\u002Fva-longe-mas-va-acompanhado":258,"\u002Fnotes\u002Fpre-match-ratings":6,"\u002Fnotes\u002Fr2-too-good":20,"\u002Fnotes\u002Fsofascore-data-traps":259,"\u002Fprojects\u002Fargus-maximus":260,"\u002Fprojects\u002Frobbie":261,"\u002Fprojects\u002Fsofascore-rating-prediction":185},"Vá longe, mas vá acompanhado","Uma temporada de dados do Sofascore, e onde eles mentem","Argus Maximus","robbie",1793409192708]