Akki2228 commited on
Commit
cb24658
Β·
verified Β·
1 Parent(s): 4f30479

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -59
app.py CHANGED
@@ -3,46 +3,59 @@ import pickle
3
  import numpy as np
4
  import matplotlib.pyplot as plt
5
 
6
- # Load model
7
  with open("DecisionTreeClassifier.pkl", "rb") as file:
8
  model = pickle.load(file)
9
 
 
10
  def predict_churn(age, gender, tenure, usage, support, delay,
11
  subscription, contract, spend, interaction):
12
  try:
 
13
  gender_val = 1 if gender == "Female" else 0
14
 
 
15
  sub_premium = 1 if subscription == "Premium" else 0
16
  sub_standard = 1 if subscription == "Standard" else 0
17
 
18
  contract_monthly = 1 if contract == "Monthly" else 0
19
  contract_quarterly = 1 if contract == "Quarterly" else 0
20
 
 
21
  input_data = np.array([[
22
- age, gender_val, tenure, usage, support, delay,
23
- spend, interaction,
24
- sub_premium, sub_standard,
25
- contract_monthly, contract_quarterly
 
 
 
 
 
 
 
 
26
  ]])
27
 
 
28
  pred = model.predict(input_data)[0]
29
  prob = model.predict_proba(input_data)[0][1]
30
 
31
- result = "⚠️ Likely to Churn" if pred == 1 else "βœ… Stable Customer"
32
 
33
- # Risk label
34
  if prob > 0.7:
35
- risk = "πŸ”΄ High Risk"
36
  elif prob > 0.4:
37
- risk = "🟠 Medium Risk"
38
  else:
39
- risk = "🟒 Low Risk"
40
 
41
- # Styled graph
42
  fig, ax = plt.subplots()
43
  ax.bar(["No Churn", "Churn"], [1 - prob, prob])
44
- ax.set_title("Churn Probability Analysis")
45
- ax.set_ylim(0, 1)
46
 
47
  return result, f"{prob*100:.2f}%", risk, fig
48
 
