From c2b059e78809886ec80c361734f2442bd9e477ea Mon Sep 17 00:00:00 2001 From: Daniel Andarge Date: Sun, 30 Jun 2024 18:48:12 +0300 Subject: [PATCH] Update serve_model.py --- flask-app/serve_model.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/flask-app/serve_model.py b/flask-app/serve_model.py index 23d93a1..d4a3891 100644 --- a/flask-app/serve_model.py +++ b/flask-app/serve_model.py @@ -1,5 +1,8 @@ from flask import Flask, request, jsonify import pandas as pd +from lime import lime_tabular +import shap +import lime import pickle import os import sys @@ -17,6 +20,7 @@ def home(): return ("Welcome to ML based fraud detction") + @app.route('/predict', methods=['POST']) def detect(): try: @@ -27,14 +31,25 @@ def detect(): df['signup_time'] = pd.to_datetime(df['signup_time']) df['purchase_time'] = pd.to_datetime(df['purchase_time']) - # FeatureEngineering + # Feature Engineering fg = FeatureEngineering(df) featured_df = fg.preprocess() if len(featured_df) > 0: # Make detection result = model.predict(featured_df.values).tolist() detection_results = ["Fraud" if res == 1 else "Not Fraud" for res in result] - return jsonify({'Detection': detection_results}) + + # SHAP Explanation + explainer = shap.TreeExplainer(model) + shap_values = explainer.shap_values(featured_df) + shap_summary = shap.summary_plot(shap_values, featured_df, plot_type="bar") + + # LIME Explanation + lime_explainer = lime_tabular.LimeTabularExplainer(featured_df.values, feature_names=featured_df.columns) + lime_exp = lime_explainer.explain_instance(featured_df.iloc[0].values, model.predict_proba, num_features=5) + lime_explanation = lime_exp.as_html() + + return jsonify({'Detection': detection_results, 'SHAP_Explanation': shap_summary, 'LIME_Explanation': lime_explanation}) else: return jsonify({'error': 'No data provided for detection'}), 400 @@ -42,6 +57,3 @@ def detect(): return jsonify({'error': f"Missing key in the input data: {ke}"}), 400 except Exception as e: return jsonify({'error': str(e)}), 400 - -if __name__ == '__main__': - app.run(debug=True) \ No newline at end of file