File size: 1,721 Bytes
cf40bc6
 
 
 
1b4fadc
cf40bc6
 
1b4fadc
113bc30
1b4fadc
 
 
cf40bc6
1b4fadc
 
cf40bc6
113bc30
cf40bc6
113bc30
 
 
 
 
 
cf40bc6
 
113bc30
1613eae
 
1b4fadc
113bc30
1b4fadc
 
cf40bc6
113bc30
 
cf40bc6
1b4fadc
cf40bc6
113bc30
1613eae
1b4fadc
1613eae
1b4fadc
cf40bc6
 
1b4fadc
 
 
113bc30
1b4fadc
 
 
 
113bc30
1b4fadc
 
 
 
113bc30
1b4fadc
 
113bc30
1b4fadc
 
 
113bc30
 
1b4fadc
1613eae
 
113bc30
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
import gradio as gr
import shap
import xgboost as xgb
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# -----------------------------
# 1. Train a simple clean model
# -----------------------------
np.random.seed(0)
X = pd.DataFrame({
    "age": np.random.randint(20, 80, 200),
    "bmi": np.random.uniform(18, 40, 200),
    "bp": np.random.uniform(80, 160, 200)
})
y = 0.3 * X["age"] + 0.5 * X["bmi"] + 0.2 * X["bp"] + np.random.normal(0, 3, 200)

model = xgb.XGBRegressor(
    n_estimators=100,
    max_depth=3,
    learning_rate=0.1,
    objective="reg:squarederror"
)
model.fit(X, y)

# Use TreeExplainer ONLY with XGBoost <= 1.7.6
explainer = shap.TreeExplainer(model)

# -----------------------------
# 2. Prediction + SHAP plot
# -----------------------------
def predict_and_explain(age, bmi, bp):

    df = pd.DataFrame([{"age": age, "bmi": bmi, "bp": bp}])
    pred = float(model.predict(df)[0])

    shap_values = explainer(df)

    # Make SHAP waterfall plot
    plt.figure(figsize=(8, 5))
    shap.plots.waterfall(shap_values[0], show=False)
    plt.tight_layout()
    plt.savefig("shap_plot.png")
    plt.close()

    return pred, "shap_plot.png"

# -----------------------------
# 3. Gradio UI
# -----------------------------
inputs = [
    gr.Number(label="Age"),
    gr.Number(label="BMI"),
    gr.Number(label="Blood Pressure"),
]

outputs = [
    gr.Number(label="Prediction"),
    gr.Image(label="SHAP Explanation"),
]

app = gr.Interface(
    fn=predict_and_explain,
    inputs=inputs,
    outputs=outputs,
    title="XGBoost + SHAP Deployment Fix",
    description="Guaranteed working version for Hugging Face Spaces."
)

if __name__ == "__main__":
    app.launch(share=True)