Spaces:
Sleeping
Sleeping
File size: 2,781 Bytes
a103715 8fe9115 a103715 9fd6b10 84d6071 8fe9115 a103715 84d6071 576db26 a103715 6bd018f 9fd6b10 84d6071 6bd018f 84d6071 ed4b241 84d6071 ed4b241 84d6071 8fe9115 84d6071 8fe9115 b9468d3 8fe9115 a103715 84d6071 6bd018f a103715 84d6071 ed4b241 a103715 576db26 dcbfdda ed4b241 dcbfdda 576db26 a103715 06ad1ac 576db26 a103715 ae60b43 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
import gradio as gr
import joblib
import numpy as np
import pandas as pd
from sklearn.preprocessing import OrdinalEncoder
# Carregar o modelo treinado e objetos de binning da raiz do projeto
model = joblib.load("tiebreak_model_v1b.pkl")
binning_mean_log_odds = joblib.load("Mean_Log_Odds_binning_tiebreak_model_v1b.pkl")
binning_sum_prob = joblib.load("Sum_Prob_binning_tiebreak_model_v1b.pkl")
encoder = joblib.load("ordinal_encoder_tiebreak_model_v1b.pkl") # Carregue o encoder treinado
# Definir o melhor threshold encontrado
best_threshold = 0.9400000000000005
# Função para realizar a previsão
def predict_tiebreak(odds1_input, odds2_input):
# Converter as odds para o formato float e garantir que as vírgulas sejam substituídas por pontos
odds1 = float(str(odds1_input).replace(',', '.'))
odds2 = float(str(odds2_input).replace(',', '.'))
# Calcular as métricas necessárias
odds_min = min(odds1, odds2)
odds_max = max(odds1, odds2)
odds_ratio = odds_min / odds_max
mean_log_odds = (np.log(odds_max) + np.log(odds_min)) / 2
sum_prob = (1 / odds_min) + (1 / odds_max)
# Aplicar binning nas métricas
mean_log_odds_bin = binning_mean_log_odds.transform([[mean_log_odds]], metric="bins")[0][0]
sum_prob_bin = binning_sum_prob.transform([[sum_prob]], metric="bins")[0][0]
# Preparar os dados para a predição
bin_features = np.array([[mean_log_odds_bin, sum_prob_bin]])
# Aplicar o OrdinalEncoder nas features binadas
encoded_features = encoder.fit_transform(bin_features)
# Criar o vetor de features para o modelo
features = np.array([[encoded_features[0][0], encoded_features[0][1], odds_ratio]])
# Realizar a previsão com o modelo
raw_prob = model.predict_proba(features)[0, 1] # Probabilidade da classe 1 (menos de 1.5 tiebreaks)
# Calcular a odds mínima
odds_minima = 1 / raw_prob
# Decisão de entrar ou não na aposta
enter_bet = "Sim" if raw_prob >= best_threshold else "Não"
# Formatando a probabilidade para percentual com duas casas decimais
prob_percent = f"{round(raw_prob * 100, 2)}%"
# Retornando os valores
return prob_percent, round(odds_minima, 2), enter_bet
# Interface Gradio
inputs = [gr.Number(label="Odds 1"), gr.Number(label="Odds 2")]
outputs = [gr.Textbox(label="Probabilidade de menos de 1.5 Tiebreaks"), gr.Textbox(label="Odds Mínima"), gr.Textbox(label="Entrar na Aposta?")]
# Criação da interface
gr.Interface(fn=predict_tiebreak, inputs=inputs, outputs=outputs, title="Previsão de Tiebreaks",
description="Insira as odds para prever a probabilidade de haver menos de 1.5 tiebreaks, calcular as odds mínimas, e decidir se deve entrar na aposta.").launch()
|