nikki2661's picture
Create app.py
47f01a2 verified
import numpy as np
import torch
import torch.nn as nn
from flask import Flask, request, jsonify
from sklearn.preprocessing import MinMaxScaler
import joblib
# Define the autoencoder model
class Autoencoder(nn.Module):
def __init__(self, input_dim):
super(Autoencoder, self).__init__()
self.encoder = nn.Sequential(
nn.Linear(input_dim, 64),
nn.BatchNorm1d(64),
nn.ReLU(),
nn.Dropout(0.2)
)
self.decoder = nn.Sequential(
nn.Linear(64, input_dim),
nn.BatchNorm1d(input_dim),
nn.Sigmoid()
)
def forward(self, x):
encoded = self.encoder(x)
decoded = self.decoder(encoded)
return decoded
# Load trained model
input_dim = 29 # Assuming 29 features (V1-V28 + Amount)
model = Autoencoder(input_dim)
model.load_state_dict(torch.load("trained_autoencoder.pth"))
model.eval()
# Load the MinMaxScaler
scaler = joblib.load("scaler.pkl")
# Create Flask app
app = Flask(__name__)
@app.route('/')
def home():
return "Credit Card Fraud Detection API is Running!"
@app.route('/predict', methods=['POST'])
def predict():
try:
# Get JSON input
data = request.get_json()
X_input = np.array(data['features']).reshape(1, -1) # Ensure it's in the right shape
# Scale input data
X_scaled = scaler.transform(X_input)
# Convert to PyTorch tensor
X_tensor = torch.tensor(X_scaled, dtype=torch.float32)
# Get reconstruction error
recon = model(X_tensor).detach().numpy()
recon_error = np.mean((recon - X_scaled) ** 2)
# Use threshold to classify as fraud (1) or normal (0)
threshold = 0.01 # Adjust this based on previous experiments
prediction = 1 if recon_error > threshold else 0
return jsonify({'fraud_probability': float(recon_error), 'is_fraud': prediction})
except Exception as e:
return jsonify({'error': str(e)})
if __name__ == '__main__':
app.run(debug=True)