Spaces:
Running
Running
File size: 5,720 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 |
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])
@st.cache_resource
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) |