Spaces:
Sleeping
Sleeping
import pickle | |
import pandas as pd | |
import gradio as gr | |
# словарь с названиями признаков на русском для отображения в приложении | |
features = dict( | |
gender='Пол', | |
age='Возраст', | |
hypertension='Гипертония', | |
heart_disease='Заболевание сердца', | |
smoking_history='История курения', | |
bmi='Индекс массы тела', | |
HbA1c_level='Гемоглобин', | |
blood_glucose_level='Глюкоза', | |
) | |
# словари с названиями признаков и соответствующими индексами | |
gender_label_to_index = {'Female': 0, 'Male': 1} | |
smok_label_to_index = { | |
'Нет информации': 0, | |
'Курю': 1, | |
'Курил когда-либо': 2, | |
'Не курю (курил)': 3, | |
'Никогда не курил': 4, | |
'Бросил курить': 5, | |
} | |
# загрузка модели | |
model_path = 'model.pkl' | |
with open(model_path, 'rb') as f: | |
model = pickle.load(f) | |
# изменить ширину всего приложения (через css можно настраивать любые компоненты) | |
css = '.gradio-container {width: 80% !important}' | |
# интерфейс приложения | |
with gr.Blocks(css=css) as demo: | |
# приветсвенное сообщение | |
gr.HTML( | |
""" | |
<div style="text-align: center;"> | |
<h2 style="color: green; font-weight: bold; font-style: italic;">Диагностика диабета</h2> | |
<h6>Введите ваши данные и получите результат</h6> | |
</div> | |
""" | |
) | |
# строка в которой будут два столбца - 1) параметры ввода 2) картинка, датафрейм с введенными данными и результаты | |
with gr.Row(): | |
# столбец с параметрами (scale между столбцами устанавливаем 1 к 3) | |
with gr.Column(scale=1): | |
with gr.Group(): | |
gr.Markdown('**Данные**') | |
# элементы параметров ввода данных пользователя (компоненты Gradio) | |
gender = gr.Radio(gender_label_to_index.keys(), value='Male', label=features['gender']) | |
with gr.Row(): | |
hypertension = gr.Checkbox(value=False, label=features['hypertension']) | |
heart_disease = gr.Checkbox(value=False, label=features['heart_disease']) | |
smoking_history = gr.Radio(smok_label_to_index.keys(), value='Нет информации', label=features['smoking_history']) | |
age = gr.Slider(minimum=11, maximum=80, value=45, step=1, label=features['age']) | |
bmi = gr.Slider(minimum=10.0, maximum=60.0, value=30.0, step=0.1, label=features['bmi']) | |
HbA1c_level = gr.Slider(minimum=3.5, maximum=9.0, value=5.5, step=0.01, label=features['HbA1c_level']) | |
blood_glucose_level = gr.Slider(minimum=80, maximum=300, value=138, step=1, label=features['blood_glucose_level']) | |
# стобец с картинкой, датафреймом с введенными данными и результатом | |
with gr.Column(scale=3): | |
# отобразить картинку через через gr.Image() | |
gr.Image('main_page_image.jpg', height=460, show_label=False) | |
# датафрейм для отображения введенных данных | |
dataframe = gr.DataFrame( | |
value=pd.DataFrame(columns=features.values()), # пустой датафрейм с нашими названиями столбцов | |
label='Ваши данные', | |
row_count=1, | |
column_widths='50%', | |
max_height=100, | |
# type='pandas', | |
) | |
# текстовое поле для результата | |
textbox = gr.Textbox(label='Результат') | |
# для удобства входные параметры о пользователе собираем в список | |
all_params = [gender, age, hypertension, heart_disease, smoking_history, bmi, HbA1c_level, blood_glucose_level] | |
# функция для предсказания результата - принимает введенные параметры, и выводит результат вместе с датафреймом параметров | |
def predict(*params): | |
# датафрейм параметров для отображения | |
data_df = pd.DataFrame([dict(zip(features.values(), params))]) | |
# преобразовать все столбцы датафрейма к числам перед предиктом | |
df_to_predict = data_df.copy() | |
df_to_predict['Пол'] = gender_label_to_index[df_to_predict['Пол'][0]] | |
df_to_predict['История курения'] = smok_label_to_index[df_to_predict['История курения'][0]] | |
# сделать предсказание моделью - вероятность диабета | |
diabetes_prob = model.predict_proba(df_to_predict.values)[0, 1] | |
text_result = f'Вероятность диабета: {diabetes_prob:.2f}' | |
# вернуть датафрейм с параметрами и результат - вероятность диабета | |
return data_df, text_result | |
# назначить прослушиватель событий - функция predict будет вызывыатся при изменени (change) любого из компонентов | |
gr.on( | |
triggers=[param.change for param in all_params], | |
fn=predict, | |
inputs=[*all_params], | |
outputs=[dataframe, textbox], | |
) | |
# запуск приложения (убрать debug при деплое) | |
demo.launch(debug=True) | |
# чтобы сервер работал в докере нужно указать server_name='0.0.0.0' | |
# demo.launch(server_name='0.0.0.0') |