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()