[{"data":1,"prerenderedAt":241},["ShallowReactive",2],{"note-r2-too-good-pt":3,"titles-pt":237},{"note":4,"project":164},{"id":5,"title":6,"body":7,"date":146,"description":147,"draft":148,"extension":149,"kind":150,"meta":151,"navigation":152,"path":153,"pinned":148,"project":154,"seo":155,"stem":157,"summary":158,"tags":159,"__hash__":163,"translated":152},"notes\u002Fnotes\u002Fr2-too-good.md","Quando o R² é bom demais",{"type":8,"value":9,"toc":140},"minimark",[10,14,22,76,79,84,87,90,93,97,100,113,128,131],[11,12,13],"p",{},"A pergunta do TCC: modelos Random Forest especializados por posição (goleiro, defensor, meio-campista, atacante) preveem a nota de um jogador no Sofascore melhor do que um único modelo genérico?",[11,15,16,17,21],{},"A primeira versão alimentava cada modelo com as estatísticas do jogador na própria partida: finalizações, passes, duelos, desarmes, toques, 63 colunas no total. A validação era limpa. Treino nas rodadas 1 a 30, teste nas 31 a 38, hiperparâmetros ajustados com ",[18,19,20],"code",{},"GroupKFold"," agrupado por partida, pra que jogadores do mesmo jogo nunca caíssem dos dois lados de um fold. Uma baseline que só prevê a nota média da posição definia o piso.",[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,55,66],"tbody",{},[29,45,46,50,53],{},[47,48,49],"td",{},"Média da posição",[47,51,52],{},"0,391",[47,54],{},[29,56,57,60,63],{},[47,58,59],{},"Genérico",[47,61,62],{},"0,203",[47,64,65],{},"0,72",[29,67,68,71,74],{},[47,69,70],{},"Especialistas",[47,72,73],{},"0,207",[47,75,65],{},[11,77,78],{},"Os atacantes chegaram a R² 0,80. Cortar pela metade o erro da baseline fica ótimo num TCC. Só que a conta não fechava: as estatísticas de uma única partida não deveriam explicar tanto assim de nada no futebol.",[80,81,83],"h2",{"id":82},"não-era-vazamento-era-circularidade","Não era vazamento. Era circularidade.",[11,85,86],{},"O primeiro suspeito foi vazamento entre treino e teste. Não havia nenhum. A divisão e os folds mantinham cada partida inteira, e nenhuma linha de teste encostou no treino.",[11,88,89],{},"O problema era o alvo. A nota do Sofascore sai de uma fórmula proprietária alimentada por estatísticas muito parecidas com aquelas 63 features: gols, passes, duelos, desarmes. O Random Forest não estava aprendendo o que é uma boa atuação. Estava aproximando a fórmula que gerou o número. O R² alto media o quanto o modelo imita o algoritmo do Sofascore, e nada mais.",[11,91,92],{},"Esse experimento ainda respondeu uma pergunta mais estreita (com as estatísticas da partida em mãos, os especialistas só ganharam nos goleiros, a posição estatisticamente mais distinta). Mas não respondia a que importa: dá pra saber a nota antes do jogo?",[80,94,96],{"id":95},"o-redesenho","O redesenho",[11,98,99],{},"O segundo experimento proíbe qualquer estatística da partida que está sendo prevista. Cada feature tem que existir antes do apito inicial:",[101,102,103,107,110],"ul",{},[104,105,106],"li",{},"mandante ou visitante;",[104,108,109],{},"força do adversário: gols marcados e sofridos pelo adversário em partidas anteriores;",[104,111,112],{},"o histórico do próprio jogador: médias da temporada de 61 estatísticas, mais médias da temporada e dos últimos 5 jogos de nota e minutos, todas calculadas só com partidas estritamente anteriores a esta.",[11,114,115,116,123,124,127],{},"O \"estritamente anteriores\" é o motivo de a ordem das rodadas em ",[117,118,122],"a",{"className":119,"href":121},[120],"wikilink","\u002Fpt\u002Fnotes\u002Fsofascore-data-traps","Uma temporada de dados do Sofascore, e onde eles mentem"," ter deixado de ser detalhe. Jogadores ainda sem histórico (14,9% deles jogam 3 partidas ou menos na temporada inteira) recebem ",[18,125,126],{},"NaN",", que o Random Forest do scikit-learn trata nativamente desde a versão 1.4. Junto entra uma contagem de partidas anteriores, pro modelo aprender a confiar mais em 20 jogos de histórico do que em 1.",[11,129,130],{},"A validação passou a ser walk-forward: treinar com tudo antes de um lote de 10 partidas, prever esse lote, somá-lo ao treino e seguir em frente, ao longo das últimas 80 partidas da temporada. A busca de hiperparâmetros usa folds em ordem temporal dentro da janela de treino, sempre validando em partidas posteriores às de treino.",[11,132,133,134,139],{},"O R² caiu pra 0,10. Esse é o resultado esperado, não uma piora. Explicar uma nota que já aconteceu, a partir de estatísticas próximas da própria fórmula, é uma tarefa. Prever a nota antes do jogo é outra, bem mais difícil. ",[117,135,138],{"className":136,"href":137},[120],"\u002Fpt\u002Fnotes\u002Fpre-match-ratings","A maior parte da nota de uma partida não dá pra prever"," conta o que saiu.",{"title":141,"searchDepth":142,"depth":142,"links":143},"",2,[144,145],{"id":82,"depth":142,"text":83},{"id":95,"depth":142,"text":96},"2026-10-22","The thesis question: can Random Forest models specialized by position (goalkeeper, defender, midfielder, forward) predict a player's Sofascore rating better than one generic model?",false,"md","article",{},true,"\u002Fnotes\u002Fr2-too-good","sofascore-rating-prediction",{"title":156,"description":147},"When R² is too good","notes\u002Fr2-too-good","O primeiro modelo explicava 80% da variância das notas dos atacantes. Esse era o problema: ele estava reconstruindo a fórmula do Sofascore, não prevendo futebol.",[160,161,162],"ml","random-forest","python","CP8qnPZk8uwlUZW8_GuAtolxx3ul1AWgwUEW6IlLme8",{"id":165,"title":166,"body":167,"cover":222,"date":223,"demo":222,"description":224,"draft":148,"extension":149,"featured":152,"meta":225,"navigation":152,"order":226,"path":227,"repo":228,"seo":229,"status":231,"stem":232,"summary":233,"tags":234,"__hash__":236,"translated":152},"projects\u002Fprojects\u002Fsofascore-rating-prediction.md","Previsão de notas do Sofascore",{"type":8,"value":168,"toc":217},[169,172,176,179,200,204,207,211,214],[11,170,171],{},"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?",[80,173,175],{"id":174},"pipeline","Pipeline",[11,177,178],{},"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.",[101,180,181,188,194],{},[104,182,183,187],{},[184,185,186],"strong",{},"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.",[104,189,190,193],{},[184,191,192],{},"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.",[104,195,196,199],{},[184,197,198],{},"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.",[80,201,203],{"id":202},"resultado","Resultado",[11,205,206],{},"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.",[80,208,210],{"id":209},"notas","Notas",[11,212,213],{},"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,215,216],{},"Stack: Python, httpx, tenacity, Pydantic v2, pandas, scikit-learn, pytest.",{"title":141,"searchDepth":142,"depth":142,"links":218},[219,220,221],{"id":174,"depth":142,"text":175},{"id":202,"depth":142,"text":203},{"id":209,"depth":142,"text":210},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","https:\u002F\u002Fgithub.com\u002Falmeidaota\u002Fsofascore-rating-prediction",{"title":230,"description":224},"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.",[162,235,160,161],"scraping","IcTcWXpYn5Kpmy9fqNl7cIFEbUs7Jrm8SMXO46pBHt8",{"\u002Fnotes\u002Fva-longe-mas-va-acompanhado":238,"\u002Fnotes\u002Fpre-match-ratings":138,"\u002Fnotes\u002Fr2-too-good":6,"\u002Fnotes\u002Fsofascore-data-traps":122,"\u002Fprojects\u002Fargus-maximus":239,"\u002Fprojects\u002Frobbie":240,"\u002Fprojects\u002Fsofascore-rating-prediction":166},"Vá longe, mas vá acompanhado","Argus Maximus","robbie",1793409192774]