A time-series deep learning system for detecting suspicious bank accounts using transaction history.
This system predicts potentially fraudulent E.SUN Bank accounts by analyzing transaction patterns using LSTM, GRU, and Transformer models.
- Account-Level Filtering: Trains only on E.SUN Bank accounts
- Time-Series Analysis: Captures temporal patterns in transactions
- Class Imbalance Handling: Uses SMOTE/ADASYN oversampling
- Multiple Model Architectures: LSTM, GRU, and Transformer
- F1-Score Optimization: Focuses on recall and precision balance
pip install -r requirements.txtpreliminary_data/
├── acct_transaction.csv # Transaction records
├── acct_alert.csv # Alert labels
└── acct_predict.csv # Accounts to predict
Process raw transaction data and create train/validation splits:
python data_preprocess.py \
--data_dir ./preliminary_data \
--output_dir ./data \
--train_end_day 90 \
--sequence_length 30Parameters:
--data_dir: Input data directory (default:./preliminary_data)--output_dir: Output directory for processed data (default:./data)--train_end_day: Last day for training set (default: 90)--sequence_length: Sequence length for time-series (default: 30)
Output:
./data/train.parquet: Training set (days 1-90)./data/val.parquet: Validation set (days 91-121)
Train a model with specified architecture:
LSTM:
python training.py \
--model lstm \
--hidden_size 128 \
--num_layers 2 \
--epochs 50 \
--batch_size 32 \
--lr 0.001GRU:
python training.py \
--model gru \
--hidden_size 128 \
--num_layers 2 \
--epochs 50 \
--batch_size 32 \
--lr 0.001Transformer:
python training.py \
--model transformer \
--hidden_size 128 \
--num_layers 3 \
--epochs 50 \
--batch_size 32 \
--lr 0.001Training Parameters:
--model: Model type (lstm/gru/transformer)--hidden_size: Hidden layer size (default: 128)--num_layers: Number of layers (default: 2)--max_seq_len: Maximum sequence length (default: 50)--batch_size: Batch size (default: 32)--epochs: Number of training epochs (default: 50)--lr: Learning rate (default: 0.001)--dropout: Dropout rate (default: 0.3)--loss: Loss function - focal/weighted_ce (default: focal)--balance_method: Oversampling method - smote/adasyn (default: smote)
Output:
./models/best_model_{model}.pth: Best model checkpoint./models/training_history_{model}.json: Training metrics
Make predictions on new accounts:
python predict.py \
--model_path ./models/best_model_lstm.pth \
--data_dir ./preliminary_data \
--output_file ./predictions.csv \
--threshold 0.5Parameters:
--model_path: Path to trained model checkpoint (required)--data_dir: Data directory (default:./preliminary_data)--output_file: Output CSV file (default:./predictions.csv)--threshold: Classification threshold (default: 0.5)--batch_size: Batch size for inference (default: 32)
Output:
predictions.csv: Account predictions with probabilitiespredictions_stats.json: Prediction statistics
- Identifies E.SUN accounts (from_acct_type='01' OR to_acct_type='01')
- Keeps ALL transactions for these accounts (including cross-bank)
Features per transaction:
txn_amt_normalized: Z-score normalized amountis_self_txn_{Y,N,UNK}: One-hot encoded self-transaction flagfrom_acct_type_binary: Binary encoding (01=0, 02=1)to_acct_type_binary: Binary encoding (01=0, 02=1)delta_time_seconds: Seconds since last transactiondelta_days: Days since last transactiontxn_time_seconds: Time of day in seconds
- Training: Days 1-90
- Validation: Days 91-121
- No temporal overlap to prevent data leakage
- Alert ratio: ~0.0558% (extremely imbalanced)
- Applies SMOTE/ADASYN oversampling to training set only
- Validation set remains unbalanced (realistic distribution)
- Bidirectional LSTM layers
- Captures long-term dependencies
- Good for sequential patterns
- Gated Recurrent Units
- Faster than LSTM
- Similar performance with fewer parameters
- Multi-head self-attention
- Parallel processing
- Best for long sequences
- Focuses on hard-to-classify examples
- Parameters: α=0.25, γ=2.0
- Better for extreme imbalance
- Class-weighted loss
- Simpler alternative
Primary Metric: F1-Score
- Balances precision and recall
- More important than accuracy for imbalanced data
Secondary Metrics:
- Precision: % of predicted alerts that are correct
- Recall: % of actual alerts detected
DL_Time_based/
├── data_preprocess.py # Data preprocessing script
├── training.py # Model training script
├── predict.py # Prediction script
├── requirements.txt # Python dependencies
├── plan.md # Technical plan
├── data_schema.json # Data schema
├── Record.md # Project notes
├── preliminary_data/ # Raw data
├── data/ # Processed data
└── models/ # Trained models
- Training set alert ratio: ~0.0558%
- After balancing: ~50% (oversampled)
- Validation set: Original imbalanced distribution
- Target F1-Score: Optimized on validation set
- Start with LSTM: Simplest and most reliable
- Use Focal Loss: Better for extreme imbalance
- Monitor F1-Score: More important than accuracy
- Adjust threshold: Use 0.5 as baseline, tune on validation set
- GPU Recommended: Significantly faster training
Out of Memory:
- Reduce
--batch_size - Reduce
--max_seq_len - Reduce
--hidden_size
Poor F1-Score:
- Increase training epochs
- Try different model architecture
- Adjust class balancing method
- Tune classification threshold
Slow Training:
- Enable CUDA/GPU
- Reduce sequence length
- Use smaller model