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)