Back to Projects
ml
Case StudyCredit Risk Classifier — Random Forest
Binary classification model to predict loan default probability, trained on a public Kaggle dataset of ~32K credit records. Implements feature engineering (DTI ratio, income buckets, age groups), trains Logistic Regression and Random Forest with class balancing, and evaluates using AUC-ROC, KS Statistic, and confusion matrix. AUC: 0.93.
Pythonscikit-learnRandom ForestpandasEDA
Architecture
Raw Data (32K records)
→Feature Engineering
→Train / Evaluate
→AUC 0.93 / F1 0.82
Code Snippet
# Feature engineering
df['dti_ratio'] = df['loan_amnt'] / df['person_income']
df['income_bucket'] = pd.qcut(df['person_income'], q=4, labels=['low','mid','high','top'])
df['age_group'] = pd.cut(df['person_age'], bins=[0,25,35,50,100],
labels=['<25','25-35','35-50','50+'])
# Train / test split (stratified)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.30, stratify=y, random_state=42
)
# Random Forest — class_weight balances the 78/22 split
rf = RandomForestClassifier(
n_estimators=100,
max_depth=15,
min_samples_split=10,
class_weight='balanced',
random_state=42,
)
rf.fit(X_train, y_train)
# Results on held-out test set
# AUC-ROC : 0.9280 (industry threshold: > 0.80)
# F1-Score : 0.8162
# Sensitivity: 70.11% (defaults correctly flagged)
# Specificity: 99.53% (good clients correctly approved)
# Top features: loan_percent_income 20.6%, person_income 16.7%, loan_int_rate 13.8%