Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22,545 changes: 22,545 additions & 0 deletions cleaned_kdd_test.csv

Large diffs are not rendered by default.

22,545 changes: 22,545 additions & 0 deletions kdd_test.csv

Large diffs are not rendered by default.

125,974 changes: 125,974 additions & 0 deletions kdd_train.csv

Large diffs are not rendered by default.

21 changes: 21 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import pandas as pd

df = pd.read_csv("kdd_test.csv")

print("Initial Dataset:")
print(df.head())

col_to_remove = "urgent"

if col_to_remove in df.columns:
df.drop(col_to_remove, axis=1, inplace=True)
print(f"\nColumn '{col_to_remove}' removed successfully.")
else:
print(f"\nColumn '{col_to_remove}' not found in dataset.")


print("\nDataset after removing the column:")
print(df.head())

df.to_csv("cleaned_kdd_test.csv", index=False)
print("\nModified dataset saved as 'cleaned_kdd_test.csv' in the same folder.")
156 changes: 156 additions & 0 deletions mdltraining.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
import pandas as pd
import numpy as np

from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.metrics import (
accuracy_score,
confusion_matrix,
classification_report,
ConfusionMatrixDisplay
)

from sklearn.linear_model import LogisticRegression, LinearRegression, SGDClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import GaussianNB

import matplotlib.pyplot as plt
import seaborn as sns

# ===============================================
# 1. LOAD TRAIN & TEST DATA
# ===============================================
train_data = pd.read_csv("kdd_train.csv")
test_data = pd.read_csv("kdd_test.csv")

print("Train Dataset Size :", train_data.shape)
print("Test Dataset Size :", test_data.shape)

# ===============================================
# 2. CREATE BINARY TARGET LABEL
# ===============================================
train_data["is_attack"] = train_data["labels"].apply(lambda x: 0 if x == "normal" else 1)
test_data["is_attack"] = test_data["labels"].apply(lambda x: 0 if x == "normal" else 1)

cat_columns = ["protocol_type", "service", "flag"]
label_enc = LabelEncoder()

for col in cat_columns:
train_data[col] = label_enc.fit_transform(train_data[col])
test_data[col] = label_enc.transform(test_data[col])

TARGET = "is_attack"
FEATURE_COLS = [c for c in train_data.columns if c not in ["is_attack", "labels"]]

# ===============================================
# 3. SPLIT FEATURES AND TARGET
# ===============================================
X_train = train_data[FEATURE_COLS]
y_train = train_data[TARGET]

X_test = test_data[FEATURE_COLS]
y_test = test_data[TARGET]

# ===============================================
# 4. FEATURE SCALING
# ===============================================
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# ===============================================
# 5. CORRELATION HEATMAP
# ===============================================
num_data = train_data.select_dtypes(include=['number'])

plt.figure(figsize=(14, 11))
sns.heatmap(num_data.corr(), cmap="viridis", linewidths=0.3)
plt.title("Correlation Heatmap - Training Dataset")
plt.show()

# ===============================================
# 6. MODEL DEFINITIONS
# ===============================================
models = {
"Linear OLS": LinearRegression(),
"SGD Classifier": SGDClassifier(max_iter=2000, tol=1e-4, random_state=42),
"Logistic Model": LogisticRegression(max_iter=1500),
"Naive Bayes": GaussianNB(),
"Decision Tree": DecisionTreeClassifier(random_state=42),
"Random Forest": RandomForestClassifier(n_estimators=250, n_jobs=-1, random_state=42)
}

# ===============================================
# 7. TRAIN + EVALUATE ALL MODELS
# ===============================================
results = {}

for model_name, model in models.items():
print(f"\n---- Training Model: {model_name} ----")

model.fit(X_train_scaled, y_train)

if model_name == "Linear OLS":
y_cont = model.predict(X_test_scaled)
y_pred = (y_cont >= 0.5).astype(int)
else:
y_pred = model.predict(X_test_scaled)

cm = confusion_matrix(y_test, y_pred)
acc = accuracy_score(y_test, y_pred)
rep = classification_report(y_test, y_pred, output_dict=True)

