Spaces:
Running
Running
"""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() | |