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