Spaces:
Sleeping
Sleeping
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() | |