|
|
|
import gradio as gr |
|
import numpy as np |
|
import pandas as pd |
|
from joblib import load |
|
from huggingface_hub import hf_hub_download |
|
|
|
REPO_ID = "eyu1belay/entrepreneurial-readiness-model" |
|
MODEL_FILE = "readiness_model.joblib" |
|
|
|
try: |
|
local_path = hf_hub_download(repo_id=REPO_ID, filename=MODEL_FILE, repo_type="model") |
|
bundle = load(local_path) |
|
model = bundle["model"] |
|
feature_cols = bundle["feature_cols"] |
|
load_err = None |
|
except Exception as e: |
|
model, feature_cols = None, [] |
|
load_err = f"β οΈ Could not load model bundle: {e}" |
|
|
|
def _validate(savings_amount, income, bills, entertainment, sales, dependents, assets, age, risk, confidence, idea_diff): |
|
for name, v in [("savings_amount", savings_amount), ("income", income), ("bills", bills), |
|
("entertainment", entertainment), ("assets", assets)]: |
|
if v is None or v < 0: |
|
return f"Invalid {name}: must be >= 0" |
|
if not (1 <= sales <= 5): return "Sales must be in [1,5]" |
|
if not (0 <= dependents <= 10): return "Dependents must be in [0,10]" |
|
if not (18 <= age <= 80): return "Age must be in [18,80]" |
|
if not (1 <= risk <= 5): return "Risk must be in [1,5]" |
|
if not (1 <= confidence <= 10): return "Confidence must be in [1,10]" |
|
if not (1 <= idea_diff <= 5): return "Idea difficulty must be in [1,5]" |
|
return None |
|
|
|
def predict_readiness(savings_amount, income, bills, entertainment, sales, dependents, assets, age, risk, confidence, idea_diff, debug=False): |
|
if load_err: |
|
return {"error": load_err} |
|
|
|
msg = _validate(savings_amount, income, bills, entertainment, sales, dependents, assets, age, risk, confidence, idea_diff) |
|
if msg: |
|
return {"error": msg} |
|
|
|
|
|
row_dict = { |
|
"savings_amount": float(savings_amount), |
|
"monthly_income": float(income), |
|
"monthly_bills": float(bills), |
|
"monthly_entertainment": float(entertainment), |
|
"sales_skills": float(sales), |
|
"dependents": float(dependents), |
|
"assets": float(assets), |
|
"age": float(age), |
|
"risk": float(risk), |
|
"confidence": float(confidence), |
|
"idea_difficulty": float(idea_diff), |
|
} |
|
|
|
try: |
|
X = pd.DataFrame([row_dict])[feature_cols] |
|
except Exception as e: |
|
return {"error": f"Feature mismatch. Expected: {feature_cols}, Got: {list(row_dict.keys())}, Err: {e}"} |
|
|
|
y_hat = int(model.predict(X)[0]) |
|
proba = model.predict_proba(X)[0].tolist() if hasattr(model, "predict_proba") else None |
|
|
|
out = {"model_label_1_5": y_hat, "proba": proba} |
|
if debug: |
|
out["echo_row_in_training_order"] = X.to_dict(orient="records")[0] |
|
out["feature_cols"] = feature_cols |
|
return out |
|
|
|
with gr.Blocks(title="Entrepreneurial Readiness Predictor") as app: |
|
gr.Markdown("## Entrepreneurial Readiness Predictor") |
|
|
|
with gr.Row(): |
|
savings_amount = gr.Number(label="Savings Amount ($)", value=1000) |
|
income = gr.Number(label="Monthly Income ($)", value=4000) |
|
bills = gr.Number(label="Monthly Bills ($)", value=2500) |
|
entertainment = gr.Number(label="Monthly Entertainment ($)", value=300) |
|
|
|
with gr.Row(): |
|
sales = gr.Slider(1, 5, step=1, value=3, label="Sales Skills (1β5)") |
|
dependents = gr.Slider(0, 10, step=1, value=1, label="Dependents (0β10)") |
|
assets = gr.Number(label="Assets ($)", value=8000) |
|
age = gr.Slider(18, 80, step=1, value=28, label="Age") |
|
|
|
with gr.Row(): |
|
risk = gr.Slider(1, 5, step=1, value=3, label="Risk (1β5)") |
|
confidence = gr.Slider(1, 10, step=1, value=6, label="Confidence (1β10)") |
|
idea_diff = gr.Slider(1, 5, step=1, value=2, label="Idea Difficulty (1=easy, 5=hard)") |
|
debug_ck = gr.Checkbox(label="Debug", value=False) |
|
|
|
predict_btn = gr.Button("Predict") |
|
pred_out = gr.JSON(label="Prediction") |
|
|
|
predict_btn.click( |
|
predict_readiness, |
|
inputs=[savings_amount, income, bills, entertainment, sales, dependents, assets, age, risk, confidence, idea_diff, debug_ck], |
|
outputs=pred_out, |
|
api_name="predict_readiness" |
|
) |
|
|
|
app.launch() |
|
|