henriquepgomide / caRtola

Extração de dados da API do CartolaFC, análise exploratória dos dados e modelos preditivos em R e Python - 2014-22. [EN] Data munging, analysis and modeling of CartolaFC - the most popular fantasy football game in Brazil. Data cover years 2014-23.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Resultados do modelo preditivo em 2017

arnaldog12 opened this issue · comments

Nessa planilha você pode conferir os jogadores que o nosso modelo preditivo acreditou que iam fazer boas pontuações e a pontuação real do jogador na respectiva rodada.

Esse ano utilizamos Redes Neurais como principal modelo preditivo, mas também chegamos a testar Random Forests e XGb. Ainda não fizemos nenhuma análise em cima das predições, mas pretendemos fazer em breve.

E aí? Você acha que nosso modelo mandou bem ou não?
Será que deveríamos ter utilizado outros modelos?

Opa bom dia.. Estou iniciando meus estudos em ciencia de dados e achei esses script do cartola e comecei a estuda-lo... Mas esta dando erro ao rodar:

df_players = predict_best_players(df_samples, reg, n_players=25)
df_rodada.iloc[df_players.index][['Apelido', 'Posicao', 'ClubeID']].sort_values('Posicao')

image
image

Ja rodei pra tentar arrumar e nada kkk

Boa noite, @fir3f0x

tentei rodar aqui agora o código do Jupyter notebook Análise dos Dados.ipynb e o código funcionou tranquilo. Analisando o erro que você mostrou, por algum motivo está faltando alguma coluna nos seus dados. Então, talvez possa ser alguma dessas coisas:

  • Você está com o código mais atualizado do repositório?
  • Você rodou todas as células das seções "0. Dependências e configurações", "1. Limpeza dos dados" e "2. Criação das amostras", antes de rodar a seção "4. Predições"?

Estou rodando no windows 10.. Ja quando tento rodar o conda env create ja aparece

image

Mas todos os pacotes estao instalados só nao nessas versões. Seria um problema?
E sim rodei todas as celulas na sequencia. De qualquer forma baixei novamente os arquivos e vou rodar . Mas ja era a ultima versao disponivel

Acho que descobri minha falha... Rodei a sessão 3. Treinamento do modelo. Essa sessão não deve ser executada novamente?

Segui na sequencia que vc falou e deu certo. Executei a sessão 3 e o erro volta.. Mudei apenas pra ele pegar os dados de 2016 e 2017 mas ai já da o erro.

A sessão 3 não precisa ser executada se você não quer treinar um novo modelo.
Já que você está executando a sessão 3, você talvez deve estar esquecendo alguma coluna.
Tem como você criar um gist com o seu Jupyter notebook?

Arnaldo,
Bem interessante o seu trabalho, mas os cálculos estatísticos voltaram com um resultado médio muito baixo. Eu participo do Cartola desde a sua origem e tenho trabalhado nesta linha estatística há algum tempo.

Acredito que falta apenas um pequeno dado para que sua predição seja melhorada em pelo menos 20%.

Mande um e-mail para mim. Vamos conversar sobre: macson.guedes@flir.com.br

Abraço

Põe na roda ai, @macsong :)

Olhando os resultados, achei o modelo muito bom.

No meu caso, o que trouxe alguma melhoria foi utilizar Random Forests como modelo preditivo ao invés de Redes Neurais.

Eu tive o mesmo problema que o @fir3f0x ao rodar o notebook nos comandos abaixo:
df_players = predict_best_players(df_samples, reg, n_players=25)
df_rodada.iloc[df_players.index][['Apelido', 'Posicao', 'ClubeID']].sort_values('Posicao')

@fir3f0x voce conseguiu resolver o problema ?

Boa tarde.

Gostaria de saber, como vocês fazem para realizar a atualização das rodadas? Como vocês fazem para obter os dados de cada rodada? Existe alguma API para obter todos esses dados das rodadas?

Boa noite, @brunoeurico

