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(
"""
Диагностика диабета
Введите ваши данные и получите результат
"""
)
# строка в которой будут два столбца - 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')