fraud-detection-url / model_service.py
kh03's picture
Upload 7 files
8d70efc verified
import os
import logging
import numpy as np
import tensorflow as tf
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Global variables for model and scaler
_model = None
_scaler = None
class DirectScaler:
"""
Simple scaler implementation that normalizes features.
"""
def transform(self, X):
"""Simple normalization of input features"""
if isinstance(X, np.ndarray):
# Basic normalization to [0,1] range
# Add small epsilon to avoid division by zero
epsilon = 1e-10
max_values = np.max(np.abs(X), axis=0, keepdims=True)
max_values[max_values < epsilon] = 1.0
return X / max_values
return X
def create_model():
"""
Load the user's model file, or create a model if loading fails.
Returns:
tf.keras.Sequential: The loaded or created model
"""
# Define the path to the model file
current_dir = os.path.dirname(os.path.abspath(__file__))
model_path = os.path.join(current_dir, 'models', 'fraud_model.h5')
# First try to load the user's model
if os.path.exists(model_path):
try:
logger.info(f"Loading model from {model_path}")
model = tf.keras.models.load_model(model_path)
logger.info("Successfully loaded user's model")
return model
except Exception as e:
logger.error(f"Error loading model: {str(e)}")
logger.info("Falling back to creating a new model")
else:
logger.warning(f"Model file not found at {model_path}")
# If loading fails, create a new model
logger.info("Creating model with fixed architecture")
model = tf.keras.Sequential([
tf.keras.layers.Input(shape=(96,)),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(32, activation='relu'),
tf.keras.layers.Dense(16, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
# Compile the model
model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy']
)
logger.info("New model created and compiled successfully")
return model
def initialize():
"""
Initialize the model and scaler.
Returns:
tuple: (model_success, scaler_success)
"""
global _model, _scaler
logger.info("Initializing model service")
# Create scaler
try:
_scaler = DirectScaler()
logger.info("Scaler created successfully")
scaler_success = True
except Exception as e:
logger.error(f"Error creating scaler: {str(e)}")
_scaler = None
scaler_success = False
# Create model
try:
_model = create_model()
model_success = True
except Exception as e:
logger.error(f"Error creating model: {str(e)}")
_model = None
model_success = False
return model_success, scaler_success
def get_model():
"""
Get the model instance, initializing if necessary.
Returns:
tf.keras.Model: The model
"""
global _model
if _model is None:
initialize()
return _model
def get_scaler():
"""
Get the scaler instance, initializing if necessary.
Returns:
DirectScaler: The scaler
"""
global _scaler
if _scaler is None:
initialize()
return _scaler
def predict(features):
"""
Make a prediction using the model.
Args:
features: Feature vector (numpy array)
Returns:
numpy.ndarray: Prediction result
"""
model = get_model()
scaler = get_scaler()
if model is None:
raise ValueError("Model is not initialized")
# Scale features if scaler is available
if scaler is not None:
features = scaler.transform(features)
# Make prediction
return model.predict(features)
def get_status():
"""
Get the status of the model service.
Returns:
dict: Status information
"""
global _model, _scaler
# Initialize if not already done
if _model is None or _scaler is None:
initialize()
status = {
"model_loaded": _model is not None,
"model_type": str(type(_model)) if _model else "None",
"scaler_loaded": _scaler is not None,
"status": "operational" if _model is not None and _scaler is not None else "error",
"using_fallback": False
}
return status
# Initialize the model service when the module is imported
initialize()