@@ -50,49 +63,29 @@ def predict_churn(age, gender, tenure, usage, support, delay,
50
  return f"Error: {str(e)}", "", "", None
51
 
52
 
53
- # 🎨 Custom CSS
54
- custom_css = """
55
- body {background-color: #0f172a; color: white;}
56
- .gradio-container {max-width: 900px; margin: auto;}
57
- h1 {text-align: center; color: #38bdf8;}
58
- """
59
-
60
- # πŸš€ UI with Blocks
61
- with gr.Blocks(css=custom_css) as demo:
62
-
63
- gr.Markdown("# πŸ“Š Customer Churn Prediction Dashboard")
64
- gr.Markdown("### Analyze customer behavior and predict churn risk")
65
-
66
- with gr.Row():
67
- with gr.Column():
68
- age = gr.Slider(18, 80, label="Age")
69
- gender = gr.Radio(["Male", "Female"], label="Gender")
70
- tenure = gr.Slider(0, 60, label="Tenure (Months)")
71
- usage = gr.Slider(0, 50, label="Usage Frequency")
72
-
73
- with gr.Column():
74
- support = gr.Slider(0, 20, label="Support Calls")
75
- delay = gr.Slider(0, 30, label="Payment Delay")
76
- subscription = gr.Radio(["Basic", "Standard", "Premium"], label="Subscription Type")
77
- contract = gr.Radio(["Monthly", "Quarterly", "Yearly"], label="Contract Length")
78
-
79
- spend = gr.Slider(0, 10000, label="Total Spend")
80
- interaction = gr.Slider(0, 100, label="Last Interaction")
81
-
82
- predict_btn = gr.Button("πŸ” Predict Churn", variant="primary")
83
-
84
- gr.Markdown("## πŸ“ˆ Results")
85
-
86
- result = gr.Textbox(label="Prediction")
87
- prob = gr.Textbox(label="Churn Probability")
88
- risk = gr.Textbox(label="Risk Level")
89
- graph = gr.Plot()
90
-
91
- predict_btn.click(
92
- fn=predict_churn,
93
- inputs=[age, gender, tenure, usage, support, delay,
94
- subscription, contract, spend, interaction],
95
- outputs=[result, prob, risk, graph]
96
- )
97
-
98
- demo.launch()
 
3
  import numpy as np
4
  import matplotlib.pyplot as plt
5
 
6
+ # Load trained model
7
  with open("DecisionTreeClassifier.pkl", "rb") as file:
8
  model = pickle.load(file)
9
 
10
+ # Prediction function
11
  def predict_churn(age, gender, tenure, usage, support, delay,
12
  subscription, contract, spend, interaction):
13
  try:
14
+ # πŸ”Ή Gender encoding
15
  gender_val = 1 if gender == "Female" else 0
16
 
17
+ # πŸ”Ή One-hot encoding (MUST match training columns)
18
  sub_premium = 1 if subscription == "Premium" else 0
19
  sub_standard = 1 if subscription == "Standard" else 0
20
 
21
  contract_monthly = 1 if contract == "Monthly" else 0
22
  contract_quarterly = 1 if contract == "Quarterly" else 0
23
 
24
+ # πŸ”Ή Input array (order matters!)
25
  input_data = np.array([[
26
+ age,
27
+ gender_val,
28
+ tenure,
29
+ usage,
30
+ support,
31
+ delay,
32
+ spend,
33
+ interaction,
34
+ sub_premium,
35
+ sub_standard,
36
+ contract_monthly,
37
+ contract_quarterly
38
  ]])
39
 
40
+ # πŸ”Ή Prediction
41
  pred = model.predict(input_data)[0]
42
  prob = model.predict_proba(input_data)[0][1]
43
 
44
+ result = "Churn ⚠️" if pred == 1 else "No Churn πŸ™‚"
45
 
46
+ # πŸ”Ή Risk Level
47
  if prob > 0.7:
48
+ risk = "High Risk πŸ”΄"
49
  elif prob > 0.4:
50
+ risk = "Medium Risk 🟠"
51
  else:
52
+ risk = "Low Risk 🟒"
53
 
54
+ # πŸ”Ή Graph
55
  fig, ax = plt.subplots()
56
  ax.bar(["No Churn", "Churn"], [1 - prob, prob])
57
+ ax.set_title("Churn Probability")
58
+ ax.set_ylabel("Probability")
59
 
60
  return result, f"{prob*100:.2f}%", risk, fig
61
 
 
63
  return f"Error: {str(e)}", "", "", None
64
 
65
 
66
+ # 🎨 Gradio UI
67
+ interface = gr.Interface(
68
+ fn=predict_churn,
69
+ inputs=[
70
+ gr.Number(label="Age"),
71
+ gr.Dropdown(["Male", "Female"], label="Gender"),
72
+ gr.Number(label="Tenure"),
73
+ gr.Number(label="Usage Frequency"),
74
+ gr.Number(label="Support Calls"),
75
+ gr.Number(label="Payment Delay"),
76
+ gr.Dropdown(["Basic", "Standard", "Premium"], label="Subscription Type"),
77
+ gr.Dropdown(["Monthly", "Quarterly", "Yearly"], label="Contract Length"),
78
+ gr.Number(label="Total Spend"),
79
+ gr.Number(label="Last Interaction")
80
+ ],
81
+ outputs=[
82
+ gr.Text(label="Prediction"),
83
+ gr.Text(label="Churn Probability"),
84
+ gr.Text(label="Risk Level"),
85
+ gr.Plot(label="Graph")
86
+ ],
87
+ title="πŸ“Š Customer Churn Prediction System",
88
+ description="Enter customer details to predict churn probability and risk level"
89
+ )
90
+
91
+ interface.launch()