BINN
  • Home
  • Examples & tutorials
    • Creating a BINN
    • Shap example
    • Robustness
  • API Reference
    • BINN
    • Explain
    • BINNTrainer
    • BINNDataloader
  • Previous
  • Next
  • Edit on GitHub
  • Robustness

Robustness¶

In this example we analyze how robust feature selection with BINN is. All feature selection methods are data-greedy, meaning that we need many samples to generate robust estimations of feature importance. One way to analyze this is to train and explain several models, and compare their feature importances. This will also yield a more robust method.

In [1]:
Copied!
from binn import BINN, BINNDataLoader, BINNTrainer
import pandas as pd

# Load your data
data_matrix = pd.read_csv("../binn/data/sample_datamatrix.csv")
design_matrix = pd.read_csv("../binn/data/sample_design_matrix.tsv", sep="\t")

# Initialize BINN
binn = BINN(data_matrix=data_matrix, network_source="reactome", n_layers=5, dropout=0.2)

## Initialize DataLoader
binn_dataloader = BINNDataLoader(binn)

# Create DataLoaders
dataloaders = binn_dataloader.create_dataloaders(
    data_matrix=data_matrix,
    design_matrix=design_matrix,
    feature_column="Protein",
    group_column="group",
    sample_column="sample",
    batch_size=32,
    validation_split=0.2,
)
# Train the model
trainer = BINNTrainer(binn)

from binn import BINNExplainer

explainer = BINNExplainer(binn)

