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>