Skip to content
All projects

Year

2024

Role

Preprocessing, resampling, model comparison, evaluation

Stack

  • XGBoost
  • Random Forest
  • Decision Tree
  • Logistic Regression
  • SMOTE
  • ADASYN

Imbalanced learning

Credit Card Fraud Detection

Fraud detection on a dataset that is 0.172% positive — where accuracy is a useless metric and the whole problem is resampling strategy and the recall/precision trade-off.

  • Conducted fraud detection on the Kaggle dataset (284,807 transactions, only 492 fraud → 0.172%).
  • Applied SMOTE and ADASYN to handle severe class imbalance.
  • Implemented and compared Logistic Regression, Decision Tree, Random Forest, and XGBoost.
  • Achieved ROC-AUC 0.9817 and Recall 0.735 with XGBoost on imbalanced data.
  • Improved Recall to 0.816 with ADASYN while maintaining high ROC-AUC (0.9744), outperforming other models.
  • Contributed to data preprocessing, resampling, model development, and evaluation, delivering a robust prototype for financial fraud detection.
Explain this for
ROC-AUC
0.9817
XGBoost on imbalanced data
Recall
0.816
with ADASYN
Positive rate
0.172%
492 frauds in 284

The problem

The Kaggle credit-card dataset contains 284,807 transactions of which 492 are fraudulent — 0.172%. A classifier that predicts "legitimate" unconditionally scores 99.83% accuracy and catches nothing. This is the canonical case where the headline metric actively misleads, and every meaningful decision in the project follows from refusing to use it.

Resampling

I compared SMOTE and ADASYN. Both synthesise minority-class examples by interpolating between neighbours, but they choose where to synthesise differently: SMOTE spreads uniformly across the minority class, ADASYN concentrates on the examples that are hardest to classify — the ones sitting near the decision boundary, which is where fraud actually lives.

Models

Four classifiers, on both the raw and resampled distributions: Logistic Regression, Decision Tree, Random Forest, XGBoost.

SettingROC-AUCRecall
XGBoost, imbalanced0.98170.735
XGBoost + ADASYN0.97440.816

Reading the trade-off

This is the entire finding, and it is a trade, not a win. ADASYN lifts recall from 0.735 to 0.816 — roughly 40 additional frauds caught out of every 492 — at the cost of 0.7 points of ROC-AUC.

Which side of that trade you want is a business question, not a modelling one. A missed fraud costs the issuer the transaction value plus investigation overhead; a false positive costs a declined card and an annoyed customer. The ratio between those decides the operating point, and the honest output of this project is the curve rather than a single chosen threshold.

What I took from it

Choosing the metric is the modelling decision. Once ROC-AUC and recall replaced accuracy, every subsequent choice — which resampler, which model, which threshold — became answerable with evidence. Before that, the numbers were all excellent and all meaningless.