5.9 KiB
5.9 KiB
In [ ]:
from pathlib import Path
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
TRAIN_PATH = Path("data/nsl_kdd_train.csv")
TEST_PATH = Path("data/nsl_kdd_test.csv")
missing_files = [str(path) for path in (TRAIN_PATH, TEST_PATH) if not path.exists()]
if missing_files:
raise FileNotFoundError(
"Missing prepared NSL-KDD files: " + ", ".join(missing_files) +
". Follow data/README.md and run: python data/prepare_dataset.py"
)
TARGET_COLUMNS = ["attack_label", "attack_group", "binary_label", "difficulty"]
CATEGORICAL_FEATURES = ["protocol_type", "service", "flag"]
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScalerIn [ ]:
# TODO 1: load both splits and define feature_cols/numeric_features.
train_df = None
test_df = None
feature_cols = None
numeric_features = None
# TODO 2: create feature_families for basic, content, traffic, and host-based features.
feature_families = NoneIn [ ]:
# TODO 3: create log_src_bytes and log_dst_bytes using np.log1p.
exploratory = None
# TODO 4: calculate class medians and plot a sampled log-byte scatter chart.
byte_summary = None
sample = None
display(byte_summary)In [ ]:
# TODO 5: build supervised_preprocessor with OneHotEncoder for the three
# categorical features and median imputation for numeric features.
supervised_preprocessor = None
distance_features = [
"duration", "src_bytes", "dst_bytes", "count", "srv_count",
"serror_rate", "rerror_rate", "dst_host_count", "dst_host_srv_count",
]
# TODO 6: build distance_preprocessor with median imputation and StandardScaler.
distance_preprocessor = None
# TODO 7: fit both preprocessors on training data only and record output shapes.
supervised_shape = None
distance_shape = None
print(supervised_shape, distance_shape)In [ ]:
assert len(feature_cols) == 41
assert exploratory[["log_src_bytes", "log_dst_bytes"]].ge(0).all().all()
assert supervised_shape[0] == 100
assert supervised_shape[1] > len(feature_cols)
assert distance_shape == (100, len(distance_features))
assert all(feature in numeric_features for feature in distance_features)
print("✓ Lab 2 completed")