6.0 KiB
6.0 KiB
In [ ]:
from pathlib import Path
import numpy as np
import pandas as pd
DATA_PATH = Path("data/synthetic_security_flows.csv")
RANDOM_STATE = 42
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import precision_score, recall_score, f1_score, confusion_matrix
In [ ]:
df = pd.read_csv(DATA_PATH).drop_duplicates()
df.columns = df.columns.str.strip()
df = df.replace([np.inf, -np.inf], np.nan)
X = df.drop(columns="Label").select_dtypes(include="number")
y = df["Label"].astype(str).str.strip().str.upper().ne("BENIGN").astype(int)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=RANDOM_STATE, stratify=y
)
# TODO 1: calculate benign_count, attack_count, and imbalance_ratio
benign_count = None
attack_count = None
imbalance_ratio = None
print(f"BENIGN={benign_count}, ATTACK={attack_count}")
print(f"BENIGN-to-ATTACK ratio: {imbalance_ratio:.2f}:1")
In [ ]:
def train_and_measure(class_weight):
# TODO 2: create the imputer + Random Forest pipeline
model = None
# TODO 3: fit, predict, and return a metrics dictionary
return None
In [ ]:
# Keep the data split and all hyperparameters fixed.
# TODO 4: run the baseline with class_weight=None
baseline_metrics = None
# TODO 5: run the weighted model with class_weight="balanced"
balanced_metrics = None
# TODO 6: create comparison_df with Baseline and Balanced rows
comparison_df = None
comparison_df.round(3)
In [ ]:
# TODO 7: select the configuration with the higher attack F1 score
recommended_configuration = None
print("Recommended configuration:", recommended_configuration)
print(comparison_df.loc[recommended_configuration].round(3))
In [ ]:
assert benign_count > attack_count
assert imbalance_ratio > 1
assert list(comparison_df.index) == ["Baseline", "Balanced"]
assert {"precision", "recall", "f1", "false_positives", "false_negatives"}.issubset(comparison_df.columns)
assert comparison_df[["precision", "recall", "f1"]].apply(lambda col: col.between(0, 1).all()).all()
assert recommended_configuration in {"Baseline", "Balanced"}
print("✓ Lab 5 completed")