experiment: validate beta selection on one paired full condition
This commit is contained in:
1 parent
ad9aa53ba7
commit
50f2da7216
8 files changed
+12434
-150
No files matched your search
@@ -0,0 +1,51 @@
|
||||
beta,client_id,n_train,min_pos_Nij,max_Nij,test_rare_f1,test_rare_recall,test_macro_f1,test_acc,val_rare_f1,val_rare_recall
|
||||
0.00,0,94564,18,48503,0.4995519291027485,0.9921372408863474,0.6068173367966223,0.8913947112408243,0.8875379939209728,0.9864864864864865
|
||||
0.00,1,50631,69,34165,0.3843553008595989,0.6648852971845672,0.6486242436476237,0.9225095530080867,0.43045783132530124,0.6944444444444444
|
||||
0.00,2,52476,5,32409,0.8823127539462803,1.0,0.7728569293315674,0.9196444444444445,0.7407407407407407,1.0
|
||||
0.00,3,69609,140,49283,0.6162162162162163,0.5757575757575758,0.8397394354975644,0.9857448851466135,0.7126436781609196,0.6888888888888889
|
||||
0.00,4,18521,1,14033,0.1375107083096483,0.7972972972972974,0.6020588243275056,0.6915242824678057,0.8619718309859155,0.9807692307692307
|
||||
0.00,5,41886,2,27596,0.7126436781609197,0.9959839357429718,0.7651475774621735,0.9101290574892452,0.28180563997182917,0.9848484848484849
|
||||
0.00,6,45085,44,34309,0.3787878787878788,1.0,0.7092622710304912,0.9331267329962486,0.5320018964086761,1.0
|
||||
0.00,7,84396,10,57789,0.047041500368117176,0.8571428571428572,0.6094373847709916,0.9094209211825521,0.29411764705882354,0.9444444444444444
|
||||
0.00,8,85073,4,68657,0.6316180325004368,0.975206611570248,0.8034446527877533,0.9593320235756385,0.5012611838161273,0.9813953488372094
|
||||
0.00,9,27668,12,22604,0.391006006006006,0.6304721030042919,0.5530864277589688,0.8042184646202792,0.3308578745198464,0.641025641025641
|
||||
0.25,0,94564,18,48503,0.5110279671296534,0.9917798427448177,0.6122053493827229,0.9059432210135314,0.8971962616822431,0.972972972972973
|
||||
0.25,1,50631,69,34165,0.39677115606585267,0.683133472367049,0.6640266458191656,0.9332918629106313,0.4363790334821964,0.7013888888888888
|
||||
0.25,2,52476,5,32409,0.8932300313595277,1.0,0.7822731669528147,0.9262222222222222,0.8,1.0
|
||||
0.25,3,69609,140,49283,0.6096256684491979,0.5757575757575758,0.842542396138789,0.9864096314351134,0.7272727272727273,0.7111111111111111
|
||||
0.25,4,18521,1,14033,0.1370011419201827,0.7972972972972974,0.6132568687939982,0.7093678983250569,0.8571428571428572,0.9807692307692307
|
||||
0.25,5,41886,2,27596,0.7626339969372129,1.0,0.7656983269300117,0.9234258897145092,0.3131615278416935,0.9898989898989898
|
||||
0.25,6,45085,44,34309,0.40922072623419015,1.0,0.7176182213955545,0.9372043712281847,0.5400683913172762,0.9642857142857143
|
||||
0.25,7,84396,10,57789,0.05790960451977401,0.8571428571428572,0.6190468740355366,0.9239124121507812,0.29858525688756515,0.9444444444444444
|
||||
0.25,8,85073,4,68657,0.6614490161001789,0.9594155844155845,0.8123526609102988,0.9671905697445973,0.5063361579319026,0.9837209302325581
|
||||
0.25,9,27668,12,22604,0.3979347640285311,0.6412017167381974,0.5633288254699136,0.8157072998291404,0.3417318982387475,0.6688034188034189
|
||||
0.50,0,94564,18,48503,0.512290254862411,0.9885632594710507,0.6157506652321422,0.8995754842133192,0.9306930693069307,0.9527027027027027
|
||||
0.50,1,50631,69,34165,0.3997755462609072,0.6940823774765381,0.6661761632145973,0.9264788648952872,0.4413828325877919,0.7124999999999999
|
||||
0.50,2,52476,5,32409,0.9038072776280324,0.976,0.7840044573244555,0.9194666666666667,0.8333333333333333,1.0
|
||||
0.50,3,69609,140,49283,0.548076923076923,0.5757575757575758,0.8283908856029829,0.9845631139670581,0.7555555555555555,0.7555555555555555
|
||||
0.50,4,18521,1,14033,0.14114416475972538,0.7972972972972974,0.633397359958961,0.7090312263277502,0.8660968660968661,0.9743589743589743
|
||||
0.50,5,41886,2,27596,0.8330522765598651,0.9919678714859438,0.7897951478339219,0.9199843566679703,0.3727944926058133,0.9898989898989898
|
||||
0.50,6,45085,44,34309,0.4421820010055304,1.0,0.7242896435001043,0.9334529440548035,0.536609144974164,0.9642857142857143
|
||||
0.50,7,84396,10,57789,0.0476701869438899,0.8492063492063492,0.6201912087601653,0.9144740663297903,0.2654713707345286,0.9444444444444444
|
||||
0.50,8,85073,4,68657,0.6342776536969554,0.9532172373081464,0.8037879798749075,0.9589390962671905,0.5000157678965627,0.9767441860465116
|
||||
0.50,9,27668,12,22604,0.4051075371940363,0.6540772532188841,0.5706270497272496,0.8158251340364108,0.35566502463054184,0.6965811965811965
|
||||
0.75,0,94564,18,48503,0.49852708011546776,0.9305694543721705,0.6157366471089164,0.8903334217741222,0.9166666666666667,0.8918918918918919
|
||||
0.75,1,50631,69,34165,0.3950598098818963,0.6940823774765381,0.6616396943744374,0.9189253236174058,0.4390983440522611,0.711111111111111
|
||||
0.75,2,52476,5,32409,0.8949207257273619,0.952,0.7766807853440173,0.8968888888888888,0.8333333333333333,1.0
|
||||
0.75,3,69609,140,49283,0.35962145110410093,0.5757575757575758,0.7905690740085016,0.9793190043577812,0.7415730337078651,0.7333333333333333
|
||||
0.75,4,18521,1,14033,0.15006641568143958,0.7972972972972974,0.6440684296718677,0.7001094183991247,0.8411764705882353,0.9166666666666666
|
||||
0.75,5,41886,2,27596,0.8338983050847457,0.9879518072289156,0.7926623902258025,0.9104419241298397,0.37074068149096145,0.9898989898989898
|
||||
0.75,6,45085,44,34309,0.4477565595404441,1.0,0.7195049733487044,0.9106181699559615,0.5318530266983875,0.9642857142857143
|
||||
0.75,7,84396,10,57789,0.03969509578636252,0.8174603174603174,0.6169939163182777,0.904571063483766,0.25831969448990727,0.9444444444444444
|
||||
0.75,8,85073,4,68657,0.6208429867121025,0.9487898465171193,0.7924831635124538,0.9469548133595285,0.5019948230864674,0.9304909560723513
|
||||
0.75,9,27668,12,22604,0.400258937520882,0.6476394849785407,0.5718262874717445,0.8091675013256349,0.34527541424093144,0.6965811965811965
|
||||
1.00,0,94564,18,48503,0.4818296933718207,0.8849535382416012,0.612389815191912,0.8770673034403467,0.9077490774907748,0.831081081081081
|
||||
1.00,1,50631,69,34165,0.39042298483639265,0.683133472367049,0.6565215242583741,0.9103054000414704,0.4280463143311497,0.6916666666666667
|
||||
1.00,2,52476,5,32409,0.8458762886597938,0.9079999999999999,0.7579100758793161,0.8709333333333333,0.7692307692307693,1.0
|
||||
1.00,3,69609,140,49283,0.27403846153846156,0.5757575757575758,0.7713507627602365,0.9729669842676711,0.7272727272727273,0.7111111111111111
|
||||
1.00,4,18521,1,14033,0.12323186430410421,0.7639639639639639,0.6411866463651053,0.7410992340712061,0.7859237536656892,0.8589743589743589
|
||||
1.00,5,41886,2,27596,0.7748031496062993,0.9879518072289156,0.7790197411231496,0.8925303089558075,0.32319994363815696,0.9848484848484849
|
||||
1.00,6,45085,44,34309,0.41129575567033466,1.0,0.7087816117284831,0.8851737073886805,0.5186591560629684,0.9285714285714286
|
||||
1.00,7,84396,10,57789,0.033061148495890626,0.7857142857142857,0.6117787034769915,0.8940872393564501,0.2510204081632653,0.9444444444444444
|
||||
1.00,8,85073,4,68657,0.6041990809422151,0.9487898465171193,0.7637750644835428,0.9316306483300589,0.5004931186519341,0.9304909560723513
|
||||
1.00,9,27668,12,22604,0.3936995850971967,0.6390557939914163,0.5889039404362588,0.838802804454133,0.3028365305787834,0.6688034188034189
|
||||
|
+11313
File diff suppressed because it is too large.
Load diff
+46
@@ -0,0 +1,46 @@
|
||||
class_id,class_name,beta,n_contributors,support_min,support_max,support_mean,prototype_norm,reference_norm_beta0,displacement_from_beta0,relative_displacement
|
||||
0,C&C,0.0,10,1,966,200.4,5.81850391528672,5.81850391528672,0.0,0.0
|
||||
0,C&C,0.25,10,1,966,200.4,5.510286369188621,5.81850391528672,0.7965140380628059,0.13689327182029676
|
||||
0,C&C,0.5,10,1,966,200.4,5.278134014922836,5.81850391528672,1.4197451476394127,0.24400518901592105
|
||||
0,C&C,0.75,10,1,966,200.4,5.112640672849202,5.81850391528672,1.8599716115561264,0.3196649239453974
|
||||
0,C&C,1.0,10,1,966,200.4,4.988900967983733,5.81850391528672,2.1557306865858097,0.37049570095194845
|
||||
1,Exfiltration,0.0,9,45,6305,1721.5555555555557,7.242890510522882,7.242890510522882,0.0,0.0
|
||||
1,Exfiltration,0.25,9,45,6305,1721.5555555555557,7.332133171734469,7.242890510522882,0.564975966349673,0.07800421192738505
|
||||
1,Exfiltration,0.5,9,45,6305,1721.5555555555557,7.370154863192438,7.242890510522882,0.9364837301255268,0.12929696075965116
|
||||
1,Exfiltration,0.75,9,45,6305,1721.5555555555557,7.378891442696988,7.242890510522882,1.2417976657519203,0.17145056437726985
|
||||
1,Exfiltration,1.0,9,45,6305,1721.5555555555557,7.382636843813542,7.242890510522882,1.5471979064159855,0.2136160838229059
|
||||
2,Exploitation,0.0,8,10,353,99.125,5.654243351061799,5.654243351061799,0.0,0.0
|
||||
2,Exploitation,0.25,8,10,353,99.125,5.416735148887854,5.654243351061799,0.4992592412018676,0.08829815241470156
|
||||
2,Exploitation,0.5,8,10,353,99.125,5.22366961142136,5.654243351061799,1.0125335941087894,0.17907499398989393
|
||||
2,Exploitation,0.75,8,10,353,99.125,5.0940205859608465,5.654243351061799,1.4982123491722337,0.26497132439319
|
||||
2,Exploitation,1.0,8,10,353,99.125,5.025379750610227,5.654243351061799,1.934383194968876,0.3421117689612036
|
||||
3,Lateral_movement,0.0,10,49,8385,2211.7,5.571182640715375,5.571182640715375,0.0,0.0
|
||||
3,Lateral_movement,0.25,10,49,8385,2211.7,5.7916154156522595,5.571182640715375,0.7543102387618712,0.13539499373960803
|
||||
3,Lateral_movement,0.5,10,49,8385,2211.7,6.055975082042928,5.571182640715375,1.3479271988117953,0.2419463309209897
|
||||
3,Lateral_movement,0.75,10,49,8385,2211.7,6.2899803645536005,5.571182640715375,1.776607909870438,0.31889241915829747
|
||||
3,Lateral_movement,1.0,10,49,8385,2211.7,6.465847026093679,5.571182640715375,2.0688588443755878,0.37135003064805877
|
||||
4,Normal,0.0,10,604,68657,29277.7,6.042285009407229,6.042285009407229,0.0,0.0
|
||||
4,Normal,0.25,10,604,68657,29277.7,6.387573421391307,6.042285009407229,0.4522766775093571,0.07485192717741845
|
||||
4,Normal,0.5,10,604,68657,29277.7,6.595264342297928,6.042285009407229,0.7146990338285016,0.11828290666788925
|
||||
4,Normal,0.75,10,604,68657,29277.7,6.720334273286351,6.042285009407229,0.8756391811740736,0.14491854982192856
|
||||
4,Normal,1.0,10,604,68657,29277.7,6.803080625783804,6.042285009407229,0.9899061725928462,0.16382977152710637
|
||||
5,RDOS,0.0,10,168,49283,9888.3,8.705113176029744,8.705113176029744,0.0,0.0
|
||||
5,RDOS,0.25,10,168,49283,9888.3,8.772588209172795,8.705113176029744,0.3633215970184691,0.04173657362880766
|
||||
5,RDOS,0.5,10,168,49283,9888.3,8.811154949619254,8.705113176029744,0.6718616497957892,0.07718011658318427
|
||||
5,RDOS,0.75,10,168,49283,9888.3,8.840855101677697,8.705113176029744,0.9758862376670907,0.11210494544221147
|
||||
5,RDOS,1.0,10,168,49283,9888.3,8.874204913906459,8.705113176029744,1.2860320043774807,0.1477329448075043
|
||||
6,Reconnaissance,0.0,10,1137,29234,8916.1,6.1132865312061595,6.1132865312061595,0.0,0.0
|
||||
6,Reconnaissance,0.25,10,1137,29234,8916.1,6.3313502624680265,6.1132865312061595,0.3500984939064864,0.05726845815574941
|
||||
6,Reconnaissance,0.5,10,1137,29234,8916.1,6.540280247643444,6.1132865312061595,0.6864476003243064,0.11228781717006636
|
||||
6,Reconnaissance,0.75,10,1137,29234,8916.1,6.716129778242917,6.1132865312061595,0.970753367392759,0.1587940238752768
|
||||
6,Reconnaissance,1.0,10,1137,29234,8916.1,6.8462376211276155,6.1132865312061595,1.183931540468372,0.19366531151857863
|
||||
7,Tampering,0.0,9,2,1266,398.44444444444446,5.095948820849879,5.095948820849879,0.0,0.0
|
||||
7,Tampering,0.25,9,2,1266,398.44444444444446,5.222475642896568,5.095948820849879,0.7528833961261016,0.1477415536525226
|
||||
7,Tampering,0.5,9,2,1266,398.44444444444446,5.2417538146739915,5.095948820849879,1.1900181694152834,0.2335223942097632
|
||||
7,Tampering,0.75,9,2,1266,398.44444444444446,5.214766049805263,5.095948820849879,1.489091829390507,0.29221090747574724
|
||||
7,Tampering,1.0,9,2,1266,398.44444444444446,5.186261162459578,5.095948820849879,1.7365220144389066,0.3407651990800994
|
||||
8,Weaponization,0.0,10,18,32409,4509.4,6.165797271067825,6.165797271067825,0.0,0.0
|
||||
8,Weaponization,0.25,10,18,32409,4509.4,6.324316870213558,6.165797271067825,1.0213874306568795,0.16565374853461415
|
||||
8,Weaponization,0.5,10,18,32409,4509.4,6.57305363177223,6.165797271067825,2.0215287048880053,0.3278616886049363
|
||||
8,Weaponization,0.75,10,18,32409,4509.4,6.878957349558733,6.165797271067825,2.9039530195295855,0.47097770034639236
|
||||
8,Weaponization,1.0,10,18,32409,4509.4,7.15445660681278,6.165797271067825,3.5588066747258478,0.577185158426319
|
||||
|
+431
@@ -0,0 +1,431 @@
|
||||
class_id,class_name,beta,client_id,N_ij,weight
|
||||
0,C&C,0.0,0,126.0,0.1
|
||||
0,C&C,0.0,1,559.0,0.1
|
||||
0,C&C,0.0,2,92.0,0.1
|
||||
0,C&C,0.0,3,966.0,0.1
|
||||
0,C&C,0.0,4,1.0,0.1
|
||||
0,C&C,0.0,5,4.0,0.1
|
||||
0,C&C,0.0,6,44.0,0.1
|
||||
0,C&C,0.0,7,20.0,0.1
|
||||
0,C&C,0.0,8,4.0,0.1
|
||||
0,C&C,0.0,9,188.0,0.1
|
||||
0,C&C,0.25,0,126.0,0.1151076953459115
|
||||
0,C&C,0.25,1,559.0,0.16705699856522024
|
||||
0,C&C,0.25,2,92.0,0.10640417756135012
|
||||
0,C&C,0.25,3,966.0,0.19153846560388027
|
||||
0,C&C,0.25,4,1.0,0.03435672212828583
|
||||
0,C&C,0.25,5,4.0,0.048587742392505656
|
||||
0,C&C,0.25,6,44.0,0.08848606687234023
|
||||
0,C&C,0.25,7,20.0,0.07265562136892396
|
||||
0,C&C,0.25,8,4.0,0.048587742392505656
|
||||
0,C&C,0.25,9,188.0,0.12721876776907656
|
||||
0,C&C,0.5,0,126.0,0.1065422012127861
|
||||
0,C&C,0.5,1,559.0,0.22441004697943928
|
||||
0,C&C,0.5,2,92.0,0.09103959276541436
|
||||
0,C&C,0.5,3,966.0,0.2950019970006494
|
||||
0,C&C,0.5,4,1.0,0.00949153367073754
|
||||
0,C&C,0.5,5,4.0,0.01898306734147508
|
||||
0,C&C,0.5,6,44.0,0.06295971174172223
|
||||
0,C&C,0.5,7,20.0,0.042447428996994496
|
||||
0,C&C,0.5,8,4.0,0.01898306734147508
|
||||
0,C&C,0.5,9,188.0,0.13014135294930645
|
||||
0,C&C,0.75,0,126.0,0.0855655871345543
|
||||
0,C&C,0.75,1,559.0,0.2615652717477686
|
||||
0,C&C,0.75,2,92.0,0.06758683296367546
|
||||
0,C&C,0.75,3,966.0,0.394233994745809
|
||||
0,C&C,0.75,4,1.0,0.002275208627619524
|
||||
0,C&C,0.75,5,4.0,0.0064352617968156155
|
||||
0,C&C,0.75,6,44.0,0.03886965923679492
|
||||
0,C&C,0.75,7,20.0,0.02151759468302796
|
||||
0,C&C,0.75,8,4.0,0.0064352617968156155
|
||||
0,C&C,0.75,9,188.0,0.11551532726711894
|
||||
0,C&C,1.0,0,126.0,0.06287425149700598
|
||||
0,C&C,1.0,1,559.0,0.27894211576846306
|
||||
0,C&C,1.0,2,92.0,0.04590818363273453
|
||||
0,C&C,1.0,3,966.0,0.4820359281437126
|
||||
0,C&C,1.0,4,1.0,0.000499001996007984
|
||||
0,C&C,1.0,5,4.0,0.001996007984031936
|
||||
0,C&C,1.0,6,44.0,0.021956087824351298
|
||||
0,C&C,1.0,7,20.0,0.00998003992015968
|
||||
0,C&C,1.0,8,4.0,0.001996007984031936
|
||||
0,C&C,1.0,9,188.0,0.09381237524950099
|
||||
1,Exfiltration,0.0,0,901.0,0.1111111111111111
|
||||
1,Exfiltration,0.0,1,2212.0,0.1111111111111111
|
||||
1,Exfiltration,0.0,2,6305.0,0.1111111111111111
|
||||
1,Exfiltration,0.0,3,1509.0,0.1111111111111111
|
||||
1,Exfiltration,0.0,4,1151.0,0.1111111111111111
|
||||
1,Exfiltration,0.0,5,554.0,0.1111111111111111
|
||||
1,Exfiltration,0.0,7,2414.0,0.1111111111111111
|
||||
1,Exfiltration,0.0,8,45.0,0.1111111111111111
|
||||
1,Exfiltration,0.0,9,403.0,0.1111111111111111
|
||||
1,Exfiltration,0.25,0,901.0,0.10488370771254768
|
||||
1,Exfiltration,0.25,1,2212.0,0.13128742018910042
|
||||
1,Exfiltration,0.25,2,6305.0,0.17058785429598938
|
||||
1,Exfiltration,0.25,3,1509.0,0.11931612591243025
|
||||
1,Exfiltration,0.25,4,1151.0,0.11150533960183845
|
||||
1,Exfiltration,0.25,5,554.0,0.09287616512675537
|
||||
1,Exfiltration,0.25,7,2414.0,0.1341872183614202
|
||||
1,Exfiltration,0.25,8,45.0,0.049582676014601146
|
||||
1,Exfiltration,0.25,9,403.0,0.08577349278531715
|
||||
1,Exfiltration,0.5,0,901.0,0.09132555422282185
|
||||
1,Exfiltration,0.5,1,2212.0,0.14309434870683396
|
||||
1,Exfiltration,0.5,2,6305.0,0.24158639122064396
|
||||
1,Exfiltration,0.5,3,1509.0,0.11818831496599357
|
||||
1,Exfiltration,0.5,4,1151.0,0.10322088606347385
|
||||
1,Exfiltration,0.5,5,554.0,0.0716118351658491
|
||||
1,Exfiltration,0.5,7,2414.0,0.14948532289176902
|
||||
1,Exfiltration,0.5,8,45.0,0.02040967916975066
|
||||
1,Exfiltration,0.5,9,403.0,0.06107766759286411
|
||||
1,Exfiltration,0.75,0,901.0,0.07474547195934379
|
||||
1,Exfiltration,0.75,1,2212.0,0.14659870610885303
|
||||
1,Exfiltration,0.75,2,6305.0,0.32159190878390587
|
||||
1,Exfiltration,0.75,3,1509.0,0.11004193666101915
|
||||
1,Exfiltration,0.75,4,1151.0,0.0898147753510184
|
||||
1,Exfiltration,0.75,5,554.0,0.05190074821259029
|
||||
1,Exfiltration,0.75,7,2414.0,0.15652879594112112
|
||||
1,Exfiltration,0.75,8,45.0,0.007896791666047197
|
||||
1,Exfiltration,0.75,9,403.0,0.04088086531610112
|
||||
1,Exfiltration,1.0,0,901.0,0.05815154253259326
|
||||
1,Exfiltration,1.0,1,2212.0,0.14276494126758746
|
||||
1,Exfiltration,1.0,2,6305.0,0.4069317155027753
|
||||
1,Exfiltration,1.0,3,1509.0,0.09739253904737318
|
||||
1,Exfiltration,1.0,4,1151.0,0.07428682070478895
|
||||
1,Exfiltration,1.0,5,554.0,0.03575577642958565
|
||||
1,Exfiltration,1.0,7,2414.0,0.15580224603072157
|
||||
1,Exfiltration,1.0,8,45.0,0.002904350070995224
|
||||
1,Exfiltration,1.0,9,403.0,0.02601006841357945
|
||||
2,Exploitation,0.0,1,69.0,0.125
|
||||
2,Exploitation,0.0,2,353.0,0.125
|
||||
2,Exploitation,0.0,3,140.0,0.125
|
||||
2,Exploitation,0.0,4,18.0,0.125
|
||||
2,Exploitation,0.0,5,53.0,0.125
|
||||
2,Exploitation,0.0,7,10.0,0.125
|
||||
2,Exploitation,0.0,8,138.0,0.125
|
||||
2,Exploitation,0.0,9,12.0,0.125
|
||||
2,Exploitation,0.25,1,69.0,0.12820070837603917
|
||||
2,Exploitation,0.25,2,353.0,0.19280656995181955
|
||||
2,Exploitation,0.25,3,140.0,0.15300659874710393
|
||||
2,Exploitation,0.25,4,18.0,0.09162126389668253
|
||||
2,Exploitation,0.25,5,53.0,0.12001820291832185
|
||||
2,Exploitation,0.25,7,10.0,0.07910030393054958
|
||||
2,Exploitation,0.25,8,138.0,0.15245719454917472
|
||||
2,Exploitation,0.25,9,12.0,0.08278915763030867
|
||||
2,Exploitation,0.5,1,69.0,0.12069450280550381
|
||||
2,Exploitation,0.5,2,353.0,0.2729922370196399
|
||||
2,Exploitation,0.5,3,140.0,0.17192022168391838
|
||||
2,Exploitation,0.5,4,18.0,0.061645190243919123
|
||||
2,Exploitation,0.5,5,53.0,0.10577934645369526
|
||||
2,Exploitation,0.5,7,10.0,0.04594761195710334
|
||||
2,Exploitation,0.5,8,138.0,0.17068780277142104
|
||||
2,Exploitation,0.5,9,12.0,0.05033308706479918
|
||||
2,Exploitation,0.75,1,69.0,0.10556071811114456
|
||||
2,Exploitation,0.75,2,353.0,0.35908440732013547
|
||||
2,Exploitation,0.75,3,140.0,0.1794574716279232
|
||||
2,Exploitation,0.75,4,18.0,0.038531853176504316
|
||||
2,Exploitation,0.75,5,53.0,0.08661087380030844
|
||||
2,Exploitation,0.75,7,10.0,0.024795080232788844
|
||||
2,Exploitation,0.75,8,138.0,0.17753125890253862
|
||||
2,Exploitation,0.75,9,12.0,0.028428336828656486
|
||||
2,Exploitation,1.0,1,69.0,0.08701134930643127
|
||||
2,Exploitation,1.0,2,353.0,0.4451450189155107
|
||||
2,Exploitation,1.0,3,140.0,0.17654476670870115
|
||||
2,Exploitation,1.0,4,18.0,0.02269861286254729
|
||||
2,Exploitation,1.0,5,53.0,0.06683480453972257
|
||||
2,Exploitation,1.0,7,10.0,0.012610340479192938
|
||||
2,Exploitation,1.0,8,138.0,0.17402269861286254
|
||||
2,Exploitation,1.0,9,12.0,0.015132408575031526
|
||||
3,Lateral_movement,0.0,0,5915.0,0.1
|
||||
3,Lateral_movement,0.0,1,180.0,0.1
|
||||
3,Lateral_movement,0.0,2,949.0,0.1
|
||||
3,Lateral_movement,0.0,3,630.0,0.1
|
||||
3,Lateral_movement,0.0,4,1747.0,0.1
|
||||
3,Lateral_movement,0.0,5,315.0,0.1
|
||||
3,Lateral_movement,0.0,6,588.0,0.1
|
||||
3,Lateral_movement,0.0,7,8385.0,0.1
|
||||
3,Lateral_movement,0.0,8,3359.0,0.1
|
||||
3,Lateral_movement,0.0,9,49.0,0.1
|
||||
3,Lateral_movement,0.25,0,5915.0,0.1501082860475012
|
||||
3,Lateral_movement,0.25,1,180.0,0.06269517301380084
|
||||
3,Lateral_movement,0.25,2,949.0,0.09500195270506487
|
||||
3,Lateral_movement,0.25,3,630.0,0.08575335420491714
|
||||
3,Lateral_movement,0.25,4,1747.0,0.11065962780573274
|
||||
3,Lateral_movement,0.25,5,315.0,0.07210968814689687
|
||||
3,Lateral_movement,0.25,6,588.0,0.08428694450008248
|
||||
3,Lateral_movement,0.25,7,8385.0,0.16379164537659827
|
||||
3,Lateral_movement,0.25,8,3359.0,0.13030722009687146
|
||||
3,Lateral_movement,0.25,9,49.0,0.04528610810253415
|
||||
3,Lateral_movement,0.5,0,5915.0,0.1989618416073142
|
||||
3,Lateral_movement,0.5,1,180.0,0.034707926590178705
|
||||
3,Lateral_movement,0.5,2,949.0,0.07969398135686781
|
||||
3,Lateral_movement,0.5,3,630.0,0.06493258495287492
|
||||
3,Lateral_movement,0.5,4,1747.0,0.10812817429705543
|
||||
3,Lateral_movement,0.5,5,315.0,0.04591427114014944
|
||||
3,Lateral_movement,0.5,6,588.0,0.0627308367770708
|
||||
3,Lateral_movement,0.5,7,8385.0,0.23688848537124346
|
||||
3,Lateral_movement,0.5,8,3359.0,0.14993306515737906
|
||||
3,Lateral_movement,0.5,9,49.0,0.01810883274986615
|
||||
3,Lateral_movement,0.75,0,5915.0,0.23911291675609309
|
||||
3,Lateral_movement,0.75,1,180.0,0.017421733025013916
|
||||
3,Lateral_movement,0.75,2,949.0,0.060615910738470946
|
||||
3,Lateral_movement,0.75,3,630.0,0.04458023848929545
|
||||
3,Lateral_movement,0.75,4,1747.0,0.09579804672694094
|
||||
3,Lateral_movement,0.75,5,315.0,0.026507568399994158
|
||||
3,Lateral_movement,0.75,6,588.0,0.04233211526127385
|
||||
3,Lateral_movement,0.75,7,8385.0,0.3106449340481183
|
||||
3,Lateral_movement,0.75,8,3359.0,0.15642079119509741
|
||||
3,Lateral_movement,0.75,9,49.0,0.006565745359701934
|
||||
3,Lateral_movement,1.0,0,5915.0,0.2674413347198987
|
||||
3,Lateral_movement,1.0,1,180.0,0.008138535967807569
|
||||
3,Lateral_movement,1.0,2,949.0,0.0429081701858299
|
||||
3,Lateral_movement,1.0,3,630.0,0.02848487588732649
|
||||
3,Lateral_movement,1.0,4,1747.0,0.07898901297644347
|
||||
3,Lateral_movement,1.0,5,315.0,0.014242437943663245
|
||||
3,Lateral_movement,1.0,6,588.0,0.026585884161504723
|
||||
3,Lateral_movement,1.0,7,8385.0,0.3791201338337026
|
||||
3,Lateral_movement,1.0,8,3359.0,0.15187412397703123
|
||||
3,Lateral_movement,1.0,9,49.0,0.0022154903467920604
|
||||
4,Normal,0.0,0,48503.0,0.1
|
||||
4,Normal,0.0,1,34165.0,0.1
|
||||
4,Normal,0.0,2,604.0,0.1
|
||||
4,Normal,0.0,3,13892.0,0.1
|
||||
4,Normal,0.0,4,733.0,0.1
|
||||
4,Normal,0.0,5,11521.0,0.1
|
||||
4,Normal,0.0,6,34309.0,0.1
|
||||
4,Normal,0.0,7,57789.0,0.1
|
||||
4,Normal,0.0,8,68657.0,0.1
|
||||
4,Normal,0.0,9,22604.0,0.1
|
||||
4,Normal,0.25,0,48503.0,0.12643311355099549
|
||||
4,Normal,0.25,1,34165.0,0.11582812842102214
|
||||
4,Normal,0.25,2,604.0,0.04223552698344285
|
||||
4,Normal,0.25,3,13892.0,0.09249321518664805
|
||||
4,Normal,0.25,4,733.0,0.044329688172499916
|
||||
4,Normal,0.25,5,11521.0,0.08826554900973617
|
||||
4,Normal,0.25,6,34309.0,0.11594998523709188
|
||||
4,Normal,0.25,7,57789.0,0.1320930528829076
|
||||
4,Normal,0.25,8,68657.0,0.1379081359749846
|
||||
4,Normal,0.25,9,22604.0,0.10446360458067135
|
||||
4,Normal,0.5,0,48503.0,0.1448989887460024
|
||||
4,Normal,0.5,1,34165.0,0.12161069385961577
|
||||
4,Normal,0.5,2,604.0,0.016169609181656136
|
||||
4,Normal,0.5,3,13892.0,0.07754672143303329
|
||||
4,Normal,0.5,4,733.0,0.017812834840683953
|
||||
4,Normal,0.5,5,11521.0,0.07061974453269211
|
||||
4,Normal,0.5,6,34309.0,0.12186670917054386
|
||||
4,Normal,0.5,7,57789.0,0.1581625446069081
|
||||
4,Normal,0.5,8,68657.0,0.17239452345619735
|
||||
4,Normal,0.5,9,22604.0,0.09891763017266696
|
||||
4,Normal,0.75,0,48503.0,0.15736844444383508
|
||||
4,Normal,0.75,1,34165.0,0.12099774308796071
|
||||
4,Normal,0.75,2,604.0,0.005866362622349557
|
||||
4,Normal,0.75,3,13892.0,0.06161192554082022
|
||||
4,Normal,0.75,4,733.0,0.006782958842895826
|
||||
4,Normal,0.75,5,11521.0,0.053543756058172465
|
||||
4,Normal,0.75,6,34309.0,0.12138003149725662
|
||||
4,Normal,0.75,7,57789.0,0.17946306696598666
|
||||
4,Normal,0.75,8,68657.0,0.2042230782495533
|
||||
4,Normal,0.75,9,22604.0,0.08876263269116956
|
||||
4,Normal,1.0,0,48503.0,0.16566533573333972
|
||||
4,Normal,1.0,1,34165.0,0.11669290962063276
|
||||
4,Normal,1.0,2,604.0,0.0020630035829317193
|
||||
4,Normal,1.0,3,13892.0,0.047449082407429545
|
||||
4,Normal,1.0,4,733.0,0.0025036119640545534
|
||||
4,Normal,1.0,5,11521.0,0.03935076867376877
|
||||
4,Normal,1.0,6,34309.0,0.1171847515344443
|
||||
4,Normal,1.0,7,57789.0,0.19738230803649193
|
||||
4,Normal,1.0,8,68657.0,0.23450271025387923
|
||||
4,Normal,1.0,9,22604.0,0.07720551819302746
|
||||
5,RDOS,0.0,0,9867.0,0.1
|
||||
5,RDOS,0.0,1,6640.0,0.1
|
||||
5,RDOS,0.0,2,10123.0,0.1
|
||||
5,RDOS,0.0,3,49283.0,0.1
|
||||
5,RDOS,0.0,4,168.0,0.1
|
||||
5,RDOS,0.0,5,1150.0,0.1
|
||||
5,RDOS,0.0,6,5683.0,0.1
|
||||
5,RDOS,0.0,7,9870.0,0.1
|
||||
5,RDOS,0.0,8,5008.0,0.1
|
||||
5,RDOS,0.0,9,1091.0,0.1
|
||||
5,RDOS,0.25,0,9867.0,0.11567973944230156
|
||||
5,RDOS,0.25,1,6640.0,0.10477388301010801
|
||||
5,RDOS,0.25,2,10123.0,0.11642287745471731
|
||||
5,RDOS,0.25,3,49283.0,0.1729359579215234
|
||||
5,RDOS,0.25,4,168.0,0.041786725492481906
|
||||
5,RDOS,0.25,5,1150.0,0.06759047208536309
|
||||
5,RDOS,0.25,6,5683.0,0.10077560955092968
|
||||
5,RDOS,0.25,7,9870.0,0.11568853136632039
|
||||
5,RDOS,0.25,8,5008.0,0.09763984914273084
|
||||
5,RDOS,0.25,9,1091.0,0.06670635453352391
|
||||
5,RDOS,0.5,0,9867.0,0.11984639914435963
|
||||
5,RDOS,0.5,1,6640.0,0.0983142488701723
|
||||
5,RDOS,0.5,2,10123.0,0.12139115517749137
|
||||
5,RDOS,0.5,3,49283.0,0.2678434277048929
|
||||
5,RDOS,0.5,4,168.0,0.0156382109316702
|
||||
5,RDOS,0.5,5,1150.0,0.04091488605243881
|
||||
5,RDOS,0.5,6,5683.0,0.09095388492115096
|
||||
5,RDOS,0.5,7,9870.0,0.11986461703595143
|
||||
5,RDOS,0.5,8,5008.0,0.08538165838381333
|
||||
5,RDOS,0.5,9,1091.0,0.039851511778059096
|
||||
5,RDOS,0.75,0,9867.0,0.11357825947097776
|
||||
5,RDOS,0.75,1,6640.0,0.08438833581318253
|
||||
5,RDOS,0.75,2,10123.0,0.11578126507487838
|
||||
5,RDOS,0.75,3,49283.0,0.3794715449540076
|
||||
5,RDOS,0.75,4,168.0,0.005353506375321114
|
||||
5,RDOS,0.75,5,1150.0,0.022655817788480442
|
||||
5,RDOS,0.75,6,5683.0,0.07509129687510661
|
||||
5,RDOS,0.75,7,9870.0,0.11360415805947478
|
||||
5,RDOS,0.75,8,5008.0,0.06829746795700407
|
||||
5,RDOS,0.75,9,1091.0,0.021778347631566747
|
||||
5,RDOS,1.0,0,9867.0,0.0997845939140196
|
||||
5,RDOS,1.0,1,6640.0,0.06715006623989968
|
||||
5,RDOS,1.0,2,10123.0,0.10237351213049765
|
||||
5,RDOS,1.0,3,49283.0,0.4983970955573759
|
||||
5,RDOS,1.0,4,168.0,0.0016989775795637268
|
||||
5,RDOS,1.0,5,1150.0,0.011629906050585035
|
||||
5,RDOS,1.0,6,5683.0,0.057471961813456304
|
||||
5,RDOS,1.0,7,9870.0,0.09981493279936896
|
||||
5,RDOS,1.0,8,5008.0,0.050645712609852046
|
||||
5,RDOS,1.0,9,1091.0,0.011033241305381107
|
||||
6,Reconnaissance,0.0,0,29234.0,0.1
|
||||
6,Reconnaissance,0.0,1,5054.0,0.1
|
||||
6,Reconnaissance,0.0,2,1636.0,0.1
|
||||
6,Reconnaissance,0.0,3,1137.0,0.1
|
||||
6,Reconnaissance,0.0,4,14033.0,0.1
|
||||
6,Reconnaissance,0.0,5,27596.0,0.1
|
||||
6,Reconnaissance,0.0,6,3655.0,0.1
|
||||
6,Reconnaissance,0.0,7,2431.0,0.1
|
||||
6,Reconnaissance,0.0,8,1662.0,0.1
|
||||
6,Reconnaissance,0.0,9,2723.0,0.1
|
||||
6,Reconnaissance,0.25,0,29234.0,0.15230628118055436
|
||||
6,Reconnaissance,0.25,1,5054.0,0.09820974037366471
|
||||
6,Reconnaissance,0.25,2,1636.0,0.0740783974112407
|
||||
6,Reconnaissance,0.25,3,1137.0,0.06763723878883773
|
||||
6,Reconnaissance,0.25,4,14033.0,0.12677493158618858
|
||||
6,Reconnaissance,0.25,5,27596.0,0.15012647507724955
|
||||
6,Reconnaissance,0.25,6,3655.0,0.09056650300174746
|
||||
6,Reconnaissance,0.25,7,2431.0,0.08178845290998221
|
||||
6,Reconnaissance,0.25,8,1662.0,0.07437098070389571
|
||||
6,Reconnaissance,0.25,9,2723.0,0.08414099896663899
|
||||
6,Reconnaissance,0.5,0,29234.0,0.21278519952291416
|
||||
6,Reconnaissance,0.5,1,5054.0,0.08847384757219018
|
||||
6,Reconnaissance,0.5,2,1636.0,0.05033718736048316
|
||||
6,Reconnaissance,0.5,3,1137.0,0.04196406276627246
|
||||
6,Reconnaissance,0.5,4,14033.0,0.14742548262585833
|
||||
6,Reconnaissance,0.5,5,27596.0,0.20673802531218738
|
||||
6,Reconnaissance,0.5,6,3655.0,0.07523864857902528
|
||||
6,Reconnaissance,0.5,7,2431.0,0.061360625065784886
|
||||
6,Reconnaissance,0.5,8,1662.0,0.050735600537849077
|
||||
6,Reconnaissance,0.5,9,2723.0,0.06494132065743503
|
||||
6,Reconnaissance,0.75,0,29234.0,0.27357822501416285
|
||||
6,Reconnaissance,0.75,1,5054.0,0.07334859067983003
|
||||
6,Reconnaissance,0.75,2,1636.0,0.03147768753676809
|
||||
6,Reconnaissance,0.75,3,1137.0,0.02395993822816564
|
||||
6,Reconnaissance,0.75,4,14033.0,0.15777138551882777
|
||||
6,Reconnaissance,0.75,5,27596.0,0.2619991894508377
|
||||
6,Reconnaissance,0.75,6,3655.0,0.05752158990542161
|
||||
6,Reconnaissance,0.75,7,2431.0,0.04236469310457719
|
||||
6,Reconnaissance,0.75,8,1662.0,0.031852139574943754
|
||||
6,Reconnaissance,0.75,9,2723.0,0.04612656098646531
|
||||
6,Reconnaissance,1.0,0,29234.0,0.3278787810814145
|
||||
6,Reconnaissance,1.0,1,5054.0,0.056683976177925324
|
||||
6,Reconnaissance,1.0,2,1636.0,0.018348829645248484
|
||||
6,Reconnaissance,1.0,3,1137.0,0.012752212290126849
|
||||
6,Reconnaissance,1.0,4,14033.0,0.15738944157198775
|
||||
6,Reconnaissance,1.0,5,27596.0,0.3095075201040814
|
||||
6,Reconnaissance,1.0,6,3655.0,0.04099325938470856
|
||||
6,Reconnaissance,1.0,7,2431.0,0.027265284148899182
|
||||
6,Reconnaissance,1.0,8,1662.0,0.01864043696234901
|
||||
6,Reconnaissance,1.0,9,2723.0,0.030540258633258936
|
||||
7,Tampering,0.0,1,1266.0,0.1111111111111111
|
||||
7,Tampering,0.0,2,5.0,0.1111111111111111
|
||||
7,Tampering,0.0,3,832.0,0.1111111111111111
|
||||
7,Tampering,0.0,4,336.0,0.1111111111111111
|
||||
7,Tampering,0.0,5,2.0,0.1111111111111111
|
||||
7,Tampering,0.0,6,93.0,0.1111111111111111
|
||||
7,Tampering,0.0,7,506.0,0.1111111111111111
|
||||
7,Tampering,0.0,8,385.0,0.1111111111111111
|
||||
7,Tampering,0.0,9,161.0,0.1111111111111111
|
||||
7,Tampering,0.25,1,1266.0,0.17471282970949986
|
||||
7,Tampering,0.25,2,5.0,0.04379846321697165
|
||||
7,Tampering,0.25,3,832.0,0.15730669363947933
|
||||
7,Tampering,0.25,4,336.0,0.12540105513004648
|
||||
7,Tampering,0.25,5,2.0,0.034831635761437905
|
||||
7,Tampering,0.25,6,93.0,0.09095720540006634
|
||||
7,Tampering,0.25,7,506.0,0.1389165536784107
|
||||
7,Tampering,0.25,8,385.0,0.12974228838401372
|
||||
7,Tampering,0.25,9,161.0,0.1043332750800741
|
||||
7,Tampering,0.5,1,1266.0,0.23586314666038674
|
||||
7,Tampering,0.5,2,5.0,0.014822731352266548
|
||||
7,Tampering,0.5,3,832.0,0.19120748911321409
|
||||
7,Tampering,0.5,4,336.0,0.12151023870697683
|
||||
7,Tampering,0.5,5,2.0,0.009374718443589987
|
||||
7,Tampering,0.5,6,93.0,0.06392705674588234
|
||||
7,Tampering,0.5,7,506.0,0.14911402520164335
|
||||
7,Tampering,0.5,8,385.0,0.13006893974001962
|
||||
7,Tampering,0.5,9,161.0,0.08411165403602044
|
||||
7,Tampering,0.75,1,1266.0,0.29501963330004927
|
||||
7,Tampering,0.75,2,5.0,0.0046478611218455125
|
||||
7,Tampering,0.75,3,832.0,0.21533674018298182
|
||||
7,Tampering,0.75,4,336.0,0.10908878321903859
|
||||
7,Tampering,0.75,5,2.0,0.002337750380452871
|
||||
7,Tampering,0.75,6,93.0,0.04162822095143507
|
||||
7,Tampering,0.75,7,506.0,0.14829910404504437
|
||||
7,Tampering,0.75,8,385.0,0.12081509138390237
|
||||
7,Tampering,0.75,9,161.0,0.06282681541525013
|
||||
7,Tampering,1.0,1,1266.0,0.35303959843837146
|
||||
7,Tampering,1.0,2,5.0,0.0013943112102621305
|
||||
7,Tampering,1.0,3,832.0,0.2320133853876185
|
||||
7,Tampering,1.0,4,336.0,0.09369771332961517
|
||||
7,Tampering,1.0,5,2.0,0.0005577244841048522
|
||||
7,Tampering,1.0,6,93.0,0.025934188510875627
|
||||
7,Tampering,1.0,7,506.0,0.1411042944785276
|
||||
7,Tampering,1.0,8,385.0,0.10736196319018405
|
||||
7,Tampering,1.0,9,161.0,0.0448968209704406
|
||||
8,Weaponization,0.0,0,18.0,0.1
|
||||
8,Weaponization,0.0,1,486.0,0.1
|
||||
8,Weaponization,0.0,2,32409.0,0.1
|
||||
8,Weaponization,0.0,3,1220.0,0.1
|
||||
8,Weaponization,0.0,4,334.0,0.1
|
||||
8,Weaponization,0.0,5,691.0,0.1
|
||||
8,Weaponization,0.0,6,713.0,0.1
|
||||
8,Weaponization,0.0,7,2971.0,0.1
|
||||
8,Weaponization,0.0,8,5815.0,0.1
|
||||
8,Weaponization,0.0,9,437.0,0.1
|
||||
8,Weaponization,0.25,0,18.0,0.033579850190171893
|
||||
8,Weaponization,0.25,1,486.0,0.07654550547998105
|
||||
8,Weaponization,0.25,2,32409.0,0.21873940967036698
|
||||
8,Weaponization,0.25,3,1220.0,0.09634974857071463
|
||||
8,Weaponization,0.25,4,334.0,0.06969429747420275
|
||||
8,Weaponization,0.25,5,691.0,0.08358534509570838
|
||||
8,Weaponization,0.25,6,713.0,0.08424284215070223
|
||||
8,Weaponization,0.25,7,2971.0,0.12036113957241214
|
||||
8,Weaponization,0.25,8,5815.0,0.14236330371286063
|
||||
8,Weaponization,0.25,9,437.0,0.07453855808287936
|
||||
8,Weaponization,0.5,0,18.0,0.009140200048750224
|
||||
8,Weaponization,0.5,1,486.0,0.04749387262733675
|
||||
8,Weaponization,0.5,2,32409.0,0.38783970155797365
|
||||
8,Weaponization,0.5,3,1220.0,0.07524876280121073
|
||||
8,Weaponization,0.5,4,334.0,0.039372471922378
|
||||
8,Weaponization,0.5,5,691.0,0.05663155311084731
|
||||
8,Weaponization,0.5,6,713.0,0.05752600484028785
|
||||
8,Weaponization,0.5,7,2971.0,0.11742775943402554
|
||||
8,Weaponization,0.5,8,5815.0,0.16428363668004434
|
||||
8,Weaponization,0.5,9,437.0,0.0450360369771456
|
||||
8,Weaponization,0.75,0,18.0,0.002056724198802832
|
||||
8,Weaponization,0.75,1,486.0,0.024361211428694487
|
||||
8,Weaponization,0.75,2,32409.0,0.5684874769186409
|
||||
8,Weaponization,0.75,3,1220.0,0.04858380802663028
|
||||
8,Weaponization,0.75,4,334.0,0.01838787442345046
|
||||
8,Weaponization,0.75,5,691.0,0.031719783511132846
|
||||
8,Weaponization,0.75,6,713.0,0.032474227320990603
|
||||
8,Weaponization,0.75,7,2971.0,0.09471061744309137
|
||||
8,Weaponization,0.75,8,5815.0,0.1567234445867468
|
||||
8,Weaponization,0.75,9,437.0,0.022494832141819396
|
||||
8,Weaponization,1.0,0,18.0,0.00039916618618884993
|
||||
8,Weaponization,1.0,1,486.0,0.010777487027098949
|
||||
8,Weaponization,1.0,2,32409.0,0.7186987182330243
|
||||
8,Weaponization,1.0,3,1220.0,0.027054597063910942
|
||||
8,Weaponization,1.0,4,334.0,0.007406750343726438
|
||||
8,Weaponization,1.0,5,691.0,0.015323546369805296
|
||||
8,Weaponization,1.0,6,713.0,0.015811416152925
|
||||
8,Weaponization,1.0,7,2971.0,0.06588459662039296
|
||||
8,Weaponization,1.0,8,5815.0,0.12895285403823126
|
||||
8,Weaponization,1.0,9,437.0,0.009690867964695968
|
||||
|
+176
-150
@@ -3,11 +3,11 @@
|
||||
This is the canonical continuation point for the next agent session. It is written to be
|
||||
readable without prior chat history, terminal scrollback, or git history.
|
||||
|
||||
Last updated: 2026-09-24 (Session 4, support-weighted beta aggregation implementation).
|
||||
Session 4 type: implementation + validation. The proposed `support_weighted`
|
||||
(`w_ij = N_ij ** beta`) mode was added **without changing the frozen `original_protean`
|
||||
baseline**. Only small smoke tests were run; **no beta sweep and no beta selection were
|
||||
performed**.
|
||||
Last updated: 2026-09-25 (Session 5, one paired full beta condition + validation-only
|
||||
selection). Session 5 type: **protocol-validation experiment**. Exactly one
|
||||
`(dataset, alpha, seed)` condition was run across all five beta candidates; beta was
|
||||
selected on validation only and the selected beta evaluated once on test. **No full grid
|
||||
was launched.**
|
||||
|
||||
---
|
||||
|
||||
@@ -24,204 +24,225 @@ S_j = { i | N_ij > 0 and a valid local prototype C_ij exists }
|
||||
beta in {0.0, 0.25, 0.5, 0.75, 1.0}
|
||||
```
|
||||
|
||||
Both the baseline and the proposed mode are now implemented. The baseline remains the
|
||||
reference; `beta = 0` is arithmetic-identical to it only because both use the same
|
||||
documented `S_j` participant rule.
|
||||
Both the frozen `original_protean` baseline and the proposed `support_weighted` mode are
|
||||
implemented. `beta = 0` is mathematically the equal mean over the shared `S_j` but is not
|
||||
bitwise identical to the baseline (see §7).
|
||||
|
||||
## 2. Authoritative source and immutability
|
||||
|
||||
- `planningawal/PROTEAN_Revisi_Lurus.md` — authoritative research specification.
|
||||
- `planningawal/` is immutable. Re-verified unchanged this session: `git status --
|
||||
planningawal` and `git diff -- planningawal` are both empty.
|
||||
- Raw datasets re-verified unchanged (SHA-256):
|
||||
`~/datasets/X-IIoTID/X-IIoTID-dataset.csv`
|
||||
`7b9290057ee42e784da3c0d84b781815502c9205c74175c96374e71a5ffd98a0`;
|
||||
`~/datasets/5G-NIDD/5G-NIDD.csv`
|
||||
`fa36f80859585f474504ca69eb951a079b35145537976c86b00aae3aab46ee59`.
|
||||
|
||||
## 3. Dataset locations (read-only external source data)
|
||||
## 3. Session 5 objective and outcome
|
||||
|
||||
- `~/datasets/X-IIoTID/X-IIoTID-dataset.csv` — SHA-256
|
||||
`7b9290057ee42e784da3c0d84b781815502c9205c74175c96374e71a5ffd98a0` (re-verified unchanged).
|
||||
- `~/datasets/5G-NIDD/5G-NIDD.csv` — SHA-256
|
||||
`fa36f80859585f474504ca69eb951a079b35145537976c86b00aae3aab46ee59` (re-verified unchanged).
|
||||
Objective: run ONE paired full condition (X-IIoTID, alpha=0.5, seed=0) across
|
||||
`beta ∈ {0, 0.25, 0.5, 0.75, 1}`, reusing the frozen manifest and training settings;
|
||||
select beta on validation only; evaluate the selected beta on test; add the direct
|
||||
prototype-effect and client-level analyses; update docs. **All acceptance items were met.**
|
||||
No commit or push was made.
|
||||
|
||||
## 4. Session 4 objective and outcome
|
||||
## 4. Condition and pairing
|
||||
|
||||
Objective: implement the proposed support-weighted prototype aggregation while preserving
|
||||
the frozen `original_protean` baseline, add the deferred beta-invariant tests, add direct
|
||||
prototype-effect instrumentation, run small smoke tests for beta 0 / 0.5 / 1, and update
|
||||
docs. **All acceptance items were met.** No commit was made.
|
||||
| Field | Value |
|
||||
|---|---|
|
||||
| dataset / alpha / seed | `xiiotid` / 0.50 / 0 |
|
||||
| manifest | `artifacts/partitions/xiiotid__alpha0.5__seed0.json` (reused) |
|
||||
| manifest content hash | `e81a6538ecefcda202aa7602310ff8d8c9529031ab9dcbec4ebbabc0e63b636c` |
|
||||
| partition hash | `2465485539a3e923548dcc0c73d8acc5076d456536b78682d512897ea586e779` |
|
||||
| split hash / sizes | `d0acc0c14e3ecbeba02dfa9e6227c983da12dec2d6111df0b714002e6e03c29d` / 569,909 train, 81,414 val, 162,831 test |
|
||||
| preprocessing hash | `8580cee41c698ce43cf3269e4a2b3a01c92d6df22820f4004c0267478bd2579a` |
|
||||
| training | 10 clients, 10 rounds, 3 local epochs, batch 256, lr 1e-3, mu 0.1, lambda 1.0, Adam |
|
||||
| code revision | HEAD `ad9aa53ba76f60671ace991fcee85f003781f196`; only `scripts/run_baseline.py` modified (hash-object `2b469e35ecbbc6ea3dbd4b0632419993e4d5130b`) |
|
||||
|
||||
## 5. Implementation summary
|
||||
Pairing proof: the round-0 prototype snapshot is **byte-identical** (SHA-256 prefix
|
||||
`e27f41b3a62eb83c`) across all five beta runs and the frozen `original_protean` run;
|
||||
`train_support_Nij.csv`, `characterization.csv`, `rare_unseen.csv` are identical across
|
||||
runs. All runs are in `results/xiiotid__alpha0.5__seed0__support_weighted__beta{0,0.25,0.5,0.75,1}/`.
|
||||
|
||||
Added a new aggregation mode and threaded it through the stack; the baseline code path is
|
||||
untouched.
|
||||
## 5. Validation results and beta selection
|
||||
|
||||
- `src/protean_research/aggregation/prototype_aggregation.py`: `AggregationMode.SUPPORT_
|
||||
WEIGHTED`, `BETA_CANDIDATES = (0.0, 0.25, 0.50, 0.75, 1.00)`, strict `validate_beta`
|
||||
(`[0, 1]`; rejects `None`/non-numeric/non-finite/out-of-range), `normalized_support_
|
||||
weights`; `aggregate_prototypes(..., supports=None, beta=None)` and `aggregate_class_
|
||||
prototypes(..., beta=None)`. `S_j` is built once and is identical to the baseline:
|
||||
`None`/`N_ij <= 0` entries dropped, no zero-vector padding. Passing `beta` to
|
||||
`original_protean` raises.
|
||||
- `src/protean_research/aggregation/__init__.py`: exports updated.
|
||||
- `src/protean_research/models/prototypes.py`, `federated/server.py`: forward `beta`.
|
||||
- `src/protean_research/federated/round.py`: `TrainingConfig.aggregation_mode` (default
|
||||
`original_protean`) and `.beta` (default `None`); the round loop dispatches to the mode.
|
||||
- `scripts/run_baseline.py`: new `--aggregation-mode {original_protean,support_weighted}`
|
||||
and `--beta`. Default behavior is the unchanged baseline. Run name/metadata record mode
|
||||
and beta (`...__original_protean` unchanged; `...__support_weighted__beta0.5` for beta).
|
||||
- `src/protean_research/analysis/direct_prototype.py` (new) +
|
||||
`scripts/analyze_prototype_effect.py` (new): recompute `Cbar_j(beta)` from a fixed round
|
||||
snapshot of `{C_ij, N_ij}` **without retraining**; emit `||Cbar_j(beta) - Cbar_j(0)||`,
|
||||
support stats, norms, and normalised client weights.
|
||||
Primary selection metric: **validation per-client-mean rare-class macro-F1** (per-client
|
||||
rare F1 on each client's validation eval partition, averaged over clients with rare
|
||||
classes). Global union-rare validation metrics also shown.
|
||||
|
||||
`equal_available` was **not** added (the baseline already is equal-over-`S_j`, so it equals
|
||||
`beta = 0`).
|
||||
| beta | val rareMacroF1 (pc mean) | val rareMacroF1 (global) | val rareRecall | val macroF1 | val acc | val wF1 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 0.00 | 0.557340 | 0.611641 | 0.884184 | 0.708929 | 0.891038 | 0.917741 |
|
||||
| 0.25 | 0.571787 | 0.629475 | 0.888488 | 0.723431 | 0.902953 | 0.925933 |
|
||||
| **0.50** | **0.585762** | **0.641709** | 0.887173 | **0.731166** | 0.897831 | **0.926005** |
|
||||
| 0.75 | 0.578003 | 0.637107 | 0.873910 | 0.726603 | 0.887894 | 0.921696 |
|
||||
| 1.00 | 0.551443 | 0.615307 | 0.847043 | 0.715951 | 0.883263 | 0.921182 |
|
||||
|
||||
## 6. Tests and baseline regression status
|
||||
**Selected beta = 0.50** (best among tested candidates under this validation condition;
|
||||
no tie; both validation readings agree). Test was **not** used for selection.
|
||||
|
||||
```
|
||||
.venv/bin/python -m pytest -> 75 passed
|
||||
```
|
||||
## 6. Final test evaluation of the selected beta
|
||||
|
||||
Session-3 suite was 46 tests. Added `tests/test_support_weighted_aggregation.py` (21) and
|
||||
`tests/test_prototype_effect.py` (7); one baseline-aggregation test was replaced by two
|
||||
explicit tests (support_weighted now available; `beta` rejected for `original_protean`).
|
||||
| metric | original_protean | support_weighted beta=0.50 |
|
||||
|---|---|---|
|
||||
| rare-class macro-F1 | 0.609620 | 0.640829 |
|
||||
| rare-class recall | 0.871487 | 0.871583 |
|
||||
| overall macro-F1 | 0.707701 | 0.730743 |
|
||||
| accuracy | 0.890432 | 0.898158 |
|
||||
| weighted-F1 | 0.917585 | 0.926333 |
|
||||
|
||||
Covered beta invariants: `beta=0` arithmetic mean; `beta=1` support-weighted mean;
|
||||
hand-computed intermediate-beta fixture; single-contributor invariance; equal-support
|
||||
invariance; missing-class exclusion; normalised weights sum to 1; invalid/non-numeric
|
||||
beta rejection; supports strictly positive and aligned. **Baseline regression is green**:
|
||||
`test_end_to_end_baseline_is_deterministic_and_learns_separable_fixture` and all baseline
|
||||
arithmetic/validation tests pass unchanged.
|
||||
All five candidates' test metrics (transparency only) are in
|
||||
`docs/research/PAIRED_BETA_VALIDATION.md` §B.2. No superiority is claimed: single
|
||||
dataset / alpha / seed.
|
||||
|
||||
## 7. Smoke results (NOT scientific results)
|
||||
## 7. `beta = 0` equivalence result (important)
|
||||
|
||||
Condition: `xiiotid`, `alpha=0.5`, `seed=0`, `--max-rows 3000 --sample-from 60000`,
|
||||
4 clients, 2 rounds, 1 local epoch (ignored dirs only).
|
||||
`support_weighted beta=0` vs frozen `original_protean`:
|
||||
|
||||
| mode / beta | test accuracy | test macro-F1 | test rare macro-F1 | test rare recall |
|
||||
|---|---|---|---|---|
|
||||
| `original_protean` | 0.5167 | 0.2998 | 0.3140 | 0.4572 |
|
||||
| `support_weighted` 0.0 | 0.5167 | 0.2998 | 0.3140 | 0.4572 |
|
||||
| `support_weighted` 0.5 | 0.2333 | 0.1397 | 0.1797 | 0.3193 |
|
||||
| `support_weighted` 1.0 | 0.0383 | 0.0252 | 0.0324 | 0.1995 |
|
||||
- Same frozen manifest and split: **yes**.
|
||||
- Same initialisation/round-0 setup: **yes** (round-0 snapshot byte-identical).
|
||||
- Training behaviour: **mathematically identical, not bitwise**. `original_protean`
|
||||
computes `Σ(C_ij/count)`; `support_weighted beta=0` computes `Σ((1/count)·C_ij)`.
|
||||
Per-element difference ≤ `2.2e-16`–`4.4e-16` (~1 ULP, relative ~1e-16).
|
||||
- Validation/test metrics: **not identical** (baseline slightly lower; e.g. test
|
||||
accuracy 0.890432 vs 0.891974). The ~1 ULP aggregation difference feeds back into
|
||||
round-1 prototype-alignment training and the trajectories diverge slowly from round 1.
|
||||
- Deterministic artifacts identical: round-0 snapshot, `train_support_Nij.csv`,
|
||||
`characterization.csv`, `rare_unseen.csv`; `history.json`/per-client/per-class differ.
|
||||
|
||||
Baseline-preservation evidence: the `original_protean` and `support_weighted beta=0` smoke
|
||||
runs produced **byte-identical** result artifacts (only `metadata.json` differed in
|
||||
mode/beta/run_name). The round-0 snapshots for `beta = 0, 0.5, 1` were **byte-identical**,
|
||||
confirming the paired comparison (same partition/split/init/round-0 training). The
|
||||
beta=0.5/1 metrics are toy-scale and must not be interpreted as method quality.
|
||||
This is floating-point arithmetic ordering, not a semantic change; no code was altered to
|
||||
force bitwise equality. **Conditional on the shared `S_j` reproduction assumption** and
|
||||
does not prove `beta = 0` reproduces original PROTEAN.
|
||||
|
||||
Direct-effect analysis was exercised on the `beta=0` smoke snapshot (9 classes,
|
||||
max displacement 7.65 at beta=1; relative displacement up to 1.51 for the most
|
||||
support-imbalanced class), written under the ignored smoke directory
|
||||
`artifacts/processed/smoke/analysis/`.
|
||||
## 8. Direct prototype-effect findings (fixed round-0 snapshot, no retraining)
|
||||
|
||||
## 8. Methodological decisions / assumptions carried forward
|
||||
At `beta = 1.0`, largest `||Cbar_j(1)-Cbar_j(0)||`:
|
||||
`Weaponization` 3.559 (rel 0.577; most support-imbalanced, cv 2.10, max/min 1,800),
|
||||
`C&C` 2.156, `Lateral_movement` 2.069, `Exploitation` 1.934, `Tampering` 1.737,
|
||||
`Exfiltration` 1.547; smallest: `Normal` 0.990 (cv 0.76), `RDOS` 1.286,
|
||||
`Reconnaissance` 1.184. Every class has `|S_j| ≥ 8` and unequal support, so no class has
|
||||
zero direct effect. Outputs:
|
||||
`artifacts/analysis/xiiotid__alpha0.5__seed0__support_weighted__beta0__prototype_snapshot__prototype_effect.csv`
|
||||
and `...__prototype_weights.csv`. Displacement is a direct-aggregation measure only, not
|
||||
a detection result.
|
||||
|
||||
## 9. Client-level findings (test, vs beta=0)
|
||||
|
||||
Full paired table: `artifacts/analysis/xiiotid__alpha0.5__seed0__paired_client_beta_metrics.csv`.
|
||||
At `beta=0.50` six of ten clients improve; only client 3 is materially negative (−0.068).
|
||||
At `beta=0.75/1.00` several clients lose, with client 3 worst (−0.257/−0.342). The
|
||||
`min positive N_ij` vs ΔF1 relationship is **not monotonic** in this single condition:
|
||||
client 3 (`min N_ij=140`) is the worst loser while client 5 (`min N_ij=2`) is the biggest
|
||||
gainer. Descriptive only; no causal claim.
|
||||
|
||||
## 10. Runtime / resources
|
||||
|
||||
CPU only (no GPU). Per run: 41–44 min wall-clock, ~733–740 % CPU, peak RSS ~6.21 GiB,
|
||||
no swap, exit 0. Total ~3.5 h for the five paired candidates. Preprocessing/load
|
||||
negligible.
|
||||
|
||||
## 11. Methodological decisions / assumptions
|
||||
|
||||
1. **`S_j` participant/denominator rule** (`S_j = {i | N_ij > 0 and valid C_ij}`, equal
|
||||
weights in the baseline) is a **REPRODUCTION ASSUMPTION**, not verified original
|
||||
behaviour. It is material in 53/162 class-condition cells (32.7%), 15/18 conditions
|
||||
(`docs/baseline/BASELINE_VALIDATION.md` §D). `beta = 0` equality with the baseline is
|
||||
conditional on this shared rule. Carry this caveat in all reporting.
|
||||
2. `N_ij` is **class-specific sample support**, not prototype quality.
|
||||
3. `beta` is one value for all classes/clients; candidates are frozen at
|
||||
`{0, 0.25, 0.5, 0.75, 1}`.
|
||||
4. `lambda = 1.0`, optimiser (Adam), lr (1e-3), batch (256) remain PROJECT DECISIONS.
|
||||
behaviour; material in 53/162 class-condition cells (32.7 %), 15/18 conditions
|
||||
(`docs/baseline/BASELINE_VALIDATION.md` §D). Carry this caveat in all reporting.
|
||||
2. `N_ij` is class-specific sample support, not prototype quality.
|
||||
3. Beta is one value for all classes/clients; candidates frozen at `{0,.25,.5,.75,1}`.
|
||||
4. `lambda=1.0`, Adam, lr 1e-3, batch 256 remain PROJECT DECISIONS.
|
||||
5. **New this session (protocol clarification, documented in
|
||||
`EXPERIMENT_PROTOCOL.md` §8):** candidate validation metric = final-model validation
|
||||
metrics; primary selection = per-client-mean rare-class macro-F1 using a deterministic
|
||||
Dirichlet validation eval partition (mirrors the existing test per-client procedure);
|
||||
tie-break = higher val rare macro-F1 → higher val rare recall → smaller beta.
|
||||
6. No `equal_available` mode was added.
|
||||
|
||||
## 9. Unresolved questions / blockers
|
||||
## 12. Unresolved questions / blockers
|
||||
|
||||
1. `S_j` reproduction ambiguity (above) — unresolved, no official PROTEAN code exists.
|
||||
2. Beta selection has **not** been run; no validation/test separation result exists yet.
|
||||
3. Smoke-scale metrics are unstable and not meaningful; a full paired condition is needed.
|
||||
4. Session-2 manifests store `preprocessing_hash = null` / `config_hash = null`; live
|
||||
preprocessing hash is recorded in run metadata only.
|
||||
1. `S_j` reproduction ambiguity — unresolved; no official PROTEAN code exists.
|
||||
2. `beta = 0` is not bitwise identical to `original_protean` (float ordering). Whether the
|
||||
thesis should report this explicitly, or whether an equivalence check should use a
|
||||
tolerance, is a documentation decision for later.
|
||||
3. Single condition only; no multi-seed/multi-alpha evidence yet.
|
||||
4. Session-2 manifests still store `preprocessing_hash = null` / `config_hash = null`.
|
||||
|
||||
## 10. Git status
|
||||
## 13. Git status
|
||||
|
||||
No commit or push was made. Working tree has 9 modified tracked files and 5 untracked
|
||||
paths from this session (listed by `git status`). `planningawal/` and both raw datasets
|
||||
are unchanged. `results/`, `artifacts/processed/` remain ignored. `artifacts/analysis/` is
|
||||
tracked (no new files were written there this session; smoke analysis went to
|
||||
`artifacts/processed/smoke/analysis/`).
|
||||
No commit or push was made. `git status --short`:
|
||||
|
||||
## 11. Files created / modified this session
|
||||
```
|
||||
M scripts/run_baseline.py
|
||||
?? artifacts/analysis/xiiotid__alpha0.5__seed0__paired_client_beta_metrics.csv
|
||||
?? artifacts/analysis/xiiotid__alpha0.5__seed0__support_weighted__beta0__prototype_snapshot.json
|
||||
?? artifacts/analysis/xiiotid__alpha0.5__seed0__support_weighted__beta0__prototype_snapshot__prototype_effect.csv
|
||||
?? artifacts/analysis/xiiotid__alpha0.5__seed0__support_weighted__beta0__prototype_snapshot__prototype_weights.csv
|
||||
?? artifacts/analysis/xiiotid__alpha0.5__seed0__support_weighted__beta0.25__prototype_snapshot.json
|
||||
?? artifacts/analysis/xiiotid__alpha0.5__seed0__support_weighted__beta0.5__prototype_snapshot.json
|
||||
?? artifacts/analysis/xiiotid__alpha0.5__seed0__support_weighted__beta0.75__prototype_snapshot.json
|
||||
?? artifacts/analysis/xiiotid__alpha0.5__seed0__support_weighted__beta1__prototype_snapshot.json
|
||||
```
|
||||
|
||||
`planningawal/` and both raw datasets are unchanged; `results/` and
|
||||
`artifacts/processed/` are ignored; `artifacts/analysis/` is tracked.
|
||||
|
||||
## 14. Files created / modified this session
|
||||
|
||||
Created:
|
||||
|
||||
- `src/protean_research/analysis/__init__.py`
|
||||
- `src/protean_research/analysis/direct_prototype.py`
|
||||
- `scripts/analyze_prototype_effect.py`
|
||||
- `tests/test_support_weighted_aggregation.py`
|
||||
- `tests/test_prototype_effect.py`
|
||||
- `docs/research/BETA_AGGREGATION_IMPLEMENTATION.md`
|
||||
- `docs/research/PAIRED_BETA_VALIDATION.md`
|
||||
- `artifacts/analysis/xiiotid__alpha0.5__seed0__paired_client_beta_metrics.csv`
|
||||
- five `artifacts/analysis/...__support_weighted__beta*__prototype_snapshot.json`
|
||||
- two `artifacts/analysis/...__prototype_snapshot__prototype_effect.csv` / `__prototype_weights.csv`
|
||||
|
||||
Modified:
|
||||
|
||||
- `src/protean_research/aggregation/prototype_aggregation.py`
|
||||
- `src/protean_research/aggregation/__init__.py`
|
||||
- `src/protean_research/models/prototypes.py`
|
||||
- `src/protean_research/federated/server.py`
|
||||
- `src/protean_research/federated/round.py`
|
||||
- `scripts/run_baseline.py`
|
||||
- `tests/test_baseline_aggregation.py`
|
||||
- `configs/experiments/experiment_protocol.yaml`
|
||||
- `docs/research/EXPERIMENT_PROTOCOL.md`
|
||||
- `scripts/run_baseline.py` (added validation-only evaluation artifacts; test/training paths untouched)
|
||||
- `docs/research/EXPERIMENT_PROTOCOL.md` (§8 Session-5 clarification)
|
||||
- `docs/handoff/SESSION_HANDOFF.md` (this file)
|
||||
|
||||
## 12. Exact next task
|
||||
## 15. Exact recommended next phase
|
||||
|
||||
**Recommended: run ONE paired full `(dataset, alpha, seed)` condition across
|
||||
`beta in {0, 0.25, 0.5, 0.75, 1}` under the validation-based selection protocol, then
|
||||
inspect.** Do not launch the full grid.
|
||||
**Recommendation: B — checkpoint Session 5, then proceed to a controlled
|
||||
multi-seed/multi-alpha experiment.** The protocol ran cleanly (validation/test separation
|
||||
held, artifacts reproducible, pairing proven by byte-identical round-0 snapshots, no test
|
||||
leakage into selection), so the next step is to scale to seeds `{0,1,2}` at a small alpha
|
||||
set, still paired. Do **not** run the entire `dataset × alpha × seed × beta` grid at once;
|
||||
grow it in controlled, inspectable increments.
|
||||
|
||||
Concretely:
|
||||
Before scaling: decide how to report the float-level `beta = 0` vs `original_protean`
|
||||
non-identity (§7), and whether to re-run `original_protean` per condition with the new
|
||||
validation artifacts (the existing baseline run predates the validation-artifact change).
|
||||
|
||||
1. Reuse the frozen manifest for one condition (e.g. X-IIoTID `alpha=0.5`, seed 0) and the
|
||||
frozen training settings (10 clients, 10 rounds, 3 local epochs, batch 256, lr 1e-3,
|
||||
mu 0.1, lambda 1.0). Measure the single-run cost first (Session 3 measured ~42 min /
|
||||
6.2 GiB on CPU for one baseline run; beta adds one run per candidate).
|
||||
2. Train each beta with `run_baseline.py --aggregation-mode support_weighted --beta ...`
|
||||
and record validation rare-class macro-F1; select beta on validation only.
|
||||
3. Evaluate the selected beta on test, and report all candidates transparently.
|
||||
4. Run `scripts/analyze_prototype_effect.py` on the round-0 snapshot for the direct
|
||||
aggregation effect, clearly separated from end-to-end results.
|
||||
5. Report the `S_j` reproduction caveat alongside every between-beta claim.
|
||||
|
||||
Do **not** add `equal_available`. Do **not** run the alpha x seed x dataset x beta grid.
|
||||
|
||||
## 13. Important commands
|
||||
## 16. Important commands
|
||||
|
||||
```bash
|
||||
# Tests (75 expected)
|
||||
.venv/bin/python -m pytest
|
||||
|
||||
# Smoke: baseline and beta candidates (ignored output dirs)
|
||||
# One full paired beta run (CPU, ~42 min, ~6.2 GiB)
|
||||
.venv/bin/python scripts/run_baseline.py --dataset xiiotid --alpha 0.5 --seed 0 \
|
||||
--max-rows 3000 --sample-from 60000 --clients 4 --rounds 2 --local-epochs 1
|
||||
.venv/bin/python scripts/run_baseline.py --dataset xiiotid --alpha 0.5 --seed 0 \
|
||||
--max-rows 3000 --sample-from 60000 --clients 4 --rounds 2 --local-epochs 1 \
|
||||
--clients 10 --rounds 10 --local-epochs 3 \
|
||||
--aggregation-mode support_weighted --beta 0.5
|
||||
|
||||
# Direct prototype-effect analysis (no retraining)
|
||||
.venv/bin/python scripts/analyze_prototype_effect.py \
|
||||
--snapshot artifacts/processed/smoke/analysis/\
|
||||
xiiotid__alpha0.5__seed0__support_weighted__beta0__prototype_snapshot.json \
|
||||
--output-dir artifacts/processed/smoke/analysis
|
||||
|
||||
# Full-data baseline for one condition (measure first; ~40-65 min, CPU)
|
||||
.venv/bin/python scripts/run_baseline.py --dataset xiiotid --alpha 0.5 --seed 0 \
|
||||
--clients 10 --rounds 10 --local-epochs 3
|
||||
--snapshot artifacts/analysis/xiiotid__alpha0.5__seed0__support_weighted__beta0__prototype_snapshot.json \
|
||||
--class-names "C&C,Exfiltration,Exploitation,Lateral_movement,Normal,RDOS,Reconnaissance,Tampering,Weaponization" \
|
||||
--output-dir artifacts/analysis
|
||||
```
|
||||
|
||||
## 14. Recommended next-session prompt
|
||||
## 17. Recommended next-session prompt
|
||||
|
||||
```
|
||||
You are continuing the perdalam-protean research repository (Session 5).
|
||||
You are continuing the perdalam-protean research repository (Session 6).
|
||||
|
||||
FIRST, read completely:
|
||||
1. docs/handoff/SESSION_HANDOFF.md
|
||||
2. docs/research/BETA_AGGREGATION_IMPLEMENTATION.md
|
||||
3. docs/baseline/BASELINE_VALIDATION.md
|
||||
4. docs/research/EXPERIMENT_PROTOCOL.md
|
||||
2. docs/research/PAIRED_BETA_VALIDATION.md
|
||||
3. docs/research/EXPERIMENT_PROTOCOL.md
|
||||
4. docs/research/BETA_AGGREGATION_IMPLEMENTATION.md
|
||||
5. docs/baseline/BASELINE_VALIDATION.md
|
||||
|
||||
Critical rules:
|
||||
- planningawal/ is immutable. Do not edit/create/move/rename/delete anything inside it.
|
||||
@@ -231,14 +252,19 @@ Critical rules:
|
||||
class-condition cells). Carry this caveat in all reporting.
|
||||
- Do NOT add an executable equal_available mode.
|
||||
- Do NOT launch the full alpha x seed x dataset x beta grid.
|
||||
- Beta selection uses validation metrics only; test never influences selection.
|
||||
|
||||
Task: the support_weighted mode (w_ij = N_ij^beta) is implemented and unit/smoke
|
||||
validated; original_protean is unchanged. Run ONE paired full (dataset, alpha, seed)
|
||||
condition across beta in {0, 0.25, 0.5, 0.75, 1}, reusing the frozen manifest and frozen
|
||||
training settings. Select beta on validation rare-class macro-F1 only, then evaluate the
|
||||
selected beta on test and report all candidates. Add the direct prototype-effect analysis
|
||||
from the round-0 snapshot. Measure runtime before scaling. Update docs and
|
||||
docs/handoff/SESSION_HANDOFF.md.
|
||||
Context: Session 5 ran one paired full condition (xiiotid, alpha=0.5, seed=0) across
|
||||
beta in {0,0.25,0.5,0.75,1}. Selected beta = 0.50 on validation per-client-mean
|
||||
rare-class macro-F1; test rare-class macro-F1 0.640829 vs original_protean 0.609620.
|
||||
beta=0 is mathematically but not bitwise equal to original_protean (~1 ULP aggregation
|
||||
ordering). scripts/run_baseline.py now writes validation-only artifacts.
|
||||
|
||||
Task: scale the paired protocol to a controlled multi-seed/multi-alpha set (e.g. seeds
|
||||
{0,1,2} at alpha 0.50, reusing frozen manifests; grow only as compute allows), keeping
|
||||
validation-only beta selection and reporting all candidates. Decide/document how to
|
||||
report the beta=0 vs original_protean float non-identity. Update docs and
|
||||
docs/handoff/SESSION_HANDOFF.md. Measure runtime before scaling further.
|
||||
|
||||
Use .venv/bin/python for all Python commands. Do not commit or push unless asked.
|
||||
```
|
||||
@@ -135,6 +135,29 @@ Procedure, strictly ordered:
|
||||
|
||||
Test data is never used in steps 1–2.
|
||||
|
||||
**Session-5 clarification (implementation detail, not a design change).** Running
|
||||
the protocol surfaced two concrete points that the original text left implicit.
|
||||
They do not alter the frozen design; they pin how step 1 is computed.
|
||||
|
||||
1. **Candidate validation metric.** For each beta, validation metrics are taken
|
||||
from the final trained model after the fixed round count (no best-round
|
||||
cherry-picking). Two validation readings are recorded: (a) the global
|
||||
union-rare validation rare-class macro-F1 (also stored in `history.json`), and
|
||||
(b) the primary selection metric, the **per-client mean** rare-class macro-F1,
|
||||
where each client is scored on its validation eval partition using that
|
||||
client's rare class ids and the result is averaged over clients that have rare
|
||||
classes. The per-client validation eval partition reuses the same deterministic
|
||||
Dirichlet eval-partition procedure already used for the per-client test
|
||||
evaluation, applied to the validation split (`split_name="validation"`); this
|
||||
is a PROJECT DECISION, paired across all beta candidates and seeds.
|
||||
2. **Tie-break order.** Higher validation rare-class macro-F1, then higher
|
||||
validation rare-class recall, then smaller beta.
|
||||
|
||||
`scripts/run_baseline.py` writes `val_global_metrics.json`, `val_per_class.csv`,
|
||||
`val_per_client.csv` and `val_selection.json` to make this explicit; the test
|
||||
path and the frozen training path are unchanged. See
|
||||
`docs/research/PAIRED_BETA_VALIDATION.md`.
|
||||
|
||||
## 9. Required metrics
|
||||
|
||||
Per dataset/alpha/seed/beta and per client, record:
|
||||
|
||||
@@ -0,0 +1,321 @@
|
||||
# Paired Beta Validation (Session 5)
|
||||
|
||||
Status: **ONE paired full condition run end to end** with validation-only beta
|
||||
selection, followed by a single final test evaluation of the selected beta. This
|
||||
is a **protocol-validation experiment**, not a sweep and not evidence of global
|
||||
behaviour.
|
||||
|
||||
Companion documents:
|
||||
|
||||
- `docs/research/EXPERIMENT_PROTOCOL.md` — frozen protocol.
|
||||
- `docs/research/BETA_AGGREGATION_IMPLEMENTATION.md` — beta mode implementation.
|
||||
- `docs/baseline/BASELINE_VALIDATION.md` — frozen baseline evidence.
|
||||
- `docs/handoff/SESSION_HANDOFF.md` — continuation point.
|
||||
|
||||
---
|
||||
|
||||
## A. Condition
|
||||
|
||||
| Field | Value |
|
||||
|---|---|
|
||||
| dataset | `xiiotid` (X-IIoTID) |
|
||||
| alpha | 0.50 |
|
||||
| seed | 0 |
|
||||
| aggregation modes | `original_protean` (reference), `support_weighted` for `beta ∈ {0, .25, .5, .75, 1}` |
|
||||
| clients / rounds / local epochs | 10 / 10 / 3 |
|
||||
| batch size / lr / optimizer | 256 / 1e-3 / Adam |
|
||||
| mu / lambda | 0.1 / 1.0 |
|
||||
| device | CPU only (`torch 2.14.0+cpu`, CUDA unavailable) |
|
||||
| code revision | HEAD `ad9aa53ba76f60671ace991fcee85f003781f196`; only `scripts/run_baseline.py` was modified this session (`git hash-object` `2b469e35ecbbc6ea3dbd4b0632419993e4d5130b`) to add validation-only evaluation artifacts. Training, partition, aggregation, loss and inference source are unchanged at `ad9aa53`. |
|
||||
|
||||
Frozen manifest reused (never regenerated):
|
||||
|
||||
| Field | Value |
|
||||
|---|---|
|
||||
| path | `artifacts/partitions/xiiotid__alpha0.5__seed0.json` |
|
||||
| manifest content hash | `e81a6538ecefcda202aa7602310ff8d8c9529031ab9dcbec4ebbabc0e63b636c` |
|
||||
| partition hash | `2465485539a3e923548dcc0c73d8acc5076d456536b78682d512897ea586e779` |
|
||||
| Dirichlet rng seed | `2009062324` |
|
||||
| split hash | `d0acc0c14e3ecbeba02dfa9e6227c983da12dec2d6111df0b714002e6e03c29d` |
|
||||
| split sizes (train/val/test) | 569,909 / 81,414 / 162,831 |
|
||||
| preprocessing hash | `8580cee41c698ce43cf3269e4a2b3a01c92d6df22820f4004c0267478bd2579a` |
|
||||
| `manifest_reload_ok` | true for every beta run |
|
||||
|
||||
Pairing evidence: the **round-0 prototype snapshot is byte-identical**
|
||||
(SHA-256 prefix `e27f41b3a62eb83c`) for all five beta runs **and** the frozen
|
||||
`original_protean` run, so every candidate shares the same partition, split,
|
||||
model initialisation and round-0 local training. `train_support_Nij.csv`,
|
||||
`characterization.csv` and `rare_unseen.csv` are byte-identical across all runs.
|
||||
|
||||
### A.1 Validation-evaluation clarification (new this session)
|
||||
|
||||
The frozen runner previously wrote only test artifacts; `history.json` held a
|
||||
global (union-rare) validation trajectory. To evaluate the protocol's
|
||||
validation-only selection, `scripts/run_baseline.py` now additionally writes, at
|
||||
the end of the fixed 10 rounds:
|
||||
|
||||
- `val_global_metrics.json`, `val_confusion_matrix.json`, `val_per_class.csv`
|
||||
(global validation metrics over the union of per-client rare classes);
|
||||
- `val_per_client.csv` (per-client validation metrics, using the same
|
||||
deterministic Dirichlet eval-partition procedure already used for test,
|
||||
applied to the validation split with `split_name="validation"`);
|
||||
- `val_selection.json` (the selection summary).
|
||||
|
||||
The test path is untouched: re-running a smoke condition before/after the change
|
||||
produced byte-identical test artifacts (`history.json`, `test_global_metrics.json`,
|
||||
`test_confusion_matrix.json`, `test_per_class.csv`, `per_client.csv`,
|
||||
`train_support_Nij.csv`, `characterization.csv`, `rare_unseen.csv`,
|
||||
`metadata.json`). The candidate's validation metric is taken from the **final
|
||||
trained model after the fixed 10 rounds** (no best-round cherry-picking).
|
||||
|
||||
---
|
||||
|
||||
## B. Candidate results
|
||||
|
||||
`val rareMacroF1 (pc mean)` is the primary selection metric:
|
||||
per-client rare-class macro-F1 (each client scored on its validation eval
|
||||
partition using that client's rare class ids), averaged over clients with rare
|
||||
classes. The global column is the union-rare validation metric also recorded in
|
||||
`history.json`.
|
||||
|
||||
### B.1 USED FOR SELECTION — validation only
|
||||
|
||||
| beta | val rareMacroF1 (pc mean) | val rareMacroF1 (global) | val rareRecall (global) | val macroF1 (global) | val accuracy | val weighted-F1 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 0.00 | 0.557340 | 0.611641 | 0.884184 | 0.708929 | 0.891038 | 0.917741 |
|
||||
| 0.25 | 0.571787 | 0.629475 | 0.888488 | 0.723431 | 0.902953 | 0.925933 |
|
||||
| **0.50** | **0.585762** | **0.641709** | 0.887173 | **0.731166** | 0.897831 | **0.926005** |
|
||||
| 0.75 | 0.578003 | 0.637107 | 0.873910 | 0.726603 | 0.887894 | 0.921696 |
|
||||
| 1.00 | 0.551443 | 0.615307 | 0.847043 | 0.715951 | 0.883263 | 0.921182 |
|
||||
|
||||
Validation rare support: 12,726. Validation evaluated rare classes: `[0,1,2,3,7,8]`.
|
||||
Ten of ten clients had validation eval data and rare classes.
|
||||
|
||||
### B.2 NOT USED FOR SELECTION — test (produced automatically by the frozen pipeline)
|
||||
|
||||
| beta | test accuracy | test macro-F1 | test weighted-F1 | test rareMacroF1 | test rare recall | wall-clock |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 0.00 | 0.891974 | 0.710481 | 0.918369 | 0.613575 | 0.873508 | 41:17 |
|
||||
| 0.25 | 0.903520 | 0.725299 | 0.926452 | 0.632154 | 0.877350 | 42:11 |
|
||||
| 0.50 | 0.898158 | 0.730743 | 0.926333 | 0.640829 | 0.871583 | 42:57 |
|
||||
| 0.75 | 0.888670 | 0.726298 | 0.922278 | 0.636189 | 0.857543 | 43:45 |
|
||||
| 1.00 | 0.884635 | 0.716383 | 0.921910 | 0.615509 | 0.832407 | 42:08 |
|
||||
|
||||
Test rare support: 25,454. The test columns are reported for transparency only and
|
||||
played no part in selecting beta.
|
||||
|
||||
---
|
||||
|
||||
## C. Beta selection
|
||||
|
||||
- **Selected beta: `0.50`** — best among the tested candidates under this
|
||||
validation condition.
|
||||
- **Criterion:** maximum validation per-client-mean rare-class macro-F1
|
||||
(`0.585762`). The secondary global union-rare validation metric independently
|
||||
also peaks at `beta = 0.50` (`0.641709`), so the two readings agree here.
|
||||
- **Tie-break (not used):** higher validation rare-class macro-F1, then higher
|
||||
validation rare-class recall, then smaller beta.
|
||||
- **Test was not used for selection.** `val_selection.json` records
|
||||
`"test_used_for_selection": false` for every run. Test metrics were not
|
||||
inspected until after `beta = 0.50` was fixed from validation.
|
||||
|
||||
---
|
||||
|
||||
## D. Final test evaluation (selected beta vs baseline)
|
||||
|
||||
Selected `beta = 0.50` (test) versus the frozen `original_protean` reference for
|
||||
the identical condition:
|
||||
|
||||
| metric | original_protean | support_weighted beta=0.50 | difference |
|
||||
|---|---|---|---|
|
||||
| rare-class macro-F1 | 0.609620 | 0.640829 | +0.031209 |
|
||||
| rare-class recall | 0.871487 | 0.871583 | +0.000096 |
|
||||
| overall macro-F1 | 0.707701 | 0.730743 | +0.023042 |
|
||||
| accuracy | 0.890432 | 0.898158 | +0.007726 |
|
||||
| weighted-F1 | 0.917585 | 0.926333 | +0.008748 |
|
||||
|
||||
Per-class test results, selected beta (support in parentheses):
|
||||
|
||||
| class | precision | recall | F1 | support |
|
||||
|---|---|---|---|---|
|
||||
| C&C | 0.098 | 0.960 | 0.178 | 573 |
|
||||
| Exfiltration | 1.000 | 0.944 | 0.971 | 4,427 |
|
||||
| Exploitation | 0.017 | 0.581 | 0.033 | 227 |
|
||||
| Lateral_movement | 0.965 | 0.781 | 0.864 | 6,319 |
|
||||
| Normal | 0.971 | 0.935 | 0.953 | 83,651 |
|
||||
| RDOS | 0.992 | 0.997 | 0.995 | 28,252 |
|
||||
| Reconnaissance | 0.993 | 0.648 | 0.784 | 25,474 |
|
||||
| Tampering | 0.732 | 0.989 | 0.841 | 1,024 |
|
||||
| Weaponization | 0.941 | 0.973 | 0.957 | 12,884 |
|
||||
|
||||
Per-client test results, selected beta:
|
||||
|
||||
| client | n | accuracy | macro-F1 | rare macro-F1 | rare recall |
|
||||
|---|---|---|---|---|---|
|
||||
| 0 | 22,614 | 0.8996 | 0.6158 | 0.5123 | 0.9886 |
|
||||
| 1 | 33,759 | 0.9265 | 0.6662 | 0.3998 | 0.6941 |
|
||||
| 2 | 5,625 | 0.9195 | 0.7840 | 0.9038 | 0.9760 |
|
||||
| 3 | 13,539 | 0.9846 | 0.8284 | 0.5481 | 0.5758 |
|
||||
| 4 | 11,881 | 0.7090 | 0.6334 | 0.1411 | 0.7973 |
|
||||
| 5 | 12,785 | 0.9200 | 0.7898 | 0.8331 | 0.9920 |
|
||||
| 6 | 6,131 | 0.9335 | 0.7243 | 0.4422 | 1.0000 |
|
||||
| 7 | 34,434 | 0.9145 | 0.6202 | 0.0477 | 0.8492 |
|
||||
| 8 | 5,090 | 0.9589 | 0.8038 | 0.6343 | 0.9532 |
|
||||
| 9 | 16,973 | 0.8158 | 0.5706 | 0.4051 | 0.6541 |
|
||||
|
||||
**No superiority is claimed.** These are single-dataset, single-alpha,
|
||||
single-seed results from one protocol-validation run.
|
||||
|
||||
---
|
||||
|
||||
## E. Direct prototype analysis (no retraining)
|
||||
|
||||
Computed from the fixed round-0 snapshot
|
||||
(`artifacts/analysis/xiiotid__alpha0.5__seed0__support_weighted__beta0__prototype_snapshot.json`,
|
||||
byte-identical across all beta runs) using the production aggregation; see
|
||||
`...__prototype_effect.csv` and `...__prototype_weights.csv` under
|
||||
`artifacts/analysis/`.
|
||||
|
||||
Per-class `||Cbar_j(beta) - Cbar_j(0)||` at `beta = 1.0` (relative displacement
|
||||
in parentheses), sorted by displacement:
|
||||
|
||||
| class | contributors | support min–max (cv) | disp@beta=1 | rel disp |
|
||||
|---|---|---|---|---|
|
||||
| Weaponization | 10 | 18–32,409 (2.10) | 3.559 | 0.577 |
|
||||
| C&C | 10 | 1–966 (1.50) | 2.156 | 0.370 |
|
||||
| Lateral_movement | 10 | 49–8,385 (1.22) | 2.069 | 0.371 |
|
||||
| Exploitation | 8 | 10–353 (1.09) | 1.934 | 0.342 |
|
||||
| Tampering | 9 | 2–1,266 (1.00) | 1.737 | 0.341 |
|
||||
| Exfiltration | 9 | 45–6,305 (1.04) | 1.547 | 0.214 |
|
||||
| RDOS | 10 | 168–49,283 (1.38) | 1.286 | 0.148 |
|
||||
| Reconnaissance | 10 | 1,137–29,234 (1.16) | 1.184 | 0.194 |
|
||||
| Normal | 10 | 604–68,657 (0.76) | 0.990 | 0.164 |
|
||||
|
||||
- **Largest direct displacement:** `Weaponization` (also the most support-imbalanced
|
||||
class, cv 2.10, max/min 1,800). For that class at `beta = 1.0` the single
|
||||
largest-support client (N=32,409) holds weight `0.719` versus `0.100` at
|
||||
`beta = 0`, while a client with N=18 drops to `0.0004`.
|
||||
- Classes with more balanced support (`Normal`, cv 0.76; `RDOS`, cv 1.38 with one
|
||||
dominant client) move less.
|
||||
- **No class has zero direct effect:** every class has `|S_j| ≥ 8` and unequal
|
||||
supports, so all nine prototypes shift for `beta > 0`. At `beta = 1.0`, no
|
||||
direct-effect displacement exceeded `0.58` of the class prototype norm.
|
||||
- **Displacement is a direct aggregation measure only** and is not interpreted as
|
||||
improved or degraded detection. The end-to-end effect (§D) is reported
|
||||
separately.
|
||||
|
||||
---
|
||||
|
||||
## F. Client-level analysis
|
||||
|
||||
Per-client test rarity metrics relative to `beta = 0`
|
||||
(`artifacts/analysis/xiiotid__alpha0.5__seed0__paired_client_beta_metrics.csv`
|
||||
contains the full paired table including validation columns and `N_ij`).
|
||||
|
||||
Delta test rare-class F1 vs `beta = 0` (negative = worse):
|
||||
|
||||
| client | min positive N_ij | beta=0 rare F1 | Δβ=0.25 | Δβ=0.50 | Δβ=0.75 | Δβ=1.00 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 0 | 18 | 0.4996 | +0.0115 | +0.0127 | −0.0010 | −0.0177 |
|
||||
| 1 | 69 | 0.3844 | +0.0124 | +0.0154 | +0.0107 | +0.0061 |
|
||||
| 2 | 5 | 0.8823 | +0.0109 | +0.0215 | +0.0126 | −0.0364 |
|
||||
| 3 | 140 | 0.6162 | −0.0066 | −0.0681 | −0.2566 | −0.3422 |
|
||||
| 4 | 1 | 0.1375 | −0.0005 | +0.0036 | +0.0126 | −0.0143 |
|
||||
| 5 | 2 | 0.7126 | +0.0500 | +0.1204 | +0.1213 | +0.0622 |
|
||||
| 6 | 44 | 0.3788 | +0.0304 | +0.0634 | +0.0690 | +0.0325 |
|
||||
| 7 | 10 | 0.0470 | +0.0109 | +0.0006 | −0.0073 | −0.0140 |
|
||||
| 8 | 4 | 0.6316 | +0.0298 | +0.0027 | −0.0108 | −0.0274 |
|
||||
| 9 | 12 | 0.3910 | +0.0069 | +0.0141 | +0.0093 | +0.0027 |
|
||||
|
||||
Observations (descriptive, **not causal**):
|
||||
|
||||
- At `beta = 0.50`, six of ten clients improve and the only materially negative
|
||||
client is client 3 (−0.068); the per-client mean therefore peaks at
|
||||
`beta = 0.50` (§B.1).
|
||||
- At `beta = 0.75`/`1.00`, several clients lose ground, and the largest single
|
||||
loss is client 3 (−0.257 / −0.342). Client 3 has `min positive N_ij = 140`,
|
||||
so it is **not** the lowest-support client; conversely client 5
|
||||
(`min positive N_ij = 2`) is the largest gainer at `beta ≥ 0.5`.
|
||||
- The relationship between `min positive N_ij` and ΔF1 is **not monotonic** in
|
||||
this single condition. The data are recorded to enable the later, multi-seed
|
||||
analysis of whether high beta disproportionately harms low-support clients;
|
||||
no such claim is made here.
|
||||
|
||||
---
|
||||
|
||||
## G. Runtime and resources
|
||||
|
||||
Measured with `/usr/bin/time -v`, CPU only, no GPU, no swap.
|
||||
|
||||
| beta | wall-clock | CPU % | peak RSS |
|
||||
|---|---|---|---|
|
||||
| 0.00 | 41:17 | 740 % | 6.21 GiB |
|
||||
| 0.25 | 42:11 | 738 % | 6.21 GiB |
|
||||
| 0.50 | 42:57 | 737 % | 6.21 GiB |
|
||||
| 0.75 | 43:45 | 733 % | 6.21 GiB |
|
||||
| 1.00 | 42:08 | 737 % | 6.21 GiB |
|
||||
|
||||
Total: ~3 h 30 min for the five paired candidates, plus ~41 min for the initial
|
||||
beta=0 measurement run (same configuration; not counted twice in the table
|
||||
above beyond beta=0.00). Preprocessing/load is negligible next to training
|
||||
(Session 3 measured ~0.9 s read and ~1.3 s prepare). No warnings, no client
|
||||
failures, 9/9 global prototypes in every round, exit status 0.
|
||||
|
||||
---
|
||||
|
||||
## H. Limitations
|
||||
|
||||
- **Single dataset** (X-IIoTID), **single alpha** (0.50), **single seed** (0).
|
||||
- The `S_j` participant/denominator rule
|
||||
(`S_j = {i | N_ij > 0 and valid C_ij}`, equal weights in the baseline) is a
|
||||
**REPRODUCTION ASSUMPTION**, not verified original PROTEAN behaviour. It is
|
||||
material in 53/162 class-condition cells (32.7 %), 15/18 conditions
|
||||
(`docs/baseline/BASELINE_VALIDATION.md` §D). `beta = 0` equality with the
|
||||
baseline is **conditional** on both modes using this shared rule; the
|
||||
`beta = 0` vs `original_protean` comparison below does **not** prove the rule
|
||||
matches original PROTEAN.
|
||||
- **No claim of a global beta optimum.** `beta = 0.50` is only the best among the
|
||||
five tested candidates under this one validation procedure.
|
||||
- **No full experiment grid has been run** (no other alpha, seed, dataset).
|
||||
- The selected-beta test numbers are single-condition and may not generalise.
|
||||
- The validation per-client evaluation partition used for selection is a
|
||||
Session-5 clarification (mirrors the existing test per-client Dirichlet
|
||||
procedure); it is a project decision, not source-confirmed.
|
||||
- `beta = 0` under `support_weighted` is mathematically the equal mean but is
|
||||
**not bitwise identical** to `original_protean` (see §I); the difference is
|
||||
floating-point ordering, not a methodological change.
|
||||
|
||||
---
|
||||
|
||||
## I. `beta = 0` equivalence check (vs frozen `original_protean`)
|
||||
|
||||
| Property | Result |
|
||||
|---|---|
|
||||
| Same frozen manifest | **Yes** — identical manifest content/partition/split hashes |
|
||||
| Same initialisation / round-0 setup | **Yes** — round-0 prototype snapshot byte-identical (`e27f41b3a62eb83c`) |
|
||||
| Same training behaviour | **Mathematically yes, not bitwise.** `original_protean` computes `Σ(C_ij/count)`; `support_weighted beta=0` computes `Σ((1/count)·C_ij)`. Per-element difference is at most `2.2e-16`–`4.4e-16` (~1 ULP, relative ~1e-16) on the round-0 snapshot. |
|
||||
| Same validation metrics | **No** — tiny divergence (e.g. global rare macro-F1 0.611641 vs 0.608087) |
|
||||
| Same test metrics | **No** — accuracy 0.891974 vs 0.890432; rare macro-F1 0.613575 vs 0.609620 |
|
||||
| Same deterministic artifacts | Round-0 snapshot, `train_support_Nij.csv`, `characterization.csv`, `rare_unseen.csv` identical; `history.json` and per-client/per-class metrics differ |
|
||||
|
||||
Mechanism: round 0 is byte-identical, then the ~1 ULP aggregation difference
|
||||
feeds back into round-1 prototype-alignment training and the trajectories
|
||||
diverge slowly (differences grow from ~1e-4 at round 1 to ~1e-2 at round 9). This
|
||||
is floating-point arithmetic ordering (`vec/count` vs `vec*(1/count)`), amplified
|
||||
by iterative training, **not** a semantic difference in the aggregation formula.
|
||||
No code was changed to force bitwise equality; the frozen baseline arithmetic was
|
||||
left untouched.
|
||||
|
||||
**Caveat:** this equivalence is conditional on the shared `S_j` reproduction
|
||||
assumption and does not establish that `beta = 0` reproduces original PROTEAN.
|
||||
|
||||
---
|
||||
|
||||
## J. Verdict
|
||||
|
||||
The validation/test separation protocol ran cleanly end to end for this
|
||||
condition: candidates trained on the paired manifest, beta was selected using
|
||||
validation metrics only, and the selected beta was evaluated once on test. The
|
||||
protocol appears ready, with the documented clarifications (validation per-client
|
||||
evaluation partition; float-level `beta = 0` non-identity), to be scaled to
|
||||
multi-seed/multi-alpha experiments. No full grid was launched.
|
||||
@@ -252,6 +252,66 @@ def main(argv=None) -> int:
|
||||
"rare_class_recall": rare["rare_class_recall"],
|
||||
})
|
||||
|
||||
# ---- global validation evaluation (SELECTION ONLY) -------------------
|
||||
# This block never influences training and is never used to tune any
|
||||
# hyperparameter except the prototype-aggregation beta, which is selected
|
||||
# on validation metrics only. The test split is untouched here.
|
||||
val_embeddings = extract_embeddings(model, val_features)
|
||||
val_pred = nearest_prototype_predict(val_embeddings, global_prototypes)
|
||||
val_metrics = classification_metrics(val_labels, val_pred, bundle.num_classes)
|
||||
val_rare = rare_class_metrics(val_labels, val_pred, bundle.num_classes, union_rare)
|
||||
|
||||
val_eval_assignments, _ = partition_mod.partition_eval_split(
|
||||
val_labels, args.clients, args.alpha, args.dataset, args.seed, "validation"
|
||||
)
|
||||
val_per_client_rows = []
|
||||
for client_id in range(args.clients):
|
||||
idx = val_eval_assignments[client_id]
|
||||
if len(idx) == 0:
|
||||
val_per_client_rows.append({
|
||||
"client_id": client_id, "n_samples": 0, "accuracy": None,
|
||||
"macro_f1": None, "rare_class_macro_f1": None, "rare_class_recall": None,
|
||||
})
|
||||
continue
|
||||
emb = extract_embeddings(model, val_features[idx])
|
||||
pred = nearest_prototype_predict(emb, global_prototypes)
|
||||
metrics = classification_metrics(val_labels[idx], pred, bundle.num_classes)
|
||||
rare_ids = per_client_rare[client_id]
|
||||
if rare_ids:
|
||||
rare = rare_class_metrics(val_labels[idx], pred, bundle.num_classes, rare_ids)
|
||||
else:
|
||||
rare = {"rare_class_macro_f1": None, "rare_class_recall": None}
|
||||
val_per_client_rows.append({
|
||||
"client_id": client_id,
|
||||
"n_samples": int(len(idx)),
|
||||
"accuracy": metrics["accuracy"],
|
||||
"macro_f1": metrics["macro_f1"],
|
||||
"rare_class_macro_f1": rare["rare_class_macro_f1"],
|
||||
"rare_class_recall": rare["rare_class_recall"],
|
||||
})
|
||||
|
||||
def _mean_over_present(rows, key):
|
||||
values = [float(row[key]) for row in rows if row.get(key) is not None]
|
||||
return float(sum(values) / len(values)) if values else None
|
||||
|
||||
val_selection = {
|
||||
"val_rare_class_macro_f1_global": val_rare["rare_class_macro_f1"],
|
||||
"val_rare_class_recall_global": val_rare["rare_class_recall"],
|
||||
"val_macro_f1_global": val_metrics["macro_f1"],
|
||||
"val_weighted_f1_global": val_metrics["weighted_f1"],
|
||||
"val_accuracy_global": val_metrics["accuracy"],
|
||||
"val_rare_class_macro_f1_per_client_mean": _mean_over_present(
|
||||
val_per_client_rows, "rare_class_macro_f1"
|
||||
),
|
||||
"val_rare_class_recall_per_client_mean": _mean_over_present(
|
||||
val_per_client_rows, "rare_class_recall"
|
||||
),
|
||||
"val_n_eval_clients": sum(1 for row in val_per_client_rows if row["n_samples"] > 0),
|
||||
"selection_metric": "rare_class_macro_f1_per_client_mean",
|
||||
"selection_split": "validation",
|
||||
"test_used_for_selection": False,
|
||||
}
|
||||
|
||||
# ---- structured artifacts --------------------------------------------
|
||||
mode_tag = args.aggregation_mode
|
||||
if args.aggregation_mode == "support_weighted":
|
||||
@@ -301,6 +361,19 @@ def main(argv=None) -> int:
|
||||
for row in test_metrics["per_class"]
|
||||
])
|
||||
write_csv(run_dir / "per_client.csv", per_client_rows)
|
||||
write_json(run_dir / "val_global_metrics.json", {
|
||||
"accuracy": val_metrics["accuracy"],
|
||||
"macro_f1": val_metrics["macro_f1"],
|
||||
"weighted_f1": val_metrics["weighted_f1"],
|
||||
**val_rare,
|
||||
})
|
||||
write_json(run_dir / "val_confusion_matrix.json", val_metrics["confusion_matrix"])
|
||||
write_csv(run_dir / "val_per_class.csv", [
|
||||
{**row, "class_name": bundle.class_names[row["class_id"]]}
|
||||
for row in val_metrics["per_class"]
|
||||
])
|
||||
write_csv(run_dir / "val_per_client.csv", val_per_client_rows)
|
||||
write_json(run_dir / "val_selection.json", val_selection)
|
||||
write_csv(run_dir / "train_support_Nij.csv", [
|
||||
{"client_id": i, **{bundle.class_names[c]: int(support[i, c]) for c in range(bundle.num_classes)}}
|
||||
for i in range(args.clients)
|
||||
|
||||
Reference in new issue
Block a user