cfREF / tests /test_validation.py
qiongli0705's picture
Upload 10 files
703e278 verified
Raw History Blame Contribute Delete
2.5 kB
import unittest
import json
import numpy as np
import torch
from cfref import nested_lopo
from cfref.validation import training_mask
class TestNestedValidation(unittest.TestCase):
@classmethod
def setUpClass(cls):
torch.set_num_threads(1)
rng=np.random.RandomState(21)
cls.S=rng.poisson(100,size=(60,5)).astype(float)
cls.L=rng.poisson(100,size=(60,5)).astype(float)
cls.y=np.tile([0]*12+[1]*8,3);cls.c=np.repeat(['A','B','C'],20)
cls.ids=np.array([str(i) for i in range(60)])
cls.S[20:,-1]=0;cls.L[20:,-1]=0
cls.kw=dict(outer_cohorts=['A'],seeds=(0,),capacities=((8,4),(12,6)),
episodes=3,reference_sizes=(3,),draws=3,threshold_draws=2,
inner_references=3,outer_threshold_references=3)
cls.out=nested_lopo(cls.S,cls.L,cls.y,cls.c,cls.ids,**cls.kw)
def test_reference_and_query_disjoint(self):
for row in self.out['assignments'].itertuples():
self.assertFalse(set(json.loads(row.reference_ids))&set(json.loads(row.query_ids)))
def test_auc_identical_when_only_threshold_changes(self):
p=self.out['draw_metrics'].pivot(index=['held_out','seed','n_ref','draw'],columns='method',values='auc')
np.testing.assert_array_equal(p.logreg_locked,p.logreg_recalibrated)
def test_pairing(self):
m=self.out['draw_metrics']
self.assertTrue((m.groupby(['held_out','seed','n_ref','draw']).query_sha256.nunique()==1).all())
self.assertEqual(len(self.out['paired_differences']),6)
def test_outer_feature_exclusion_and_selection_isolation(self):
a=self.S.copy();a[:20]=a[:20]*1000
b=nested_lopo(a,self.L,self.y,self.c,self.ids,**self.kw)
self.assertNotIn(4,self.out['fold_masks'][0]['kept_indices'])
self.assertEqual(self.out['fold_masks'],b['fold_masks'])
self.assertTrue(self.out['capacity_picks'].equals(b['capacity_picks']))
self.assertTrue(self.out['inner_selection'].equals(b['inner_selection']))
def test_inner_mask_does_not_use_inner_target(self):
a=self.S.copy();train=self.c=='B';a[~train]=1e9
np.testing.assert_array_equal(training_mask(self.S,self.L,train),training_mask(a,self.L,train))
def test_duplicate_ids_rejected(self):
ids=self.ids.copy();ids[1]=ids[0]
with self.assertRaisesRegex(ValueError,'unique'):
nested_lopo(self.S,self.L,self.y,self.c,ids,**self.kw)
if __name__=='__main__':unittest.main()