dschandra commited on
Commit
fbde87b
·
verified ·
1 Parent(s): ef419fa

Upload 5 files

Browse files
Files changed (5) hide show
  1. app.py +30 -0
  2. predictor.py +11 -0
  3. preprocessing.py +28 -0
  4. requirements.txt +5 -0
  5. train_model.py +18 -0
app.py ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import gradio as gr
3
+ from predictor import predict_risk
4
+
5
+ def predict(policy_id, last_premium_paid_date, payment_mode, policy_term, policy_age):
6
+ input_data = {
7
+ "policy_id": policy_id,
8
+ "last_premium_paid_date": last_premium_paid_date,
9
+ "payment_mode": payment_mode,
10
+ "policy_term": int(policy_term),
11
+ "policy_age": int(policy_age)
12
+ }
13
+ risk = predict_risk(input_data)
14
+ return {"Lapse Risk Score (0–1)": risk}
15
+
16
+ iface = gr.Interface(
17
+ fn=predict,
18
+ inputs=[
19
+ gr.Textbox(label="Policy ID"),
20
+ gr.Textbox(label="Last Premium Paid Date (YYYY-MM-DD)"),
21
+ gr.Dropdown(["Annual", "Semi-Annual", "Quarterly", "Monthly"], label="Payment Mode"),
22
+ gr.Number(label="Policy Term (Years)"),
23
+ gr.Number(label="Policy Age (Years)")
24
+ ],
25
+ outputs="json",
26
+ title="Lapse Risk Predictor",
27
+ description="Enter policy details to predict the risk of lapse using an XGBoost model"
28
+ )
29
+
30
+ iface.launch()
predictor.py ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import xgboost as xgb
3
+ from preprocessing import preprocess_input
4
+
5
+ model = xgb.XGBClassifier()
6
+ model.load_model("model/xgb_model.json")
7
+
8
+ def predict_risk(input_dict):
9
+ df = preprocess_input(input_dict)
10
+ score = model.predict_proba(df)[0][1]
11
+ return round(score, 2)
preprocessing.py ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import pandas as pd
3
+ from datetime import datetime
4
+
5
+ def encode_payment_mode(mode):
6
+ return {"Annual": 0, "Semi-Annual": 1, "Quarterly": 2, "Monthly": 3}.get(mode, -1)
7
+
8
+ def calculate_months_since(date_str):
9
+ try:
10
+ delta = datetime.now() - datetime.strptime(date_str, "%Y-%m-%d")
11
+ return delta.days // 30
12
+ except:
13
+ return 0
14
+
15
+ def preprocess_input(data):
16
+ return pd.DataFrame([{
17
+ "months_since_last_payment": calculate_months_since(data["last_premium_paid_date"]),
18
+ "payment_mode_encoded": encode_payment_mode(data["payment_mode"]),
19
+ "policy_term": data["policy_term"],
20
+ "policy_age": data["policy_age"]
21
+ }])
22
+
23
+ def preprocess_dataframe(df):
24
+ df["months_since_last_payment"] = df["last_premium_paid_date"].apply(calculate_months_since)
25
+ df["payment_mode_encoded"] = df["payment_mode"].apply(encode_payment_mode)
26
+ X = df[["months_since_last_payment", "payment_mode_encoded", "policy_term", "policy_age"]]
27
+ y = df["risk"]
28
+ return X, y
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+
2
+ gradio==4.24.0
3
+ xgboost==2.0.3
4
+ pandas==2.2.2
5
+ scikit-learn==1.5.0
train_model.py ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import xgboost as xgb
3
+ import pandas as pd
4
+ import os
5
+ from preprocessing import preprocess_dataframe
6
+
7
+ # Sample training data
8
+ data = pd.DataFrame([
9
+ {"last_premium_paid_date": "2023-06-15", "payment_mode": "Annual", "policy_term": 15, "policy_age": 3, "risk": 1},
10
+ {"last_premium_paid_date": "2024-03-10", "payment_mode": "Monthly", "policy_term": 20, "policy_age": 2, "risk": 0},
11
+ ])
12
+
13
+ X, y = preprocess_dataframe(data)
14
+ model = xgb.XGBClassifier()
15
+ model.fit(X, y)
16
+
17
+ os.makedirs("model", exist_ok=True)
18
+ model.save_model("model/xgb_model.json")