roptimizer / compare_ndcg.py
chris1sflaggin's picture
Upload 4 files
aa03608 verified
Raw
History Blame Contribute Delete
2.47 kB
import pandas as pd
import numpy as np
import pickle
from sklearn.metrics import ndcg_score as _ndcg
from lcsajdump.ml.features import FEATURE_NAMES
def safe_ndcg(tc, sc, kk):
try:
if len(tc) < 2:
return 1.0 if (tc[0] == 1) else 0.0
return _ndcg([tc], [sc], k=kk)
except Exception:
n_pos = int(tc.sum())
if n_pos > 0:
top_k_idx = np.argsort(sc)[-kk:][::-1]
n_pos_in_top_k = int(tc[top_k_idx].sum())
return n_pos_in_top_k / min(n_pos, kk)
return 0.0
def main():
df = pd.read_csv("gadget_dataset.csv")
for col in FEATURE_NAMES:
if col not in df.columns: df[col] = 0
with open("gadget_model.pkl", "rb") as f:
data = pickle.load(f)
model = data['model'] if isinstance(data, dict) and 'model' in data else data
X = df[FEATURE_NAMES].values
ml_scores = model.predict(X)
heur_scores = df["heuristic_score"].values
labels = df["label"].values
results_heur = {1: [], 3: [], 5: [], 10: []}
results_ml = {1: [], 3: [], 5: [], 10: []}
for bid in df["binary_id"].unique():
mask = df["binary_id"] == bid
tc = labels[mask]
sc_h = heur_scores[mask]
sc_m = ml_scores[mask]
if tc.sum() == 0: continue
for k in [1, 3, 5, 10]:
results_heur[k].append(safe_ndcg(tc, sc_h, k))
results_ml[k].append(safe_ndcg(tc, sc_m, k))
print(f"===========================================================")
print(f" CONFRONTO PRESTAZIONI: EURISTICA TRADIZIONALE vs ML IBRIDO")
print(f"===========================================================")
print(f"Totale binari valutati (gruppi CTF): {len(results_heur[5])}\n")
print(f"[1] Euristica Tradizionale (Solo regole sintattiche)")
print(f" NDCG@1: {np.mean(results_heur[1]):.4f}")
print(f" NDCG@3: {np.mean(results_heur[3]):.4f}")
print(f" NDCG@5: {np.mean(results_heur[5]):.4f}")
print(f" NDCG@10: {np.mean(results_heur[10]):.4f}\n")
print(f"[2] Modello ML (LightGBM + Angr Semantic Features)")
print(f" NDCG@1: {np.mean(results_ml[1]):.4f}")
print(f" NDCG@3: {np.mean(results_ml[3]):.4f}")
print(f" NDCG@5: {np.mean(results_ml[5]):.4f}")
print(f" NDCG@10: {np.mean(results_ml[10]):.4f}")
print(f"===========================================================")
if __name__ == "__main__":
main()