File size: 3,545 Bytes
42a9e1a
 
 
 
 
 
 
 
 
c2f5c14
42a9e1a
 
 
 
 
1854f5d
 
 
3b82c0e
42a9e1a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7d57cde
42a9e1a
 
 
9ecdc0e
42a9e1a
 
 
 
 
 
 
 
 
 
 
1854f5d
7d57cde
 
 
1854f5d
42a9e1a
 
 
 
 
 
 
1854f5d
42a9e1a
 
 
 
 
1854f5d
42a9e1a
 
 
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
import pickle
import pandas as pd
import shap
from shap.plots._force_matplotlib import draw_additive_plot
import gradio as gr
import numpy as np
import matplotlib.pyplot as plt

# load the model from disk
loaded_model = pickle.load(open("XGB_CLF_5Feature.pkl", 'rb'))

# Setup SHAP
explainer = shap.Explainer(loaded_model) # PLEASE DO NOT CHANGE THIS.

# Create the main function for server
def main_func(JobSatisfaction,EmployeeWellBeing,EngagedAtWork,WorkEnvironment,Management):
    new_row = pd.DataFrame.from_dict({'JobSatisfaction':JobSatisfaction,'EmployeeWellBeing':EmployeeWellBeing,
              'EngagedAtWork':EngagedAtWork,'WorkEnvironment':WorkEnvironment,'Management':Management,
              }, orient = 'index').transpose()
    
    prob = loaded_model.predict_proba(new_row)
    
    shap_values = explainer(new_row)
    # plot = shap.force_plot(shap_values[0], matplotlib=True, figsize=(30,30), show=False)
    # plot = shap.plots.waterfall(shap_values[0], max_display=6, show=False)
    plot = shap.plots.bar(shap_values[0], max_display=6, order=shap.Explanation.abs, show_data='auto', show=False)

    plt.tight_layout()
    local_plot = plt.gcf()
    plt.close()
    
    return {"Leave": float(prob[0][0]), "Stay": 1-float(prob[0][0])}, local_plot

# Create the UI
title = "**Employee Turnover Predictor & Interpreter** 🪐"
description1 = """
This app takes five inputs about employees' satisfaction with different aspects of their work (such as job satisfaction, ...) and predicts whether the employee intends to stay with the employer or leave. There are two outputs from the app: 1- the predicted probability of stay or leave, 2- Shapley's force-plot which visualizes the extent to which each factor impacts the stay/ leave prediction.   
"""

description2 = """
To use the app, click on one of the examples, or adjust the values of the five employee satisfaction factors, and click on Analyze. ✨ 
""" 

with gr.Blocks(title=title) as demo:
    gr.Markdown(f"## {title}")
    # gr.Markdown("""![marketing](types-of-employee-turnover.jpg)""")
    gr.Markdown(description1)
    gr.Markdown("""---""")
    gr.Markdown(description2)
    gr.Markdown("""---""")
    with gr.Row():        
        with gr.Column():
            JobSatisfaction = gr.Slider(label="Job Satisfaction Score", minimum=1, maximum=5, value=4, step=.1)
            EmployeeWellBeing = gr.Slider(label="Employee Well Being Score", minimum=1, maximum=5, value=4, step=.1)
            EngagedAtWork = gr.Slider(label="Work Engagement Score", minimum=1, maximum=5, value=4, step=.1)
            WorkEnvironment = gr.Slider(label="Work Environment Score", minimum=1, maximum=5, value=4, step=.1)
            Management = gr.Slider(label="Management Score", minimum=1, maximum=5, value=4, step=.1)
            submit_btn = gr.Button("Analyze")
        with gr.Column(visible=True) as output_col:
            label = gr.Label(label = "Predicted Label")
            local_plot = gr.Plot(label = 'Shap:')
        
            submit_btn.click(
                main_func,
                [JobSatisfaction,EmployeeWellBeing,EngagedAtWork,WorkEnvironment,Management],
                [label,local_plot], api_name="Employee_Turnover"
            )
    
    gr.Markdown("### Click on any of the examples below to see how it works:")
    gr.Examples([[4,4,4,4,5,5], [5,4,5,4,4,4]], 
                [JobSatisfaction,EmployeeWellBeing,EngagedAtWork,WorkEnvironment,Management], 
                [label,local_plot], main_func, cache_examples=True)

demo.launch()