Spaces:
Sleeping
Sleeping
import streamlit as st | |
import pandas as pd | |
import numpy as np | |
import pickle | |
import json | |
# Загрузка сохраненной модели и других необходимых объектов | |
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)}") |