Malware classification balancing comparison
Benchmark di un classificatore CNN ADFA-based
Gabriele Bottani - 65826A
Francesco Perna - 66095A
Matteo Celardo - 66094A
Process
Analisi
Una volta analizzato il codice, abbiamo optato per la generazione di 500 sequenze finte tramite GAN, al fine di ribilanciare il dataset di partenza
1.
2.
Implementazione
Sono stati creati due modelli:
- uno bilanciato tramite i dati generati dalla GAN
- uno sbilanciato, basato unicamente sul dataset di patenza
Per l'addestramento sono state usate 20 epoche in entrambi i casi
3.
Valutazione
Le prestazioni dei due modelli sono state misurate tramite 5 metriche:
- precision
- recall
- F1-score
- loss
- accuracy

I risultati mostrano una maggiore performance del modello bilanciato:
- Aumento precision: maggiore efficacia del modello bilanciato per classificare i veri malware
- Aumento recall: migliore capacità di riconoscere i malware
- Aumento F1-score: precision e recall rimangono ben bilanciate

Ulteriori conferme di miglioramento:
- Aumento accuracy: il modello bilanciato garantisce maggiore capacità di classificare correttamente sia true postive che true negative
- Diminuzione loss: indica maggiore confidenza nelle predizioni del modello, grazie a una migliore convergenza dell'addestramento
gan.G.eval()
# Fake sample creati con rumore
z = gan._sample_noise(500)
print(f"Shape of z: {z.shape}")
with torch.no_grad():
# Genera le sequenze finte con GAN.G
fake_sequences = gan.G(z)
fake_sequences = fake_sequences.view(500,
seq_len,
vocab_size)
fake_sequences = torch.softmax(fake_sequences,
dim=-1)
fake_sequences = fake_sequences.argmax(dim=-1)
torch.save(fake_sequences, "fake_sequences.pt") Generazione delle sequenze finte
trainer = pl.Trainer(
max_epochs=MAX_EPOCHS,
max_steps=classifier_max_steps,
val_check_interval=5, # validazione ogni 10 passi
log_every_n_steps=5,
accelerator="auto",
devices="auto",
callbacks=[RichProgressBar()], # progress bar
enable_progress_bar=True,
logger=logger,
)
trainer.fit(model_1,
train_dataloaders=train_loader,
val_dataloaders=val_loader)
torch.save(model_1.state_dict(),
"./model/not-balanced.pt")Addestramento del modello sbilanciato
class FakeDataset(torch.utils.data.Dataset):
def __init__(self, fake_sequences, fake_labels):
self.sequences = fake_sequences
self.labels = fake_labels
def __len__(self):
return len(self.sequences)
def __getitem__(self, idx):
return self.sequences[idx], self.labels[idx]
fake_dataset = FakeDataset(fake_sequences,
fake_labels)
# Concatenazione dei dataset
balanced_dataset = ConcatDataset([train_dataset,
fake_dataset])Generazione fake dataset
trainer_2 = pl.Trainer(
max_epochs=MAX_EPOCHS,
max_steps=classifier_max_steps,
val_check_interval=5, # valida ogni 10 passi
log_every_n_steps=5,
accelerator="auto",
devices="auto",
callbacks=[RichProgressBar()], # progress bar
enable_progress_bar=True,
logger=logger,
)
trainer_2.fit(model_2,
train_dataloaders=train_loader,
val_dataloaders=val_loader)
torch.save(model_2.state_dict(),
"./model/balanced.pt")Addestramento del modello bilanciato
Conclusioni
- Il bilanciamento migliora le prestazioni complessive
- L'approccio GAN per data augmentation è stato efficace
{Q&A}
Grazie per l'attenzione
Code
By Gabriele Bottani (TheGaBr0_)
Code
- 65