File size: 4,923 Bytes
de2bb03
 
 
 
b55f922
de2bb03
 
 
 
30364ee
 
b55f922
 
 
 
 
 
 
 
de2bb03
b55f922
 
 
dfdcea4
b55f922
 
323e84a
 
de2bb03
 
 
 
 
 
 
 
 
 
dfdcea4
323e84a
 
 
 
 
 
 
 
 
 
de2bb03
 
 
b55f922
 
323e84a
 
 
 
 
 
 
de2bb03
 
 
323e84a
 
 
 
 
 
 
 
 
 
 
de2bb03
 
 
 
 
 
 
 
 
 
 
dfdcea4
 
 
 
de2bb03
 
 
 
 
 
dfdcea4
 
 
de2bb03
 
b55f922
 
 
 
 
dfdcea4
 
 
 
323e84a
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import streamlit as st
import pandas as pd
import numpy as np
import pickle
import json

# Загрузка сохраненной модели и других необходимых объектов
@st.cache_resource
def load_model():
    with open('model.pkl', 'rb') as file:
        model = pickle.load(file)
    
    with open('scaler.pkl', 'rb') as file:
        scaler = pickle.load(file)
    
    with open('data.json', 'r', encoding='utf-8') as f:
        data = json.load(f)
    
    return model, scaler, data

model, scaler, data = load_model()
feature_list = data['features']
categorical_features = data['categorical_features']
numeric_features = data['numeric_features']
categorical_options = data['categorical_options']
group_names = data['group_names']
numeric_defaults = data['numeric_defaults']
categorical_defaults = data['categorical_defaults']

st.title('Классификатор пациентов')

# Создание формы ввода для всех необходимых признаков
def get_user_input():
    input_data = {}
    
    # Числовые признаки
    st.subheader('Числовые параметры')
    for feature in feature_list:
        if feature in numeric_features:
            default_value = float(numeric_defaults[feature])
            min_val = default_value - abs(default_value)
            max_val = default_value + abs(default_value)
            input_data[feature] = st.number_input(
                f'{feature}',
                value=default_value,
                min_value=min_val,
                max_value=max_val,
                help=f"Среднее значение: {default_value:.2f}"
            )
    
    # Категориальные признаки
    st.subheader('Категориальные параметры')
    for feature in categorical_features:
        options = categorical_options[feature]
        default_idx = options.index(categorical_defaults[feature]) if categorical_defaults[feature] in options else 0
        input_data[feature] = st.selectbox(
            f'{feature}',
            options,
            index=default_idx,
            help=f"Наиболее частое значение: {categorical_defaults[feature]}"
        )
    
    return input_data

# Добавим описание
st.markdown("""
    ## Описание
    Это приложение помогает классифицировать пациентов по группам на основе введенных параметров.
    
    ### Инструкция:
    1. Заполните все поля формы (установлены средние значения по умолчанию)
    2. Нажмите кнопку "Выполнить классификацию"
    3. Получите результат с вероятностями принадлежности к каждой группе
""")

# Получение данных от пользователя
user_input = get_user_input()

# Кнопка для выполнения предсказания
if st.button('Выполнить классификацию'):
    # Преобразование входных данных
    input_df = pd.DataFrame([user_input])
    
    # One-hot encoding для категориальных признаков
    input_df_encoded = pd.get_dummies(input_df, columns=categorical_features)
    
    # Масштабирование числовых признаков
    if numeric_features:
        input_df_encoded[numeric_features] = scaler.transform(input_df_encoded[numeric_features])
    
    # Убедитесь, что все необходимые столбцы присутствуют
    for col in feature_list:
        if col not in input_df_encoded.columns:
            input_df_encoded[col] = 0
    
    # Получение предсказания
    X_pred = input_df_encoded[feature_list]
    prediction = model.predict(X_pred)
    probabilities = model.predict_proba(X_pred)[0]
    
    # Отображение результата
    st.success(f'Предсказанная группа: {group_names[str(prediction[0])]}')
    
    # Вывод вероятностей
    st.write('Вероятности для каждой группы:')
    for i, prob in enumerate(probabilities):
        st.write(f'{group_names[str(i)]}: {prob:.2f}')

    # Добавим вывод введенных данных для проверки
    st.write("\nВведенные данные:")
    st.write(input_df)

# Добавим информацию о модели
with st.expander("Информация о модели"):
    st.write(f"Количество признаков: {len(feature_list)}")
    st.write(f"Числовые признаки: {len(numeric_features)}")
    st.write(f"Категориальные признаки: {len(categorical_features)}")