Nós utilizamos a API do Cartola mesmo. O lado ruim é que a API do Cartola só disponibiliza os dados rodada a rodada, ou seja, não há um histórico desses dados via API. Por conta disso, toda semana a gente pega esses dados e vai armazenando para criar o histórico.

df_players = predict_best_players(df_samples, reg, n_players=25)
df_rodada.iloc[df_players.index][['Apelido', 'Posicao', 'ClubeID']].sort_values('Posicao')

Com erro?

Solucao:
df_samples['e'] = 1
df_rodada = df_test[(df_test['Rodada'] == (ROUND_TO_PREDICT-1)) & (df_test['Status'] == "Provável")]
df_samples = to_samples(df_rodada)

Fala pessoal,

Nas últimas semanas testei uns modelos pra fazer predições pro Cartola e criei um repositório pra quem quiser dar uma olhada e também tiver alguma sugestão (tdanf/cartola-predictions).
Vocês tão fazendo modelos para 2018?

Abraço!

Olá, como gero o arquivo dados_agregados ?
Gostaria de executar as predições com os dados de 2019, mas não sei qual deve ser a ordem de execução dos algoritmos.

Porque os dados de treino tem que ter dois jogos consecutivos de um jogador? a pontuação dele só está sendo prevista de acordo com a rodada passada?

Oi, @mranjos
Sim. Em 2017, eu utilizava só os dados da última rodada para prever a próxima, mesmo sabendo que isso não era o ideal. Mesmo assim, a rede funcionou bem.
Entretanto, esse ano já comecei o desenvolvimento de uma rede neural recorrente (LSTM) para levar em consideração o histórico de rodadas do jogador. Se você puder me ajudar, o código encontra-se aqui.

@arnaldog12 entendi. Então, sou pouco familiarizado com o Python, estava transcrevendo os códigos para o R e ai acabei parando nessa etapa pois não tinha entendido muito bem. Estava pensando em criar uma regressão mais simples e interpretável do que uma rede neural, mas pode ser testada várias técnicas. Poderia ajudar sim na rede recorrente, mas ai seria no R, porque gastaria um tempinho pra aprender implementar no python.

@arnaldog12 primeiro de tudo, show o LSTM, realmente é a melhor opção para regressão, estou fazendo alguns testes (ando complicado de tempo para testar) porem existem alguns parametros que estou mudando não na NN para nos dados.

Tem uma gama de resultados / dados adicionais que são importantes:

  1. RNN dos times, jogos anteriores: X vs S, gera score dos times.
  2. Separar os jogadores realmente por posicao, principalmente defesa onde o SG é fator relevante. (Um mesmo time pode ter um ataca fraco e ter uma defesa forte, ai o SG faz diferença), score do time tem que entrar como feature do jogador
  3. Cruzamento de jogos da rodada atual (prognostico), evitando cruzar ataque e defesa de times que se enfrentam na roda.

Concordo com o @getzleo , acho que seria interessante montar um book de variáveis antes de ir pra técnica, adicionando ao que o @getzleo falou, talvez segmentar os times em grandes / médios / pequenos, jogos em casa e fora, como feature também, possa ser interessante, por exemplo, jogador X quando joga contra time grande fora de casa tende a ter em média um score menor ou maior.

@mranjos casa vs fora é geralmente 65/35% não importa muito o time, e tem o empate na jogada ainda. Isto é fato.

Não precisa segmentar em grande/medio/pequeno, apenas colocando os % de casa/empate/fora já é um score a mais.

Tem outros fatores também , inclusive "clima/tempo". Pensa pessoal do sul jogando no calor infernal do nordeste ou vice-versa, até isto influencia.

Por isto o score casa vs fora é importante alem do jogo em si

Outra, alterei o Model para:

model = Sequential()
model.add(LSTM(units=256, return_sequences=True, input_shape=x.shape[1:]))
model.add(Dropout(rate=0.2))
model.add(Dense(units=64, activation='linear'))
model.add(Dropout(rate=0.2))
model.add(Dense(units=16, activation='relu'))
model.add(Dropout(rate=0.2))
model.add(LSTM(units=16, return_sequences=False))

