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