tiebreak_model / app.py
joaomaia's picture
Update app.py
fca2a76 verified
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()