model.add(Dense(units=1, activation='linear'))
model.summary()

model.compile(optimizer='adam', loss='mean_squared_error')

model.fit(x, y, batch_size=64, epochs=300)

Melhorou muito os "negativos" e os positivos pico de pontuação

Captura de Tela 2019-05-20 às 23 06 59
Com o Model acima

Também concordo com @mranjos e o @getzleo que devemos colocar mais algumas variáveis. Acho que as mais importantes agora são com qual time o jogador irá jogar na próxima rodada e se jogará fora ou em casa. O importante é que esses dados sejam da próxima rodada, já que a rede vai tentar prever baseado na próxima rodada. Alguém se disponibiliza a gerar esses dados, por favor?

Esse seu modelo ficou muito legal, @getzleo
Nunca tinha visto colocar camadas Dense entre camadas LSTM. Isso é comum?

Independente disso, os resultados ficaram legais. Você deu commit nessa rede?

@arnaldog12 vamos lá.
O que ao meu ver falta e vou tentar implementar o quanto antes:

1 - Jogos da rodada, ranking times
2 - Jogador: Joga em Casa ou Fora
3 - Divisão em: Defesa e Ataque (quem começa com SG tem que ser tratado diferente, pois o ZERO dele são 5 pontos)
4 - Na previsão: Soltar 5 jogadores com maiores "predictions" de pontuacao por posição, e mostrar o quanto o sistema preve de pontos.
5 - Não muito dificil dar input das cartoletas que você tem Ex: 110,00 e ele montar o time para você com maiores probalilidades até 110,00 de gasto, pois não adianta nada ele soltar um time que você não pode montar, outra coisa importante a verificar é a relação pontos/cartoleta do jogador na linha de tempo. Tem muitos jogadores caros que não valem a escalação

Quanto ao Dense dentro do LSTM sim , em alguns modelos é normal e sobe muito a confiança do modelo. Mas deve ser sempre testado e validado. Ainda mais com ativadores diferentes, não dei commit não, mas fique a vontade para comitar se quiser

Opa, @getzleo

Os atributos dos itens 1 e 2 são interessantíssimos. O item 3, entretanto, eu acredito que não seja necessário. Uma rede neural facilmente faz essa associação. Por exemplo, se construíssimos uma rede que calculasse a pontuação dado os scouts + posição do jogador, com certeza o erro seria zero. Então, acho que não precisamos perder tempo com esse atributo.

Os itens 4 e 5 eu me comprometo a fazer. Então, se você extrair os atributos dos itens 1 e 2, eu fico com os itens 4 e 5. Pode ser?

@getzleo Esse ranking times seria a posição do time na tabela? Senão, acho que seria interessante essa informação também.

@mranjos @henriquepgomide quando digo raking é o resultado da RNN dos jogos. Um "Rating" e não ranking, para ser mais especifico.
Posicao simples no campeonato nao muda muito.

Valor do Elenco é relativo, tem jogador caro pontuando pouco.
O que pode ser a melhor opcao talvez seja Resultados Jogos + Media dos Time + Jogo seguinte, ai ter um rating para deixar como feature de jogador, vou fazer umas analises cruzando estes dados e ver o nivel de confiança desta informaçao.

@arnaldog12 vou tentar validar e implementar os itens 1 e 2 o quanto antes

ótimo, @getzleo 💯

Vocês já estão com os dados limpos acrescentando 2018 e 2019?

Fala Henrique tudo bem? Cara ano passado fiz contato com vc por não conseguir rodar o os scripts aqui disponibilizados por vc,... Data Science era uma grande caixa preta para mim,.. mas fui para a luta, e hoje volto aqui com disposição a tentar ajudar no projeto.
Com os dados disponibilizados por vc e outros web scraping que fiz pela net,... consegui criar uma analise sobre os confrontos da rodada. Dê uma olhada nesse link www.cartolytics.club.

Vou começar a interagir por aqui para ajudar no que precisar.... abraços!