average_importances = explainer.explain(dataloaders, nr_iterations=3, num_epochs=100, trainer=trainer)
from binn import BINN, BINNDataLoader, BINNTrainer import pandas as pd # Load your data data_matrix = pd.read_csv("../binn/data/sample_datamatrix.csv") design_matrix = pd.read_csv("../binn/data/sample_design_matrix.tsv", sep="\t") # Initialize BINN binn = BINN(data_matrix=data_matrix, network_source="reactome", n_layers=5, dropout=0.2) ## Initialize DataLoader binn_dataloader = BINNDataLoader(binn) # Create DataLoaders dataloaders = binn_dataloader.create_dataloaders( data_matrix=data_matrix, design_matrix=design_matrix, feature_column="Protein", group_column="group", sample_column="sample", batch_size=32, validation_split=0.2, ) # Train the model trainer = BINNTrainer(binn) from binn import BINNExplainer explainer = BINNExplainer(binn) average_importances = explainer.explain(dataloaders, nr_iterations=3, num_epochs=100, trainer=trainer)
[INFO] BINN is on device: cpu
Mapping group labels: {np.int64(1): 0, np.int64(2): 1}
[BINNExplainer] Iteration 1/3...
[Epoch 1/100] Train Loss: 0.8722, Train Accuracy: 0.4409
[Epoch 1/100] Val Loss: 0.6932, Val Accuracy: 0.4688
[Epoch 2/100] Train Loss: 1.0039, Train Accuracy: 0.4058
[Epoch 2/100] Val Loss: 0.6932, Val Accuracy: 0.4688
[Epoch 3/100] Train Loss: 0.8480, Train Accuracy: 0.4884
[Epoch 3/100] Val Loss: 0.6932, Val Accuracy: 0.4688
[Epoch 4/100] Train Loss: 0.9019, Train Accuracy: 0.4534
[Epoch 4/100] Val Loss: 0.6928, Val Accuracy: 0.5312
[Epoch 5/100] Train Loss: 0.8155, Train Accuracy: 0.5172
[Epoch 5/100] Val Loss: 0.6928, Val Accuracy: 0.5312
[Epoch 6/100] Train Loss: 0.8161, Train Accuracy: 0.5377
[Epoch 6/100] Val Loss: 0.6926, Val Accuracy: 0.5312
[Epoch 7/100] Train Loss: 0.8011, Train Accuracy: 0.5235
[Epoch 7/100] Val Loss: 0.6927, Val Accuracy: 0.5938
[Epoch 8/100] Train Loss: 0.8089, Train Accuracy: 0.5259
[Epoch 8/100] Val Loss: 0.6922, Val Accuracy: 0.4688
[Epoch 9/100] Train Loss: 0.8030, Train Accuracy: 0.5235
[Epoch 9/100] Val Loss: 0.6931, Val Accuracy: 0.4688
[Epoch 10/100] Train Loss: 0.7974, Train Accuracy: 0.5784
[Epoch 10/100] Val Loss: 0.6888, Val Accuracy: 0.5000
[Epoch 11/100] Train Loss: 0.8542, Train Accuracy: 0.4666
[Epoch 11/100] Val Loss: 0.6754, Val Accuracy: 0.6875
[Epoch 12/100] Train Loss: 0.7494, Train Accuracy: 0.5679
[Epoch 12/100] Val Loss: 0.6533, Val Accuracy: 0.7188
[Epoch 13/100] Train Loss: 0.7032, Train Accuracy: 0.5797
[Epoch 13/100] Val Loss: 0.6191, Val Accuracy: 0.6406
[Epoch 14/100] Train Loss: 0.7650, Train Accuracy: 0.5735
[Epoch 14/100] Val Loss: 0.5861, Val Accuracy: 0.6719
[Epoch 15/100] Train Loss: 0.7377, Train Accuracy: 0.5810
[Epoch 15/100] Val Loss: 0.5665, Val Accuracy: 0.7500
[Epoch 16/100] Train Loss: 0.6764, Train Accuracy: 0.6142
[Epoch 16/100] Val Loss: 0.5487, Val Accuracy: 0.7812
[Epoch 17/100] Train Loss: 0.7043, Train Accuracy: 0.5985
[Epoch 17/100] Val Loss: 0.5426, Val Accuracy: 0.7969
[Epoch 18/100] Train Loss: 0.7055, Train Accuracy: 0.6274
[Epoch 18/100] Val Loss: 0.5343, Val Accuracy: 0.7344
[Epoch 19/100] Train Loss: 0.6689, Train Accuracy: 0.5685
[Epoch 19/100] Val Loss: 0.5276, Val Accuracy: 0.7344
[Epoch 20/100] Train Loss: 0.7306, Train Accuracy: 0.5728
[Epoch 20/100] Val Loss: 0.5214, Val Accuracy: 0.7344
[Epoch 21/100] Train Loss: 0.6750, Train Accuracy: 0.6504
[Epoch 21/100] Val Loss: 0.5189, Val Accuracy: 0.7344
[Epoch 22/100] Train Loss: 0.6520, Train Accuracy: 0.6379
[Epoch 22/100] Val Loss: 0.5432, Val Accuracy: 0.7500
[Epoch 23/100] Train Loss: 0.6885, Train Accuracy: 0.6304
[Epoch 23/100] Val Loss: 0.5259, Val Accuracy: 0.7500
[Epoch 24/100] Train Loss: 0.6260, Train Accuracy: 0.6554
[Epoch 24/100] Val Loss: 0.5332, Val Accuracy: 0.7500
[Epoch 25/100] Train Loss: 0.5714, Train Accuracy: 0.7054
[Epoch 25/100] Val Loss: 0.5299, Val Accuracy: 0.7500
[Epoch 26/100] Train Loss: 0.7151, Train Accuracy: 0.6304
[Epoch 26/100] Val Loss: 0.5191, Val Accuracy: 0.8125
[Epoch 27/100] Train Loss: 0.6898, Train Accuracy: 0.6054
[Epoch 27/100] Val Loss: 0.4883, Val Accuracy: 0.8125
[Epoch 28/100] Train Loss: 0.5490, Train Accuracy: 0.7205
[Epoch 28/100] Val Loss: 0.4766, Val Accuracy: 0.8125
[Epoch 29/100] Train Loss: 0.6649, Train Accuracy: 0.6060
[Epoch 29/100] Val Loss: 0.4663, Val Accuracy: 0.8125
[Epoch 30/100] Train Loss: 0.5763, Train Accuracy: 0.6879
[Epoch 30/100] Val Loss: 0.4651, Val Accuracy: 0.8125
[Epoch 31/100] Train Loss: 0.5855, Train Accuracy: 0.6892
[Epoch 31/100] Val Loss: 0.4527, Val Accuracy: 0.8125
[Epoch 32/100] Train Loss: 0.6125, Train Accuracy: 0.6560
[Epoch 32/100] Val Loss: 0.4396, Val Accuracy: 0.8125
[Epoch 33/100] Train Loss: 0.5711, Train Accuracy: 0.7142
[Epoch 33/100] Val Loss: 0.4376, Val Accuracy: 0.8125
[Epoch 34/100] Train Loss: 0.5832, Train Accuracy: 0.7017
[Epoch 34/100] Val Loss: 0.4322, Val Accuracy: 0.8125
[Epoch 35/100] Train Loss: 0.5406, Train Accuracy: 0.7136
[Epoch 35/100] Val Loss: 0.4180, Val Accuracy: 0.8125
[Epoch 36/100] Train Loss: 0.5581, Train Accuracy: 0.6981
[Epoch 36/100] Val Loss: 0.4077, Val Accuracy: 0.8125
[Epoch 37/100] Train Loss: 0.6007, Train Accuracy: 0.6541
[Epoch 37/100] Val Loss: 0.3873, Val Accuracy: 0.8750
[Epoch 38/100] Train Loss: 0.6025, Train Accuracy: 0.6754
[Epoch 38/100] Val Loss: 0.3808, Val Accuracy: 0.8750
[Epoch 39/100] Train Loss: 0.5861, Train Accuracy: 0.7037
[Epoch 39/100] Val Loss: 0.3696, Val Accuracy: 0.8906
[Epoch 40/100] Train Loss: 0.5581, Train Accuracy: 0.6998
[Epoch 40/100] Val Loss: 0.3694, Val Accuracy: 0.8750
[Epoch 41/100] Train Loss: 0.5396, Train Accuracy: 0.7524
[Epoch 41/100] Val Loss: 0.3782, Val Accuracy: 0.8750
[Epoch 42/100] Train Loss: 0.4844, Train Accuracy: 0.7366
[Epoch 42/100] Val Loss: 0.3847, Val Accuracy: 0.8750
[Epoch 43/100] Train Loss: 0.5415, Train Accuracy: 0.7267
[Epoch 43/100] Val Loss: 0.3806, Val Accuracy: 0.8750
[Epoch 44/100] Train Loss: 0.4842, Train Accuracy: 0.7698
[Epoch 44/100] Val Loss: 0.3792, Val Accuracy: 0.8750
[Epoch 45/100] Train Loss: 0.5298, Train Accuracy: 0.7448
[Epoch 45/100] Val Loss: 0.3704, Val Accuracy: 0.8594
[Epoch 46/100] Train Loss: 0.5246, Train Accuracy: 0.7004
[Epoch 46/100] Val Loss: 0.3621, Val Accuracy: 0.8750
[Epoch 47/100] Train Loss: 0.5010, Train Accuracy: 0.7468
[Epoch 47/100] Val Loss: 0.3536, Val Accuracy: 0.8906
[Epoch 48/100] Train Loss: 0.5489, Train Accuracy: 0.7267
[Epoch 48/100] Val Loss: 0.3374, Val Accuracy: 0.8906
[Epoch 49/100] Train Loss: 0.5024, Train Accuracy: 0.7774
[Epoch 49/100] Val Loss: 0.3320, Val Accuracy: 0.8906
[Epoch 50/100] Train Loss: 0.4502, Train Accuracy: 0.8211
[Epoch 50/100] Val Loss: 0.3199, Val Accuracy: 0.8906
[Epoch 51/100] Train Loss: 0.4708, Train Accuracy: 0.7886
[Epoch 51/100] Val Loss: 0.3124, Val Accuracy: 0.8750
[Epoch 52/100] Train Loss: 0.5374, Train Accuracy: 0.7198
[Epoch 52/100] Val Loss: 0.3089, Val Accuracy: 0.8750
[Epoch 53/100] Train Loss: 0.5101, Train Accuracy: 0.8017
[Epoch 53/100] Val Loss: 0.3066, Val Accuracy: 0.8750
[Epoch 54/100] Train Loss: 0.4343, Train Accuracy: 0.8149
[Epoch 54/100] Val Loss: 0.3138, Val Accuracy: 0.8750
[Epoch 55/100] Train Loss: 0.5170, Train Accuracy: 0.7293
[Epoch 55/100] Val Loss: 0.3217, Val Accuracy: 0.8750
[Epoch 56/100] Train Loss: 0.4846, Train Accuracy: 0.7373
[Epoch 56/100] Val Loss: 0.3143, Val Accuracy: 0.8750
[Epoch 57/100] Train Loss: 0.4959, Train Accuracy: 0.7830
[Epoch 57/100] Val Loss: 0.3039, Val Accuracy: 0.8906
[Epoch 58/100] Train Loss: 0.4200, Train Accuracy: 0.8300
[Epoch 58/100] Val Loss: 0.2996, Val Accuracy: 0.8750
[Epoch 59/100] Train Loss: 0.5097, Train Accuracy: 0.7580
[Epoch 59/100] Val Loss: 0.2879, Val Accuracy: 0.8906
[Epoch 60/100] Train Loss: 0.4219, Train Accuracy: 0.7961
[Epoch 60/100] Val Loss: 0.2860, Val Accuracy: 0.8906
[Epoch 61/100] Train Loss: 0.4711, Train Accuracy: 0.7774
[Epoch 61/100] Val Loss: 0.2720, Val Accuracy: 0.8906
[Epoch 62/100] Train Loss: 0.4537, Train Accuracy: 0.7961
[Epoch 62/100] Val Loss: 0.2630, Val Accuracy: 0.9062
[Epoch 63/100] Train Loss: 0.4655, Train Accuracy: 0.7642
[Epoch 63/100] Val Loss: 0.2599, Val Accuracy: 0.9062
[Epoch 64/100] Train Loss: 0.4057, Train Accuracy: 0.8050
[Epoch 64/100] Val Loss: 0.2650, Val Accuracy: 0.9219
[Epoch 65/100] Train Loss: 0.4483, Train Accuracy: 0.7886
[Epoch 65/100] Val Loss: 0.2676, Val Accuracy: 0.9219
[Epoch 66/100] Train Loss: 0.4263, Train Accuracy: 0.8274
[Epoch 66/100] Val Loss: 0.2703, Val Accuracy: 0.9219
[Epoch 67/100] Train Loss: 0.4507, Train Accuracy: 0.8099
[Epoch 67/100] Val Loss: 0.2861, Val Accuracy: 0.8906
[Epoch 68/100] Train Loss: 0.4164, Train Accuracy: 0.8155
[Epoch 68/100] Val Loss: 0.2933, Val Accuracy: 0.8750
[Epoch 69/100] Train Loss: 0.4427, Train Accuracy: 0.7942
[Epoch 69/100] Val Loss: 0.2840, Val Accuracy: 0.8750
[Epoch 70/100] Train Loss: 0.4015, Train Accuracy: 0.8093
[Epoch 70/100] Val Loss: 0.2762, Val Accuracy: 0.9062
[Epoch 71/100] Train Loss: 0.4044, Train Accuracy: 0.8274
[Epoch 71/100] Val Loss: 0.3055, Val Accuracy: 0.8594
[Epoch 72/100] Train Loss: 0.3961, Train Accuracy: 0.8274
[Epoch 72/100] Val Loss: 0.2980, Val Accuracy: 0.8594
[Epoch 73/100] Train Loss: 0.4161, Train Accuracy: 0.8086
[Epoch 73/100] Val Loss: 0.2773, Val Accuracy: 0.8906
[Epoch 74/100] Train Loss: 0.3648, Train Accuracy: 0.8668
[Epoch 74/100] Val Loss: 0.2760, Val Accuracy: 0.9062
[Epoch 75/100] Train Loss: 0.3807, Train Accuracy: 0.8149
[Epoch 75/100] Val Loss: 0.2675, Val Accuracy: 0.9062
[Epoch 76/100] Train Loss: 0.3806, Train Accuracy: 0.8280
[Epoch 76/100] Val Loss: 0.2589, Val Accuracy: 0.9062
[Epoch 77/100] Train Loss: 0.4066, Train Accuracy: 0.8162
[Epoch 77/100] Val Loss: 0.2576, Val Accuracy: 0.9062
[Epoch 78/100] Train Loss: 0.3681, Train Accuracy: 0.8580
[Epoch 78/100] Val Loss: 0.2536, Val Accuracy: 0.9062
[Epoch 79/100] Train Loss: 0.3819, Train Accuracy: 0.8356
[Epoch 79/100] Val Loss: 0.2543, Val Accuracy: 0.9062
[Epoch 80/100] Train Loss: 0.4032, Train Accuracy: 0.8129
[Epoch 80/100] Val Loss: 0.2485, Val Accuracy: 0.9062
[Epoch 81/100] Train Loss: 0.3618, Train Accuracy: 0.8412
[Epoch 81/100] Val Loss: 0.2680, Val Accuracy: 0.9062
[Epoch 82/100] Train Loss: 0.3592, Train Accuracy: 0.8543
[Epoch 82/100] Val Loss: 0.2759, Val Accuracy: 0.9062
[Epoch 83/100] Train Loss: 0.3862, Train Accuracy: 0.8655
[Epoch 83/100] Val Loss: 0.2727, Val Accuracy: 0.8906
[Epoch 84/100] Train Loss: 0.4263, Train Accuracy: 0.8293
[Epoch 84/100] Val Loss: 0.2525, Val Accuracy: 0.9062
[Epoch 85/100] Train Loss: 0.3653, Train Accuracy: 0.8425
[Epoch 85/100] Val Loss: 0.2471, Val Accuracy: 0.9062
[Epoch 86/100] Train Loss: 0.3513, Train Accuracy: 0.8662
[Epoch 86/100] Val Loss: 0.2366, Val Accuracy: 0.9062
[Epoch 87/100] Train Loss: 0.3684, Train Accuracy: 0.8343
[Epoch 87/100] Val Loss: 0.2569, Val Accuracy: 0.9062
[Epoch 88/100] Train Loss: 0.3961, Train Accuracy: 0.8392
[Epoch 88/100] Val Loss: 0.2586, Val Accuracy: 0.8906
[Epoch 89/100] Train Loss: 0.3943, Train Accuracy: 0.8136
[Epoch 89/100] Val Loss: 0.2682, Val Accuracy: 0.8906
[Epoch 90/100] Train Loss: 0.3851, Train Accuracy: 0.8724
[Epoch 90/100] Val Loss: 0.2597, Val Accuracy: 0.8906
[Epoch 91/100] Train Loss: 0.4028, Train Accuracy: 0.8455
[Epoch 91/100] Val Loss: 0.2679, Val Accuracy: 0.8906
[Epoch 92/100] Train Loss: 0.3677, Train Accuracy: 0.8530
[Epoch 92/100] Val Loss: 0.2855, Val Accuracy: 0.8906
[Epoch 93/100] Train Loss: 0.3726, Train Accuracy: 0.8412
[Epoch 93/100] Val Loss: 0.2600, Val Accuracy: 0.8906
[Epoch 94/100] Train Loss: 0.3381, Train Accuracy: 0.8537
[Epoch 94/100] Val Loss: 0.2658, Val Accuracy: 0.8750
[Epoch 95/100] Train Loss: 0.3923, Train Accuracy: 0.7981
[Epoch 95/100] Val Loss: 0.2757, Val Accuracy: 0.8750
[Epoch 96/100] Train Loss: 0.3408, Train Accuracy: 0.8718
[Epoch 96/100] Val Loss: 0.2716, Val Accuracy: 0.8906
[Epoch 97/100] Train Loss: 0.3661, Train Accuracy: 0.8455
[Epoch 97/100] Val Loss: 0.2830, Val Accuracy: 0.8750
[Epoch 98/100] Train Loss: 0.4346, Train Accuracy: 0.8024
[Epoch 98/100] Val Loss: 0.2873, Val Accuracy: 0.8906
[Epoch 99/100] Train Loss: 0.3812, Train Accuracy: 0.8218
[Epoch 99/100] Val Loss: 0.3013, Val Accuracy: 0.8906
[Epoch 100/100] Train Loss: 0.3780, Train Accuracy: 0.8418
[Epoch 100/100] Val Loss: 0.2933, Val Accuracy: 0.8906
[BINNExplainer] Iteration 2/3...
[Epoch 1/100] Train Loss: 0.5776, Train Accuracy: 0.6541
[Epoch 1/100] Val Loss: 0.6929, Val Accuracy: 0.5312
[Epoch 2/100] Train Loss: 0.5651, Train Accuracy: 0.7149
[Epoch 2/100] Val Loss: 0.6929, Val Accuracy: 0.5312
[Epoch 3/100] Train Loss: 0.6181, Train Accuracy: 0.6961
[Epoch 3/100] Val Loss: 0.6929, Val Accuracy: 0.5312
[Epoch 4/100] Train Loss: 0.6016, Train Accuracy: 0.7129
[Epoch 4/100] Val Loss: 0.6929, Val Accuracy: 0.5312
[Epoch 5/100] Train Loss: 0.5856, Train Accuracy: 0.7274
[Epoch 5/100] Val Loss: 0.6927, Val Accuracy: 0.5312
[Epoch 6/100] Train Loss: 0.6161, Train Accuracy: 0.6804
[Epoch 6/100] Val Loss: 0.6924, Val Accuracy: 0.5312
[Epoch 7/100] Train Loss: 0.5927, Train Accuracy: 0.6685
[Epoch 7/100] Val Loss: 0.6912, Val Accuracy: 0.5625
[Epoch 8/100] Train Loss: 0.6182, Train Accuracy: 0.6909
[Epoch 8/100] Val Loss: 0.6886, Val Accuracy: 0.8594
[Epoch 9/100] Train Loss: 0.5645, Train Accuracy: 0.7343
[Epoch 9/100] Val Loss: 0.6820, Val Accuracy: 0.7344
[Epoch 10/100] Train Loss: 0.5924, Train Accuracy: 0.6623
[Epoch 10/100] Val Loss: 0.6653, Val Accuracy: 0.7656
[Epoch 11/100] Train Loss: 0.5760, Train Accuracy: 0.6905
[Epoch 11/100] Val Loss: 0.6407, Val Accuracy: 0.8438
[Epoch 12/100] Train Loss: 0.6014, Train Accuracy: 0.7149
[Epoch 12/100] Val Loss: 0.6030, Val Accuracy: 0.8594
[Epoch 13/100] Train Loss: 0.5616, Train Accuracy: 0.7093
[Epoch 13/100] Val Loss: 0.5558, Val Accuracy: 0.8750
[Epoch 14/100] Train Loss: 0.5447, Train Accuracy: 0.7218
[Epoch 14/100] Val Loss: 0.5021, Val Accuracy: 0.8750
[Epoch 15/100] Train Loss: 0.5489, Train Accuracy: 0.6929
[Epoch 15/100] Val Loss: 0.4535, Val Accuracy: 0.8750
[Epoch 16/100] Train Loss: 0.5454, Train Accuracy: 0.7261
[Epoch 16/100] Val Loss: 0.4215, Val Accuracy: 0.8750
[Epoch 17/100] Train Loss: 0.4917, Train Accuracy: 0.7948
[Epoch 17/100] Val Loss: 0.4030, Val Accuracy: 0.7812
[Epoch 18/100] Train Loss: 0.5419, Train Accuracy: 0.7254
[Epoch 18/100] Val Loss: 0.4031, Val Accuracy: 0.7812
[Epoch 19/100] Train Loss: 0.5737, Train Accuracy: 0.6610
[Epoch 19/100] Val Loss: 0.3909, Val Accuracy: 0.8281
[Epoch 20/100] Train Loss: 0.4808, Train Accuracy: 0.7511
[Epoch 20/100] Val Loss: 0.3822, Val Accuracy: 0.8281
[Epoch 21/100] Train Loss: 0.5115, Train Accuracy: 0.7448
[Epoch 21/100] Val Loss: 0.3748, Val Accuracy: 0.8281
[Epoch 22/100] Train Loss: 0.5371, Train Accuracy: 0.7517
[Epoch 22/100] Val Loss: 0.3707, Val Accuracy: 0.8281
[Epoch 23/100] Train Loss: 0.4973, Train Accuracy: 0.7711
[Epoch 23/100] Val Loss: 0.3385, Val Accuracy: 0.9062
[Epoch 24/100] Train Loss: 0.5118, Train Accuracy: 0.7254
[Epoch 24/100] Val Loss: 0.3345, Val Accuracy: 0.9062
[Epoch 25/100] Train Loss: 0.5575, Train Accuracy: 0.7004
[Epoch 25/100] Val Loss: 0.3284, Val Accuracy: 0.8906
[Epoch 26/100] Train Loss: 0.4904, Train Accuracy: 0.7629
[Epoch 26/100] Val Loss: 0.3178, Val Accuracy: 0.9219
[Epoch 27/100] Train Loss: 0.4695, Train Accuracy: 0.7698
[Epoch 27/100] Val Loss: 0.3222, Val Accuracy: 0.9219
[Epoch 28/100] Train Loss: 0.4896, Train Accuracy: 0.7856
[Epoch 28/100] Val Loss: 0.3185, Val Accuracy: 0.9219
[Epoch 29/100] Train Loss: 0.4350, Train Accuracy: 0.8162
[Epoch 29/100] Val Loss: 0.3167, Val Accuracy: 0.9219
[Epoch 30/100] Train Loss: 0.4600, Train Accuracy: 0.8198
[Epoch 30/100] Val Loss: 0.3353, Val Accuracy: 0.8281
[Epoch 31/100] Train Loss: 0.5266, Train Accuracy: 0.7386
[Epoch 31/100] Val Loss: 0.3331, Val Accuracy: 0.8281
[Epoch 32/100] Train Loss: 0.4719, Train Accuracy: 0.8073
[Epoch 32/100] Val Loss: 0.3559, Val Accuracy: 0.7969
[Epoch 33/100] Train Loss: 0.4404, Train Accuracy: 0.7961
[Epoch 33/100] Val Loss: 0.3517, Val Accuracy: 0.7969
[Epoch 34/100] Train Loss: 0.4813, Train Accuracy: 0.7649
[Epoch 34/100] Val Loss: 0.3276, Val Accuracy: 0.8125
[Epoch 35/100] Train Loss: 0.4908, Train Accuracy: 0.7879
[Epoch 35/100] Val Loss: 0.3266, Val Accuracy: 0.8281
[Epoch 36/100] Train Loss: 0.4551, Train Accuracy: 0.8024
[Epoch 36/100] Val Loss: 0.3437, Val Accuracy: 0.7969
[Epoch 37/100] Train Loss: 0.4829, Train Accuracy: 0.7761
[Epoch 37/100] Val Loss: 0.3268, Val Accuracy: 0.8125
[Epoch 38/100] Train Loss: 0.4997, Train Accuracy: 0.7899
[Epoch 38/100] Val Loss: 0.3257, Val Accuracy: 0.7656
[Epoch 39/100] Train Loss: 0.4727, Train Accuracy: 0.7774
[Epoch 39/100] Val Loss: 0.3111, Val Accuracy: 0.8750
[Epoch 40/100] Train Loss: 0.5158, Train Accuracy: 0.6955
[Epoch 40/100] Val Loss: 0.3046, Val Accuracy: 0.9219
[Epoch 41/100] Train Loss: 0.4677, Train Accuracy: 0.7580
[Epoch 41/100] Val Loss: 0.2994, Val Accuracy: 0.9219
[Epoch 42/100] Train Loss: 0.4853, Train Accuracy: 0.7698
[Epoch 42/100] Val Loss: 0.3127, Val Accuracy: 0.8125
[Epoch 43/100] Train Loss: 0.4462, Train Accuracy: 0.7817
[Epoch 43/100] Val Loss: 0.3052, Val Accuracy: 0.8594
[Epoch 44/100] Train Loss: 0.3918, Train Accuracy: 0.8356
[Epoch 44/100] Val Loss: 0.3019, Val Accuracy: 0.8594
[Epoch 45/100] Train Loss: 0.4463, Train Accuracy: 0.7899
[Epoch 45/100] Val Loss: 0.2845, Val Accuracy: 0.9219
[Epoch 46/100] Train Loss: 0.3873, Train Accuracy: 0.8530
[Epoch 46/100] Val Loss: 0.2710, Val Accuracy: 0.9375
[Epoch 47/100] Train Loss: 0.4467, Train Accuracy: 0.7968
[Epoch 47/100] Val Loss: 0.2598, Val Accuracy: 0.9688
[Epoch 48/100] Train Loss: 0.4487, Train Accuracy: 0.7981
[Epoch 48/100] Val Loss: 0.2637, Val Accuracy: 0.9375
[Epoch 49/100] Train Loss: 0.4170, Train Accuracy: 0.8168
[Epoch 49/100] Val Loss: 0.2700, Val Accuracy: 0.9219
[Epoch 50/100] Train Loss: 0.4167, Train Accuracy: 0.8106
[Epoch 50/100] Val Loss: 0.2851, Val Accuracy: 0.8906
[Epoch 51/100] Train Loss: 0.4259, Train Accuracy: 0.8399
[Epoch 51/100] Val Loss: 0.2676, Val Accuracy: 0.9219
[Epoch 52/100] Train Loss: 0.4357, Train Accuracy: 0.7948
[Epoch 52/100] Val Loss: 0.2729, Val Accuracy: 0.9062
[Epoch 53/100] Train Loss: 0.4290, Train Accuracy: 0.8073
[Epoch 53/100] Val Loss: 0.2817, Val Accuracy: 0.9062
[Epoch 54/100] Train Loss: 0.4089, Train Accuracy: 0.8086
[Epoch 54/100] Val Loss: 0.2640, Val Accuracy: 0.9375
[Epoch 55/100] Train Loss: 0.4001, Train Accuracy: 0.8399
[Epoch 55/100] Val Loss: 0.2576, Val Accuracy: 0.9688
[Epoch 56/100] Train Loss: 0.4242, Train Accuracy: 0.8336
[Epoch 56/100] Val Loss: 0.2564, Val Accuracy: 0.9688
[Epoch 57/100] Train Loss: 0.3932, Train Accuracy: 0.8668
[Epoch 57/100] Val Loss: 0.2493, Val Accuracy: 0.9531
[Epoch 58/100] Train Loss: 0.4524, Train Accuracy: 0.8030
[Epoch 58/100] Val Loss: 0.2544, Val Accuracy: 0.9531
[Epoch 59/100] Train Loss: 0.4288, Train Accuracy: 0.8218
[Epoch 59/100] Val Loss: 0.2774, Val Accuracy: 0.9062
[Epoch 60/100] Train Loss: 0.4017, Train Accuracy: 0.8136
[Epoch 60/100] Val Loss: 0.2728, Val Accuracy: 0.9219
[Epoch 61/100] Train Loss: 0.4088, Train Accuracy: 0.8543
[Epoch 61/100] Val Loss: 0.2580, Val Accuracy: 0.9531
[Epoch 62/100] Train Loss: 0.4476, Train Accuracy: 0.7823
[Epoch 62/100] Val Loss: 0.2664, Val Accuracy: 0.9219
[Epoch 63/100] Train Loss: 0.3781, Train Accuracy: 0.8343
[Epoch 63/100] Val Loss: 0.2682, Val Accuracy: 0.9375
[Epoch 64/100] Train Loss: 0.4112, Train Accuracy: 0.8211
[Epoch 64/100] Val Loss: 0.2671, Val Accuracy: 0.9375
[Epoch 65/100] Train Loss: 0.3640, Train Accuracy: 0.8862
[Epoch 65/100] Val Loss: 0.2723, Val Accuracy: 0.9375
[Epoch 66/100] Train Loss: 0.4026, Train Accuracy: 0.8418
[Epoch 66/100] Val Loss: 0.2465, Val Accuracy: 0.9688
[Epoch 67/100] Train Loss: 0.4064, Train Accuracy: 0.8080
[Epoch 67/100] Val Loss: 0.2471, Val Accuracy: 0.9688
[Epoch 68/100] Train Loss: 0.4166, Train Accuracy: 0.8099
[Epoch 68/100] Val Loss: 0.2467, Val Accuracy: 0.9688
[Epoch 69/100] Train Loss: 0.3742, Train Accuracy: 0.8481
[Epoch 69/100] Val Loss: 0.2625, Val Accuracy: 0.9219
[Epoch 70/100] Train Loss: 0.3551, Train Accuracy: 0.8849
[Epoch 70/100] Val Loss: 0.2905, Val Accuracy: 0.8906
[Epoch 71/100] Train Loss: 0.3629, Train Accuracy: 0.8800
[Epoch 71/100] Val Loss: 0.3039, Val Accuracy: 0.8125
[Epoch 72/100] Train Loss: 0.3889, Train Accuracy: 0.8323
[Epoch 72/100] Val Loss: 0.2851, Val Accuracy: 0.8750
[Epoch 73/100] Train Loss: 0.3497, Train Accuracy: 0.8675
[Epoch 73/100] Val Loss: 0.2827, Val Accuracy: 0.8750
[Epoch 74/100] Train Loss: 0.4076, Train Accuracy: 0.8037
[Epoch 74/100] Val Loss: 0.2737, Val Accuracy: 0.9219
[Epoch 75/100] Train Loss: 0.4486, Train Accuracy: 0.7698
[Epoch 75/100] Val Loss: 0.2545, Val Accuracy: 0.9219
[Epoch 76/100] Train Loss: 0.3500, Train Accuracy: 0.8875
[Epoch 76/100] Val Loss: 0.2492, Val Accuracy: 0.9375
[Epoch 77/100] Train Loss: 0.3810, Train Accuracy: 0.8662
[Epoch 77/100] Val Loss: 0.2537, Val Accuracy: 0.9219
[Epoch 78/100] Train Loss: 0.3328, Train Accuracy: 0.8655
[Epoch 78/100] Val Loss: 0.2523, Val Accuracy: 0.9219
[Epoch 79/100] Train Loss: 0.3637, Train Accuracy: 0.8431
[Epoch 79/100] Val Loss: 0.2700, Val Accuracy: 0.9219
[Epoch 80/100] Train Loss: 0.3847, Train Accuracy: 0.8412
[Epoch 80/100] Val Loss: 0.2765, Val Accuracy: 0.9062
[Epoch 81/100] Train Loss: 0.3772, Train Accuracy: 0.8619
[Epoch 81/100] Val Loss: 0.2746, Val Accuracy: 0.9219
[Epoch 82/100] Train Loss: 0.3931, Train Accuracy: 0.8330
[Epoch 82/100] Val Loss: 0.2724, Val Accuracy: 0.9219
[Epoch 83/100] Train Loss: 0.3798, Train Accuracy: 0.8343
[Epoch 83/100] Val Loss: 0.3024, Val Accuracy: 0.8125
[Epoch 84/100] Train Loss: 0.3551, Train Accuracy: 0.8425
[Epoch 84/100] Val Loss: 0.3248, Val Accuracy: 0.8125
[Epoch 85/100] Train Loss: 0.3532, Train Accuracy: 0.8468
[Epoch 85/100] Val Loss: 0.3248, Val Accuracy: 0.8125
[Epoch 86/100] Train Loss: 0.3283, Train Accuracy: 0.8573
[Epoch 86/100] Val Loss: 0.2791, Val Accuracy: 0.9062
[Epoch 87/100] Train Loss: 0.4187, Train Accuracy: 0.8274
[Epoch 87/100] Val Loss: 0.2742, Val Accuracy: 0.9062
[Epoch 88/100] Train Loss: 0.3520, Train Accuracy: 0.8625
[Epoch 88/100] Val Loss: 0.2685, Val Accuracy: 0.9062
[Epoch 89/100] Train Loss: 0.3527, Train Accuracy: 0.8836
[Epoch 89/100] Val Loss: 0.2692, Val Accuracy: 0.9062
[Epoch 90/100] Train Loss: 0.3375, Train Accuracy: 0.8550
[Epoch 90/100] Val Loss: 0.2513, Val Accuracy: 0.9219
[Epoch 91/100] Train Loss: 0.3746, Train Accuracy: 0.8530
[Epoch 91/100] Val Loss: 0.2527, Val Accuracy: 0.9219
[Epoch 92/100] Train Loss: 0.3375, Train Accuracy: 0.8405
[Epoch 92/100] Val Loss: 0.2315, Val Accuracy: 0.9375
[Epoch 93/100] Train Loss: 0.3122, Train Accuracy: 0.9175
[Epoch 93/100] Val Loss: 0.2432, Val Accuracy: 0.9219
[Epoch 94/100] Train Loss: 0.3262, Train Accuracy: 0.8862
[Epoch 94/100] Val Loss: 0.2358, Val Accuracy: 0.9219
[Epoch 95/100] Train Loss: 0.3134, Train Accuracy: 0.9237
[Epoch 95/100] Val Loss: 0.2558, Val Accuracy: 0.9219
[Epoch 96/100] Train Loss: 0.3492, Train Accuracy: 0.8606
[Epoch 96/100] Val Loss: 0.2341, Val Accuracy: 0.9375
[Epoch 97/100] Train Loss: 0.3262, Train Accuracy: 0.8800
[Epoch 97/100] Val Loss: 0.2277, Val Accuracy: 0.9375
[Epoch 98/100] Train Loss: 0.3343, Train Accuracy: 0.8925
[Epoch 98/100] Val Loss: 0.2404, Val Accuracy: 0.9375
[Epoch 99/100] Train Loss: 0.3193, Train Accuracy: 0.8912
[Epoch 99/100] Val Loss: 0.2349, Val Accuracy: 0.9375
[Epoch 100/100] Train Loss: 0.3189, Train Accuracy: 0.8987
[Epoch 100/100] Val Loss: 0.2346, Val Accuracy: 0.9375
[BINNExplainer] Iteration 3/3...
[Epoch 1/100] Train Loss: 0.4883, Train Accuracy: 0.8086
[Epoch 1/100] Val Loss: 0.6931, Val Accuracy: 0.5312
[Epoch 2/100] Train Loss: 0.4763, Train Accuracy: 0.8280
[Epoch 2/100] Val Loss: 0.6929, Val Accuracy: 0.5312
[Epoch 3/100] Train Loss: 0.4736, Train Accuracy: 0.7905
[Epoch 3/100] Val Loss: 0.6928, Val Accuracy: 0.5312
[Epoch 4/100] Train Loss: 0.4675, Train Accuracy: 0.7886
[Epoch 4/100] Val Loss: 0.6925, Val Accuracy: 0.5312
[Epoch 5/100] Train Loss: 0.4775, Train Accuracy: 0.7987
[Epoch 5/100] Val Loss: 0.6917, Val Accuracy: 0.5312
[Epoch 6/100] Train Loss: 0.4689, Train Accuracy: 0.7774
[Epoch 6/100] Val Loss: 0.6906, Val Accuracy: 0.5312
[Epoch 7/100] Train Loss: 0.4451, Train Accuracy: 0.8205
[Epoch 7/100] Val Loss: 0.6881, Val Accuracy: 0.5312
[Epoch 8/100] Train Loss: 0.4796, Train Accuracy: 0.7679
[Epoch 8/100] Val Loss: 0.6809, Val Accuracy: 0.5469
[Epoch 9/100] Train Loss: 0.4580, Train Accuracy: 0.8261
[Epoch 9/100] Val Loss: 0.6653, Val Accuracy: 0.8750
[Epoch 10/100] Train Loss: 0.4304, Train Accuracy: 0.8343
[Epoch 10/100] Val Loss: 0.6342, Val Accuracy: 0.8906
[Epoch 11/100] Train Loss: 0.4665, Train Accuracy: 0.7905
[Epoch 11/100] Val Loss: 0.5872, Val Accuracy: 0.9062
[Epoch 12/100] Train Loss: 0.4768, Train Accuracy: 0.8086
[Epoch 12/100] Val Loss: 0.5260, Val Accuracy: 0.9219
[Epoch 13/100] Train Loss: 0.4594, Train Accuracy: 0.8205
[Epoch 13/100] Val Loss: 0.4629, Val Accuracy: 0.9219
[Epoch 14/100] Train Loss: 0.4362, Train Accuracy: 0.8149
[Epoch 14/100] Val Loss: 0.4100, Val Accuracy: 0.9688
[Epoch 15/100] Train Loss: 0.4007, Train Accuracy: 0.8343
[Epoch 15/100] Val Loss: 0.3674, Val Accuracy: 0.9375
[Epoch 16/100] Train Loss: 0.4072, Train Accuracy: 0.8162
[Epoch 16/100] Val Loss: 0.3414, Val Accuracy: 0.8750
[Epoch 17/100] Train Loss: 0.4458, Train Accuracy: 0.8218
[Epoch 17/100] Val Loss: 0.3229, Val Accuracy: 0.8594
[Epoch 18/100] Train Loss: 0.4357, Train Accuracy: 0.8412
[Epoch 18/100] Val Loss: 0.3294, Val Accuracy: 0.8594
[Epoch 19/100] Train Loss: 0.3732, Train Accuracy: 0.8918
[Epoch 19/100] Val Loss: 0.3385, Val Accuracy: 0.8438
[Epoch 20/100] Train Loss: 0.4047, Train Accuracy: 0.8287
[Epoch 20/100] Val Loss: 0.3363, Val Accuracy: 0.8438
[Epoch 21/100] Train Loss: 0.4019, Train Accuracy: 0.8668
[Epoch 21/100] Val Loss: 0.3319, Val Accuracy: 0.8438
[Epoch 22/100] Train Loss: 0.3757, Train Accuracy: 0.8800
[Epoch 22/100] Val Loss: 0.3203, Val Accuracy: 0.8438
[Epoch 23/100] Train Loss: 0.3633, Train Accuracy: 0.8925
[Epoch 23/100] Val Loss: 0.3206, Val Accuracy: 0.8281
[Epoch 24/100] Train Loss: 0.4284, Train Accuracy: 0.8274
[Epoch 24/100] Val Loss: 0.3172, Val Accuracy: 0.8281
[Epoch 25/100] Train Loss: 0.4015, Train Accuracy: 0.8461
[Epoch 25/100] Val Loss: 0.3048, Val Accuracy: 0.8438
[Epoch 26/100] Train Loss: 0.4167, Train Accuracy: 0.8155
[Epoch 26/100] Val Loss: 0.2935, Val Accuracy: 0.8438
[Epoch 27/100] Train Loss: 0.3805, Train Accuracy: 0.8280
[Epoch 27/100] Val Loss: 0.3022, Val Accuracy: 0.8438
[Epoch 28/100] Train Loss: 0.3869, Train Accuracy: 0.8580
[Epoch 28/100] Val Loss: 0.3214, Val Accuracy: 0.8281
[Epoch 29/100] Train Loss: 0.3592, Train Accuracy: 0.8718
[Epoch 29/100] Val Loss: 0.3196, Val Accuracy: 0.8281
[Epoch 30/100] Train Loss: 0.3719, Train Accuracy: 0.8606
[Epoch 30/100] Val Loss: 0.3071, Val Accuracy: 0.8281
[Epoch 31/100] Train Loss: 0.3493, Train Accuracy: 0.8849
[Epoch 31/100] Val Loss: 0.3018, Val Accuracy: 0.8281
[Epoch 32/100] Train Loss: 0.3121, Train Accuracy: 0.9175
[Epoch 32/100] Val Loss: 0.3016, Val Accuracy: 0.8281
[Epoch 33/100] Train Loss: 0.3997, Train Accuracy: 0.8481
[Epoch 33/100] Val Loss: 0.2884, Val Accuracy: 0.9062
[Epoch 34/100] Train Loss: 0.3440, Train Accuracy: 0.8994
[Epoch 34/100] Val Loss: 0.2912, Val Accuracy: 0.8906
[Epoch 35/100] Train Loss: 0.3915, Train Accuracy: 0.8293
[Epoch 35/100] Val Loss: 0.2834, Val Accuracy: 0.9062
[Epoch 36/100] Train Loss: 0.3274, Train Accuracy: 0.8675
[Epoch 36/100] Val Loss: 0.2914, Val Accuracy: 0.8906
[Epoch 37/100] Train Loss: 0.3415, Train Accuracy: 0.8412
[Epoch 37/100] Val Loss: 0.2818, Val Accuracy: 0.9062
[Epoch 38/100] Train Loss: 0.2993, Train Accuracy: 0.9237
[Epoch 38/100] Val Loss: 0.2767, Val Accuracy: 0.9062
[Epoch 39/100] Train Loss: 0.3421, Train Accuracy: 0.9237
[Epoch 39/100] Val Loss: 0.2852, Val Accuracy: 0.8906
[Epoch 40/100] Train Loss: 0.3344, Train Accuracy: 0.9037
[Epoch 40/100] Val Loss: 0.2830, Val Accuracy: 0.9062
[Epoch 41/100] Train Loss: 0.3135, Train Accuracy: 0.8987
[Epoch 41/100] Val Loss: 0.2810, Val Accuracy: 0.9062
[Epoch 42/100] Train Loss: 0.3530, Train Accuracy: 0.8836
[Epoch 42/100] Val Loss: 0.2887, Val Accuracy: 0.9062
[Epoch 43/100] Train Loss: 0.3235, Train Accuracy: 0.8931
[Epoch 43/100] Val Loss: 0.2826, Val Accuracy: 0.8906
[Epoch 44/100] Train Loss: 0.3517, Train Accuracy: 0.8662
[Epoch 44/100] Val Loss: 0.2805, Val Accuracy: 0.8906
[Epoch 45/100] Train Loss: 0.3445, Train Accuracy: 0.8468
[Epoch 45/100] Val Loss: 0.2777, Val Accuracy: 0.8750
[Epoch 46/100] Train Loss: 0.3282, Train Accuracy: 0.8918
[Epoch 46/100] Val Loss: 0.2677, Val Accuracy: 0.8750
[Epoch 47/100] Train Loss: 0.3287, Train Accuracy: 0.8731
[Epoch 47/100] Val Loss: 0.2584, Val Accuracy: 0.8906
[Epoch 48/100] Train Loss: 0.2973, Train Accuracy: 0.9119
[Epoch 48/100] Val Loss: 0.2552, Val Accuracy: 0.8906
[Epoch 49/100] Train Loss: 0.2990, Train Accuracy: 0.8862
[Epoch 49/100] Val Loss: 0.2510, Val Accuracy: 0.8906
[Epoch 50/100] Train Loss: 0.3245, Train Accuracy: 0.8599
[Epoch 50/100] Val Loss: 0.2566, Val Accuracy: 0.8906
[Epoch 51/100] Train Loss: 0.2723, Train Accuracy: 0.8925
[Epoch 51/100] Val Loss: 0.2703, Val Accuracy: 0.8906
[Epoch 52/100] Train Loss: 0.2834, Train Accuracy: 0.8925
[Epoch 52/100] Val Loss: 0.2810, Val Accuracy: 0.8906
[Epoch 53/100] Train Loss: 0.3065, Train Accuracy: 0.9050
[Epoch 53/100] Val Loss: 0.2712, Val Accuracy: 0.8906
[Epoch 54/100] Train Loss: 0.2520, Train Accuracy: 0.9244
[Epoch 54/100] Val Loss: 0.2674, Val Accuracy: 0.8906
[Epoch 55/100] Train Loss: 0.2568, Train Accuracy: 0.8918
[Epoch 55/100] Val Loss: 0.2550, Val Accuracy: 0.8906
[Epoch 56/100] Train Loss: 0.3323, Train Accuracy: 0.8780
[Epoch 56/100] Val Loss: 0.2503, Val Accuracy: 0.8906
[Epoch 57/100] Train Loss: 0.2897, Train Accuracy: 0.8856
[Epoch 57/100] Val Loss: 0.2458, Val Accuracy: 0.8906
[Epoch 58/100] Train Loss: 0.3138, Train Accuracy: 0.9175
[Epoch 58/100] Val Loss: 0.2491, Val Accuracy: 0.9062
[Epoch 59/100] Train Loss: 0.2883, Train Accuracy: 0.9162
[Epoch 59/100] Val Loss: 0.2233, Val Accuracy: 0.9219
[Epoch 60/100] Train Loss: 0.3099, Train Accuracy: 0.8918
[Epoch 60/100] Val Loss: 0.2264, Val Accuracy: 0.9062
[Epoch 61/100] Train Loss: 0.3179, Train Accuracy: 0.8925
[Epoch 61/100] Val Loss: 0.2369, Val Accuracy: 0.9062
[Epoch 62/100] Train Loss: 0.2377, Train Accuracy: 0.9369
[Epoch 62/100] Val Loss: 0.2396, Val Accuracy: 0.9062
[Epoch 63/100] Train Loss: 0.2487, Train Accuracy: 0.9362
[Epoch 63/100] Val Loss: 0.2443, Val Accuracy: 0.9062
[Epoch 64/100] Train Loss: 0.2607, Train Accuracy: 0.9181
[Epoch 64/100] Val Loss: 0.2452, Val Accuracy: 0.9062
[Epoch 65/100] Train Loss: 0.2838, Train Accuracy: 0.9112
[Epoch 65/100] Val Loss: 0.2433, Val Accuracy: 0.8906
[Epoch 66/100] Train Loss: 0.2630, Train Accuracy: 0.9187
[Epoch 66/100] Val Loss: 0.2415, Val Accuracy: 0.9062
[Epoch 67/100] Train Loss: 0.2155, Train Accuracy: 0.9399
[Epoch 67/100] Val Loss: 0.2426, Val Accuracy: 0.8906
[Epoch 68/100] Train Loss: 0.3308, Train Accuracy: 0.8612
[Epoch 68/100] Val Loss: 0.2386, Val Accuracy: 0.9062
[Epoch 69/100] Train Loss: 0.2510, Train Accuracy: 0.9119
[Epoch 69/100] Val Loss: 0.2277, Val Accuracy: 0.9062
[Epoch 70/100] Train Loss: 0.2554, Train Accuracy: 0.9175
[Epoch 70/100] Val Loss: 0.2248, Val Accuracy: 0.9062
[Epoch 71/100] Train Loss: 0.2865, Train Accuracy: 0.9125
[Epoch 71/100] Val Loss: 0.2179, Val Accuracy: 0.9062
[Epoch 72/100] Train Loss: 0.2677, Train Accuracy: 0.9112
[Epoch 72/100] Val Loss: 0.2150, Val Accuracy: 0.9062
[Epoch 73/100] Train Loss: 0.2547, Train Accuracy: 0.9287
[Epoch 73/100] Val Loss: 0.2195, Val Accuracy: 0.9062
[Epoch 74/100] Train Loss: 0.2768, Train Accuracy: 0.9437
[Epoch 74/100] Val Loss: 0.2216, Val Accuracy: 0.9062
[Epoch 75/100] Train Loss: 0.2462, Train Accuracy: 0.9293
[Epoch 75/100] Val Loss: 0.2264, Val Accuracy: 0.9062
[Epoch 76/100] Train Loss: 0.2650, Train Accuracy: 0.9362
[Epoch 76/100] Val Loss: 0.2159, Val Accuracy: 0.9062
[Epoch 77/100] Train Loss: 0.2386, Train Accuracy: 0.9437
[Epoch 77/100] Val Loss: 0.2196, Val Accuracy: 0.9062
[Epoch 78/100] Train Loss: 0.2637, Train Accuracy: 0.9043
[Epoch 78/100] Val Loss: 0.2174, Val Accuracy: 0.9062
[Epoch 79/100] Train Loss: 0.2370, Train Accuracy: 0.9437
[Epoch 79/100] Val Loss: 0.2102, Val Accuracy: 0.9062
[Epoch 80/100] Train Loss: 0.2821, Train Accuracy: 0.9011
[Epoch 80/100] Val Loss: 0.2076, Val Accuracy: 0.9062
[Epoch 81/100] Train Loss: 0.2469, Train Accuracy: 0.9356
[Epoch 81/100] Val Loss: 0.1994, Val Accuracy: 0.9062
[Epoch 82/100] Train Loss: 0.2445, Train Accuracy: 0.9293
[Epoch 82/100] Val Loss: 0.2009, Val Accuracy: 0.9062
[Epoch 83/100] Train Loss: 0.2433, Train Accuracy: 0.9300
[Epoch 83/100] Val Loss: 0.2065, Val Accuracy: 0.9062
[Epoch 84/100] Train Loss: 0.2102, Train Accuracy: 0.9619
[Epoch 84/100] Val Loss: 0.2044, Val Accuracy: 0.9062
[Epoch 85/100] Train Loss: 0.2853, Train Accuracy: 0.9106
[Epoch 85/100] Val Loss: 0.2154, Val Accuracy: 0.9062
[Epoch 86/100] Train Loss: 0.2524, Train Accuracy: 0.9237
[Epoch 86/100] Val Loss: 0.2134, Val Accuracy: 0.9062
[Epoch 87/100] Train Loss: 0.2283, Train Accuracy: 0.9494
[Epoch 87/100] Val Loss: 0.2206, Val Accuracy: 0.9062
[Epoch 88/100] Train Loss: 0.2519, Train Accuracy: 0.9237
[Epoch 88/100] Val Loss: 0.2154, Val Accuracy: 0.9062
[Epoch 89/100] Train Loss: 0.2534, Train Accuracy: 0.9375
[Epoch 89/100] Val Loss: 0.2155, Val Accuracy: 0.9062
[Epoch 90/100] Train Loss: 0.2424, Train Accuracy: 0.9119
[Epoch 90/100] Val Loss: 0.2209, Val Accuracy: 0.9062
[Epoch 91/100] Train Loss: 0.2313, Train Accuracy: 0.9556
[Epoch 91/100] Val Loss: 0.2175, Val Accuracy: 0.9062
[Epoch 92/100] Train Loss: 0.2422, Train Accuracy: 0.9356
[Epoch 92/100] Val Loss: 0.2186, Val Accuracy: 0.9062
[Epoch 93/100] Train Loss: 0.2881, Train Accuracy: 0.8981
[Epoch 93/100] Val Loss: 0.2178, Val Accuracy: 0.9062
[Epoch 94/100] Train Loss: 0.2571, Train Accuracy: 0.9231
[Epoch 94/100] Val Loss: 0.2146, Val Accuracy: 0.8906
[Epoch 95/100] Train Loss: 0.2525, Train Accuracy: 0.9175
[Epoch 95/100] Val Loss: 0.2101, Val Accuracy: 0.8906
[Epoch 96/100] Train Loss: 0.2538, Train Accuracy: 0.9244
[Epoch 96/100] Val Loss: 0.2126, Val Accuracy: 0.8906
[Epoch 97/100] Train Loss: 0.2571, Train Accuracy: 0.9175
[Epoch 97/100] Val Loss: 0.2106, Val Accuracy: 0.9062
[Epoch 98/100] Train Loss: 0.2869, Train Accuracy: 0.9030
[Epoch 98/100] Val Loss: 0.2119, Val Accuracy: 0.9062
[Epoch 99/100] Train Loss: 0.2607, Train Accuracy: 0.9043
[Epoch 99/100] Val Loss: 0.2139, Val Accuracy: 0.9062
[Epoch 100/100] Train Loss: 0.2346, Train Accuracy: 0.9619
[Epoch 100/100] Val Loss: 0.2016, Val Accuracy: 0.9062
In [2]:
Copied!
average_importances["copy"] = average_importances.apply(lambda x: True if x["source_node"] == x["target_node"] else False, axis=1)
average_importances = average_importances[average_importances["copy"] == False]
average_importances
average_importances["copy"] = average_importances.apply(lambda x: True if x["source_node"] == x["target_node"] else False, axis=1) average_importances = average_importances[average_importances["copy"] == False] average_importances
Out[2]:
source_layer target_layer source_node target_node class_idx importance normalized_importance importance_0 importance_1 importance_2 importance_mean importance_std copy
0 0 1 A0M8Q6 R-HSA-166786 0 0.027387 0.005429 0.027855 0.017162 0.037143 0.027387 0.008164 False
1 0 1 A0M8Q6 R-HSA-166786 1 0.015106 0.002995 0.006003 0.016084 0.023230 0.015106 0.007067 False
2 0 1 A0M8Q6 R-HSA-198933 0 0.027387 0.005429 0.027855 0.017162 0.037143 0.027387 0.008164 False
3 0 1 A0M8Q6 R-HSA-198933 1 0.015106 0.002995 0.006003 0.016084 0.023230 0.015106 0.007067 False
4 0 1 A0M8Q6 R-HSA-2029481 0 0.027387 0.005429 0.027855 0.017162 0.037143 0.027387 0.008164 False
... ... ... ... ... ... ... ... ... ... ... ... ... ...
8697 5 6 R-HSA-9612973 output_node 1 0.123601 0.028599 0.156739 0.070309 0.143756 0.123601 0.038054 False
8698 5 6 R-HSA-9709957 output_node 0 0.077952 0.016786 0.140222 0.003100 0.090535 0.077952 0.056682 False
8699 5 6 R-HSA-9709957 output_node 1 0.246396 0.053059 0.278197 0.172465 0.288527 0.246396 0.052447 False
8700 5 6 R-HSA-9748784 output_node 0 0.063370 0.015504 0.070037 0.086703 0.033370 0.063370 0.022278 False
8701 5 6 R-HSA-9748784 output_node 1 0.106925 0.026159 0.097053 0.149194 0.074527 0.106925 0.031272 False

