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')