alperugurcan commited on
Commit
35277f6
·
verified ·
1 Parent(s): 21c8ef5

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +91 -0
app.py ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import pandas as pd
3
+ from catboost import CatBoostClassifier
4
+ import joblib
5
+
6
+ # Load and prepare data
7
+ train_df = pd.read_csv('/kaggle/input/amazon-employee-access-challenge/train.csv')
8
+ X = train_df.drop('ACTION', axis=1)
9
+ y = train_df['ACTION']
10
+
11
+ # Train and save model
12
+ def train_and_save_model():
13
+ model = CatBoostClassifier(
14
+ iterations=100,
15
+ learning_rate=0.1,
16
+ depth=6,
17
+ verbose=0,
18
+ task_type='CPU',
19
+ bootstrap_type='Bernoulli',
20
+ subsample=0.8,
21
+ eval_metric='Accuracy',
22
+ early_stopping_rounds=20
23
+ )
24
+ model.fit(X, y)
25
+ joblib.dump(model, 'amazon_access_model.joblib', compress=3)
26
+ return model
27
+
28
+ # Cache common values
29
+ COMMON_VALUES = {
30
+ 'ROLE_ROLLUP_1': train_df['ROLE_ROLLUP_1'].mode()[0],
31
+ 'ROLE_ROLLUP_2': train_df['ROLE_ROLLUP_2'].mode()[0],
32
+ 'ROLE_DEPTNAME': train_df['ROLE_DEPTNAME'].mode()[0],
33
+ 'ROLE_FAMILY_DESC': train_df['ROLE_FAMILY_DESC'].mode()[0],
34
+ 'ROLE_FAMILY': train_df['ROLE_FAMILY'].mode()[0],
35
+ 'ROLE_CODE': train_df['ROLE_CODE'].mode()[0]
36
+ }
37
+
38
+ # Load or train model
39
+ try:
40
+ model = joblib.load('amazon_access_model.joblib')
41
+ except:
42
+ model = train_and_save_model()
43
+
44
+ def predict_access(resource, mgr_id, role_title):
45
+ input_data = pd.DataFrame([[
46
+ resource,
47
+ mgr_id,
48
+ COMMON_VALUES['ROLE_ROLLUP_1'],
49
+ COMMON_VALUES['ROLE_ROLLUP_2'],
50
+ COMMON_VALUES['ROLE_DEPTNAME'],
51
+ role_title,
52
+ COMMON_VALUES['ROLE_FAMILY_DESC'],
53
+ COMMON_VALUES['ROLE_FAMILY'],
54
+ COMMON_VALUES['ROLE_CODE']
55
+ ]], columns=X.columns)
56
+
57
+ prediction = model.predict(input_data)[0]
58
+ confidence = model.predict_proba(input_data)[0][prediction]
59
+
60
+ result = "✅ Access Granted" if prediction == 1 else "❌ Access Denied"
61
+ return f"{result} (Confidence: {confidence:.2%})"
62
+
63
+ # Create Gradio interface
64
+ iface = gr.Interface(
65
+ fn=predict_access,
66
+ inputs=[
67
+ gr.Dropdown(
68
+ choices=sorted(train_df['RESOURCE'].unique().tolist())[:100], # Limit choices
69
+ label="Resource"
70
+ ),
71
+ gr.Dropdown(
72
+ choices=sorted(train_df['MGR_ID'].unique().tolist())[:100], # Limit choices
73
+ label="Manager"
74
+ ),
75
+ gr.Dropdown(
76
+ choices=sorted(train_df['ROLE_TITLE'].unique().tolist()),
77
+ label="Role Title"
78
+ )
79
+ ],
80
+ outputs=gr.Text(label="Access Decision"),
81
+ title="Amazon Access Control",
82
+ description="Select employee details to check access permission",
83
+ theme="soft",
84
+ examples=[
85
+ [train_df['RESOURCE'].iloc[0], train_df['MGR_ID'].iloc[0], train_df['ROLE_TITLE'].iloc[0]],
86
+ [train_df['RESOURCE'].iloc[1], train_df['MGR_ID'].iloc[1], train_df['ROLE_TITLE'].iloc[1]]
87
+ ]
88
+ )
89
+
90
+ if __name__ == "__main__":
91
+ iface.launch()