import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score

rng = np.random.default_rng(42)
n = 50_000
fico = np.clip(rng.normal(660,55,n),300,850).round().astype(int)
years = np.clip(rng.poisson(5,n),0,40)
income = rng.lognormal(10.9,0.5,n).round(2)
lines = rng.poisson(2.3,n)
loan = (income*rng.uniform(0.05,0.55,n)).round(2)
other = (lines*rng.uniform(400,4500,n)).round(2)
debt = (loan+other).round(2)
dti = debt/np.maximum(income,1e-3)
z = -4.35 + 4.20*(1-(fico-300)/550) + 1.10*dti + 0.28*lines - 0.05*years
p = 1/(1+np.exp(-z))
default = rng.binomial(1,p)
X = np.column_stack([lines,dti,years,fico])
Xtr,Xte,ytr,yte = train_test_split(X,default,test_size=0.25,random_state=42,stratify=default)
sc = StandardScaler().fit(Xtr)
model = LogisticRegression(max_iter=1000,class_weight="balanced").fit(sc.transform(Xtr),ytr)
auc = roc_auc_score(yte,model.predict_proba(sc.transform(Xte))[:,1])
print("borrowers:", n)
print("default_rate:", default.mean())
print("test_auc:", auc)
