File size: 3,533 Bytes
7c5d1d0
7a63bb7
a719e13
2750f6c
 
 
a178285
2750f6c
a178285
de496ae
7c5d1d0
a178285
2750f6c
a178285
 
 
 
 
 
 
7a63bb7
2750f6c
 
96a2bd1
 
 
 
 
 
3e635fa
96a2bd1
3e635fa
 
96a2bd1
3e635fa
 
a719e13
 
 
7a63bb7
96a2bd1
2ab8b05
 
 
96a2bd1
a719e13
 
 
 
2d5fce6
de496ae
a719e13
 
 
de496ae
 
2d5fce6
a719e13
 
 
7a63bb7
96a2bd1
 
 
 
 
 
 
 
a178285
96a2bd1
a178285
 
 
 
 
 
 
 
 
 
96a2bd1
3e635fa
 
96a2bd1
 
a178285
 
 
96a2bd1
 
a178285
96a2bd1
 
2750f6c
a178285
3e635fa
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
import gradio as gr
import numpy as np
import pandas as pd
import joblib
import os
import warnings
from huggingface_hub import hf_hub_download

# Suppress warnings
warnings.filterwarnings("ignore")

# Load ensemble model from Hugging Face Hub
def load_model():
    model_path = hf_hub_download(
        repo_id="Zeyadd-Mostaffa/final_ensemble_model",
        filename="final_ensemble_model.pkl"
    )
    model = joblib.load(model_path)
    print("βœ… Ensemble model loaded successfully.")
    return model

model = load_model()

# Define prediction function
def predict_employee_status(
    satisfaction_level, last_evaluation, number_project,
    average_monthly_hours, time_spend_company,
    work_accident, promotion_last_5years, salary, department, threshold=0.5
):
    # List of all departments as encoded during training
    departments = [
        'IT', 'RandD', 'accounting', 'hr', 'management',
        'marketing', 'product_mng', 'sales', 'support', 'technical'
    ]

    # One-hot encode department
    department_features = {f"department_{dept}": 0 for dept in departments}
    if department in departments:
        department_features[f"department_{department}"] = 1

    # Interaction features
    satisfaction_evaluation = satisfaction_level * last_evaluation
    work_balance = average_monthly_hours / number_project

    # Construct input DataFrame
    input_data = {
        "satisfaction_level": [satisfaction_level],
        "last_evaluation": [last_evaluation],
        "number_project": [number_project],
        "average_monthly_hours": [average_monthly_hours],
        "time_spend_company": [time_spend_company],
        "Work_accident": [work_accident],
        "promotion_last_5years": [promotion_last_5years],
        "salary": [salary],
        "satisfaction_evaluation": [satisfaction_evaluation],
        "work_balance": [work_balance],
        **department_features
    }

    input_df = pd.DataFrame(input_data)

    try:
        prob = model.predict_proba(input_df)[0][1]
        result = "βœ… Employee is likely to quit." if prob >= threshold else "βœ… Employee is likely to stay."
        return f"{result} (Probability: {prob:.2%})"
    except Exception as e:
        return f"❌ Prediction error: {str(e)}"

# Gradio Interface
def gradio_interface():
    interface = gr.Interface(
        fn=predict_employee_status,
        inputs=[
            gr.Number(label="Satisfaction Level (0.0 - 1.0)"),
            gr.Number(label="Last Evaluation (0.0 - 1.0)"),
            gr.Number(label="Number of Projects (1 - 10)"),
            gr.Number(label="Average Monthly Hours (80 - 320)"),
            gr.Number(label="Time Spend at Company (Years)"),
            gr.Radio([0, 1], label="Work Accident (0 = No, 1 = Yes)"),
            gr.Radio([0, 1], label="Promotion in Last 5 Years (0 = No, 1 = Yes)"),
            gr.Radio([0, 1, 2], label="Salary (0 = Low, 1 = Medium, 2 = High)"),
            gr.Dropdown(
                ['IT', 'RandD', 'accounting', 'hr', 'management',
                 'marketing', 'product_mng', 'sales', 'support', 'technical'],
                label="Department"
            ),
            gr.Slider(0.1, 0.9, value=0.5, step=0.05, label="Prediction Threshold")
        ],
        outputs="text",
        title="Employee Retention Prediction System (Voting Ensemble)",
        description="Predict whether an employee is likely to stay or quit based on their profile. Supports threshold adjustment.",
        theme="dark"
    )
    interface.launch()

gradio_interface()