print(f"Accuracy Score : {acc:.4f}")
print(f"Recall (Attack): {rep['1']['recall']:.4f}")
print("Confusion Matrix:\n", cm)

results[model_name] = {
"cm": cm,
"acc": acc,
"report": rep
}

# ===============================================
# 8. PLOT CONFUSION MATRICES
# ===============================================
rows, cols = 3, 2
fig, axes = plt.subplots(rows, cols, figsize=(15, 16))
axes = axes.flatten()

for idx, (model_name, metrics) in enumerate(results.items()):
disp = ConfusionMatrixDisplay(metrics["cm"], display_labels=["Normal", "Attack"])
disp.plot(ax=axes[idx], cmap="Blues", colorbar=False)
axes[idx].set_title(f"{model_name}\nAccuracy = {metrics['acc']:.3f}")

for i in range(idx + 1, len(axes)):
axes[i].axis("off")

plt.tight_layout()
plt.show()

# ===============================================
# 9. SAVE RESULTS TO TEXT FILE
# ===============================================
summary_file = "updated_model_results.txt"

with open(summary_file, "w") as f:
f.write("UPDATED MODEL PERFORMANCE SUMMARY\n")
f.write("=" * 65 + "\n\n")

for model_name, info in results.items():
rep = info["report"]
cm = info["cm"]

f.write(f"MODEL: {model_name}\n")
f.write("-" * 50 + "\n")
f.write(f"Accuracy : {info['acc']:.4f}\n")
f.write(f"Precision (Atk): {rep['1']['precision']:.4f}\n")
f.write(f"Recall (Atk) : {rep['1']['recall']:.4f}\n")
f.write(f"F1 Score (Atk) : {rep['1']['f1-score']:.4f}\n\n")

f.write("Confusion Matrix:\n")
f.write(f"TN = {cm[0,0]}, FP = {cm[0,1]}\n")
f.write(f"FN = {cm[1,0]}, TP = {cm[1,1]}\n")
f.write("\n" + "-" * 50 + "\n")

print(f"\nSummary file saved as → {summary_file}")
109 changes: 109 additions & 0 deletions network_attack_detection.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
# 1. IMPORTS
import pandas as pd
import numpy as np

from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from imblearn.over_sampling import SMOTE

from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from xgboost import XGBClassifier

from sklearn.metrics import accuracy_score, classification_report, confusion_matrix


# 2. LOAD DATA
df = pd.read_csv("Friday-WorkingHours-Afternoon-DDos.pcap_ISCX.csv", low_memory=False)
df.columns = df.columns.str.strip()
print("Loaded:", df.shape)


# 3. REMOVE NON-FEATURE COLUMNS
remove_list = ["Flow ID", "Timestamp", "Source IP", "Destination IP"]
df = df.drop([c for c in remove_list if c in df.columns], axis=1)


# 4. CLEAN DATA
df = df.replace([np.inf, -np.inf], np.nan)
df = df.dropna()
print("Cleaned:", df.shape)


# 5. ENCODE LABEL
enc = LabelEncoder()
df["Attack"] = enc.fit_transform(df["Label"])
df = df.drop(columns=["Label"])
print("Classes:", enc.classes_)


# 6. SPLIT FEATURES/TARGET
X = df.drop(columns=["Attack"])
y = df["Attack"]


# 7. SMOTE BALANCING
sm = SMOTE(random_state=11)
X_bal, y_bal = sm.fit_resample(X, y)
print("Balanced:", X_bal.shape)


# 8. SCALING
sc = StandardScaler()
X_norm = sc.fit_transform(X_bal)


# 9. PCA REDUCTION
pca = PCA(n_components=30, random_state=11)
X_pca = pca.fit_transform(X_norm)

X_train, X_test, y_train, y_test = train_test_split(
X_pca, y_bal, test_size=0.25, random_state=11, stratify=y_bal
)


# 10. DEFINE MODELS
models = {
"LogReg": LogisticRegression(max_iter=2000),
"DecisionTree": DecisionTreeClassifier(max_depth=20),
"RandomForest": RandomForestClassifier(n_estimators=350),
"NaiveBayes": GaussianNB(),
"SVM": SVC(kernel="rbf", gamma="scale"),
"XGBoost": XGBClassifier(
n_estimators=350,
max_depth=7,
learning_rate=0.07,
subsample=0.85,
colsample_bytree=0.85,
eval_metric="logloss"
)
}


