Spaces:
Running
Running
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 | |
st.set_page_config(page_title="# Отток клиентов «Бета-Банка»") | |
st.markdown('# Отток клиентов «Бета-Банка»') | |
with st.expander("Описание проекта:"): | |
st.write( | |
"""Из «Бета-Банка» стали уходить клиенты. Каждый месяц. Немного, но заметно. Банковские маркетологи посчитали: сохранять текущих клиентов дешевле, чем привлекать новых. | |
Нужно спрогнозировать, уйдёт клиент из банка в ближайшее время или нет. Вам предоставлены исторические данные о поведении клиентов и расторжении договоров с банком. | |
Постройте модель с предельно большим значением *F1*-меры. Чтобы сдать проект успешно, нужно довести метрику до 0.59. Проверьте *F1*-меру на тестовой выборке самостоятельно. | |
Дополнительно измеряйте *AUC-ROC*, сравнивайте её значение с *F1*-мерой. | |
Источник данных: [https://www.kaggle.com/barelydedicated/bank-customer-churn-modeling](https://www.kaggle.com/barelydedicated/bank-customer-churn-modeling) | |
""") | |
with st.expander("Описание данных:"): | |
st.write(""" | |
Признаки: | |
- CreditScore — кредитный рейтинг | |
- Geography — страна проживания | |
- Gender — пол | |
- Age — возраст | |
- Tenure — сколько лет человек является клиентом банка | |
- Balance — баланс на счёте | |
- NumOfProducts — количество продуктов банка, используемых клиентом | |
- HasCrCard — наличие кредитной карты | |
- IsActiveMember — активность клиента | |
- EstimatedSalary — предполагаемая зарплата | |
Целевой признак: | |
- Exited — факт ухода клиента | |
""" | |
) | |
st.sidebar.header("Признаки для модели машинного обучения") | |
def user_input_features(): | |
credit_score = st.sidebar.slider('Кредитный рейтинг', 350, 850, 500) | |
geography = st.sidebar.selectbox('Страна проживания', ('France', 'Spain', 'Germany')) | |
gender = st.sidebar.selectbox('Пол', ('Female', 'Male')) | |
age = st.sidebar.slider('Возраст', 18, 92, 25) | |
tenure = st.sidebar.slider('Сколько лет человек является клиентом банка', 0, 10, 7) | |
balance = st.sidebar.slider('Баланс на счёте', 0, 300000, 20000) | |
num_of_products = st.sidebar.slider('Количество продуктов банка, используемых клиентом', 1, 4, 1) | |
has_cr_card = st.sidebar.selectbox('Наличие кредитной карты', ('Yes', 'No')) | |
is_active_member = st.sidebar.selectbox('Активность клиента', ('Yes', 'No')) | |
estimated_salary = st.sidebar.slider('Предполагаемая зарплата', 0, 200000, 10000) | |
data = {'credit_score': credit_score, | |
'geography': geography, | |
'gender': gender, | |
'age': age, | |
'tenure': tenure, | |
'balance': balance, | |
'num_of_products': num_of_products, | |
'has_cr_card': has_cr_card, | |
'is_active_member': is_active_member, | |
'estimated_salary': estimated_salary} | |
features = pd.DataFrame(data, index=[0]) | |
return features | |
df = user_input_features() | |
st.subheader('Таблица с введенными вами параметрами:') | |
st.write(df) | |
def pre_category(data): | |
if data == "Yes": | |
return 1 | |
else: | |
return 0 | |
def preprocessing_data(df, scaler, ohe): | |
df['has_cr_card'] = df['has_cr_card'].apply(pre_category) | |
df['is_active_member'] = df['is_active_member'].apply(pre_category) | |
numeric = ['credit_score', 'age', 'tenure', 'balance', 'num_of_products', 'estimated_salary'] | |
categorical = ['geography', 'gender'] | |
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) | |
return pd.DataFrame(df, index=[0]) | |
def get_model(): | |
load_model = pickle.load(open('models/clients_churn.pkl', 'rb')) | |
ohe_model = pickle.load(open('models/ohe_clients_churn.pkl', 'rb')) | |
scaler_model = pickle.load(open('models/scaler_clients_churn.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) | |
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) |