7620 rows × 13 columns

In [ ]:
Copied!
# Group by and compute the mean of numeric columns.
importance_df_copy = (
    average_importances
    .groupby(["source_node", "source_layer", "target_layer"], as_index=False)
    .mean(numeric_only=True)
)

def compute_normalized_ranks(df, num_importance=5):
    for i in range(num_importance):
        col = f"importance_{i}"
        df[f"rank_{i}"] = df[col].rank(method="min", ascending=False) - 1

    n = len(df)
    df["mean"] = df[[f"rank_{i}" for i in range(num_importance)]].mean(axis=1) / n
    df["std"] = df[[f"rank_{i}" for i in range(num_importance)]].std(axis=1) / n
    return df


dfs = []
for layer in range(binn.n_layers):
    layer_df = importance_df_copy[
        importance_df_copy["source_layer"] == layer
    ].copy()
    layer_df = compute_normalized_ranks(layer_df, num_importance=3)
    dfs.append(layer_df[["source_node", "source_layer", "mean", "std"]])

plot_df = (
    pd.concat(dfs, ignore_index=True)
    .rename(columns={"source_node": "source", "source_layer": "source layer"})
)
# Group by and compute the mean of numeric columns. importance_df_copy = ( average_importances .groupby(["source_node", "source_layer", "target_layer"], as_index=False) .mean(numeric_only=True) ) def compute_normalized_ranks(df, num_importance=5): for i in range(num_importance): col = f"importance_{i}" df[f"rank_{i}"] = df[col].rank(method="min", ascending=False) - 1 n = len(df) df["mean"] = df[[f"rank_{i}" for i in range(num_importance)]].mean(axis=1) / n df["std"] = df[[f"rank_{i}" for i in range(num_importance)]].std(axis=1) / n return df dfs = [] for layer in range(binn.n_layers): layer_df = importance_df_copy[ importance_df_copy["source_layer"] == layer ].copy() layer_df = compute_normalized_ranks(layer_df, num_importance=3) dfs.append(layer_df[["source_node", "source_layer", "mean", "std"]]) plot_df = ( pd.concat(dfs, ignore_index=True) .rename(columns={"source_node": "source", "source_layer": "source layer"}) )
In [5]:
Copied!
plot_df.sort_values("mean").head(20)
plot_df.sort_values("mean").head(20)
Out[5]:
source source layer mean std
426 Q96A08 0 0.002983 0.005166
814 R-HSA-446388 2 0.003115 0.003115
1130 R-HSA-446353 3 0.004796 0.005495
283 P25788 0 0.005220 0.007191
197 P08571 0 0.005220 0.005166
693 R-HSA-140534 2 0.006231 0.006231
224 P12814 0 0.008949 0.005919
1190 R-HSA-69052 3 0.009592 0.007488
1146 R-HSA-5357769 3 0.009592 0.005495
885 R-HSA-69017 2 0.010384 0.001799
1338 R-HSA-446728 4 0.013333 0.016653
978 R-HSA-975634 2 0.013499 0.008993
122 P04114 0 0.014914 0.010572
897 R-HSA-72163 2 0.015576 0.009346
137 P04908 0 0.018643 0.012321
212 P10451 0 0.019389 0.020299
636 R-HSA-9609736 1 0.019691 0.030524
1074 R-HSA-212436 3 0.020384 0.005495
218 P11142 0 0.020880 0.016939
245 P15291 0 0.020880 0.019546

If we now plot the (normalized) mean and standard deviation of the rank, we see that highly important features generally have a low standard deviation. We can therefore be the most certain about the most important features.

In [6]:
Copied!
import seaborn as sns

sns.jointplot(plot_df, y="mean", x="std", hue="source layer", palette="coolwarm")
import seaborn as sns sns.jointplot(plot_df, y="mean", x="std", hue="source layer", palette="coolwarm")
Out[6]:
<seaborn.axisgrid.JointGrid at 0x315899f00>
No description has been provided for this image

Documentation built with MkDocs.

Keyboard Shortcuts

Keys Action
? Open this help
n Next page
p Previous page
s Search