Ekaterina2002's picture
Update app.py
280730c verified
"""Gradio‑интерфейс: ввод реальных показателей → StandardScaler → CatBoost."""
import numpy as np, joblib, gradio as gr
bundle = joblib.load("model.pkl")
scaler, model = bundle["scaler"], bundle["model"]
FEATURES = ["age", "sex", "bmi", "bp", "s1", "s2", "s3", "s4", "s5", "s6"]
SEX_MAP = {"мужчина": 0, "женщина": 1}
TH1, TH2 = 100, 150
def interpret(y: float) -> str:
if y <= TH1:
return "Вероятно нет диабета"
if y <= TH2:
return "Пограничный риск"
return "Высокий риск диабета"
def predict(age, sex, bmi, bp, s1, s2, s3, s4, s5, s6):
x_raw = np.array([[age, SEX_MAP[sex], bmi, bp, s1, s2, s3, s4, s5, s6]])
y = float(model.predict(scaler.transform(x_raw))[0])
return y, interpret(y)
inputs = [
gr.Number(label="Возраст, лет", minimum=18, maximum=90, value=45),
gr.Dropdown(list(SEX_MAP), value="мужчина", label="Пол"),
gr.Number(label="BMI, кг/м²", minimum=15, maximum=40, value=25.0),
gr.Number(label="Давление, мм рт. ст.", minimum=60, maximum=180, value=90),
gr.Number(label="s1 – холестерин, мг/дл", minimum=130, maximum=320, value=180, info="Норма ≤ 200"),
gr.Number(label="s2 – ЛПНП, мг/дл", minimum=40, maximum=250, value=120, info="Норма ≤ 130"),
gr.Number(label="s3 – ЛПВП, мг/дл", minimum=20, maximum=120, value=50, info="Норма ≥ 40"),
gr.Number(label="s4 – Chol/HDL ratio", minimum=2.0, maximum=8.0, value=4.5, info="Норма ≤ 5"),
gr.Number(label="s5 – log триглицеридов", minimum=4.0, maximum=8.0, value=5.5, info="log10(триглиц.)"),
gr.Number(label="s6 – глюкоза, мг/дл", minimum=60, maximum=220, value=100, info="Норма 70‑110 натощак"),
]
outputs = [
gr.Number(label="Числовой прогноз"),
gr.Textbox(label="Интерпретация", show_copy_button=False),
]
description_text = (
"Введите измеренные значения. Модель автоматически стандартизирует их и выдаёт прогноз "
"и текстовую оценку (результат не является медицинским диагнозом)."
)
gr.Interface(
fn=predict,
inputs=inputs,
outputs=outputs,
title="Диабет: CatBoost прогноз",
description=description_text,
).launch()