File size: 3,076 Bytes
4ae07ef
 
 
 
d96eae1
4ae07ef
f73a5f3
9197906
f73a5f3
 
 
 
 
4ae07ef
f73a5f3
4ae07ef
 
 
 
 
 
 
 
30a5ef1
4ae07ef
 
5eb1934
 
 
4ae07ef
 
 
 
30a5ef1
 
 
 
 
 
 
4ae07ef
30a5ef1
 
 
 
 
5d62a07
4ae07ef
 
 
 
 
 
 
 
 
 
b44b271
4ae07ef
27eaf67
 
 
7064dcf
ab382c0
7064dcf
ab382c0
 
 
27eaf67
 
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
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()