# 11. TRAIN & EVALUATE
scores = {}

for name, clf in models.items():
print(f"\nMODEL: {name}")
clf.fit(X_train, y_train)
preds = clf.predict(X_test)

acc = accuracy_score(y_test, preds)
scores[name] = acc * 100

print("Accuracy:", round(acc * 100, 3), "%")
print(classification_report(y_test, preds))


# 12. FINAL RESULT TABLE
results = (
pd.DataFrame(scores.items(), columns=["Model", "Accuracy (%)"])
.sort_values(by="Accuracy (%)", ascending=False)
)

print("\nFINAL MODEL SCORES")
print(results)
104 changes: 104 additions & 0 deletions preprocessing.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# ================================
# KDD Dataset Preprocessing Script
# ================================

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.impute import SimpleImputer
from imblearn.over_sampling import SMOTE
from collections import Counter

# ================================
# Load Train and Test Data
# ================================
train = pd.read_csv('kdd_train.csv')
test = pd.read_csv('kdd_test.csv')

print("Train Shape:", train.shape)
print("Test Shape:", test.shape)

# ================================
# Split Features and Labels
# ================================
X_train = train.drop('labels', axis=1)
y_train = train['labels']
X_test = test.drop('labels', axis=1)
y_test = test['labels']

# ================================
# Identify Numeric and Categorical Columns
# ================================
num_cols = X_train.select_dtypes(include=['int64', 'float64']).columns
cat_cols = X_train.select_dtypes(include=['object']).columns

# ================================
# Handle Missing Values
# ================================

# For numeric columns → fill missing values with mean
num_imputer = SimpleImputer(strategy='mean')
X_train[num_cols] = num_imputer.fit_transform(X_train[num_cols])
X_test[num_cols] = num_imputer.transform(X_test[num_cols])

# For categorical columns → fill missing with 'missing'
X_train[cat_cols] = X_train[cat_cols].fillna('missing')
X_test[cat_cols] = X_test[cat_cols].fillna('missing')

# ================================
# Encode Categorical Columns
# ================================
for col in cat_cols:
le = LabelEncoder()
all_values = pd.concat([X_train[col], X_test[col]], axis=0).astype(str)
le.fit(all_values)
X_train[col] = le.transform(X_train[col].astype(str))
X_test[col] = le.transform(X_test[col].astype(str))

# ================================
# Scale Numeric Features
# ================================
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# ================================
# Handle Class Imbalance with SMOTE
# ================================
print("Class distribution before SMOTE:", Counter(y_train))

# Remove rare classes (with only 1 sample)
class_counts = y_train.value_counts()
valid_classes = class_counts[class_counts > 1].index
mask = y_train.isin(valid_classes)
X_train_filtered = X_train_scaled[mask]
y_train_filtered = y_train[mask]

# Apply SMOTE to balance dataset
smote = SMOTE(random_state=42, k_neighbors=1)
X_train_balanced, y_train_balanced = smote.fit_resample(X_train_filtered, y_train_filtered)

print("Class distribution after SMOTE:", Counter(y_train_balanced))

# ================================
# Convert Back to DataFrames
# ================================
X_train_final = pd.DataFrame(X_train_balanced)
y_train_final = pd.DataFrame(y_train_balanced, columns=['labels'])
X_test_final = pd.DataFrame(X_test_scaled)
y_test_final = pd.DataFrame(y_test, columns=['labels'])

# ================================
# Save Preprocessed Data
# ================================
X_train_final.to_csv("X_train_preprocessed.csv", index=False)
y_train_final.to_csv("y_train_preprocessed.csv", index=False)
X_test_final.to_csv("X_test_preprocessed.csv", index=False)
y_test_final.to_csv("y_test_preprocessed.csv", index=False)

print("\n Preprocessing complete!")
print("Files saved:")
print(" - X_train_preprocessed.csv")
print(" - y_train_preprocessed.csv")
print(" - X_test_preprocessed.csv")
print(" - y_test_preprocessed.csv")
Binary file added task3_output.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading