Spaces:
Running
Running
File size: 7,807 Bytes
540fe64 |
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 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
import streamlit as st
import numpy as np
import pandas as pd
import pickle
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler, OneHotEncoder
import datetime
st.set_page_config(page_title="# Разработка модели для оценки ДТП по выбранному маршруту движения.")
st.markdown('# Разработка модели для оценки ДТП по выбранному маршруту движения.')
st.write(
"""Цель:
Нужно создать систему, которая могла бы оценить риск ДТП по выбранному маршруту движения.
Под риском понимается вероятность ДТП с любым повреждением транспортного средства.
Как только водитель забронировал автомобиль, сел за руль и выбрал маршрут, система должна оценить уровень риска.
Если уровень риска высок, водитель увидит предупреждение и рекомендации по маршруту.
"""
)
st.sidebar.header("Признаки для модели машинного обучения")
def changes(df):
pass
def user_input_features():
meal = st.sidebar.selectbox('опции заказа', ('BB', 'FB', 'HB', 'SC'))
country = st.sidebar.selectbox('гражданство постояльца', ('GBR', 'PRT', 'ESP', 'IRL', 'FRA', 'Others', 'USA', 'DEU', 'BEL', 'CHE', 'NLD', 'ITA', 'BRA', 'AUT'))
distribution_channel = st.sidebar.selectbox('канал дистрибуции заказа', ('Direct', 'TA/TO', 'Corporate', 'GDS'))
reserved_room_type = st.sidebar.selectbox('тип забронированной комнаты', ('A', 'C', 'D', 'E', 'G', 'F', 'B'))
customer_type = st.sidebar.selectbox('тип заказчика', ('Transient', 'Contract', 'Transient-Party', 'Group'))
adults = st.sidebar.slider('количество взрослых постояльцев', 0, 6, 2)
children = st.sidebar.slider('количество детей от 3 до 14 лет', 0, 5, 2)
babies = st.sidebar.slider('количество младенцев', 0, 1, 5)
days_in_waiting_list = st.sidebar.slider('сколько дней заказ ожидал подтверждения', 0, 250, 0)
previous_cancellations = st.sidebar.slider('количество отменённых заказов у клиента', 0, 30, 0)
data_lead = st.sidebar.date_input("день бронирования", datetime.date(2019, 7, 6))
end_time = st.sidebar.date_input("день заезда", datetime.date(2019, 7, 20))
count_day = st.sidebar.slider('Количество дней проживания', 0, 31, 0)
data_back = end_time + datetime.timedelta(days=count_day)
lead_time = (end_time-data_lead).days
total_of_special_requests = st.sidebar.slider('количество специальных отметок', 0, 8, 0)
arrival_date_day_of_month = end_time.day
arrival_date_year = end_time.year
arrival_date_month = end_time.month
arrival_date_week_number = end_time.isocalendar()[1]
stays_in_weekend_nights = 0
stays_in_week_nights = 0
total_nights = stays_in_weekend_nights + stays_in_week_nights
current_date = end_time
while current_date < data_back:
if current_date.weekday() < 5: # Понедельник (0) - Пятница (4)
stays_in_week_nights += 1
else:
stays_in_weekend_nights += 1
current_date += datetime.timedelta(days=1)
is_repeated_guest = st.sidebar.selectbox('признак того, что гость бронирует номер второй раз', ('Yes', 'No'))
previous_bookings_not_canceled = st.sidebar.slider('количество подтверждённых заказов у клиента', 0, 60, 0)
required_car_parking_spaces = st.sidebar.selectbox('необходимость места для автомобиля', ('Yes', 'No'))
booking_changes = st.sidebar.slider('количество измененных вами параметров', 0, 10, 0)
data = {'meal': meal,
'country': country,
'distribution_channel': distribution_channel,
'reserved_room_type': reserved_room_type,
'customer_type': customer_type,
'lead_time': lead_time,
'adults': adults,
'children': children,
'booking_changes': booking_changes,
'babies': babies,
'days_in_waiting_list': days_in_waiting_list,
'previous_cancellations': previous_cancellations,
'total_nights': total_nights,
'total_of_special_requests': total_of_special_requests,
'arrival_date_day_of_month': arrival_date_day_of_month,
'arrival_date_year': arrival_date_year,
'arrival_date_month': arrival_date_month,
'arrival_date_week_number': arrival_date_week_number,
'stays_in_weekend_nights': stays_in_weekend_nights,
'stays_in_week_nights': stays_in_week_nights,
'is_repeated_guest': is_repeated_guest,
'previous_bookings_not_canceled': previous_bookings_not_canceled,
'required_car_parking_spaces': required_car_parking_spaces,
}
features = pd.DataFrame(data, index=[0])
return features
df = user_input_features()
df = df.sort_index(axis=1)
st.subheader('Таблица с введенными вами параметрами:')
# st.write(df)
def pre_category(data):
if data == "Yes":
return 1
else:
return 0
def preprocessing_data(df, scaler, ohe):
df['is_repeated_guest'] = df['is_repeated_guest'].apply(pre_category)
df['required_car_parking_spaces'] = df['required_car_parking_spaces'].apply(pre_category)
numeric = ['adults', 'children', 'booking_changes', 'babies', 'days_in_waiting_list', 'previous_cancellations', 'lead_time',
'total_nights', 'total_of_special_requests', 'arrival_date_day_of_month', 'arrival_date_year', 'arrival_date_month',
'arrival_date_week_number', 'stays_in_weekend_nights', 'stays_in_week_nights', 'is_repeated_guest', 'previous_bookings_not_canceled',
'required_car_parking_spaces', 'booking_changes']
categorical = ['meal', 'country', 'distribution_channel', 'reserved_room_type', 'customer_type']
df[numeric] = scaler.transform(df[numeric])
tmp = pd.DataFrame(ohe.transform(df[categorical]).toarray(),
columns=ohe.get_feature_names_out(),
index=df.index)
df.drop(categorical, axis=1, inplace=True)
df = df.join(tmp).sort_index(axis=1)
return pd.DataFrame(df, index=[0])
@st.cache_resource
def get_model():
load_model = pickle.load(open('models/booking_cancel_pred.pkl', 'rb'))
ohe_model = pickle.load(open('models/ohe_booking_cancel_pred.pkl', 'rb'))
scaler_model = pickle.load(open('models/scaler_booking_cancel_pred.pkl', 'rb'))
return load_model, scaler_model, ohe_model
model, sc_model, ohe_model = get_model()
df_new = preprocessing_data(df, sc_model, ohe_model)
# st.write(df_new)
prediction = model.predict(df_new)
prediction_proba = model.predict_proba(df_new)
st.subheader('Рекомендация')
exited = np.array(['Клиент вероятно оставит бронь','Клиент вероятно отменит бронь'])
st.write(exited[prediction])
st.subheader('Вероятность рекомендации')
st.write(prediction_proba) |