jonathanjordan21's picture
Update app.py
b9fb926 verified
raw
history blame
2.09 kB
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()