File size: 3,162 Bytes
de2bb03
 
 
 
b55f922
de2bb03
 
 
 
30364ee
 
b55f922
 
 
 
 
 
 
 
de2bb03
b55f922
 
 
dfdcea4
b55f922
 
de2bb03
 
 
 
 
 
 
 
 
 
dfdcea4
de2bb03
 
 
 
b55f922
 
 
de2bb03
 
 
 
 
 
 
 
 
 
 
 
 
 
dfdcea4
 
 
 
de2bb03
 
 
 
 
 
dfdcea4
 
 
de2bb03
 
b55f922
 
 
 
 
dfdcea4
 
 
 
 
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
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']

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

# Создание формы ввода для всех необходимых признаков
def get_user_input():
    input_data = {}
    
    # Числовые признаки
    st.subheader('Числовые параметры')
    for feature in feature_list:
        if feature in numeric_features:
            input_data[feature] = st.number_input(f'{feature}', value=0.0)
    
    # Категориальные признаки
    st.subheader('Категориальные параметры')
    for feature in categorical_features:
        options = categorical_options[feature]
        input_data[feature] = st.selectbox(f'{feature}', options)
    
    return input_data

# Получение данных от пользователя
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)