import streamlit as st import pandas as pd import shap from catboost import CatBoostRegressor import matplotlib.pyplot as plt # Загрузка данных и модели @st.cache_data() def load_data_and_model(): df = pd.read_csv('Dataset/car_data.txt', sep=',') final_model = CatBoostRegressor() final_model.load_model('Model/best_model.cbm') return df, final_model df, final_model = load_data_and_model() # Заголовок приложения st.title("Прогнозирование цены автомобиля") # Создаем окошки для ввода параметров inputs = {} # Выбор бренда unique_brands = df['brand'].unique() selected_brand = st.selectbox("Выберите бренд авто", unique_brands) # Выбор модели в зависимости от бренда selected_model_options = df[df['brand'] == selected_brand]['model'].unique() selected_model = st.selectbox("Выберите модель авто", selected_model_options) inputs['brand'] = selected_brand inputs['model'] = selected_model # Получаем числовые и категориальные столбцы из вашего DataFrame categorical_columns = ['brand', 'model', 'поколение', 'тип продавца', 'состояние', 'модификация', 'тип двигателя', 'коробка передач', 'привод', 'комплектация', 'тип кузова', 'цвет', 'авито оценка'] numerical_columns = ['год выпуска', 'пробег', 'объем двигателя'] # Остальные окошки для ввода параметров for column in df.columns: if column not in ['brand', 'model']: if column in numerical_columns: inputs[column] = st.number_input(f"Введите значение для {column}") elif column in categorical_columns: inputs[column] = st.text_input(f"Введите значение для {column}") # Кнопка для запуска предсказания if st.button("Предсказать цену"): # Создаем DataFrame из введенных данных input_data = pd.DataFrame(inputs, index=[0]) # Получение предсказания predicted_price = final_model.predict(input_data)[0] # Вывод результатов st.write(f"Прогнозируемая цена авто: {round(predicted_price, 2)} руб.") # Отключение предупреждения PyplotGlobalUseWarning st.set_option('deprecation.showPyplotGlobalUse', False) # Расчет важности фичей с использованием SHAP explainer = shap.TreeExplainer(final_model) shap_values = explainer.shap_values(input_data) # Отображение SHAP force plot st.write("SHAP Force Plot:") shap.force_plot(explainer.expected_value, shap_values[0], input_data, matplotlib=True, show=False) st.pyplot()