File size: 2,083 Bytes
d6e197c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ce5135e
 
d6e197c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from flask import Flask, request, jsonify, render_template
import joblib
import pandas as pd
import warnings
warnings.filterwarnings('ignore')

# Compatibility patch for sklearn 1.6.1 pickles on newer sklearn
from sklearn.compose import _column_transformer
class _RemainderColsList(list):
    def __init__(self, columns, future_dtype=None):
        super().__init__(columns)
        self.future_dtype = future_dtype
_column_transformer._RemainderColsList = _RemainderColsList

app = Flask(__name__)

preprocessor = joblib.load('preprocessor1.pkl')
model = joblib.load('randomforestmodel.pkl')

TRANSACTION_TYPES = ['CASH_IN', 'CASH_OUT', 'DEBIT', 'PAYMENT', 'TRANSFER']

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/predict', methods=['POST'])
def predict():
    try:
        d = request.get_json()

        old_org  = float(d['oldbalanceOrg'])
        new_org  = float(d['newbalanceOrig'])
        old_dest = float(d['oldbalanceDest'])
        new_dest = float(d['newbalanceDest'])
        amount   = float(d['amount'])

        err_orig = old_org - amount - new_org
        err_dest = new_dest - old_dest - amount

        df = pd.DataFrame([{
            'step':             float(d['step']),
            'type':             d['type'],
            'amount':           amount,
            'oldbalanceOrg':    old_org,
            'newbalanceOrig':   new_org,
            'oldbalanceDest':   old_dest,
            'newbalanceDest':   new_dest,
            'errorBalanceOrig': err_orig,
            'errorBalanceDest': err_dest,
        }])

        X     = preprocessor.transform(df)
        proba = model.predict_proba(X)[0]

        return jsonify({
            'legit_prob': round(float(proba[0]) * 100, 2),
            'fraud_prob': round(float(proba[1]) * 100, 2),
            'error_balance_orig': round(err_orig, 2),
            'error_balance_dest': round(err_dest, 2),
        })
    except Exception as e:
        return jsonify({'error': str(e)}), 400

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=False)