# shared loader for dig v2 (pre-C=J25 train data, all users; eval on sampled val25/26 rows in D.parquet) import polars as pl, numpy as np, scipy.sparse as sp, sys, lightgbm as lgb from scipy.sparse.linalg import svds from sklearn.metrics import roc_auc_score sys.path.insert(0,'/tmp/dig'); from h import wauc J20=1737331200; DAY=86400; C=J20+5*DAY imap=pl.read_parquet('/tmp/dig/imap.parquet'); NI=imap.height EV=pl.scan_parquet('/workspace/huawei/v2work/train_events.parquet').filter(pl.col('ts')=0,hc[np.maximum(rk,0)],0) def cosf(V,w=None): V=nrm(V); hcr=hcent(V,w); return (V[ix]*hcr).sum(1)/(np.linalg.norm(hcr,axis=1)+1e-9) def ev(x,name='',res=True,seeds=2): dd=D.select('eid','clicked','cut').with_columns(pl.Series('x',x)) g={c:round(roc_auc_score(y[cut==c],np.nan_to_num(x[cut==c],nan=-9)),4) for c in (25,26)} w={c:round(wauc(dd.filter(pl.col('cut')==c),'x'),4) for c in (25,26)} r=resid(x[:,None] if x.ndim==1 else x,seeds) if res else None print(f'{name:34s} glob {g} within {w} resid {r}',flush=True); return g,w,r def resid(X,seeds=2): X=X if X.ndim==2 else X[:,None]; out={25:[],26:[]} for s in range(seeds): p=np.zeros(len(y)) for f in range(5): tr=fold!=f; te=~tr m=lgb.train(dict(objective='binary',learning_rate=0.03,num_leaves=7,min_data_in_leaf=300,bagging_fraction=0.8,bagging_freq=1,lambda_l2=10,verbose=-1,num_threads=2,seed=s),lgb.Dataset(X[tr],y[tr],init_score=base[tr]),150) p[te]=base[te]+m.predict(X[te],raw_score=True) for c in (25,26): out[c].append(roc_auc_score(y[cut==c],p[cut==c])) return {c:round(float(np.mean(v)-roc_auc_score(y[cut==c],base[cut==c])),4) for c,v in out.items()}