"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"# Plot histogram of predictions\n",
"plt.hist(train_preds, bins=20)\n",
"plt.title('Train predictions')\n",
"plt.grid(axis='y', alpha=0.5)\n",
"plt.show()\n",
"\n",
"plt.hist(val_preds, bins=20)\n",
"plt.title('Validation predictions')\n",
"plt.grid(axis='y', alpha=0.5)\n",
"plt.show()\n",
"\n",
"plt.hist(test_preds, bins=20)\n",
"plt.title('Test predictions')\n",
"plt.grid(axis='y', alpha=0.5)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"TODO: Which data are in the most unsure middle region?"
]
},
{
"cell_type": "code",
"execution_count": 94,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"False 130\n",
"True 65\n",
"Name: Active, dtype: int64"
]
},
"execution_count": 94,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Get the test set predictions which are very confident\n",
"def is_active(p, pos_threshold=0.90, neg_threshold=0.005):\n",
" if p > pos_threshold:\n",
" return True\n",
" elif p < neg_threshold:\n",
" return False\n",
" else:\n",
" return np.nan\n",
"\n",
"\n",
"test_df['Active'] = [\n",
" is_active(p, pos_threshold=0.97, neg_threshold=0.001) for p in test_preds]\n",
"test_df[~test_df['Active'].isna()]['Active'].value_counts()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cross-Validation Training"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"TODO: Cross-Val\n",
"\n",
"* Random split\n",
"* Least Tanimoto dist PROTAC-wise\n",
"* POI-wise: some POIs never in both splits\n",
"\n",
"TODO: Separate test set??"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Global seed set to 42\n"
]
}
],
"source": [
"# Seed everything in pytorch lightning\n",
"pl.seed_everything(42)\n",
"\n",
"\n",
"def train_model(train_df, val_df, disabled_embeddings=[]):\n",
" train_ds = PROTAC_Dataset(\n",
" train_df,\n",
" protein_embeddings,\n",
" cell2embedding,\n",
" smiles2fp,\n",
" use_smote=True,\n",
" )\n",
" val_ds = PROTAC_Dataset(\n",
" val_df,\n",
" protein_embeddings,\n",
" cell2embedding,\n",
" smiles2fp,\n",
" )\n",
" logger = pl.loggers.TensorBoardLogger(\n",
" save_dir='../logs',\n",
" name='protac',\n",
" )\n",
" callbacks = [\n",
" pl.callbacks.EarlyStopping(\n",
" monitor='train_loss',\n",
" patience=10,\n",
" mode='max',\n",
" verbose=True,\n",
" ),\n",
" # pl.callbacks.ModelCheckpoint(\n",
" # monitor='val_acc',\n",
" # mode='max',\n",
" # verbose=True,\n",
" # filename='{epoch}-{val_metrics_opt_score:.4f}',\n",
" # ),\n",
" ]\n",
" # Define Trainer\n",
" trainer = pl.Trainer(\n",
" logger=logger,\n",
" callbacks=callbacks,\n",
" max_epochs=50,\n",
" enable_checkpointing=False,\n",
" )\n",
" model = PROTAC_Model(\n",
" hidden_dim=768,\n",
" smiles_emb_dim=1024,\n",
" poi_emb_dim=1024,\n",
" e3_emb_dim=1024,\n",
" cell_emb_dim=768,\n",
" batch_size=8,\n",
" learning_rate=2e-5,\n",
" train_dataset=train_ds,\n",
" val_dataset=val_ds,\n",
" disabled_embeddings=disabled_embeddings,\n",
" )\n",
" trainer.fit(model)\n",
" val_dl = DataLoader(val_ds, batch_size=32, shuffle=False)\n",
" return model, trainer, trainer.validate(model, val_dl)[0]"
]
},
{
"cell_type": "code",
"execution_count": 130,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | poi_emb | Linear | 787 K \n",
"1 | e3_emb | Linear | 787 K \n",
"2 | cell_emb | Linear | 590 K \n",
"3 | smiles_emb | Linear | 787 K \n",
"4 | fc1 | Linear | 2.4 M \n",
"5 | fc2 | Linear | 590 K \n",
"6 | fc3 | Linear | 769 \n",
"7 | dropout | Dropout | 0 \n",
"8 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"5.9 M Trainable params\n",
"0 Non-trainable params\n",
"5.9 M Total params\n",
"23.614 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7bad4f7bc2f641bdb5387ae2bbb95222",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8f412941c8884751bf5dff29683d5d4c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "054ad46139c74d1cbaf9cb92b6ed312c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.678\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "53c8e1d6d23c45b5aee636c8c65f780f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9be4ed2a0b6e42978f36defb5cfc7d4b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c1e90209b8624bb3aa551ee4be1ac28e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e1cc66975cb04cafbe498732146240c6",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8f18056dcfc74b65994c6dd7896c3922",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8a6a032f2c824e0097cb6a184ab01c05",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "53b46cb12bad482bbb7069027d97d7ef",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d95edcb4257c4ce0b89901cc219511ee",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1444787b48a04c97999f0ee6a918fdaf",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "84e125446343491cb221985ff5556838",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Monitored metric train_loss did not improve in the last 10 records. Best score: 0.678. Signaling Trainer to stop.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "2e33e9834aa042ec8e1fdb7ad1741023",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8623853325843811 │\n",
"│ val_f1_score │ 0.7368420958518982 │\n",
"│ val_hp_metric │ 0.8623853325843811 │\n",
"│ val_loss │ 0.3256032466888428 │\n",
"│ val_opt_score │ 1.5992274284362793 │\n",
"│ val_precision │ 0.8399999737739563 │\n",
"│ val_recall │ 0.65625 │\n",
"│ val_roc_auc │ 0.9358766078948975 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8623853325843811 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7368420958518982 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8623853325843811 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.3256032466888428 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.5992274284362793 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8399999737739563 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.65625 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.9358766078948975 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | poi_emb | Linear | 787 K \n",
"1 | e3_emb | Linear | 787 K \n",
"2 | cell_emb | Linear | 590 K \n",
"3 | smiles_emb | Linear | 787 K \n",
"4 | fc1 | Linear | 2.4 M \n",
"5 | fc2 | Linear | 590 K \n",
"6 | fc3 | Linear | 769 \n",
"7 | dropout | Dropout | 0 \n",
"8 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"5.9 M Trainable params\n",
"0 Non-trainable params\n",
"5.9 M Total params\n",
"23.614 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e0bc584883de471faa2f05dfd7d9cbcd",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bfe4ea0982404048a16c4e42399565d5",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c2f54315a0cd465db5497fa0c976c43c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.681\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "28915d5ad1764d5e9c95479f759ae42f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d1e2da9f2cad45b1a5df171a37147abe",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5def76e6dbbc4cccb184890412bf68b5",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "10f84836acf046d8a1c099f3a2560ef9",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c899c0afd6164f3cbe91b6f886f1d842",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b1f5699bcff045c8bfda04d618670094",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "080d55d9b2c3473da2a7e1ef8538f8af",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bdcf21d1be6c450cb0626ba0d36897fa",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3fe4cddc678b49bcae2d193c9a409d5f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8b043af809a44d289cd5e34dbe4b051a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Monitored metric train_loss did not improve in the last 10 records. Best score: 0.681. Signaling Trainer to stop.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "513f417ab6464668be9fe305507ba3d6",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8440366983413696 │\n",
"│ val_f1_score │ 0.7301587462425232 │\n",
"│ val_hp_metric │ 0.8440366983413696 │\n",
"│ val_loss │ 0.4012793004512787 │\n",
"│ val_opt_score │ 1.574195384979248 │\n",
"│ val_precision │ 0.6571428775787354 │\n",
"│ val_recall │ 0.8214285969734192 │\n",
"│ val_roc_auc │ 0.9135802388191223 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8440366983413696 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7301587462425232 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8440366983413696 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.4012793004512787 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.574195384979248 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6571428775787354 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8214285969734192 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.9135802388191223 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | poi_emb | Linear | 787 K \n",
"1 | e3_emb | Linear | 787 K \n",
"2 | cell_emb | Linear | 590 K \n",
"3 | smiles_emb | Linear | 787 K \n",
"4 | fc1 | Linear | 2.4 M \n",
"5 | fc2 | Linear | 590 K \n",
"6 | fc3 | Linear | 769 \n",
"7 | dropout | Dropout | 0 \n",
"8 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"5.9 M Trainable params\n",
"0 Non-trainable params\n",
"5.9 M Total params\n",
"23.614 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4a2456436b8943f2af3af61adeab3a22",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6c507902997f4d5494533234785a3065",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "96541b344e84483ca99ff16494e3f77c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.678\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f12c58aed8e94865b2873ca0dbb9a5ce",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "523d9c533ff54d7dbb7b7df49e492880",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7893269cb24a4f918b7d76d54e76aa43",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "96632302871840a6bf8b8677b39c52e4",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0ee7de4ab69b4e7e9ebf94fa048973a1",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6a98c7f38c074a05982dea7af9fb1e5a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3188161e3de34a79acea0688c8873eea",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a2fbb1e75b444de3b72d97e71424c5a2",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6fa8350fe63240fb8e718a1c3597b630",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0d5ca18adae94cba9d8407ff0d988fc8",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Monitored metric train_loss did not improve in the last 10 records. Best score: 0.678. Signaling Trainer to stop.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "827d4d9de83943628ac753c34af0ed82",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8256880640983582 │\n",
"│ val_f1_score │ 0.6779661178588867 │\n",
"│ val_hp_metric │ 0.8256880640983582 │\n",
"│ val_loss │ 0.46647822856903076 │\n",
"│ val_opt_score │ 1.5036542415618896 │\n",
"│ val_precision │ 0.7142857313156128 │\n",
"│ val_recall │ 0.6451612710952759 │\n",
"│ val_roc_auc │ 0.8873035907745361 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8256880640983582 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6779661178588867 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8256880640983582 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.46647822856903076 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.5036542415618896 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7142857313156128 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6451612710952759 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8873035907745361 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | poi_emb | Linear | 787 K \n",
"1 | e3_emb | Linear | 787 K \n",
"2 | cell_emb | Linear | 590 K \n",
"3 | smiles_emb | Linear | 787 K \n",
"4 | fc1 | Linear | 2.4 M \n",
"5 | fc2 | Linear | 590 K \n",
"6 | fc3 | Linear | 769 \n",
"7 | dropout | Dropout | 0 \n",
"8 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"5.9 M Trainable params\n",
"0 Non-trainable params\n",
"5.9 M Total params\n",
"23.614 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "327f63966297483a863a97ced1835d45",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d234afb327b84bc3adbcfd1b1a235eb2",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "14b0ffa369c94482b776a4017ad6349e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.679\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3e7f13a804c44f1b8a1454b479f99d26",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "ac6a9ba1af0f44f3a990cec17ef90c23",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "79272ce2d6af40648573b8d3893384aa",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e8cf9c4cbf2445fd976a78e815147867",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7f585792db9242abbc25bb3e51424b77",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "760a8c615b924c3183633db97d0e39b2",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0f0bb6ccab7a41afbe69fa4900dea4e6",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1664e40c11f9446094e837a85c64b00e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "24db82b937ad4eb6a9ddb5bec9ee88fd",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "adb60706c5c44d55816d34cc1e963450",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Monitored metric train_loss did not improve in the last 10 records. Best score: 0.679. Signaling Trainer to stop.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4c534a708f5e40d9b11a7278531856f3",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8623853325843811 │\n",
"│ val_f1_score │ 0.7368420958518982 │\n",
"│ val_hp_metric │ 0.8623853325843811 │\n",
"│ val_loss │ 0.4182129204273224 │\n",
"│ val_opt_score │ 1.5992274284362793 │\n",
"│ val_precision │ 0.6176470518112183 │\n",
"│ val_recall │ 0.9130434989929199 │\n",
"│ val_roc_auc │ 0.9155712723731995 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8623853325843811 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7368420958518982 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8623853325843811 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.4182129204273224 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.5992274284362793 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6176470518112183 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.9130434989929199 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.9155712723731995 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | poi_emb | Linear | 787 K \n",
"1 | e3_emb | Linear | 787 K \n",
"2 | cell_emb | Linear | 590 K \n",
"3 | smiles_emb | Linear | 787 K \n",
"4 | fc1 | Linear | 2.4 M \n",
"5 | fc2 | Linear | 590 K \n",
"6 | fc3 | Linear | 769 \n",
"7 | dropout | Dropout | 0 \n",
"8 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"5.9 M Trainable params\n",
"0 Non-trainable params\n",
"5.9 M Total params\n",
"23.614 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b66dae7a34384a15a05aafced6d20f45",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "ec2922e3ffc3425aad4477559ebd9c82",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f01a30977b6840c8959a8d04a6ccd391",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.677\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "cc5e4ca4a6ed4509ac665190195a5bb5",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c938ba47ca8d412384202d36dafc424f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9b462160087a47039bb22bbff87f8e31",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "95c4c6d08f6a4693b25099aa44b23937",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "90e0e49a4d4243fc8281b732adf23c35",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d01aa404fec14656a5512e93d821b116",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "36605d552b18480ab3e27b4e7bf864d1",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "36f6b6dfd6cb4d68b711f25ab0326c2d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bc0069acbbbf473dbde3b0e9298e50d0",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3cb34e255b9645f79cf79efcf87bc849",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Monitored metric train_loss did not improve in the last 10 records. Best score: 0.677. Signaling Trainer to stop.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "60eba19b79e5474ca92358cef6569759",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8348624110221863 │\n",
"│ val_f1_score │ 0.7272727489471436 │\n",
"│ val_hp_metric │ 0.8348624110221863 │\n",
"│ val_loss │ 0.40080317854881287 │\n",
"│ val_opt_score │ 1.5621352195739746 │\n",
"│ val_precision │ 0.6486486196517944 │\n",
"│ val_recall │ 0.8275862336158752 │\n",
"│ val_roc_auc │ 0.9105603098869324 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8348624110221863 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7272727489471436 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8348624110221863 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.40080317854881287 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.5621352195739746 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6486486196517944 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8275862336158752 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.9105603098869324 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | poi_emb | Linear | 787 K \n",
"1 | e3_emb | Linear | 787 K \n",
"2 | cell_emb | Linear | 590 K \n",
"3 | smiles_emb | Linear | 787 K \n",
"4 | fc1 | Linear | 2.4 M \n",
"5 | fc2 | Linear | 590 K \n",
"6 | fc3 | Linear | 769 \n",
"7 | dropout | Dropout | 0 \n",
"8 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"5.9 M Trainable params\n",
"0 Non-trainable params\n",
"5.9 M Total params\n",
"23.614 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d3736fc2b7ff42e390db860d403b3422",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "96672514a47645b58153a27ee954dbcd",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c41c5959d6b243e98dfdece816744c12",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.678\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6064c50640db40d7867e0da35c46cef1",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "316aa12385634593a7fbaa68a6237aa0",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4b1ef6614bda47c28dada91a20e32c87",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7ae30a51bb1244dcbef64a72b126bd9b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "16714eb2f3404282a90c70a0572d60d3",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "865878509cd74f1baeafc651352b7a70",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f26a9a5869454698998f214fdd5e8c70",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9bb292f1c669465d848fd7d1fcfc0ea8",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "ba3bb9a4ad414143a6b87fce0f359015",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "422e166a069445a68e0cd3d383a4ee08",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Monitored metric train_loss did not improve in the last 10 records. Best score: 0.678. Signaling Trainer to stop.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "cd1ba74db7884e55916ce19f79400044",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8256880640983582 │\n",
"│ val_f1_score │ 0.7076923251152039 │\n",
"│ val_hp_metric │ 0.8256880640983582 │\n",
"│ val_loss │ 0.4778938293457031 │\n",
"│ val_opt_score │ 1.533380389213562 │\n",
"│ val_precision │ 0.6216216087341309 │\n",
"│ val_recall │ 0.8214285969734192 │\n",
"│ val_roc_auc │ 0.899470865726471 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8256880640983582 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7076923251152039 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8256880640983582 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.4778938293457031 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.533380389213562 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6216216087341309 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8214285969734192 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.899470865726471 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | poi_emb | Linear | 787 K \n",
"1 | e3_emb | Linear | 787 K \n",
"2 | cell_emb | Linear | 590 K \n",
"3 | smiles_emb | Linear | 787 K \n",
"4 | fc1 | Linear | 2.4 M \n",
"5 | fc2 | Linear | 590 K \n",
"6 | fc3 | Linear | 769 \n",
"7 | dropout | Dropout | 0 \n",
"8 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"5.9 M Trainable params\n",
"0 Non-trainable params\n",
"5.9 M Total params\n",
"23.614 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5de1eb41278b42a6a9118e96c198afab",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c94aaf2fa0d14733b91f74b257edd937",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b27e85fcb645490ba448118900ea9fb9",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.676\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "96ba2f587e45407dbc20184f2b76203c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "130e5cee4dab470dac266c0eb4c41d54",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4bb720631b2c4c3998d206e8552988da",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "35a889e035264d8d83888b996562a61b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "babc66a7a39446f692388c42bed63348",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6b35fcc6fad04c90a5b6af19a2e3b48e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "642cd2f6b427475a97f5993eec4bfd2e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "88830f42809742e9a4a8410a0d0db20f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0c98728e2a42495fab3259e4c31051dc",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "20b45ac3e75c4f159b1d316418d354cc",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Monitored metric train_loss did not improve in the last 10 records. Best score: 0.676. Signaling Trainer to stop.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9ec6b599ec4c49aab8246eeaa7a0680e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8165137767791748 │\n",
"│ val_f1_score │ 0.6969696879386902 │\n",
"│ val_hp_metric │ 0.8165137767791748 │\n",
"│ val_loss │ 0.5011997222900391 │\n",
"│ val_opt_score │ 1.5134835243225098 │\n",
"│ val_precision │ 0.6388888955116272 │\n",
"│ val_recall │ 0.7666666507720947 │\n",
"│ val_roc_auc │ 0.8742616176605225 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8165137767791748 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6969696879386902 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8165137767791748 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.5011997222900391 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.5134835243225098 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6388888955116272 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7666666507720947 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8742616176605225 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | poi_emb | Linear | 787 K \n",
"1 | e3_emb | Linear | 787 K \n",
"2 | cell_emb | Linear | 590 K \n",
"3 | smiles_emb | Linear | 787 K \n",
"4 | fc1 | Linear | 2.4 M \n",
"5 | fc2 | Linear | 590 K \n",
"6 | fc3 | Linear | 769 \n",
"7 | dropout | Dropout | 0 \n",
"8 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"5.9 M Trainable params\n",
"0 Non-trainable params\n",
"5.9 M Total params\n",
"23.614 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6b66c9888c7c432ba437b770b9880269",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7e150636c9f34a119c42252d7d0be036",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4d4b4d556adb44349013e9eec5270942",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.679\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c3812ba392834b1aa498b96d88a9146d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "746c720b0bfa4f518d203660616b403e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3f573dfa97934c46be4fee5793acae7c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b703b204cb6d44c2accf3d13cfff1e2f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "dbedf9893f304161969b2b849fa267ad",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4f6a4f1ec73145ecb99c1e2c113c51f6",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "33db1aaf25a449dbba205039fb9efba9",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8e98390f334c4fc58f7400fb28a0ea06",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c9fd3333ba8643b4a2ae086072f3487d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d78bc24fd3a545249f8111337f2767a2",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Monitored metric train_loss did not improve in the last 10 records. Best score: 0.679. Signaling Trainer to stop.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d2b152723ff842059542ac61f5fa208c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8148148059844971 │\n",
"│ val_f1_score │ 0.6296296119689941 │\n",
"│ val_hp_metric │ 0.8148148059844971 │\n",
"│ val_loss │ 0.4128589630126953 │\n",
"│ val_opt_score │ 1.4444444179534912 │\n",
"│ val_precision │ 0.48571428656578064 │\n",
"│ val_recall │ 0.8947368264198303 │\n",
"│ val_roc_auc │ 0.932584285736084 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8148148059844971 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6296296119689941 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8148148059844971 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.4128589630126953 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.4444444179534912 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.48571428656578064 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8947368264198303 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.932584285736084 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | poi_emb | Linear | 787 K \n",
"1 | e3_emb | Linear | 787 K \n",
"2 | cell_emb | Linear | 590 K \n",
"3 | smiles_emb | Linear | 787 K \n",
"4 | fc1 | Linear | 2.4 M \n",
"5 | fc2 | Linear | 590 K \n",
"6 | fc3 | Linear | 769 \n",
"7 | dropout | Dropout | 0 \n",
"8 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"5.9 M Trainable params\n",
"0 Non-trainable params\n",
"5.9 M Total params\n",
"23.614 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8ebac9304e7046dcad2e58ffc71fa88e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "73c0044211a7435b9e0174af4d259b4e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "fa53da9ef81d4a85b7c63f778f50656f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.678\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "938ff958ed174cb090ccdf6359092057",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "80884a1d5479431aa2acab43072d2df7",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "429fac92c0af43b68031e1ea3252b39e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "2bbcc4eafe8b4d8ab5eb9ed5f22a4c5a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "986aa77e2a6e42c18d6ecd93e1eefcf9",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3c48726787834adbbc9530381d61eaac",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f3042e08db6c438ea66b16f1b1a0d579",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c16a681c6aa24ef2a5e608d5bd874766",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9f66b22ea70e401f960b730a932fda71",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c8103c35b4b44ab0b8f3f1dac0de93c4",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Monitored metric train_loss did not improve in the last 10 records. Best score: 0.678. Signaling Trainer to stop.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c760034a955649088011bb70e5d0ebad",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8703703880310059 │\n",
"│ val_f1_score │ 0.7941176295280457 │\n",
"│ val_hp_metric │ 0.8703703880310059 │\n",
"│ val_loss │ 0.3084067702293396 │\n",
"│ val_opt_score │ 1.6644880771636963 │\n",
"│ val_precision │ 0.692307710647583 │\n",
"│ val_recall │ 0.931034505367279 │\n",
"│ val_roc_auc │ 0.9456568956375122 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8703703880310059 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7941176295280457 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8703703880310059 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.3084067702293396 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.6644880771636963 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.692307710647583 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.931034505367279 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.9456568956375122 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | poi_emb | Linear | 787 K \n",
"1 | e3_emb | Linear | 787 K \n",
"2 | cell_emb | Linear | 590 K \n",
"3 | smiles_emb | Linear | 787 K \n",
"4 | fc1 | Linear | 2.4 M \n",
"5 | fc2 | Linear | 590 K \n",
"6 | fc3 | Linear | 769 \n",
"7 | dropout | Dropout | 0 \n",
"8 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"5.9 M Trainable params\n",
"0 Non-trainable params\n",
"5.9 M Total params\n",
"23.614 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bef2da9ca4bc425cb89aaa5a0a5a7d4a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a2d6d9ddf1c248f4bb9590fef4726bcc",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e4e5db39c3514142b773133df7e081bd",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.676\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a183ec05417444f1888b88e9f9f2e521",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "528376f5cc5847deaf32c7df090737a2",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9c5602cc72ec477e8f7d3c77460af50e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "08e2769e80824629bac808c4050ac22a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0f0ae8922ef64eac9ac192f3b9d4cb37",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8e4bfe586a474f68ad58e7d98a3cb27b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "cfc728dad560420685887369ec6c23e5",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9719c095361c4b74955707fd870b9493",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "28a80e6a7cf44ef5a43bc80a23959477",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0006c9b7d49f4ce0a9385f112bad560d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Monitored metric train_loss did not improve in the last 10 records. Best score: 0.676. Signaling Trainer to stop.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5606d80cfeba4289a3c096afe26cbb22",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.7962962985038757 │\n",
"│ val_f1_score │ 0.6764705777168274 │\n",
"│ val_hp_metric │ 0.7962962985038757 │\n",
"│ val_loss │ 0.45846864581108093 │\n",
"│ val_opt_score │ 1.4727668762207031 │\n",
"│ val_precision │ 0.6216216087341309 │\n",
"│ val_recall │ 0.7419354915618896 │\n",
"│ val_roc_auc │ 0.8856305480003357 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7962962985038757 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6764705777168274 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7962962985038757 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.45846864581108093 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.4727668762207031 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6216216087341309 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7419354915618896 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8856305480003357 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" val_loss | \n",
" val_acc | \n",
" val_f1_score | \n",
" val_hp_metric | \n",
" val_opt_score | \n",
" val_precision | \n",
" val_recall | \n",
" val_roc_auc | \n",
" fold | \n",
"
\n",
" \n",
" \n",
" \n",
" mean | \n",
" 0.417120 | \n",
" 0.835304 | \n",
" 0.711396 | \n",
" 0.835304 | \n",
" 1.5467 | \n",
" 0.653788 | \n",
" 0.801927 | \n",
" 0.910050 | \n",
" 4.50000 | \n",
"
\n",
" \n",
" std | \n",
" 0.062928 | \n",
" 0.024158 | \n",
" 0.044705 | \n",
" 0.024158 | \n",
" 0.0662 | \n",
" 0.089258 | \n",
" 0.099826 | \n",
" 0.023552 | \n",
" 3.02765 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" val_loss val_acc val_f1_score val_hp_metric val_opt_score \\\n",
"mean 0.417120 0.835304 0.711396 0.835304 1.5467 \n",
"std 0.062928 0.024158 0.044705 0.024158 0.0662 \n",
"\n",
" val_precision val_recall val_roc_auc fold \n",
"mean 0.653788 0.801927 0.910050 4.50000 \n",
"std 0.089258 0.099826 0.023552 3.02765 "
]
},
"execution_count": 130,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# K-fold cross-validation loop\n",
"from sklearn.model_selection import KFold\n",
"\n",
"n_splits = 5\n",
"kf = KFold(n_splits=n_splits, shuffle=True, random_state=42)\n",
"val_metrics = []\n",
"tmp = protac_df[protac_df['Active'].notna()]\n",
"for k, (train_index, val_index) in enumerate(kf.split(tmp)):\n",
" train_df = tmp.iloc[train_index]\n",
" val_df = tmp.iloc[val_index]\n",
" model, trainer, val_metric = train_model(train_df, val_df)\n",
" val_metric['fold'] = k\n",
" val_metrics.append(val_metric)\n",
"val_metrics = pd.DataFrame(val_metrics)\n",
"val_metrics.to_csv(\n",
" f'../data/results/val_metrics_{n_splits}-splits.csv', index=False)\n",
"val_metrics.aggregate(['mean', 'std'])"
]
},
{
"cell_type": "code",
"execution_count": 131,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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DLw77x2oN251cTdBI4ukVClFP0xK1cl2xs/tU9xNICIi0og9UUREREQyMEQRERERycAQRURERCQDQxQRERGRDAxRRERERDLw7rxSLFffVOP/iYiIqGAMUaVYqke74m4CERFRicXTeUREREQy6HSIys7OxjfffANXV1cYGxujSpUqmD59OnJzc6VxhBAICQmBk5MTjI2N0bx5c1y8eFGlnuDgYFhZWcHFxQUbNmxQGbZp0yZ06NDhnSwPERERvT90+nTe7NmzsXTpUkRGRqJmzZr4888/0a9fP1haWmLkyJEAgDlz5mD+/PmIiIhAtWrVMHPmTPj5+eHq1aswNzfHjh07EBUVhf379+P69evo168f/Pz8YG1tjWfPnmHy5Mk4ePBgMS8pERERlTQ63RN1/PhxfPrpp/D390flypXRpUsXtG7dGn/++SeAV71QCxcuxOTJkxEQEIBatWohMjISL1++RFRUFADg8uXLaN68OXx8fNCjRw9YWFjg1q1bAIDx48cjKCgILi4uxbaMREREVDLpdE9U06ZNsXTpUly7dg3VqlXDuXPncOzYMSxcuBAAcPv2bSQkJKB169bSNIaGhvD19UVsbCwGDx4Mb29vLF++HElJSbh16xbS0tLg5uaGY8eO4fTp01iyZEmh2pKRkYGMjAzpdUpKCgAgJycHOTk5+U6rpyjigpOkoHVbVLkKPa3WV9poe3uQ7vi9lV9xN0FNugKA4tUBND0hAUdafFy8DcrDRweii7sJVATaPI7pdIiaMGECkpOTUb16dejp6SEnJwffffcdevToAQBISEgAANjb26tMZ29vj7t37wIA2rRpg969e6N+/fowNjZGZGQkTE1NMXToUERERGDJkiVYtGgRbGxssHz5ctSsWVNjW8LCwjBt2jS18ps3b8LMzCzf5WjqbFjkZadXrl+/rtX6ku18tVpfaZOu5e1BuiO9QYPiboIa8dc5IDPz1f8NDZHu5V3MLdJM28cp+m+lpqZqrS6dDlEbN27E2rVrERUVhZo1a+Ls2bMYNWoUnJycEBgYKI2nUKh29QghVMpCQkIQEhKi8rpVq1bQ19fHzJkzcf78eezcuRN9+vRBfHy8xrZMmjQJwcHB0uuUlBQ4OzujatWqsLCwyHc5joWfKspi02vmurtrtb77v8Zotb7Sxtl9fnE3gf4jCad07zileK0nSpGR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crmHfqfV+g78ck2r9ZUm7oX4zFCeSdIGnQ5R8fHxePz4MerVqyeV5eTk4OjRo1i8eDGuXr0K4FWPlKOjozTO48eP1XqnlK5cuYJ169bhzJkzCA8PR7NmzWBra4uuXbuif//+SElJ0RiKDA0NYWio3qOkp6cHvQK6wXP4pUK2gtZtUZURWu52L2W0uT1ywG3xNrS9byi0fUqqFNH2toDgNSByFWZbaHN76fSF5S1btsT58+dx9uxZ6c/Hxwe9evXC2bNnUaVKFTg4OCA6OlqaJjMzEzExMWjcuLFafUIIDBo0CPPmzYOZmRlycnKQlZUFANK/ubm572bhiIiIqETT6Z4oc3Nz1KpVS6XM1NQU1tbWUvmoUaMQGhoKd3d3uLu7IzQ0FCYmJujZs6dafStWrICdnR06duwIAGjSpAlCQkJw4sQJ7NmzB56enihXrtx/vlxERERU8ul0iCqM8ePHIy0tDUFBQUhKSkLDhg2xf/9+mJubq4z36NEjhIaGIjY2Vipr0KABxowZA39/f9jZ2SEyMvJdN5+IiIhKqBIXoo4cOaLyWqFQqF04rom9vT3u3LmjVj5lyhRMmTJFew0kIiKiUkGnr4kiIiIi0lUMUUREREQyMEQRERERycAQRURERCQDQxQRERGRDAxRRERERDIwRBERERHJwBBFREREJANDFBEREZEMDFFEREREMjBEEREREcnAEEVEREQkA0MUERERkQwMUUREREQyMEQRERERycAQRURERCQDQxQRERGRDAxRRERERDIwRBERERHJwBBFREREJANDFBEREZEMDFFEREREMjBEEREREcnAEEVEREQkA0MUERERkQwMUUREREQyMEQRERERycAQRURERCQDQxQRERGRDAxRRERERDIwRBERERHJwBBFREREJANDFBEREZEMDFFEREREMjBEEREREcnAEEVEREQkA0MUERERkQwMUUREREQyMEQRERERycAQRURERCQDQxQRERGRDAxRRERERDIwRBERERHJwBBFREREJANDFBEREZEMDFFEREREMjBEEREREcnAEEVEREQkA0MUERERkQwMUUREREQyMEQRERERycAQRURERCQDQxQRERGRDAxRRERERDIwRBERERHJwBBFREREJANDFBEREZEMDFFEREREMjBEEREREcnAEEVEREQkA0MUERERkQwMUUREREQyMEQRERERyaDTISosLAz169eHubk57Ozs0KlTJ1y9elVlHCEEQkJC4OTkBGNjYzRv3hwXL15UGSc4OBhWVlZwcXHBhg0bVIZt2rQJHTp0+M+XhYiIiN4vOh2iYmJi8NVXX+HEiROIjo5GdnY2WrdujRcvXkjjzJkzB/Pnz8fixYsRFxcHBwcH+Pn54fnz5wCAHTt2ICoqCvv378fs2bPRr18/PHnyBADw7NkzTJ48GT/99FOxLB8RERGVXDodovbu3Yu+ffuiZs2a8Pb2xqpVq3Dv3j3Ex8cDeNULtXDhQkyePBkBAQGoVasWIiMj8fLlS0RFRQEALl++jObNm8PHxwc9evSAhYUFbt26BQAYP348goKC4OLiUmzLSERERCVT2eJuQFEkJycDAKysrAAAt2/fRkJCAlq3bi2NY2hoCF9fX8TGxmLw4MHw9vbG8uXLkZSUhFu3biEtLQ1ubm44duwYTp8+jSVLlhRq3hkZGcjIyJBep6SkAABycnKQk5OT77R6iiItJr2moHVbVLkKPa3WV9poc3vogdvibWh73xB63B5yaXtbQCG0W18pUphtoc3tVWJClBACwcHBaNq0KWrVqgUASEhIAADY29urjGtvb4+7d+8CANq0aYPevXujfv36MDY2RmRkJExNTTF06FBERERgyZIlWLRoEWxsbLB8+XLUrFlT4/zDwsIwbdo0tfKbN2/CzMws37Y3dTYs8vLSK9evX9dqfcl2vlqtr7RJ1+L2+NDyQ63VVRppe99Ib9BAq/WVJtreFhYuDFFyFWZbpKamam1+JSZEDRs2DH/99ReOHTumNkyhUO3qEUKolIWEhCAkJETldatWraCvr4+ZM2fi/Pnz2LlzJ/r06SOdKnzTpEmTEBwcLL1OSUmBs7MzqlatCgsLi3zbfiz8VGEWkTSY6+6u1fru/xqj1fpKG2f3+Vqr60T0Ca3VVRqFuYdptb6EUzxOyeUe+p1W6zvwyzWt1leauBfiM0N5JkkbSkSIGj58OLZv346jR4+iYsWKUrmDgwOAVz1Sjo6OUvnjx4/VeqeUrly5gnXr1uHMmTMIDw9Hs2bNYGtri65du6J///5ISUnRGIoMDQ1haKjeo6Snpwe9ArrBc/ilQraC1m1RlRFa7nYvZbS5PXLAbfE2tL1vKLR9SqoU0fa2gOA1IHIVZltoc3vp9IXlQggMGzYMW7ZswaFDh+Dq6qoy3NXVFQ4ODoiOjpbKMjMzERMTg8aNG2usb9CgQZg3bx7MzMyQk5ODrKwsAJD+zc3N/Q+XiIiIiN4XOt0T9dVXXyEqKgq//fYbzM3NpWugLC0tYWxsDIVCgVGjRiE0NBTu7u5wd3dHaGgoTExM0LNnT7X6VqxYATs7O3Ts2BEA0KRJE4SEhODEiRPYs2cPPD09Ua5cuXe5iERERFRC6XSIUt4517x5c5XyVatWoW/fvgBePaYgLS0NQUFBSEpKQsOGDbF//36Ym5urTPPo0SOEhoYiNjZWKmvQoAHGjBkDf39/2NnZITIy8j9dHiIiInp/6HSIEqLgi4kUCoXaheOa2Nvb486dO2rlU6ZMwZQpU2S2kIiIiEornb4mioiIiEhXMUQRERERycAQRURERCQDQxQRERGRDAxRRERERDIwRBERERHJwBBFREREJANDFBEREZEMDFFEREREMjBEEREREcnAEEVEREQkA0MUERERkQwMUUREREQyMEQRERERycAQRURERCQDQxQRERGRDAxRRERERDIwRBERERHJwBBFREREJANDFBEREZEMDFFEREREMjBEEREREcnAEEVEREQkA0MUERERkQwMUUREREQyMEQRERERycAQRURERCQDQxQRERGRDAxRRERERDIwRBERERHJwBBFREREJANDFBEREZEMDFFEREREMjBEEREREcnAEEVEREQkA0MUERERkQwMUUREREQyMEQRERERycAQRURERCQDQxQRERGRDAxRRERERDIwRBERERHJwBBFREREJANDFBEREZEMDFFEREREMjBEEREREcnAEEVEREQkA0MUERERkQwMUUREREQyMEQRERERycAQRURERCQDQxQRERGRDAxRRERERDIwRBERERHJwBBFREREJANDFBEREZEMDFFEREREMjBEEREREcnAEEVEREQkA0MUERERkQwMUUREREQyMEQRERERyfDehKiff/4Zrq6uMDIyQr169fD7779Lw77//nvY29vD3t4eCxYsUJnu5MmTqFevHnJyct51k4mIiKgEK1vcDdCGjRs3YtSoUfj555/RpEkTLFu2DO3atcOlS5eQnJyMKVOmYOfOnRBCoH379vDz80OtWrWQlZWFIUOGYPny5dDT0yvuxSAiIqIS5L0IUfPnz8eAAQMwcOBAAMDChQuxb98+LFmyBHXq1IGXlxc+/vhjAICXlxcuX76MWrVqYe7cuWjWrBnq169fnM0nIiKiEqjEh6jMzEzEx8dj4sSJKuWtW7dGbGws+vTpg2vXruHevXsQQuDatWuoVasWbty4gYiICMTHxxdTy4mIiKgkK/Eh6t9//0VOTg7s7e1Vyu3t7ZGQkIAaNWogNDQUfn5+AICwsDDUqFEDrVq1wpw5c7Bv3z6EhIRAX18fP/zwA5o1a6ZxPhkZGcjIyJBeJycnAwCSkpIKvp4qM+0tlrB0S0pK0mp9yRkFj0N50+b2EGlCa3WVRtreN1IFt4dc2t4WaZkvtFpfaVKYbZGSkgIAENp4z4sS7p9//hEARGxsrEr5zJkzhYeHh8ZpVq1aJTp16iQSEhKEpaWluHbtmjh06JBwdHQU6enpGqeZOnWqAMA//vGPf/zjH//eg7/79++/dQYp8T1RNjY20NPTQ0JCgkr548eP1XqngFc9V9OnT8fRo0dx8uRJVKtWDe7u7nB3d0dWVhauXbuG2rVrq003adIkBAcHS69zc3Px9OlTWFtbQ6FQaH/B3pGUlBQ4Ozvj/v37sLCwKO7mlGrcFrqD20J3cFvojvdlWwgh8Pz5czg5Ob11XSU+RBkYGKBevXqIjo5G586dpfLo6Gh8+umnauOPGjUKo0ePRsWKFREXF4esrCxpWHZ2dp6n5gwNDWFoaKhSVq5cOe0shA6wsLAo0TvF+4TbQndwW+gObgvd8T5sC0tLS63UU+JDFAAEBwfjiy++gI+PDxo1aoTly5fj3r17GDJkiMp40dHRuH79OlavXg0AaNCgAa5cuYI9e/bg/v370NPTg4eHR3EsAhEREZUw70WI6tatG548eYLp06fj4cOHqFWrFnbv3o1KlSpJ46SlpWHYsGHYuHEjypR59YzRChUqYNGiRejXrx8MDQ0RGRkJY2Pj4loMIiIiKkHeixAFAEFBQQgKCspzuLGxMa5evapWPnDgQOn5UqWRoaEhpk6dqnaqkt49bgvdwW2hO7gtdAe3hTqFELyvlYiIiKio3pvfziMiIiJ6lxiiiIiIiGRgiCIiIiKSgSGKiOgNlStXxsKFC7U+Lr1bb24bhUKBbdu2FVt76P3DEKVjYmNjoaenh7Zt2xZ3U0qtvn37QqFQQKFQoGzZsnBxccHQoUM1/iZTbGwsPvnkE5QvXx5GRkaoXbs25s2bp/GhrYcPH8Ynn3wCa2trmJiYwNPTE2PGjME///xTYJtCQ0Ohp6eHWbNmqQ0LCQnBBx98oFb+7NkzKBQKHDlyRKV88+bNaN68OSwtLWFmZgYvLy9Mnz4dT58+LbAdxeH17aGvr48qVapg7NixePHiv/t9sbi4OAwaNEjr45YmRdmPSL7X1/Prfzdu3AAAHD16FB06dICTkxND5H+AIUrHhIeHY/jw4Th27Bju3btXbO14/UnupVHbtm3x8OFD3LlzB7/88gt27Nih9giNrVu3wtfXFxUrVsThw4dx5coVjBw5Et999x26d++u8uOWy5YtQ6tWreDg4IDNmzfj0qVLWLp0KZKTkzFv3rwC27Nq1SqMHz8e4eHhb7VckydPRrdu3VC/fn3s2bMHFy5cwLx583Du3DmsWbPmrer+Lym3x61btzBz5kz8/PPPGDt2rNp42nrf2trawsTEROvjljaF2Y/o7SnX8+t/rq6uAIAXL17A29sbixcvLuZWaiaEQHZ2dnE3Q763/vU90prU1FRhbm4urly5Irp16yamTZumMvy3334T9erVE4aGhsLa2lp07txZGpaeni7GjRsnKlasKAwMDISbm5v45ZdfhBCvfnDZ0tJSpa6tW7eK1zf/1KlThbe3t1i5cqVwdXUVCoVC5Obmij179ogmTZoIS0tLYWVlJfz9/cWNGzdU6rp//77o1q2bKF++vDAxMRH16tUTJ06cELdv3xYKhULExcWpjP/jjz8KFxcXkZubq43VpnWBgYHi008/VSkLDg4WVlZW0uvU1FRhbW0tAgIC1Kbfvn27ACA2bNgghHi1fgwMDMSoUaM0zi8pKSnf9hw5ckRUqFBBZGZmCicnJxETE6MyXLntNNULQBw+fFgIIcTJkycFALFw4UJZ7SgumrbHwIEDhYODQ57v22fPnokvv/xS2NraCnNzc9GiRQtx9uxZlTry258qVaokFixYIL2eOnWqcHZ2FgYGBsLR0VEMHz48z3Hv3r0rOnbsKExNTYW5ubn4/PPPRUJCgkpd3t7eYvXq1aJSpUrCwsJCdOvWTaSkpGhnhemIwuxH4eHhonr16sLQ0FB4eHiIn376SWX8vI4tQghx48YN0bFjR2FnZydMTU2Fj4+PiI6OVpn+zW0DQGzdulWry1ncNK3nvBR2+c+ePSuaN28uzMzMhLm5uahbt67KcfzYsWOiWbNmwtjYWJQrV060bt1aPH36VAjx6rNo+PDhwtbWVhgaGoomTZqIU6dOSdMePnxYABB79+4V9erVE/r6+uLQoUMiNzdXzJ49W7i6ugojIyPh5eUlfv311yKti+LAnigdsnHjRnh4eMDDwwO9e/fGqlWrpN6MXbt2ISAgAP7+/jhz5gwOHjwIHx8fado+ffpgw4YN+PHHH3H58mUsXboUZmZmRZr/jRs3sGnTJmzevBlnz54F8OpbTHBwMOLi4nDw4EGUKVMGnTt3Rm5uLgAgNTUVvr6+ePDgAbZv345z585h/PjxyM3NReXKldGqVSusWrVKZT6rVq2SuqBLglu3bmHv3r3Q19eXyvbv348nT55o7A3p0KEDqlWrhvXr1wMAfv31V2RmZmL8+PEa6y/oNxhXrlyJHj16QF9fHz169MDKlStlLce6detgZmaWZ09ASfotSGNjY6nXSdP71t/fHwkJCdi9ezfi4+NRt25dtGzZUjplWdD+9Lr//e9/WLBgAZYtW4br169j27ZtGn+kHHj1rbpTp054+vQpYmJiEB0djZs3b6Jbt24q4928eRPbtm3Dzp07sXPnTsTExGg8Vfs+eXM/WrFiBSZPnozvvvsOly9fRmhoKL799ltERkYCyP/Yohz+ySef4MCBAzhz5gzatGmDDh06FGsP/vuiV69e0u/LxsfHY+LEidJ2O3v2LFq2bImaNWvi+PHjOHbsGDp06CBdwjB+/Hhs3rwZkZGROH36NNzc3NCmTRu1ywXGjx+PsLAwXL58GV5eXvjmm2+watUqLFmyBBcvXsTo0aPRu3dvxMTEvPPlL5LiTnH0fxo3biz1EmRlZQkbGxvpm1WjRo1Er169NE539epVAUDtW5hSYXui9PX1xePHj/Nt4+PHjwUAcf78eSGEEMuWLRPm5ubiyZMnGsffuHGjKF++vEhPTxdCvPqGo1AoxO3bt/OdT3EKDAwUenp6wtTUVBgZGQkAAoCYP3++NM6sWbMEgDx7bzp27Chq1KghhBBi6NChwsLCQlZbkpOThYmJidSLcubMGWFiYiKSk5OlcQrbE9WuXTvh5eUlqx3F6c1v2idPnhTW1taia9euGt+3Bw8eFBYWFtJ7Tqlq1api2bJlQoj89ychVHsw5s2bJ6pVqyYyMzMLHHf//v1CT09P3Lt3Txp+8eJFAUD6Nj516lRhYmKi0vM0btw40bBhw4JXRglS0H7k7OwsoqKiVKaZMWOGaNSokRCi4GOLJp6enmLRokXS69LSE6Vcz8q/Ll26aBy3sMtvbm4uIiIiNA7r0aOHaNKkicZhqampQl9fX6xbt04qU/agz5kzRwjxfz1R27ZtU5nOyMhIxMbGqtQ3YMAA0aNHjwLbW5zYE6Ujrl69ilOnTqF79+4AgLJly6Jbt27SNTDK9K/J2bNnoaenB19f37dqQ6VKlWBra6tSdvPmTfTs2RNVqlSBhYWFdJ5d+W3v7NmzqFOnDqysrDTW2alTJ5QtWxZbt24F8OqarxYtWqBy5cpv1db/WosWLXD27FmcPHkSw4cPR5s2bTB8+HC18UQeD/wXQkg9ba//v6iioqJQpUoVeHt7AwA++OADVKlSBRs2bChyXW/TjuK2c+dOmJmZwcjICI0aNUKzZs2waNEiAOrv2/j4eKSmpsLa2hpmZmbS3+3bt3Hz5k0A+e9Pb/r888+RlpaGKlWq4Msvv8TWrVvzvIbj8uXLcHZ2hrOzs1Tm6emJcuXK4fLly1JZ5cqVYW5uLr12dHTE48ePC79CSoi89qPExETcv38fAwYMUNlGM2fOVNlG+R1bXrx4gfHjx0vr18zMDFeuXCmVPVHK9az8+/HHH9+qvuDgYAwcOBCtWrXCrFmzpG0C5L/v3Lx5E1lZWWjSpIlUpq+vjwYNGqi8/wGo9PxeunQJ6enp8PPzU3k/rF69WmXeuui9+e28km7lypXIzs5GhQoVpDIhBPT19ZGUlJTvDyMX9KPJZcqUUfuw13QBrqmpqVpZhw4d4OzsjBUrVsDJyQm5ubmoVasWMjMzCzVvAwMDfPHFF1i1ahUCAgIQFRVVIm4HNzU1hZubGwDgxx9/RIsWLTBt2jTMmDEDAFCtWjUArz40GzdurDb9lStX4OnpKY2bnJyMhw8fwtHRsUjtCA8Px8WLF1G27P/tqrm5uVi5cqV0R5iFhQWSk5PVpn327BkAwNLSUmrHsWPHkJWVpXJqsiRo0aIFlixZAn19fTg5Oam0/833bW5uLhwdHdXuSgT+75RlUX5o3NnZGVevXkV0dDQOHDiAoKAgzJ07FzExMWrrMa+g+mb5m9MpFArpNNX7JK/9aNiwYQBendJr2LChyjR6enoACt5G48aNw759+/D999/Dzc0NxsbG6NKli3RsKk1eX8/aEBISgp49e2LXrl3Ys2cPpk6dig0bNqBz5875bhfl58yb+4Cm/eL1/Vb53t+1a5fKZyAAnf+dPvZE6YDs7GysXr0a8+bNU/k2ce7cOVSqVAnr1q2Dl5cXDh48qHH62rVrIzc3N89zx7a2tnj+/LnKLeHKa0fy8+TJE1y+fBnffPMNWrZsiRo1aqjdnuzl5YWzZ8/me3v8wIEDceDAAfz888/IyspCQEBAgfPWNVOnTsX333+PBw8eAABat24NKysrjXfWbd++HdevX0ePHj0AAF26dIGBgQHmzJmjsW5l2HnT+fPn8eeff+LIkSMq74ujR48iLi4OFy5cAABUr14df//9NxISElSmj4uLQ5kyZaSDa8+ePZGamoqff/65SO3QBcoPiUqVKhUYAOvWrYuEhASULVsWbm5uKn82NjYAkO/+pImxsTE6duyIH3/8EUeOHMHx48dx/vx5tfE8PT1x79493L9/Xyq7dOkSkpOTUaNGjULP732l3I9ycnJQoUIF3Lp1S20bKXu7Czq2/P777+jbty86d+6M2rVrw8HBAXfu3HmHS/N+q1atGkaPHo39+/cjICBAurY1v33Hzc0NBgYGOHbsmFSWlZWFP//8M9/3v6enJwwNDXHv3j2198Prvbq6iD1ROmDnzp1ISkrCgAEDpF4DpS5dumDlypVYsGABWrZsiapVq6J79+7Izs7Gnj17MH78eFSuXBmBgYHo378/fvzxR3h7e+Pu3bt4/PgxunbtioYNG8LExARff/01hg8fjlOnTiEiIqLAdpUvXx7W1tZYvnw5HB0dce/ePUycOFFlnB49eiA0NBSdOnVCWFgYHB0dcebMGTg5OaFRo0YAgBo1auDDDz/EhAkT0L9//yL1AuiK5s2bo2bNmggNDcXixYthamqKZcuWoXv37hg0aBCGDRsGCwsLHDx4EOPGjUOXLl3QtWtXAK96MhYsWIBhw4YhJSUFffr0QeXKlfH3339j9erVMDMz0xjGVq5ciQYNGqBZs2Zqwxo1aiS9L1q3bo0aNWqge/fu+O677+Dk5IS//voLY8eOxZAhQ6TTRg0bNsT48eOlZ1N17twZTk5OuHHjBpYuXYqmTZti5MiR/+2KfAdatWqFRo0aoVOnTpg9ezY8PDzw4MED7N69G506dYKPjw+mTp2a5/70poiICOTk5Ej70Zo1a2BsbIxKlSppnLeXlxd69eqFhQsXIjs7G0FBQfD19c3zwvXS5PX9KCQkBCNGjICFhQXatWuHjIwM/Pnnn0hKSkJwcHCBxxY3Nzds2bIFHTp0gEKhwLfffvte9ua9rdTUVOmZUQBw+/ZtnD17FlZWVnBxcVEbPy0tTTqGubq64u+//0ZcXBw+++wzAMCkSZNQu3ZtBAUFYciQITAwMMDhw4fx+eefw8bGBkOHDsW4ceOk+ufMmYOXL19iwIABebbR3NwcY8eOxejRo5Gbm4umTZsiJSUFsbGxMDMzQ2BgoPZXjLYU18VY9H/at28vPvnkE43D4uPjBQARHx8vNm/eLD744ANhYGAgbGxsVG6vT0tLE6NHjxaOjo7SIw7Cw8Ol4Vu3bhVubm7CyMhItG/fXixfvlzjIw7eFB0dLWrUqCEMDQ2Fl5eXOHLkiNrFiXfu3BGfffaZsLCwECYmJsLHx0ecPHlSpZ6VK1eqXFyry/K6ZXjdunXCwMBA5aLho0ePirZt2wpLS0thYGAgPD09xffffy+ys7PVpo+OjhZt2rQR5cuXF0ZGRqJ69epi7Nix4sGDB2rjZmRkCGtra+lizDfNmzdP2NjYiIyMDCGEEA8fPhT9+vUTlSpVEsbGxqJ69epi+vTpahdXC/HqYv9mzZoJc3NzYWpqKry8vMT06dNL1CMOlPJ636akpIjhw4cLJycnoa+vL5ydnUWvXr1Utl1++9PrFyRv3bpVNGzYUFhYWAhTU1Px4YcfigMHDmgcV4jCP+LgdQsWLBCVKlUq9DopCQqzH61bt07aBuXLlxfNmjUTW7ZskcbN79hy+/Zt0aJFC2FsbCycnZ3F4sWLha+vrxg5cqQ0fWm5sDy/RxwoL+R+8y8wMFDj+BkZGaJ79+7SIz2cnJzEsGHDRFpamjTOkSNHROPGjYWhoaEoV66caNOmjXT8SEtLE8OHDxc2Njb5PuLgzeNNbm6u+OGHH4SHh4fQ19cXtra2ok2bNmqPdNE1CiHyuDKWSIu+++47bNiwQeMpECIiopKI10TRfyo1NRVxcXFYtGgRRowYUdzNISIi0hqGKPpPDRs2DE2bNoWvry/69+9f3M0hIiLSGp7OIyIiIpKBPVFEREREMjBEEREREcnAEEVEREQkA0MUERERkQwMUUREb0mhUGDbtm3F3QwiescYoojovdC3b18oFAoMGTJEbVhQUBAUCgX69u1bqLqOHDkChUJR6N8TfPjwIdq1a1eE1hLR+4AhiojeG87OztiwYQPS0tKksvT0dKxfv17j74S9rczMTACAg4ODzv/aPBFpH0MUEb036tatCxcXF2zZskUq27JlC5ydnVGnTh2pTAiBOXPmoEqVKjA2Noa3tzf+97//AQDu3LmDFi1aAHj1I9yv92A1b94cw4YNQ3BwMGxsbODn5wdA/XTe33//je7du8PKygqmpqbw8fHByZMn/+OlJ6J3rWxxN4CISJv69euHVatWoVevXgCA8PBw9O/fH0eOHJHG+eabb7BlyxYsWbIE7u7uOHr0KHr37g1bW1s0bdoUmzdvxmeffYarV6/CwsICxsbG0rSRkZEYOnQo/vjjD2h6VnFqaip8fX1RoUIFbN++HQ4ODjh9+jRyc3P/82UnoneLIYqI3itffPEFJk2ahDt37kChUOCPP/7Ahg0bpBD14sULzJ8/H4cOHUKjRo0AAFWqVMGxY8ewbNky+Pr6wsrKCgBgZ2eHcuXKqdTv5uaGOXPm5Dn/qKgoJCYmIi4uTqrHzc1N+wtKRMWOIYqI3is2Njbw9/dHZGQkhBDw9/eHjY2NNPzSpUtIT0+XTsUpZWZmqpzyy4uPj0++w8+ePYs6depIAYqI3l8MUUT03unfvz+GDRsGAPjpp59UhilPq+3atQsVKlRQGVaYi8NNTU3zHf76qT8ier8xRBHRe6dt27bSnXNt2rRRGebp6QlDQ0Pcu3cPvr6+Gqc3MDAAAOTk5BR53l5eXvjll1/w9OlT9kYRved4dx4RvXf09PRw+fJlXL58GXp6eirDzM3NMXbsWIwePRqRkZG4efMmzpw5g59++gmRkZEAgEqVKkGhUGDnzp1ITExEampqoefdo0cPODg4oFOnTvjjjz9w69YtbN68GcePH9fqMhJR8WOIIqL3koWFBSwsLDQOmzFjBqZMmYKwsDDUqFEDbdq0wY4dO+Dq6goAqFChAqZNm4aJEyfC3t5eOjVYGAYGBti/fz/s7OzwySefoHbt2pg1a5ZamCOikk8hNN2jS0RERET5Yk8UERERkQwMUUREREQyMEQRERERycAQRURERCQDQxQRERGRDAxRRERERDIwRBERERHJwBBFREREJANDFBEREZEMDFFEREREMjBEEREREcnAEEVEREQkw/8DZfNLnwMy5a4AAAAASUVORK5CYII=",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot aggregated results\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"\n",
"for n_splits in [5, 10]:\n",
" val_metrics = pd.read_csv(\n",
" f'../data/results/val_metrics_{n_splits}-splits_ablation.csv'\n",
" )\n",
"\n",
" tmp = val_metrics.copy()[['fold', 'val_acc', 'val_roc_auc',\n",
" 'val_precision', 'val_recall', 'val_f1_score']]\n",
" # Rename columns\n",
" tmp.columns = ['fold', 'Accuracy', 'ROC AUC',\n",
" 'Precision', 'Recall', 'F1 score']\n",
" # Plot aggregated mean value of all metrics in one bar plot\n",
" tmp = tmp.melt(id_vars='fold', var_name='Metric', value_name='Score')\n",
"\n",
" sns.barplot(data=tmp, x='Metric', y='Score')\n",
"\n",
" num_data = len(protac_df[protac_df['Active'].notna()])\n",
" plt.title(\n",
" f'Validation metrics ({n_splits}-fold cross-validation on {num_data} samples)')\n",
" plt.grid(axis='y', alpha=0.5)\n",
" # Set y-axis to end at 1.0\n",
" plt.ylim(0, 1.0)\n",
" # Make the y-axis as percentage\n",
" plt.gca().yaxis.set_major_formatter(\n",
" plt.matplotlib.ticker.PercentFormatter(1, decimals=0))\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 126,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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MIVCwbBEREREH4xChaXr16/ruh1EREREeqlQ1yy9SggBIYQu2kJERESkdwodllavXo2aNWtCpVJBpVLBw8MDa9as0WXbiIiIiIpcoU7DzZs3D1OmTMHw4cPh7e0NIQT++usvfPbZZ3j48CFGjx6t63YSERERFYlChaVFixZhyZIl6NOnj1T2ySefoHr16ggODmZYIiIiog9GoU7D3b17F40bN9Yqb9y4Me7evfvGjSIiIiLSF4UKS66urtiwYYNW+fr16+Hm5vbGjSIiIiLSF4U6DTd9+nR069YNBw8ehLe3NxQKBQ4dOoS9e/fmGKKIiIiI3leF6lnq3Lkzjh49ChsbG2zduhWbN2+GjY0Njh07ho4dO+q6jURERERFplA9SwBQr149rF27VpdtISIiItI7hepZ2rlzJ3bv3q1Vvnv3buzateuNG0VERESkLwoVliZMmICsrCytciEEJkyY8MaNIiIiItIXhQpLly9fhru7u1Z51apVceXKlTduFBEREZG+KFRYsrS0xLVr17TKr1y5AlNT0zduFBEREZG+KFRYat++PUaNGoWrV69KZVeuXMGYMWPQvn17nTWOiIiIqKgVKizNmTMHpqamqFq1KlxcXODi4oKqVavC2toa3333na7bSERERFRkCvXoAEtLS8TGxiI6Ohr//PMPVCoVatWqhf/85z+6bh8RERFRkSpQz9LRo0elRwMoFAr4+fnBzs4O3333HTp37owhQ4YgLS3trTSUiIiIqCgUKCwFBwfj1KlT0vvTp09j8ODBaNmyJSZMmIDt27cjNDRU540kIiIiKioFCkvx8fFo3ry59D4qKgoNGjTAihUrEBQUhIULF/K34YiIiOiDUqCwlJiYCHt7e+l9TEwMWrVqJb2vX78+bt++rbvWERERERWxAoUle3t7XL9+HQCQnp6OEydOoFGjRtLwp0+fwtDQULctJCIiIipCBQpLrVq1woQJE/Dnn39i4sSJMDEx0bgD7tSpU6hUqZLOG0lERERUVAr06IBZs2ahU6dO8PHxgZmZGSIiImBkZCQNDwsLg5+fn84bSURERFRUChSWbG1t8eeffyIpKQlmZmYwMDDQGL5x40aYmZnptIFERERERanQD6XMiZWV1Rs1hoiIiEjfFOrnToiIiIiKC4YlIiIiIhkMS0REREQyGJaIiIiIZDAsEREREclgWCIiIiKSwbBEREREJINhiYiIiEgGwxIRERGRDIYlIiIiIhkMS0REREQy3quwFBoaCoVCgVGjRkllQggEBwfDyckJKpUKvr6+OHv2rMZ0QUFBsLKyQrly5RAVFaUxbMOGDWjXrt27aD4RERG9h96bsBQXF4fly5fDw8NDo3z27NmYN28eFi9ejLi4ODg4OKBly5Z4+vQpAGD79u2IjIzEnj178O2336J///549OgRAODJkyeYPHkyfvjhh3c+P0RERPR+eC/CUkpKCnr27IkVK1agdOnSUrkQAgsWLMDkyZPRqVMn1KhRAxEREXj+/DkiIyMBAOfPn4evry88PT0REBAACwsLXLt2DQAwfvx4BAYGoly5ckUyX0RERKT/ShZ1A/Lj888/R5s2bdCiRQvMmjVLKr9+/ToSEhLg5+cnlSmVSvj4+CA2NhZDhw5FrVq1sHz5ciQmJuLatWtITU2Fq6srDh06hBMnTmDJkiX5akNaWhrS0tKk98nJyQCArKwsZGVlyU5roCjI3NKr8lq2BZWtMNBpfcWNLteHAbgu3oSu9w1hwPVRWLpeF1AI3dZXjORnXRRmfel9WIqKisKJEycQFxenNSwhIQEAYG9vr1Fub2+PmzdvAgD8/f3Rq1cv1K9fHyqVChERETA1NcWwYcOwatUqLFmyBIsWLYKNjQ2WL1+O6tWr59iO0NBQTJ8+Xav86tWrMDMzk52HJs7KfM0rabt8+bJO60uy89FpfcXNCx2uj4aWDXVWV3Gk633jRYMGOq2vONH1urAox7BUWPlZFykpKQWuV6/D0u3bt/HFF19gz549MDY2znU8hUKz60YIoVEWHByM4OBgjfctWrSAoaEhZs2ahdOnT2PHjh3o06cPjh8/nuNnTJw4EUFBQdL75ORkODs7o1KlSrCwsJCdj0Nhx2SHU+7muLnptL7bG2N0Wl9x4+w2T2d1HYk+orO6iqNQt1Cd1pdwjMepwnIL+Vqn9f3x0yWd1lecuOXjO0N9Zqgg9DosHT9+HPfv30e9evWksqysLBw8eBCLFy/GxYsXAbzsYXJ0dJTGuX//vlZvk9qFCxewbt06nDx5EmFhYWjatClsbW3RtWtXDBgwAMnJyTmGH6VSCaVSu4fIwMAABnl0X2fxj4RCy2vZFlQJoePu8mJGl+sjC1wXb0LX+4ZC16eSihFdrwsIXrtRWPlZF4VZX3p9gXfz5s1x+vRpxMfHSy9PT0/07NkT8fHxqFixIhwcHBAdHS1Nk56ejpiYGDRu3FirPiEEhgwZgrlz58LMzAxZWVnIyMgAAOnf7OzsdzNzRERE9F7Q654lc3Nz1KhRQ6PM1NQU1tbWUvmoUaMQEhICNzc3uLm5ISQkBCYmJujRo4dWfStWrICdnR3at28PAPD29kZwcDCOHDmCXbt2wd3dHaVKlXrr80VERETvD70OS/kxfvx4pKamIjAwEImJifDy8sKePXtgbm6uMd69e/cQEhKC2NhYqaxBgwYYM2YM2rRpAzs7O0RERLzr5hMREZGee+/C0oEDBzTeKxQKrQu4c2Jvb48bN25olU+dOhVTp07VXQOJiIjog6LX1ywRERERFTWGJSIiIiIZDEtEREREMhiWiIiIiGQwLBERERHJYFgiIiIiksGwRERERCSDYYmIiIhIBsMSERERkQyGJSIiIiIZDEtEREREMhiWiIiIiGQwLBERERHJYFgiIiIiksGwRERERCSDYYmIiIhIBsMSERERkQyGJSIiIiIZDEtEREREMhiWiIiIiGQwLBERERHJYFgiIiIiksGwRERERCSDYYmIiIhIBsMSERERkQyGJSIiIiIZDEtEREREMhiWiIiIiGQwLBERERHJYFgiIiIiksGwRERERCSDYYmIiIhIBsMSERERkQyGJSIiIiIZDEtEREREMhiWiIiIiGQwLBERERHJYFgiIiIiksGwRERERCSDYYmIiIhIBsMSERERkQyGJSIiIiIZDEtEREREMhiWiIiIiGQwLBERERHJYFgiIiIiksGwRERERCSDYYmIiIhIBsMSERERkQyGJSIiIiIZDEtEREREMhiWiIiIiGQwLBERERHJYFgiIiIiksGwRERERCSDYYmIiIhIBsMSERERkQyGJSIiIiIZDEtEREREMhiWiIiIiGQwLBERERHJYFgiIiIiksGwRERERCRDr8NSaGgo6tevD3Nzc9jZ2aFDhw64ePGixjhCCAQHB8PJyQkqlQq+vr44e/asxjhBQUGwsrJCuXLlEBUVpTFsw4YNaNeu3VufFyIiIno/6XVYiomJweeff44jR44gOjoamZmZ8PPzw7Nnz6RxZs+ejXnz5mHx4sWIi4uDg4MDWrZsiadPnwIAtm/fjsjISOzZswfffvst+vfvj0ePHgEAnjx5gsmTJ+OHH34okvkjIiIi/afXYen3339Hv379UL16ddSqVQvh4eG4desWjh8/DuBlr9KCBQswefJkdOrUCTVq1EBERASeP3+OyMhIAMD58+fh6+sLT09PBAQEwMLCAteuXQMAjB8/HoGBgShXrlyRzSMRERHpt5JF3YCCSEpKAgBYWVkBAK5fv46EhAT4+flJ4yiVSvj4+CA2NhZDhw5FrVq1sHz5ciQmJuLatWtITU2Fq6srDh06hBMnTmDJkiX5+uy0tDSkpaVJ75OTkwEAWVlZyMrKkp3WQFGg2aRX5LVsCypbYaDT+oobXa4PA3BdvAld7xvCgOujsHS9LqAQuq2vGMnPuijM+npvwpIQAkFBQWjSpAlq1KgBAEhISAAA2Nvba4xrb2+PmzdvAgD8/f3Rq1cv1K9fHyqVChERETA1NcWwYcOwatUqLFmyBIsWLYKNjQ2WL1+O6tWr5/j5oaGhmD59ulb51atXYWZmJtv2Js7KAs8vvXT58mWd1pdk56PT+oqbFzpcHw0tG+qsruJI1/vGiwYNdFpfcaLrdWFRjmGpsPKzLlJSUgpc73sTloYPH45Tp07h0KFDWsMUCs2uGyGERllwcDCCg4M13rdo0QKGhoaYNWsWTp8+jR07dqBPnz7SKb7XTZw4EUFBQdL75ORkODs7o1KlSrCwsJBt+6GwY/mZRcrBHDc3ndZ3e2OMTusrbpzd5umsriPRR3RWV3EU6haq0/oSjvE4VVhuIV/rtL4/frqk0/qKE7d8fGeozwwVxHsRlkaMGIFt27bh4MGDKFu2rFTu4OAA4GUPk6Ojo1R+//59rd4mtQsXLmDdunU4efIkwsLC0LRpU9ja2qJr164YMGAAkpOTcww/SqUSSqV2D5GBgQEM8ui+zuIfCYWW17ItqBJCx93lxYwu10cWuC7ehK73DYWuTyUVI7peFxC8dqOw8rMuCrO+9PoCbyEEhg8fjs2bN2Pfvn1wcXHRGO7i4gIHBwdER0dLZenp6YiJiUHjxo1zrG/IkCGYO3cuzMzMkJWVhYyMDACQ/s3Ozn6Lc0RERETvG73uWfr8888RGRmJX3/9Febm5tI1SpaWllCpVFAoFBg1ahRCQkLg5uYGNzc3hISEwMTEBD169NCqb8WKFbCzs0P79u0BAN7e3ggODsaRI0ewa9cuuLu7o1SpUu9yFomIiEjP6XVYUt+p5uvrq1EeHh6Ofv36AXh5+39qaioCAwORmJgILy8v7NmzB+bm5hrT3Lt3DyEhIYiNjZXKGjRogDFjxqBNmzaws7NDRETEW50fIiIiev/odVgSIu+LfRQKhdYF3Dmxt7fHjRs3tMqnTp2KqVOnFrKFRERE9KHT62uWiIiIiIoawxIRERGRDIYlIiIiIhkMS0REREQyGJaIiIiIZDAsEREREclgWCIiIiKSwbBEREREJINhiYiIiEgGwxIRERGRDIYlIiIiIhkMS0REREQyGJaIiIiIZDAsEREREclgWCIiIiKSwbBEREREJINhiYiIiEgGwxIRERGRDIYlIiIiIhkMS0REREQyGJaIiIiIZDAsEREREclgWCIiIiKSwbBEREREJINhiYiIiEgGwxIRERGRDIYlIiIiIhkMS0REREQyGJaIiIiIZDAsEREREclgWCIiIiKSwbBEREREJINhiYiIiEgGwxIRERGRDIYlIiIiIhkMS0REREQyGJaIiIiIZDAsEREREclgWCIiIiKSwbBEREREJINhiYiIiEgGwxIRERGRDIYlIiIiIhkMS0REREQyGJaIiIiIZDAsEREREclgWCIiIiKSwbBEREREJINhiYiIiEgGwxIRERGRDIYlIiIiIhkMS0REREQyGJaIiIiIZDAsEREREclgWCIiIiKSwbBEREREJINhiYiIiEgGwxIRERGRDIYlIiIiIhkMS0REREQyGJaIiIiIZDAsEREREcn4YMLSjz/+CBcXFxgbG6NevXr4888/pWHfffcd7O3tYW9vj/nz52tMd/ToUdSrVw9ZWVnvuslERET0HihZ1A3QhfXr12PUqFH48ccf4e3tjWXLlqF169Y4d+4ckpKSMHXqVOzYsQNCCLRt2xYtW7ZEjRo1kJGRgc8++wzLly+HgYFBUc8GERER6aEPIizNmzcPAwcOxKBBgwAACxYswO7du7FkyRLUqVMHHh4e+OijjwAAHh4eOH/+PGrUqIE5c+agadOmqF+/flE2n4iIiPTYex+W0tPTcfz4cUyYMEGj3M/PD7GxsejTpw8uXbqEW7duQQiBS5cuoUaNGrhy5QpWrVqF48ePF1HLiYiI6H3w3oelhw8fIisrC/b29hrl9vb2SEhIQLVq1RASEoKWLVsCAEJDQ1GtWjW0aNECs2fPxu7duxEcHAxDQ0N8//33aNq0aY6f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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot aggregated results\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"\n",
"n_splits = 5\n",
"val_metrics = pd.read_csv(\n",
" f'../data/results/val_metrics_{n_splits}-splits_ablation.csv'\n",
")\n",
"\n",
"tmp = val_metrics.copy()[['fold', 'val_acc', 'val_roc_auc',\n",
" 'val_precision', 'val_recall', 'val_f1_score']]\n",
"# Rename columns\n",
"tmp.columns = ['fold', 'Accuracy', 'ROC AUC',\n",
" 'Precision', 'Recall', 'F1 score']\n",
"# Plot aggregated mean value of all metrics in one bar plot\n",
"tmp = tmp.melt(id_vars='fold', var_name='Metric', value_name='Score')\n",
"\n",
"sns.barplot(data=tmp, x='Metric', y='Score')\n",
"\n",
"\n",
"num_data = len(protac_df[protac_df['Active'].notna()])\n",
"plt.title(\n",
" f'Validation metrics ({n_splits}-fold cross-validation on {num_data} samples)')\n",
"plt.grid(axis='y', alpha=0.5)\n",
"# Set y-axis to end at 1.0\n",
"plt.ylim(0, 1.0)\n",
"# Make the y-axis as percentage\n",
"plt.gca().yaxis.set_major_formatter(\n",
" plt.matplotlib.ticker.PercentFormatter(1, decimals=0))\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Ablation Studies"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\ste\\Anaconda2\\envs\\env-thesis\\Lib\\site-packages\\imblearn\\over_sampling\\_smote\\base.py:345: FutureWarning: The parameter `n_jobs` has been deprecated in 0.10 and will be removed in 0.12. You can pass an nearest neighbors estimator where `n_jobs` is already set instead.\n",
" warnings.warn(\n",
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | smiles_emb | Linear | 787 K \n",
"1 | fc1 | Linear | 590 K \n",
"2 | fc2 | Linear | 590 K \n",
"3 | fc3 | Linear | 769 \n",
"4 | dropout | Dropout | 0 \n",
"5 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"2.0 M Trainable params\n",
"0 Non-trainable params\n",
"2.0 M Total params\n",
"7.877 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "50dbc6fade944436be04b6bcd2a79e91",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\ste\\Anaconda2\\envs\\env-thesis\\Lib\\site-packages\\pytorch_lightning\\trainer\\connectors\\data_connector.py:432: PossibleUserWarning: The dataloader, val_dataloader, does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` (try 8 which is the number of cpus on this machine) in the `DataLoader` init to improve performance.\n",
" rank_zero_warn(\n",
"c:\\Users\\ste\\Anaconda2\\envs\\env-thesis\\Lib\\site-packages\\pytorch_lightning\\trainer\\connectors\\data_connector.py:432: PossibleUserWarning: The dataloader, train_dataloader, does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` (try 8 which is the number of cpus on this machine) in the `DataLoader` init to improve performance.\n",
" rank_zero_warn(\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c515836678af4c2786cc0857ac2a89d9",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f5a8e06b6f3e488bbb95135d5869b821",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.679\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "cffd92ecff6b4e26ab07eff9bd96f520",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b4206cc9119848d7bc2fc72206f67fc7",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3911809e2a5d4562aa378cf7e19ce420",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "382ca9b39e6149c88019e09c0d2eaa0e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "83804e7a6df449e286d1719a8fea697e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a05b21e45d00417e80b3d0502828b07c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1c450f427d444b1c88351773896ddc78",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bcff7aadc1d44a6fa4267b4e4d8c6859",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b9796bc1e5344695adf3103d12ad3fd7",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "720f5c893557434aa0cd1360cce94c11",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Monitored metric train_loss did not improve in the last 10 records. Best score: 0.679. Signaling Trainer to stop.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f2ad945fe02b472787fc02cb2608fc51",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8894008994102478 │\n",
"│ val_f1_score │ 0.8285714387893677 │\n",
"│ val_hp_metric │ 0.8894008994102478 │\n",
"│ val_loss │ 0.22978010773658752 │\n",
"│ val_opt_score │ 1.7179722785949707 │\n",
"│ val_precision │ 0.7250000238418579 │\n",
"│ val_recall │ 0.9666666388511658 │\n",
"│ val_roc_auc │ 0.9700636863708496 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8894008994102478 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8285714387893677 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8894008994102478 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.22978010773658752 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.7179722785949707 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7250000238418579 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.9666666388511658 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.9700636863708496 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"{'val_loss': 0.22978010773658752,\n",
" 'val_acc': 0.8894008994102478,\n",
" 'val_f1_score': 0.8285714387893677,\n",
" 'val_hp_metric': 0.8894008994102478,\n",
" 'val_opt_score': 1.7179722785949707,\n",
" 'val_precision': 0.7250000238418579,\n",
" 'val_recall': 0.9666666388511658,\n",
" 'val_roc_auc': 0.9700636863708496}"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Random split the data into train and test\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"train_df, test_df = train_test_split(\n",
" protac_df[protac_df['Active'].notna()], test_size=0.2, random_state=42,\n",
")\n",
"model, trainer, val_metric = train_model(\n",
" train_df, val_df, disabled_embeddings=['poi', 'e3', 'cell'],\n",
")\n",
"val_metric"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fold 0, disabled embeddings: ['poi', 'e3', 'cell']\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\ste\\Anaconda2\\envs\\env-thesis\\Lib\\site-packages\\imblearn\\over_sampling\\_smote\\base.py:345: FutureWarning: The parameter `n_jobs` has been deprecated in 0.10 and will be removed in 0.12. You can pass an nearest neighbors estimator where `n_jobs` is already set instead.\n",
" warnings.warn(\n",
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | smiles_emb | Linear | 787 K \n",
"1 | fc1 | Linear | 590 K \n",
"2 | fc2 | Linear | 590 K \n",
"3 | fc3 | Linear | 769 \n",
"4 | dropout | Dropout | 0 \n",
"5 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"2.0 M Trainable params\n",
"0 Non-trainable params\n",
"2.0 M Total params\n",
"7.877 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6d2003ac853140d4be07094f870d01e7",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\ste\\Anaconda2\\envs\\env-thesis\\Lib\\site-packages\\pytorch_lightning\\trainer\\connectors\\data_connector.py:432: PossibleUserWarning: The dataloader, val_dataloader, does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` (try 8 which is the number of cpus on this machine) in the `DataLoader` init to improve performance.\n",
" rank_zero_warn(\n",
"c:\\Users\\ste\\Anaconda2\\envs\\env-thesis\\Lib\\site-packages\\pytorch_lightning\\trainer\\connectors\\data_connector.py:432: PossibleUserWarning: The dataloader, train_dataloader, does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` (try 8 which is the number of cpus on this machine) in the `DataLoader` init to improve performance.\n",
" rank_zero_warn(\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c5dc5bc109154647a91eba389ddfd0d5",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "717bab699d8e469ebfab4c4d165dbea2",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.681\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a05d22e6bf7048d2be4fc36bb0da2564",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7b747e15ea954c39b327caffc09ff866",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "68cd758182654515ba18d86dbee435c8",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "773de468100e493fa4190a263cf2d407",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6f83c8642a7e4f598f7ee3d47a6ce363",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b11a9156d5dc4883978bf3680c4dd17b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1cf15595d32d43b5a34887cbdbc1ff60",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5eea4f1426664a7794cb229e4fc2b697",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "854eca19c354476c8134eb6758b9fe3e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "56219f060834490f90e0597caa0ef4df",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Monitored metric train_loss did not improve in the last 10 records. Best score: 0.681. Signaling Trainer to stop.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5c1cc664f09f488f92b1f98cf61fdee2",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8256880640983582 │\n",
"│ val_f1_score │ 0.6984127163887024 │\n",
"│ val_hp_metric │ 0.8256880640983582 │\n",
"│ val_loss │ 0.43253543972969055 │\n",
"│ val_opt_score │ 1.5241007804870605 │\n",
"│ val_precision │ 0.6666666865348816 │\n",
"│ val_recall │ 0.7333333492279053 │\n",
"│ val_roc_auc │ 0.8918248414993286 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8256880640983582 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6984127163887024 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8256880640983582 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.43253543972969055 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.5241007804870605 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6666666865348816 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7333333492279053 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8918248414993286 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fold 1, disabled embeddings: ['poi', 'e3', 'cell']\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\ste\\Anaconda2\\envs\\env-thesis\\Lib\\site-packages\\imblearn\\over_sampling\\_smote\\base.py:345: FutureWarning: The parameter `n_jobs` has been deprecated in 0.10 and will be removed in 0.12. You can pass an nearest neighbors estimator where `n_jobs` is already set instead.\n",
" warnings.warn(\n",
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | smiles_emb | Linear | 787 K \n",
"1 | fc1 | Linear | 590 K \n",
"2 | fc2 | Linear | 590 K \n",
"3 | fc3 | Linear | 769 \n",
"4 | dropout | Dropout | 0 \n",
"5 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"2.0 M Trainable params\n",
"0 Non-trainable params\n",
"2.0 M Total params\n",
"7.877 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d19d15ddd9b941129b8fbcf5269061de",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\ste\\Anaconda2\\envs\\env-thesis\\Lib\\site-packages\\pytorch_lightning\\trainer\\connectors\\data_connector.py:432: PossibleUserWarning: The dataloader, val_dataloader, does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` (try 8 which is the number of cpus on this machine) in the `DataLoader` init to improve performance.\n",
" rank_zero_warn(\n",
"c:\\Users\\ste\\Anaconda2\\envs\\env-thesis\\Lib\\site-packages\\pytorch_lightning\\trainer\\connectors\\data_connector.py:432: PossibleUserWarning: The dataloader, train_dataloader, does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` (try 8 which is the number of cpus on this machine) in the `DataLoader` init to improve performance.\n",
" rank_zero_warn(\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9a8bbd54d38a4abba80e21b1a1a05a48",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bd431510337a400a991c561a505e09fa",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.681\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "2d819e2db2c5490f84d950ffa65c3c21",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "88a9d28bdbda4cccbc172e0ec5d72e5b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6147bbb29d544d51a657aeb8ce5216a8",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "62c442218b7242cc9e13d4392935d8ab",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a9380f8439ff4f2f969a9a9020d9d454",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "628ec57e41404628be9cffb1f11a18bf",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4e26d4f2cf4e474790d45d1011a7fcc5",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "459b040053fc4454b1d7fc60b1d0a243",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c443ace858774c38bc911277817931cb",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6d46e4b8f5514cc5ab33c02fd32555b2",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Monitored metric train_loss did not improve in the last 10 records. Best score: 0.681. Signaling Trainer to stop.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d98851e6b9a04e95bacb89e54fda1e6c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8302752375602722 │\n",
"│ val_f1_score │ 0.678260862827301 │\n",
"│ val_hp_metric │ 0.8302752375602722 │\n",
"│ val_loss │ 0.42626988887786865 │\n",
"│ val_opt_score │ 1.5085361003875732 │\n",
"│ val_precision │ 0.6393442749977112 │\n",
"│ val_recall │ 0.7222222089767456 │\n",
"│ val_roc_auc │ 0.878669798374176 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8302752375602722 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.678260862827301 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8302752375602722 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.42626988887786865 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.5085361003875732 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6393442749977112 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7222222089767456 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.878669798374176 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fold 2, disabled embeddings: ['poi', 'e3', 'cell']\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\ste\\Anaconda2\\envs\\env-thesis\\Lib\\site-packages\\imblearn\\over_sampling\\_smote\\base.py:345: FutureWarning: The parameter `n_jobs` has been deprecated in 0.10 and will be removed in 0.12. You can pass an nearest neighbors estimator where `n_jobs` is already set instead.\n",
" warnings.warn(\n",
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | smiles_emb | Linear | 787 K \n",
"1 | fc1 | Linear | 590 K \n",
"2 | fc2 | Linear | 590 K \n",
"3 | fc3 | Linear | 769 \n",
"4 | dropout | Dropout | 0 \n",
"5 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"2.0 M Trainable params\n",
"0 Non-trainable params\n",
"2.0 M Total params\n",
"7.877 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b34dbf29083d470faaa27389eec33307",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\ste\\Anaconda2\\envs\\env-thesis\\Lib\\site-packages\\pytorch_lightning\\trainer\\connectors\\data_connector.py:432: PossibleUserWarning: The dataloader, val_dataloader, does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` (try 8 which is the number of cpus on this machine) in the `DataLoader` init to improve performance.\n",
" rank_zero_warn(\n",
"c:\\Users\\ste\\Anaconda2\\envs\\env-thesis\\Lib\\site-packages\\pytorch_lightning\\trainer\\connectors\\data_connector.py:432: PossibleUserWarning: The dataloader, train_dataloader, does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` (try 8 which is the number of cpus on this machine) in the `DataLoader` init to improve performance.\n",
" rank_zero_warn(\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c9f0b66f5f904854b19f39f6577f78ff",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1242edb426bd4fe7a586d40b5a03bc78",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.681\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8ac5b3a3c37c47a6989698e3381f7f64",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3891c114903a4a98a84ea80337f11862",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7eb7a538328a4322bfeead1e4870af47",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "471b041184324116bae3f3dab334ab11",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "055eced85ba14e1689e93d92f8632d83",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b17ec92dc032401db16a412cf20f1446",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d7751a12e9484eea8314c9077178e41c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d1750a5a165d459e8dbd7c4b55cc9107",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "df6a7fab18224e8ead414f5f9c21116a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b4d0e7ee279e4a1b9a256335c0402a57",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Monitored metric train_loss did not improve in the last 10 records. Best score: 0.681. Signaling Trainer to stop.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "38dfcd5784fe42309b022c4b3fb3643c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8018433451652527 │\n",
"│ val_f1_score │ 0.6814814805984497 │\n",
"│ val_hp_metric │ 0.8018433451652527 │\n",
"│ val_loss │ 0.44118818640708923 │\n",
"│ val_opt_score │ 1.4833247661590576 │\n",
"│ val_precision │ 0.5822784900665283 │\n",
"│ val_recall │ 0.8214285969734192 │\n",
"│ val_roc_auc │ 0.8986246585845947 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8018433451652527 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6814814805984497 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8018433451652527 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.44118818640708923 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.4833247661590576 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.5822784900665283 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8214285969734192 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8986246585845947 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fold 3, disabled embeddings: ['poi', 'e3', 'cell']\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\ste\\Anaconda2\\envs\\env-thesis\\Lib\\site-packages\\imblearn\\over_sampling\\_smote\\base.py:345: FutureWarning: The parameter `n_jobs` has been deprecated in 0.10 and will be removed in 0.12. You can pass an nearest neighbors estimator where `n_jobs` is already set instead.\n",
" warnings.warn(\n",
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | smiles_emb | Linear | 787 K \n",
"1 | fc1 | Linear | 590 K \n",
"2 | fc2 | Linear | 590 K \n",
"3 | fc3 | Linear | 769 \n",
"4 | dropout | Dropout | 0 \n",
"5 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"2.0 M Trainable params\n",
"0 Non-trainable params\n",
"2.0 M Total params\n",
"7.877 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "2dd06a2b45e84e8c8a993f61660ba6ad",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\ste\\Anaconda2\\envs\\env-thesis\\Lib\\site-packages\\pytorch_lightning\\trainer\\connectors\\data_connector.py:432: PossibleUserWarning: The dataloader, val_dataloader, does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` (try 8 which is the number of cpus on this machine) in the `DataLoader` init to improve performance.\n",
" rank_zero_warn(\n",
"c:\\Users\\ste\\Anaconda2\\envs\\env-thesis\\Lib\\site-packages\\pytorch_lightning\\trainer\\connectors\\data_connector.py:432: PossibleUserWarning: The dataloader, train_dataloader, does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` (try 8 which is the number of cpus on this machine) in the `DataLoader` init to improve performance.\n",
" rank_zero_warn(\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "06c4442f48b74b4d88cf345db745a8ff",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "944d17ee72ff40a7ab71e7a8f5b233bf",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.681\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5c90f09634e2419b90518c10de844d15",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7439a86f21db4e2b9828e8d31689ee12",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "085cf04c66c14c419dd06b7a10d78921",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f0760a28b97b42c1b97e9bf42de5904b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3e347c35a768467fa371bd4857e4c18b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "79607567baae44258cad8d96c93185dd",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "71c052c5a3464a01b3382b77eada459b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a8a0518f250e44fb9cd39173b1795b9e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "445027abe12444cc81dfd315e6d0b13f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f931a407d4f64fd28f53e4e89408d4fb",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Monitored metric train_loss did not improve in the last 10 records. Best score: 0.681. Signaling Trainer to stop.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "70ea178af7b04737bb6a92552ff39f94",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.7972350120544434 │\n",
"│ val_f1_score │ 0.6271186470985413 │\n",
"│ val_hp_metric │ 0.7972350120544434 │\n",
"│ val_loss │ 0.4882689416408539 │\n",
"│ val_opt_score │ 1.4243535995483398 │\n",
"│ val_precision │ 0.5441176295280457 │\n",
"│ val_recall │ 0.7400000095367432 │\n",
"│ val_roc_auc │ 0.8674850463867188 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7972350120544434 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6271186470985413 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7972350120544434 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.4882689416408539 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.4243535995483398 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.5441176295280457 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7400000095367432 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8674850463867188 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fold 4, disabled embeddings: ['poi', 'e3', 'cell']\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\ste\\Anaconda2\\envs\\env-thesis\\Lib\\site-packages\\imblearn\\over_sampling\\_smote\\base.py:345: FutureWarning: The parameter `n_jobs` has been deprecated in 0.10 and will be removed in 0.12. You can pass an nearest neighbors estimator where `n_jobs` is already set instead.\n",
" warnings.warn(\n",
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | smiles_emb | Linear | 787 K \n",
"1 | fc1 | Linear | 590 K \n",
"2 | fc2 | Linear | 590 K \n",
"3 | fc3 | Linear | 769 \n",
"4 | dropout | Dropout | 0 \n",
"5 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"2.0 M Trainable params\n",
"0 Non-trainable params\n",
"2.0 M Total params\n",
"7.877 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "887bda9f44ba4f43b5cb33fe3e850f0d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\ste\\Anaconda2\\envs\\env-thesis\\Lib\\site-packages\\pytorch_lightning\\trainer\\connectors\\data_connector.py:432: PossibleUserWarning: The dataloader, val_dataloader, does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` (try 8 which is the number of cpus on this machine) in the `DataLoader` init to improve performance.\n",
" rank_zero_warn(\n",
"c:\\Users\\ste\\Anaconda2\\envs\\env-thesis\\Lib\\site-packages\\pytorch_lightning\\trainer\\connectors\\data_connector.py:432: PossibleUserWarning: The dataloader, train_dataloader, does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` (try 8 which is the number of cpus on this machine) in the `DataLoader` init to improve performance.\n",
" rank_zero_warn(\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d86c1f414c6d4bf4836c9c9df7befef1",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "13e4cea9ba2d4e2cad9fb7ffb04e734e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.679\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9024ec21c159467e99cf0e53100bcb08",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "135764bbe2c743868055ed007a2da585",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c97d0e9b0a514c71b9ecabf2c4742a91",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "eccc6b5f67c447a7b67baa201a7370be",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "893ce33822b54e4e92b0c8e697d71e55",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "32bd15f2da724b45ac7500a88613306d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "cb3c0d29d38c4197940c727bf47b315a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "efd8ec6f393d487c96d68d1d69bb6073",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "75d471ac44a743f1bddff068c4b7c3c8",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4218ae5c129f49c7a168c26bd92df42d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Monitored metric train_loss did not improve in the last 10 records. Best score: 0.679. Signaling Trainer to stop.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a0824ee73ebd4e18bc55bf3923b1ebed",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8018433451652527 │\n",
"│ val_f1_score │ 0.6861313581466675 │\n",
"│ val_hp_metric │ 0.8018433451652527 │\n",
"│ val_loss │ 0.46606215834617615 │\n",
"│ val_opt_score │ 1.4879746437072754 │\n",
"│ val_precision │ 0.6103895902633667 │\n",
"│ val_recall │ 0.7833333611488342 │\n",
"│ val_roc_auc │ 0.8800424337387085 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8018433451652527 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6861313581466675 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8018433451652527 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.46606215834617615 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.4879746437072754 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6103895902633667 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7833333611488342 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8800424337387085 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\ste\\AppData\\Local\\Temp\\ipykernel_9048\\4021510138.py:42: FutureWarning: ['Uniprot', 'Smiles', 'E3 Ligase', 'InChI', 'InChI Key', 'Cell Type', 'Article DOI', 'Comments', 'Database', 'Molecular Formula', 'Target', 'PDB', 'Name', 'Assay (DC50/Dmax)', 'Target (Parsed)', 'POI Sequence', 'E3 Ligase Uniprot', 'E3 Ligase Sequence', 'Cell Line Identifier', 'disabled_embeddings'] did not aggregate successfully. If any error is raised this will raise in a future version of pandas. Drop these columns/ops to avoid this warning.\n",
" val_metrics.aggregate(['mean', 'std'])\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Compound ID | \n",
" Molecular Weight | \n",
" Heavy Atom Count | \n",
" Ring Count | \n",
" Rotatable Bond Count | \n",
" Topological Polar Surface Area | \n",
" Hydrogen Bond Acceptor Count | \n",
" Hydrogen Bond Donor Count | \n",
" Treatment Time (h) | \n",
" DC50 (nM) | \n",
" ... | \n",
" XLogP3 | \n",
" val_loss | \n",
" val_acc | \n",
" val_f1_score | \n",
" val_hp_metric | \n",
" val_opt_score | \n",
" val_precision | \n",
" val_recall | \n",
" val_roc_auc | \n",
" fold | \n",
"
\n",
" \n",
" \n",
" \n",
" mean | \n",
" 1309.798528 | \n",
" 984.393343 | \n",
" 70.029439 | \n",
" 7.385465 | \n",
" 20.139834 | \n",
" 220.732282 | \n",
" 13.651334 | \n",
" 4.467341 | \n",
" 18.154774 | \n",
" 2396.467627 | \n",
" ... | \n",
" 5.260886 | \n",
" 0.450865 | \n",
" 0.811377 | \n",
" 0.674281 | \n",
" 0.811377 | \n",
" 1.485658 | \n",
" 0.608559 | \n",
" 0.760064 | \n",
" 0.883329 | \n",
" 2.000000 | \n",
"
\n",
" \n",
" std | \n",
" 931.846640 | \n",
" 165.936373 | \n",
" 11.294283 | \n",
" 1.368378 | \n",
" 6.379550 | \n",
" 38.692208 | \n",
" 2.872499 | \n",
" 1.429301 | \n",
" 10.410593 | \n",
" 8579.934090 | \n",
" ... | \n",
" 2.418567 | \n",
" 0.025810 | \n",
" 0.015360 | \n",
" 0.027453 | \n",
" 0.015360 | \n",
" 0.037981 | \n",
" 0.047883 | \n",
" 0.041401 | \n",
" 0.012142 | \n",
" 1.581139 | \n",
"
\n",
" \n",
"
\n",
"
2 rows × 24 columns
\n",
"
"
],
"text/plain": [
" Compound ID Molecular Weight Heavy Atom Count Ring Count \\\n",
"mean 1309.798528 984.393343 70.029439 7.385465 \n",
"std 931.846640 165.936373 11.294283 1.368378 \n",
"\n",
" Rotatable Bond Count Topological Polar Surface Area \\\n",
"mean 20.139834 220.732282 \n",
"std 6.379550 38.692208 \n",
"\n",
" Hydrogen Bond Acceptor Count Hydrogen Bond Donor Count \\\n",
"mean 13.651334 4.467341 \n",
"std 2.872499 1.429301 \n",
"\n",
" Treatment Time (h) DC50 (nM) ... XLogP3 val_loss val_acc \\\n",
"mean 18.154774 2396.467627 ... 5.260886 0.450865 0.811377 \n",
"std 10.410593 8579.934090 ... 2.418567 0.025810 0.015360 \n",
"\n",
" val_f1_score val_hp_metric val_opt_score val_precision val_recall \\\n",
"mean 0.674281 0.811377 1.485658 0.608559 0.760064 \n",
"std 0.027453 0.015360 0.037981 0.047883 0.041401 \n",
"\n",
" val_roc_auc fold \n",
"mean 0.883329 2.000000 \n",
"std 0.012142 1.581139 \n",
"\n",
"[2 rows x 24 columns]"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# K-fold cross-validation loop\n",
"import os\n",
"from sklearn.model_selection import KFold\n",
"\n",
"n_splits = 5\n",
"embeddings_to_disable = [\n",
" # ['poi'],\n",
" # ['e3'],\n",
" # ['cell'],\n",
" # ['smiles'],\n",
" ['poi', 'e3', 'cell'],\n",
"]\n",
"\n",
"csv_filepath = f'../data/results/val_metrics_{n_splits}-splits_ablation.csv'\n",
"if os.path.exists(csv_filepath):\n",
" tmp = pd.read_csv(csv_filepath)\n",
"else:\n",
" tmp = pd.DataFrame()\n",
"\n",
"kf = KFold(n_splits=n_splits, shuffle=True, random_state=42)\n",
"val_metrics = []\n",
"tmp = protac_df[protac_df['Active'].notna()]\n",
"for k, (train_index, val_index) in enumerate(kf.split(tmp)):\n",
" train_df = tmp.iloc[train_index]\n",
" val_df = tmp.iloc[val_index]\n",
" for disabled_embeddings in embeddings_to_disable:\n",
" print(f'Fold {k}, disabled embeddings: {disabled_embeddings}')\n",
" model, trainer, val_metric = train_model(\n",
" train_df, val_df, disabled_embeddings,\n",
" )\n",
" val_metric['fold'] = k\n",
" val_metric['disabled_embeddings'] = ' '.join(disabled_embeddings)\n",
" val_metrics.append(val_metric)\n",
"val_metrics = pd.DataFrame(val_metrics)\n",
"\n",
"val_metrics = pd.concat([tmp, val_metrics])\n",
"\n",
"val_metrics.to_csv(\n",
" f'../data/results/val_metrics_{n_splits}-splits_ablation.csv',\n",
" index=False\n",
")\n",
"val_metrics.aggregate(['mean', 'std'])"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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ZcoUASD37t3L9fx0n5s9evSQt99+W28YgCzPqU//gZNZoC1durS8/fbbkpqaqldn06ZNxd3dXfmMfdHzdm7nowu0z27PDz/8UADItGnT9MrfeustqVSpkvJelw88PDz0PiMSExPFwcFB6tWrp5QFBwdL0aJFlWyg07dvX7GwsFA+23O7rePj48XCwsIg1/z5558CINeB9tlzZEhIiFhYWCjHxm+//SYAZO7cuXrjTZgwweDzNjfH+e7du8XExERGjx6d7Xgi/wu0qampkpqaKrdv35aZM2eKRqORqlWriojIvn379C5qZqV69epiaWlpsPzPBloREU9PzxwD8rPy/NiuHj164L///sOGDRsAAGlpafjpp5/w3nvvwd/fXxlv3rx5qFSpEiwsLGBqagozMzPs2LEDp0+fzussFY0bN9b7yq9MmTIAgCZNmuiNpyu/evUqAGDbtm1IS0tD586dkZaWprwsLCwQFBSUpztA33//fRQpUiTH8bZs2YI6deoobclMtWrVcOzYMYSEhGDbtm2ZfiWdmevXrwMAXFxcDIYNHDgQAwcORP369VG/fn2MHTsWS5cuxZkzZ7BgwQJlvPT0dL11kVO3gZ07d6Js2bJKfz6drl27QkQMbkJ72q5du1C3bl29mwVNTEzQtm3bHJf177//xoULF9CjR48cv34FgI8++sig3bp2Pq1169awtrZWvpJ66623YG5ujk8++QTh4eG4ePGiQd3VqlXDvXv30L59e/z6668GX8MC0FunaWlpEBEAQLdu3RATE4OzZ88q4y5evBhVq1bV64t58eJFdOjQAW5ubjAxMYGZmZlyA1Fej51du3bB1tYWzZs31yvv0KGDwbhJSUn48ssv4efnB1NTU5iamsLGxgYPHjx47mM2t+te56233oK3t7fy3sLCAiVLltTr9pDVfKytrdGqVSu9ct18n51PnTp1YGtrq7x3dXWFi4tLjvPJq+zuzH962Lhx4zBlyhSEhYVh165d+PXXX1GqVCnUr18/26/fFy5cCFNTU4P1m5Vq1aphyZIlGDt2LPbt25fp17a3bt3CZ599Bi8vL+W8rbvpNLP9oGnTpnrvy5QpA41Gg0aNGillpqam8PPzy3T9dujQQW9d+Pj4oGbNmti1a1eWy5Hb87mDgwNKlCiByZMnY9q0aThy5EiuukdlZdeuXShXrhwqVqxo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iOh1sXv3btSpUwerV682eDrFq9amTRtcunTJoP870esuIiICHTt2xJ9//omaNWsauzn5Ij09HX5+fujQoQPGjRuXp2mfq8sBGZ+HhwcGDBiAcePGoXXr1rn+BSMiInpCRLB7926Dft5Er5uff/4Z//77LypUqIBChQph3759mDx5MmrVqvXGhFngyT0XSUlJ+OKLL/I8LQOtin399dewsrLCv//+m+tHYRAR0RMajSbTn0knet3Y2tpixYoVGDt2LB48eAB3d3d07doVY8eONXbT8lVGRgaWL19ucP9GbrDLARERERGp2hvzPfXvv/+OZs2awcPDAxqNxuARPiKCsLAweHh4wNLSErVr11YetaSTkpKCfv36wcnJCdbW1mjevLne809TUlLQqVMn2NnZoVSpUga/jjVp0iT069fvpS0jERERERl6YwLtgwcPULFiRXz//feZDp80aRKmTZuG77//HrGxsXBzc0P9+vX1fuxhwIABWLduHVasWIE9e/YgKSkJTZs2VZ7FOX/+fBw6dAh79+5Fr1690L59e+UZipcuXcKPP/6Y507MRERERPRi3sguBxqNBuvWrcOHH34I4MnVWd1NVF9++SWAJ1dbXV1dMXHiRHz66adISEiAs7Mzli1bpjw14Pr16/Dy8sLmzZsRHByMkJAQ2NnZ4dtvv0VycjKsrKxw69YtODs7o2HDhvj000/RokULYy02ERERUYFUIG4Ku3TpEuLi4tCgQQOlTPdrLTExMfj0009x6NAhpKam6o3j4eGB8uXLIyYmBsHBwahYsSKWLVuG5ORkbNu2De7u7nBycsJPP/0ECwuLXIfZlJQUvV+9ysjIwN27d+Ho6Jjrn9YlIiIi4xIR3L9/Hx4eHnzakJEViECr+71jV1dXvXJXV1fl5+l0v/lcpEgRg3F003fv3h3Hjx9H2bJl4eTkhFWrViE+Ph6jRo3Crl278PXXX2PFihXKT7V6enpm2p4JEybo/XoJERERqde1a9ey/MlhejUKRKDVefbqp4jkeEX06XHMzMwwe/ZsveFdu3ZF//79cfToUaxfvx7Hjh3DpEmT0L9/f6xZsybTOocNG4bQ0FDlfUJCAry9vXH58mXY2dk9z6IRERHRK5aYmIhixYrB1tbW2E0p8ApEoNX9pnJcXBzc3d2V8lu3bilXbd3c3PD48WPEx8frXaW9detW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CLscEBEREZGqMdASERERkaox0BIRERGRqjHQEhEREZGqMdASERERkaox0BIRERGRqjHQEhEREZGq8Tm0REREb6jvB200dhMydf/uQ73/v47t7Du1mbGbQHnAK7REREREpGoMtERERESkagy0RERERKRqDLREREREpGoMtERERESkagy0RERERKRqDLREREREpGoMtERERESkavxhBSKil+Tzzz/H7du3AQDOzs6YOXOmkVtERPRmYqAlInpJbt++jZs3bxq7GUSvHQtz20z/T/S8GGiJiIjolQryb2PsJtAbhn1oiYiIiEjVGGiJiIiISNUYaImIiIhI1RhoiYiIiEjVGGiJiIiISNUYaImIiIhI1RhoiYiIiEjVGGiJiIiISNUYaImIiIhI1RhoiYiIiEjVGGiJiIiISNUKXKD9999/8fHHH8PR0RFWVlZ46623cOjQIWW4iCAsLAweHh6wtLRE7dq1cfLkSb06QkND4eDgAG9vb6xYsUJv2KpVq9CsWbNXsixEREREBJgauwGvUnx8PAIDA1GnTh1s2bIFLi4uuHDhAgoXLqyMM2nSJEybNg1LlixByZIlMXbsWNSvXx9nz56Fra0tNm7ciIiICERGRuLcuXPo1q0b6tevD0dHR9y7dw/Dhw/Hjh07jLeQRAVQ4KxAYzchU9pELTTQAADiEuNe23b+2e9PYzeBiOiFFKhAO3HiRHh5eWHx4sVKWbFixZT/iwhmzJiB4cOHo2XLlgCA8PBwuLq6IiIiAp9++ilOnz6N2rVro0qVKqhSpQoGDBiAixcvwtHREUOGDEFISAi8vb1f9aIRERERFVgFKtBu2LABwcHBaN26NaKjo+Hp6YmQkBD06tULAHDp0iXExcWhQYMGyjRarRZBQUGIiYnBp59+iooVK2L+/PmIj4/HxYsXkZycDD8/P+zZsweHDx/G3Llzc2xHSkoKUlJSlPeJiYkAgPT0dKSnp2c7rYnmeZacAOS4bvMqQ2OSr/UVNPm5PUygjm3xurYzv48NMXk9l1MN8ntbQCP5W18Bkpttke/bi55bgQq0Fy9exNy5cxEaGoqvvvoKBw4cQP/+/aHVatG5c2fExcUBAFxdXfWmc3V1xZUrVwAAwcHB+Pjjj1G1alVYWloiPDwc1tbW6N27N5YsWYK5c+di1qxZcHJywvz581GuXDmDdkyYMAGjR482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MdASERERkaox0BIRERGRqjHQEhEREZGqMdASERERkaox0BIRERGRqjHQEhEREZGqMdASERERkaox0BIRERGRqjHQEhEREZGqMdASERERkaox0BIRERGRqjHQEhEREZGqMdASERERkaox0BIRERGRqjHQEhEREZGqMdASERERkaox0BIRERGRqjHQEhEREZGqMdASERERkaox0BIRERGRqjHQEhEREZGqMdASERERkaox0BIRERGRqjHQEhEREZGqMdASERERkaox0BIRERGRqjHQEhEREZGqMdASERERkaox0BIRERGRqjHQEhEREZGqMdASERERkaox0BIRERGRqjHQEhEREZGqMdASERERkaox0BIRERGRqjHQEhEREZGqMdASERERkaox0BIRERGRqjHQEhEREZGqMdASERERkaox0BIRERGRqhWoQDthwgRUrVoVtra2cHFxwYcffoizZ8/qjSMiCAsLg4eHBywtLVG7dm2cPHlSb5zQ0FA4ODjA29sbK1as0Bu2atUqNGvW7KUvCxERERE9UaACbXR0NPr06YN9+/YhKioKaWlpaNCgAR48eKCMM2nSJEybNg3ff/89YmNj4ebmhvr16+P+/fsAgI0bNyIiIgKRkZGYOHEiunXrhjt37gAA7t27h+HDh2P27NlGWT4iIiKigqhABdqtW7eia9euKFeuHCpWrIjFixfj6tWrOHToEIAnV2dnzJiB4cOHo2XLlihfvjzCw8Px8OFDREREAABOnz6N2rVro0qVKmjfvj3s7Oxw8eJFAMCQIUMQEhICb29voy0jERERUUFjauwGGFNCQgIAwMHBAQBw6dIlxMXFoUGDBso4Wq0WQUFBiImJwaeffoqKFSti/vz5iI+Px8WLF5GcnAw/Pz/s2bMHhw8fxty5c3Ocb0pKClJSUpT3iYmJAID09HSkp6dnO62JJs+LSf8vp3WbVxkak3ytr6DJz+1hAm6LF5Hfx4aYcHs8r/zeFtBI/tZXgORmW+T79qLnVmADrYggNDQU7777LsqXLw8AiIuLAwC4urrqjevq6oorV64AAIKDg/Hxxx+jatWqsLS0RHh4OKytrdG7d28sWbIEc+fOxaxZs+Dk5IT58+ejXLlyBvOeMGECRo8ebVB+4cIF2NjYZNvud720z7W8BJw7dy5f60twCcrX+gqaR/m4Pd6xfyff6iqI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VMl2+NGjR/H2228rYZaIiDLHQEtElI3u3bujb9++AIDZs2frDdN99f/bb7/B09NTb1hubuyytrbOdvjT3ROIiChrDLRERNlo2LCh8gSC4OBgvWFly5aFVqvF1atXERQUlOn05ubmAID09PQ8zzsgIAA//vgj7t69y6u0RETZ4FMOiIiyYWJigtOnT+P06dMwMTHRG2Zra4vBgwdj4MCBCA8Px4ULF3DkyBHMnj0b4eHhAAAfHx9oNBps2rQJt2/fRlJSUq7n3b59e7i5ueHDDz/En3/+iYsXL2LNmjXYu3dvvi4jEZHaMdASEeXAzs4OdnZ2mQ775ptvMHLkSEyYMAFlypRBcHAwNm7cCF9fXwCAp6cnRo8ejaFDh8LV1VXpvpAb5ubmiIyMhIuLCxo3bowKFSrg22+/NQjWREQFnUYye1YMEREREZFK8AotEREREakaAy0RERERqRoDLRERERGpGgMtEREREakaAy0RERERqRoDLRERERGpGgMtEREREakaAy0RERERqRoDLRERERGpGgMtEREREakaAy0RERERqRoDLRERERGp2v8B1TrAJEahmPoAAAAASUVORK5CYII=",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot aggregated results\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"\n",
"val_metrics = pd.read_csv(\n",
" f'../data/results/val_metrics_{n_splits}-splits_ablation.csv'\n",
")\n",
"\n",
"for disabled_embeddings in embeddings_to_disable:\n",
" tmp = val_metrics[val_metrics['disabled_embeddings']\n",
" == ' '.join(disabled_embeddings)].copy()\n",
" tmp = tmp[['fold', 'val_acc', 'val_roc_auc',\n",
" 'val_precision', 'val_recall', 'val_f1_score']]\n",
" # Rename columns\n",
" tmp.columns = ['fold', 'Accuracy', 'ROC AUC',\n",
" 'Precision', 'Recall', 'F1 score']\n",
" # Plot aggregated mean value of all metrics in one bar plot\n",
" tmp = tmp.melt(id_vars='fold', var_name='Metric', value_name='Score')\n",
" sns.barplot(data=tmp, x='Metric', y='Score')\n",
"\n",
" num_data = len(protac_df[protac_df['Active'].notna()])\n",
" plt.title(\n",
" f'Val metrics ({n_splits}-fold cross-validation on {num_data} samples, disabled embeddings: {disabled_embeddings[0].upper()})')\n",
" plt.grid(axis='y', alpha=0.5)\n",
" # Set y-axis to end at 1.0\n",
" plt.ylim(0, 1.0)\n",
" # Make the y-axis as percentage\n",
" plt.gca().yaxis.set_major_formatter(\n",
" plt.matplotlib.ticker.PercentFormatter(1, decimals=0))\n",
" plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Psuedo-Label Training"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of parameters: 5,903,617\n"
]
}
],
"source": [
"from copy import copy\n",
"\n",
"oracle_model = copy(model)\n",
"print(\n",
" f'Number of parameters: {sum(p.numel() for p in oracle_model.parameters()):,}')"
]
},
{
"cell_type": "code",
"execution_count": 107,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Oracle iteration 0\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | poi_emb | Linear | 787 K \n",
"1 | e3_emb | Linear | 787 K \n",
"2 | cell_emb | Linear | 590 K \n",
"3 | smiles_emb | Linear | 787 K \n",
"4 | fc1 | Linear | 2.4 M \n",
"5 | fc2 | Linear | 590 K \n",
"6 | fc3 | Linear | 769 \n",
"7 | dropout | Dropout | 0 \n",
"8 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"5.9 M Trainable params\n",
"0 Non-trainable params\n",
"5.9 M Total params\n",
"23.614 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "461d8a19ef004f79a2e1015175be35bd",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a972efecb6e64b28bee1223d9b460f22",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b0ed4cf70d424bfba05a38940719985c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.681\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6afd0cc025374a2fad9a03acafe19814",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e490e100850f4388b396e94ff14fad8d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "ca60d1ae8f924ab9b31ff3e4f8f0cbd1",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bb3f13aeb0c642e289edded6e5dc8ab9",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"`Trainer.fit` stopped: `max_epochs=5` reached.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5ce24886429c4947beb2a29d189b5d55",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8119266033172607 │\n",
"│ val_f1_score │ 0.6611570119857788 │\n",
"│ val_hp_metric │ 0.8119266033172607 │\n",
"│ val_loss │ 0.36858928203582764 │\n",
"│ val_opt_score │ 1.4730836153030396 │\n",
"│ val_precision │ 0.6557376980781555 │\n",
"│ val_recall │ 0.6666666865348816 │\n",
"│ val_roc_auc │ 0.8914557695388794 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8119266033172607 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6611570119857788 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8119266033172607 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.36858928203582764 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.4730836153030396 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6557376980781555 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6666666865348816 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8914557695388794 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b20cd9147ce2493d876d1704fc8d82bf",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Predicting: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[{'val_loss': 0.36858928203582764,\n",
" 'val_acc': 0.8119266033172607,\n",
" 'val_f1_score': 0.6611570119857788,\n",
" 'val_hp_metric': 0.8119266033172607,\n",
" 'val_opt_score': 1.4730836153030396,\n",
" 'val_precision': 0.6557376980781555,\n",
" 'val_recall': 0.6666666865348816,\n",
" 'val_roc_auc': 0.8914557695388794}]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Oracle iteration 1\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | poi_emb | Linear | 787 K \n",
"1 | e3_emb | Linear | 787 K \n",
"2 | cell_emb | Linear | 590 K \n",
"3 | smiles_emb | Linear | 787 K \n",
"4 | fc1 | Linear | 2.4 M \n",
"5 | fc2 | Linear | 590 K \n",
"6 | fc3 | Linear | 769 \n",
"7 | dropout | Dropout | 0 \n",
"8 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"5.9 M Trainable params\n",
"0 Non-trainable params\n",
"5.9 M Total params\n",
"23.614 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3ed1d6be59d14ff6be46e16b266751cf",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "98660bb9f10f4e4497cf935c2d145869",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c8b5685f0f2643d7b0403dd210c80048",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.680\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c3f6a0cf84f54e6aa11d85dde291108f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "ae9f8760aa8e449886cd1658283c8de4",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "49e9339fa3634dd3937a7c00dd79a51b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0e36317bc6fb41c4b9d2ef87e913b95f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"`Trainer.fit` stopped: `max_epochs=5` reached.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5bc6623e98a94a61b5fe3be9424f637a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8119266033172607 │\n",
"│ val_f1_score │ 0.7284768223762512 │\n",
"│ val_hp_metric │ 0.8119266033172607 │\n",
"│ val_loss │ 0.4363510012626648 │\n",
"│ val_opt_score │ 1.5404033660888672 │\n",
"│ val_precision │ 0.6043956279754639 │\n",
"│ val_recall │ 0.9166666865348816 │\n",
"│ val_roc_auc │ 0.8967299461364746 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8119266033172607 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7284768223762512 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8119266033172607 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.4363510012626648 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.5404033660888672 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6043956279754639 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.9166666865348816 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8967299461364746 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c5ac531089ef4db19f115739821d2f2a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Predicting: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[{'val_loss': 0.4363510012626648,\n",
" 'val_acc': 0.8119266033172607,\n",
" 'val_f1_score': 0.7284768223762512,\n",
" 'val_hp_metric': 0.8119266033172607,\n",
" 'val_opt_score': 1.5404033660888672,\n",
" 'val_precision': 0.6043956279754639,\n",
" 'val_recall': 0.9166666865348816,\n",
" 'val_roc_auc': 0.8967299461364746}]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Oracle iteration 2\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | poi_emb | Linear | 787 K \n",
"1 | e3_emb | Linear | 787 K \n",
"2 | cell_emb | Linear | 590 K \n",
"3 | smiles_emb | Linear | 787 K \n",
"4 | fc1 | Linear | 2.4 M \n",
"5 | fc2 | Linear | 590 K \n",
"6 | fc3 | Linear | 769 \n",
"7 | dropout | Dropout | 0 \n",
"8 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"5.9 M Trainable params\n",
"0 Non-trainable params\n",
"5.9 M Total params\n",
"23.614 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "52f2dee9fd5145bc8281ec9baf04d759",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "52d8b6bab5c84103b77281a06c552103",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5b64908b21c14682aef60fd5348a317b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.678\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a4d55544d779490d830147bd4adb9cc7",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4f6ece7c4eb049f3910719f758a2e84d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b6455efe0cc94ca68cb2e16be011e738",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "ae3c2e527d504dcf94ff1937655863b8",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"`Trainer.fit` stopped: `max_epochs=5` reached.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9d73120c6f324920acbd2e092689c270",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8486238718032837 │\n",
"│ val_f1_score │ 0.7441860437393188 │\n",
"│ val_hp_metric │ 0.8486238718032837 │\n",
"│ val_loss │ 0.3814685344696045 │\n",
"│ val_opt_score │ 1.5928099155426025 │\n",
"│ val_precision │ 0.695652186870575 │\n",
"│ val_recall │ 0.800000011920929 │\n",
"│ val_roc_auc │ 0.9017932415008545 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8486238718032837 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7441860437393188 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8486238718032837 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.3814685344696045 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.5928099155426025 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.695652186870575 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.800000011920929 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.9017932415008545 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "05e87ec2e35d4b7c990a69c77cfd9ff2",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Predicting: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[{'val_loss': 0.3814685344696045,\n",
" 'val_acc': 0.8486238718032837,\n",
" 'val_f1_score': 0.7441860437393188,\n",
" 'val_hp_metric': 0.8486238718032837,\n",
" 'val_opt_score': 1.5928099155426025,\n",
" 'val_precision': 0.695652186870575,\n",
" 'val_recall': 0.800000011920929,\n",
" 'val_roc_auc': 0.9017932415008545}]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Oracle iteration 3\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | poi_emb | Linear | 787 K \n",
"1 | e3_emb | Linear | 787 K \n",
"2 | cell_emb | Linear | 590 K \n",
"3 | smiles_emb | Linear | 787 K \n",
"4 | fc1 | Linear | 2.4 M \n",
"5 | fc2 | Linear | 590 K \n",
"6 | fc3 | Linear | 769 \n",
"7 | dropout | Dropout | 0 \n",
"8 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"5.9 M Trainable params\n",
"0 Non-trainable params\n",
"5.9 M Total params\n",
"23.614 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "10cee0bb09e54342b5667cc310c3b0db",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "412395eb2826440dbc6ddf6ef9cfaee6",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6341b540c19e483a8fb161552062c49e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.665\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "372085f35ee94e909997b58bb74cf411",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7aa5b829a3134f41ae08bd03523dd0bf",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "469991d3dcef48a39d462d92e321f6d4",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "049a245540a041209a17c8cdf9d4c249",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"`Trainer.fit` stopped: `max_epochs=5` reached.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "cbf64814d8a349d1bdf785e3c2003bda",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8486238718032837 │\n",
"│ val_f1_score │ 0.7591241002082825 │\n",
"│ val_hp_metric │ 0.8486238718032837 │\n",
"│ val_loss │ 0.3775690495967865 │\n",
"│ val_opt_score │ 1.607748031616211 │\n",
"│ val_precision │ 0.6753246784210205 │\n",
"│ val_recall │ 0.8666666746139526 │\n",
"│ val_roc_auc │ 0.8989450931549072 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8486238718032837 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7591241002082825 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8486238718032837 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.3775690495967865 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.607748031616211 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6753246784210205 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8666666746139526 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8989450931549072 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f142c9af8e7749969f88cf54ab742e86",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Predicting: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[{'val_loss': 0.3775690495967865,\n",
" 'val_acc': 0.8486238718032837,\n",
" 'val_f1_score': 0.7591241002082825,\n",
" 'val_hp_metric': 0.8486238718032837,\n",
" 'val_opt_score': 1.607748031616211,\n",
" 'val_precision': 0.6753246784210205,\n",
" 'val_recall': 0.8666666746139526,\n",
" 'val_roc_auc': 0.8989450931549072}]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Oracle iteration 4\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"\n",
" | Name | Type | Params\n",
"------------------------------------------\n",
"0 | poi_emb | Linear | 787 K \n",
"1 | e3_emb | Linear | 787 K \n",
"2 | cell_emb | Linear | 590 K \n",
"3 | smiles_emb | Linear | 787 K \n",
"4 | fc1 | Linear | 2.4 M \n",
"5 | fc2 | Linear | 590 K \n",
"6 | fc3 | Linear | 769 \n",
"7 | dropout | Dropout | 0 \n",
"8 | metrics | ModuleDict | 0 \n",
"------------------------------------------\n",
"5.9 M Trainable params\n",
"0 Non-trainable params\n",
"5.9 M Total params\n",
"23.614 Total estimated model params size (MB)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b46c159286f94c4292a76e773b10ecbd",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sanity Checking: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c3ee612bf9db4755b0c0d562c79d3935",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "305decdb9ec048b4bb3e2c16bc6304dc",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Metric train_loss improved. New best score: 0.665\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "91b59e48a2d541429d9902caf07f2546",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e170c32c520a4619a96b9c0f400a2d68",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "db12c97c83dc4a77a904325ab83dec48",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a11d8f8aa45640aab06ce829dc760e3c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"`Trainer.fit` stopped: `max_epochs=5` reached.\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "53d56161558244359526ba0ad3a88930",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Runningstage.validating ┃ ┃\n",
"┃ metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ val_acc │ 0.8348624110221863 │\n",
"│ val_f1_score │ 0.71875 │\n",
"│ val_hp_metric │ 0.8348624110221863 │\n",
"│ val_loss │ 0.38852933049201965 │\n",
"│ val_opt_score │ 1.553612470626831 │\n",
"│ val_precision │ 0.6764705777168274 │\n",
"│ val_recall │ 0.7666666507720947 │\n",
"│ val_roc_auc │ 0.8900843858718872 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"
\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Runningstage.validating \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m┃\n",
"┃\u001b[1m \u001b[0m\u001b[1m metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m val_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8348624110221863 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_f1_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.71875 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_hp_metric \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8348624110221863 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.38852933049201965 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_opt_score \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.553612470626831 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_precision \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.6764705777168274 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_recall \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7666666507720947 \u001b[0m\u001b[35m \u001b[0m│\n",
"│\u001b[36m \u001b[0m\u001b[36m val_roc_auc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8900843858718872 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "2a1d290c9a5940aea897f8c0412646f5",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Predicting: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[{'val_loss': 0.38852933049201965,\n",
" 'val_acc': 0.8348624110221863,\n",
" 'val_f1_score': 0.71875,\n",
" 'val_hp_metric': 0.8348624110221863,\n",
" 'val_opt_score': 1.553612470626831,\n",
" 'val_precision': 0.6764705777168274,\n",
" 'val_recall': 0.7666666507720947,\n",
" 'val_roc_auc': 0.8900843858718872}]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def get_oracle_predictions(model, trainer, test_df):\n",
" test_ds = PROTAC_Dataset(\n",
" test_df,\n",
" protein_embeddings,\n",
" cell2embedding,\n",
" smiles2fp,\n",
" )\n",
" test_dl = DataLoader(test_ds, batch_size=32, shuffle=False)\n",
" test_preds = trainer.predict(model, test_dl)\n",
" test_preds = torch.vstack(test_preds).numpy().flatten()\n",
" test_df['Active'] = [\n",
" is_active(p, pos_threshold=0.97, neg_threshold=0.001) for p in test_preds]\n",
" return test_df\n",
"\n",
"\n",
"train_df, val_df = train_test_split(\n",
" protac_df[protac_df['Active'].notna()], test_size=0.2, random_state=42)\n",
"test_df = protac_df[protac_df['Active'].isna()]\n",
"\n",
"val_metrics = []\n",
"for i in range(5):\n",
" print(f'Oracle iteration {i}')\n",
" model, trainer, metrics = train_model(train_df, val_df)\n",
" val_metrics.append(metrics)\n",
" test_df = get_oracle_predictions(model, trainer, test_df)\n",
" # Update the training set\n",
" train_df = pd.concat([\n",
" train_df,\n",
" test_df[test_df['Active'].notna()]], axis=0).drop_duplicates()\n",
" display(metrics)"
]
},
{
"cell_type": "code",
"execution_count": 108,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5aede109a90c428e900696220d318335",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Predicting: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAGxCAYAAADCo9TSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAukElEQVR4nO3df3xU1Z3/8fc4CUMCSZRfMwlEfmSjBREV0UCUbyKaWIy6ymptQy1UbFFATbMuhdKVRNlEcc1CRXB1IaZVhK0Ktf4qsWJEgzUgrBosIgTUlZCCwCQCiQzn+4ebqeMEyISZAxNfz8djHg/vueee+5nzQO6bM/fOOIwxRgAAAJacdrILAAAA3y2EDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVhA/g/1x//fWKi4vTvn37jtpn/Pjxio2N1a5du9o9rsPhUFFRkX/79ddfl8Ph0Ouvv37cYydOnKgBAwa0+1zftHDhQj3xxBNB7du3b5fD4Whz33dBW/Pf0XlmjoGOIXwA/2fSpEk6dOiQli5d2ub+/fv3a8WKFbr66qvldrs7fJ7hw4dr7dq1Gj58eIfHaI+jXRiTk5O1du1a5eXlRfT80eRf//VftWLFipCPY46BjiF8AP9n7NixSklJ0ZIlS9rc//TTT+vgwYOaNGnSCZ0nMTFRI0eOVGJi4gmN01Eul0sjR45U7969T8r5O8oYo4MHD0Zk7LS0NF1wwQVhGy9a5xiwhfAB/B+n06kJEyZo/fr1ev/994P2l5eXKzk5WWPHjtXf/vY3TZkyRUOGDFH37t3Vp08fjRkzRmvWrDnueY72scsTTzyhs88+Wy6XS4MHD9Zvf/vbNo8vLi5WRkaGevToocTERA0fPlyLFy/WN38jcsCAAaqtrVVVVZUcDoccDof/Y4WjfSTw5ptv6vLLL1dCQoLi4+OVmZmpF198MahGh8Oh1atX6/bbb1evXr3Us2dPjRs3Tp9//vlx3/vEiRPVvXt31dbW6vLLL1e3bt3Uu3dvTZs2TQcOHAjo63A4NG3aND366KMaPHiwXC6XKioqJElbtmxRfn6++vTp45+vRx55JOh8f/3rX/X9739f8fHx6tWrl2677TY1Nja2Wde3P3Y5cuSIHn74YZ1//vmKi4vT6aefrpEjR+r5558/Zeb4tddeU3Z2tnr27Km4uDideeaZ+qd/+qeguQRONYQP4BtuueUWORyOoNWPTZs26Z133tGECRPkdDr1xRdfSJJmz56tF198UeXl5Ro0aJCys7PbdS/Htz3xxBP66U9/qsGDB+vZZ5/Vr3/9a91333167bXXgvpu375dkydP1n//93/rueee07hx43THHXfovvvu8/dZsWKFBg0apAsuuEBr167V2rVrj/mxQlVVlcaMGaP9+/dr8eLFevrpp5WQkKBrrrlGy5cvD+p/6623KjY2VkuXLtXcuXP1+uuv68c//nG73utXX32lq666SpdffrlWrlypadOm6T//8z910003BfVduXKlFi1apHvuuUd/+tOfNHr0aG3atEkXXXSRPvjgAz300EN64YUXlJeXpzvvvFPFxcX+Y3ft2qWsrCx98MEHWrhwoX73u9+pqalJ06ZNa1edEydO1F133aWLLrpIy5cv17Jly3Tttddq+/btkk7+HG/fvl15eXnq0qWLlixZoldeeUX333+/unXrppaWlna9R+CkMQACZGVlmV69epmWlhZ/2z//8z8bSeajjz5q85jDhw+br776ylx++eXm+uuvD9gnycyePdu/vXr1aiPJrF692hhjjM/nMykpKWb48OHmyJEj/n7bt283sbGxpn///ket1efzma+++srce++9pmfPngHHn3POOSYrKyvomLq6OiPJlJeX+9tGjhxp+vTpYxobGwPe09ChQ02/fv3845aXlxtJZsqUKQFjzp0710gyO3fuPGqtxhgzYcIEI8nMnz8/oP3f/u3fjCTz5ptv+tskmaSkJPPFF18E9L3yyitNv379zP79+wPap02bZrp27erv/8tf/tI4HA6zcePGgH45OTkB899a1zfn+Y033jCSzKxZs475fk7mHD/zzDNGUtD7A6IBKx/At0yaNEm7d+/2L68fPnxYTz75pEaPHq309HR/v0cffVTDhw9X165dFRMTo9jYWP35z3/Whx9+GNL5Nm/erM8//1z5+flyOBz+9v79+yszMzOo/2uvvaYrrrhCSUlJcjqdio2N1T333KM9e/aooaEh5Pf75Zdf6i9/+YtuuOEGde/e3d/udDp1880367PPPtPmzZsDjrn22msDtocNGyZJ2rFjR7vOOX78+IDt/Px8SdLq1asD2seMGaMzzjjDv33o0CH9+c9/1vXXX6/4+HgdPnzY/7rqqqt06NAhvf322/6xzjnnHJ133nltnutYXn75ZUnS1KlT2/V+jicSc3z++eerS5cu+vnPf66Kigpt27YtLLUCNhA+gG+54YYblJSUpPLycknSSy+9pF27dgXcaFpWVqbbb79dGRkZevbZZ/X222+rpqZG3//+90O+KXLPnj2SJI/HE7Tv223vvPOOcnNzJUmPP/643nrrLdXU1GjWrFmS1KEbMvfu3StjjJKTk4P2paSkBNTYqmfPngHbLper3eePiYkJOr71fX77PN+uac+ePTp8+LAefvhhxcbGBryuuuoqSdLu3bv9fdszp23529/+JqfT2a6+7RGJOU5LS9Orr76qPn36aOrUqUpLS1NaWprmz58flpqBSIo52QUAp5q4uDj96Ec/0uOPP66dO3dqyZIlSkhI0I033ujv8+STTyo7O1uLFi0KOLatmxmPp/UiU19fH7Tv223Lli1TbGysXnjhBXXt2tXfvnLlypDP2+qMM87Qaaedpp07dwbta73BsVevXh0e/9sOHz6sPXv2BFxcW9/nty+431wJaq21dbXgaKsSAwcO9I/VnjltS+/eveXz+VRfX99mYAhVpOZ49OjRGj16tHw+n9atW6eHH35YBQUFcrvd+uEPf3jCdQORwsoH0IZJkybJ5/PpwQcf1EsvvaQf/vCHio+P9+93OBz+f4m2eu+997R27dqQz3X22WcrOTlZTz/9dMATKzt27FB1dXVAX4fDoZiYGDmdTn/bwYMH9bvf/S5oXJfL1a6ViG7duikjI0PPPfdcQP8jR47oySefVL9+/XTWWWeF/L6O5amnngrYbv1ulezs7GMeFx8fr8suu0wbNmzQsGHDNGLEiKBXa4C57LLLVFtbq//5n/9p81zHMnbsWEkKCpffdqrMsdPpVEZGhv+Jn3fffbfDYwE2sPIBtGHEiBEaNmyY5s2bJ2NM0Hd7XH311brvvvs0e/ZsZWVlafPmzbr33ns1cOBAHT58OKRznXbaabrvvvt066236vrrr9fPfvYz7du3T0VFRUHL/nl5eSorK1N+fr5+/vOfa8+ePfr3f//3oCAkSeeee66WLVum5cuXa9CgQeratavOPffcNmsoLS1VTk6OLrvsMt19993q0qWLFi5cqA8++EBPP/100ArEiejSpYseeughNTU16aKLLlJ1dbXmzJmjsWPH6tJL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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"val_dl = DataLoader(val_ds, batch_size=32, shuffle=False)\n",
"val_preds = trainer.predict(model, val_dl)\n",
"val_preds = torch.vstack(val_preds).numpy().flatten()\n",
"\n",
"# Plot histogram of predictions\n",
"plt.hist(val_preds, bins=20)\n",
"plt.title('Validation predictions')\n",
"plt.grid(axis='y', alpha=0.5)\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}