import gradio as gr import shap import pickle import pandas as pd import matplotlib.pyplot as plt from pathlib import Path # load our models boost_path = Path(__file__).parents[0] / "boost.sav" boost = pickle.load(open(boost_path,"rb")) # functions # preprocessing data function def preprocess(data): columns = ['distance_from_home', 'distance_from_last_transaction', 'ratio_to_median_purchase_price', 'repeat_retailer', 'used_chip', 'used_pin_number', 'online_order'] df = pd.DataFrame([data], columns = columns) # convert data type df[['repeat_retailer','used_chip','used_pin_number','online_order']] = df[['repeat_retailer','used_chip','used_pin_number','online_order']].astype('int') return df # Prediction function with probabilities def predict(*data): df = preprocess(data) prob_pred = boost.predict_proba(df) return {"Normal": float(prob_pred[0][0]), "Fraud": float(prob_pred[0][1])} # plot function def interpret(*data): plt.style.use("fivethirtyeight") df = preprocess(data) explainer = shap.TreeExplainer(boost) shap_values = explainer.shap_values(df) scores_desc = list(zip(shap_values[0], df.columns)) scores_desc = sorted(scores_desc) fig_m = plt.figure(tight_layout=True) plt.barh([s[1] for s in scores_desc], [s[0] for s in scores_desc]) plt.title("Feature Shap Values") plt.ylabel("Shap Value") plt.xlabel("Feature Importance") plt.tight_layout() return fig_m with gr.Blocks() as demo: gr.HTML("""

Credit Card Fraud Prediction System

""") with gr.Row(): with gr.Column(): repeated_retailer = gr.Radio(["No","Yes"], type = "index", label = "Repeat Retailer", info ="Was the transaction at at a repeated store?") online_order = gr.Radio(["No","Yes"], type = "index", label = "Online Order", info ="Was the transaction an online order?") used_chip = gr.Radio(["No","Yes"], type = "index", label = "Used Chip", info ="did the purchase use the security chip of the card?") used_pin = gr.Radio(["No","Yes"], type = "index", label = "Used Pin Number", info ="Did the transaction use the pin code of the card?") distance_home = gr.Number(value = 25, label = "Distance From Home (miles)", info = "How far was the transaction from the card owner's house? (in Miles)") distance_last = gr.Number(value = 5, label = "Distance From Last Transaction (miles)", info = "How far away was the it from the last transaction that happened? (in Miles)") gr.HTML("""

Ratio Median Purchase Price Equation

""") ratio_median = gr.Number(value = 1.8, label = "Ratio Median Purchase Price", info = "Divide the purchase price by card owners median purchase price?") with gr.Column(): label = gr.Label() plot = gr.Plot() with gr.Row(): predict_btn = gr.Button(value="Predict") interpret_btn = gr.Button(value="Explain") predict_btn.click( predict, inputs= [ distance_home, distance_last, ratio_median, repeated_retailer, used_chip, used_pin, online_order ], outputs=[label], ) interpret_btn.click( interpret, inputs=[ distance_home, distance_last, ratio_median, repeated_retailer, used_chip, used_pin, online_order ], outputs=[plot], ) demo.launch()