File size: 2,092 Bytes
11118c6
 
b9fb926
 
11118c6
69d9c01
11118c6
b9fb926
 
69d9c01
 
 
 
 
11118c6
69d9c01
 
11118c6
 
69d9c01
 
 
 
11118c6
69d9c01
 
 
 
 
 
 
 
 
 
 
 
11118c6
 
 
 
 
 
 
 
 
 
 
 
69d9c01
 
 
11118c6
 
 
 
69d9c01
 
11118c6
 
 
 
 
 
 
 
 
 
 
 
d63d73a
11118c6
 
 
 
 
 
 
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import gradio as gr
import torch
from torch import nn

import numpy as np
import pandas as pd

from utils import compute_features

dataset = pd.read_csv("cleaned_df_noindex.csv")
df_amenities = pd.read_csv("df_amenities.csv")

class NegBinomialModel(nn.Module):
    def __init__(self, in_features):
        super().__init__()
        self.linear = nn.Linear(in_features, 1)
        self.log_alpha = nn.Parameter(torch.tensor(0.0))

    def forward(self, x):
        eta = self.linear(x)
        mu = torch.exp(eta).squeeze(-1)
        alpha = torch.exp(self.log_alpha)
        return mu, alpha

def negbinom_loss(y, mu, alpha):
    log_prob = (
        torch.lgamma(y + 1/alpha)
        - torch.lgamma(1/alpha)
        - torch.lgamma(y + 1)
        + (1/alpha) * torch.log(1 / (1 + alpha * mu))
        + y * torch.log((alpha * mu) / (1 + alpha * mu))
    )
    return -torch.mean(log_prob)
    
model = NegBinomialModel(len(dataset.columns)-2)
model.load_state_dict(torch.load("model_weights.pt"))
model.eval()

# ======== Prediction Function ========
def predict_score(lat, lon):
    # Convert input to tensor
    inputs = torch.tensor([[lat, lon]], dtype=torch.float32)

    # Get model output
    with torch.no_grad():
        outputs = model(inputs).numpy().flatten()

    # Unpack into respective values
    mu_pred, alpha = outputs

    score = (1 * np.abs(mu_pred + 0.1)) * 100

    # You can apply any post-processing here
    return {
        "Score": round(float(score), 3),
        "Num Banks": round(float(mu_pred), 3),
        # "Normal Score": round(float(normal_score), 3),
    }

# ======== Gradio Interface ========
interface = gr.Interface(
    fn=predict_score,
    inputs=[
        gr.Number(label="Latitude"),
        gr.Number(label="Longitude"),
    ],
    outputs=[
        gr.Number(label="Score"),
        gr.Number(label="Num Banks"),
        # gr.Number(label="Normal Score"),
    ],
    title="Bank Location Scoring Model",
    description="Enter latitude and longitude to get the predicted score, number of banks, and normalized score.",
)


interface.launch()