sergey21000 commited on
Commit
2d73e81
1 Parent(s): 63f130b

Upload 4 files

Browse files
Files changed (4) hide show
  1. app.py +110 -0
  2. main_page_image.jpg +0 -0
  3. model.pkl +3 -0
  4. requirements.txt +3 -0
app.py ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pickle
2
+ import pandas as pd
3
+ import gradio as gr
4
+
5
+ # словарь с названиями признаков на русском для отображения в приложении
6
+ features = dict(
7
+ gender='Пол',
8
+ age='Возраст',
9
+ hypertension='Гипертония',
10
+ heart_disease='Заболевание сердца',
11
+ smoking_history='История курения',
12
+ bmi='Индекс массы тела',
13
+ HbA1c_level='Гемоглобин',
14
+ blood_glucose_level='Глюкоза',
15
+ )
16
+
17
+ # словари с названиями признаков и соответствующими индексами
18
+ gender_label_to_index = {'Female': 0, 'Male': 1}
19
+ smok_label_to_index = {
20
+ 'Нет информации': 0,
21
+ 'Курю': 1,
22
+ 'Курил когда-либо': 2,
23
+ 'Не курю (курил)': 3,
24
+ 'Никогда не курил': 4,
25
+ 'Бросил курить': 5,
26
+ }
27
+
28
+ # загрузка модели
29
+ model_path = 'model.pkl'
30
+ with open(model_path, 'rb') as f:
31
+ model = pickle.load(f)
32
+
33
+ # изменить ширину всего приложения (через css можно настраивать любые компоненты)
34
+ css = '.gradio-container {width: 100% !important}'
35
+
36
+ # интерфейс приложения
37
+ with gr.Blocks(css=css) as demo:
38
+ # приветсвенное сообщение
39
+ gr.HTML(
40
+ """
41
+ <div style="text-align: center;">
42
+ <h2 style="color: green; font-weight: bold; font-style: italic;">Диагностика диабета</h2>
43
+ <h6>Введите ваши данные и получите результат</h6>
44
+ </div>
45
+ """
46
+ )
47
+ # строка в которой будут два столбца - 1) параметры ввода 2) картинка, датафрейм с введенными данными и результаты
48
+ with gr.Row():
49
+ # столбец с параметрами (scale между столбцами устанавливаем 1 к 3)
50
+ with gr.Column(scale=1):
51
+ # элементы параметров ввода данных пользователя (компоненты Gradio)
52
+ gender = gr.Radio(gender_label_to_index.keys(), value='Male', label=features['gender'])
53
+ with gr.Row():
54
+ hypertension = gr.Checkbox(value=False, label=features['hypertension'])
55
+ heart_disease = gr.Checkbox(value=False, label=features['heart_disease'])
56
+ smoking_history = gr.Radio(smok_label_to_index.keys(), value='Нет информации', label=features['smoking_history'])
57
+ age = gr.Slider(minimum=11, maximum=80, value=45, step=1, label=features['age'])
58
+ bmi = gr.Slider(minimum=10.0, maximum=60.0, value=30.0, step=0.1, label=features['bmi'])
59
+ HbA1c_level = gr.Slider(minimum=3.5, maximum=9.0, value=5.5, step=0.01, label=features['HbA1c_level'])
60
+ blood_glucose_level = gr.Slider(minimum=80, maximum=300, value=138, step=1, label=features['blood_glucose_level'])
61
+
62
+ # стобец с картинкой, датафреймом с введенными данными и результатом
63
+ with gr.Column(scale=3):
64
+
65
+ # отобразить картинку через через gr.Image()
66
+ gr.Image('main_page_image.jpg', height=460)
67
+ # датафрейм для отображения введенных данных
68
+ dataframe = gr.DataFrame(
69
+ value=pd.DataFrame(columns=features.values()), # пустой датафрейм с нашими названиями столбцов
70
+ label='Ваши данные',
71
+ row_count=1,
72
+ column_widths='50%',
73
+ height=100,
74
+ # type='pandas',
75
+ )
76
+ # текстовое поле для результата
77
+ textbox = gr.Textbox(label='Результат')
78
+
79
+ # для удобства входные параметры о пользователе собираем в список
80
+ all_params = [gender, age, hypertension, heart_disease, smoking_history, bmi, HbA1c_level, blood_glucose_level]
81
+
82
+ # функция для предсказания результата - принимает введенные параметры, и выводит результат вместе с датафреймом параметров
83
+ def predict(*params):
84
+ # датафрейм параметров для отображения
85
+ data_df = pd.DataFrame([dict(zip(features.values(), params))])
86
+
87
+ # преобразовать все столбцы датафрейма к числам перед предиктом
88
+ df_to_predict = data_df.copy()
89
+ df_to_predict['Пол'] = gender_label_to_index[df_to_predict['Пол'][0]]
90
+ df_to_predict['История курения'] = smok_label_to_index[df_to_predict['История курения'][0]]
91
+
92
+ # сделать предсказание моделью - вероятность диабета
93
+ diabetes_prob = model.predict_proba(df_to_predict.values)[0, 1]
94
+ text_result = f'Вероятность диабета: {diabetes_prob:.2f}'
95
+ # вернуть датафрейм с параметрами и результат - вероятность диабета
96
+ return data_df, text_result
97
+
98
+ # назначить прослушиватель событий - функция predict будет вызывыатся при изменени (change) любого из компонентов
99
+ gr.on(
100
+ triggers=[param.change for param in all_params],
101
+ fn=predict,
102
+ inputs=[*all_params],
103
+ outputs=[dataframe, textbox],
104
+ )
105
+
106
+ # запуск приложения (убрать debug при деплое)
107
+ demo.launch(debug=True)
108
+
109
+ # чтобы сервер работал в докере нужно указать server_name='0.0.0.0'
110
+ # demo.launch(server_name='0.0.0.0')
main_page_image.jpg ADDED
model.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2819c9b98679a707140f7f25a5873ed5682d56705d6b3cea1d1815667b8b2fe8
3
+ size 22235185
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ gradio
2
+ scikit-learn
3
+ Pillow