{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceType":"datasetVersion","sourceId":15892199,"datasetId":10190354,"databundleVersionId":16846622}],"dockerImageVersionId":31329,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# HỆ THỐNG PHÂN LOẠI MÃ ĐỘC ĐA LỚP - LUỒNG XGBOOST STANDALONE\n> **Người thực hiện:** Hồ Ngọc Lan Anh  \n> **Dự án:** Phân loại mã độc dựa trên dữ liệu dạng bảng (Tabular Data)\n---","metadata":{}},{"cell_type":"markdown","source":"## 1. Giới thiệu tổng quan và Mục đích (Introduction & Objectives)\n\nTrong bối cảnh mã độc ngày càng tinh vi với các kỹ thuật **đa hình (Polymorphic)** và **làm rối mã (Obfuscation)**, phương pháp nhận diện dựa trên chữ ký (Signature) truyền thống đã bộc lộ nhiều hạn chế. Luồng xử lý này tập trung xây dựng mô hình phân loại dựa trên **Học máy (Machine Learning)** tĩnh.\n\n**Mục tiêu trọng tâm:**\n* **Khai thác đặc trưng ngữ nghĩa:** Sử dụng bộ dữ liệu bảng gồm **413 đặc trưng** (Opcodes, Metadata, Sections) trích xuất từ tệp `.asm`.\n* **Xây dựng lõi thực thi phản ứng nhanh:** Huấn luyện thuật toán **XGBoost** đơn lẻ đạt hiệu suất tối ưu để làm \"tiêu chuẩn vàng\" (Baseline) cho hệ thống.\n* **Xử lý mất cân bằng lớp cực đoan:** Áp dụng chiến lược trọng số để bảo vệ độ nhạy (Recall) cho các lớp hiếm như **Simda**.\n* **Tối ưu hóa thực tiễn:** Đảm bảo mô hình đạt tiêu chuẩn: **Siêu nhanh - Siêu nhẹ - Độ tin cậy cao**.","metadata":{}},{"cell_type":"markdown","source":"## 2. Khởi tạo môi trường và Thư viện (Environment Setup)\n\nKhối này thực hiện nạp các công cụ xử lý dữ liệu và thuật toán:\n* `xgboost`: Thuật toán Gradient Boosting lõi.\n* `pandas/numpy`: Xử lý cấu trúc dữ liệu bảng.\n* `optuna`: Phục vụ các thực nghiệm tối ưu hóa siêu tham số nâng cao.\n* `sklearn.metrics`: Đánh giá Log Loss, F1-Score và Confusion Matrix.","metadata":{}},{"cell_type":"code","source":"# ==========================================\n# KHỞI TẠO MÔI TRƯỜNG & NẠP DỮ LIỆU\n# ==========================================\nimport pandas as pd\nimport numpy as np\nimport time\nimport os\nfrom xgboost import XGBClassifier\nfrom sklearn.utils.class_weight import compute_sample_weight\nfrom sklearn.metrics import log_loss, f1_score, accuracy_score, classification_report, confusion_matrix\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\ntrain_path, val_path, test_path = \"train.csv\", \"val.csv\", \"test.csv\"\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        if 'train.csv' in filename: train_path = os.path.join(dirname, filename)\n        if 'val.csv' in filename: val_path = os.path.join(dirname, filename)\n        if 'test.csv' in filename: test_path = os.path.join(dirname, filename)\n\ntrain_df = pd.read_csv(train_path)\nval_df = pd.read_csv(val_path)\ntest_df = pd.read_csv(test_path)\n\nprint(f\" -> Train: {train_df.shape[0]} mẫu\")\nprint(f\" -> Val  : {val_df.shape[0]} mẫu\")\nprint(f\" -> Test : {test_df.shape[0]} mẫu\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-07-19T22:43:48.418551Z","iopub.execute_input":"2026-07-19T22:43:48.418966Z","iopub.status.idle":"2026-07-19T22:43:48.795450Z","shell.execute_reply.started":"2026-07-19T22:43:48.418936Z","shell.execute_reply":"2026-07-19T22:43:48.794601Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 3. Nạp tập dữ liệu đặc trưng (Data Loading)\n\nDữ liệu được trích xuất từ tập dữ liệu khổng lồ (0.5 TB) của Microsoft. Chúng ta sử dụng phiên bản đã được tiền xử lý thành các tệp CSV, chia thành 3 tập độc lập:\n1. **Train:** Huấn luyện mô hình.\n2. **Val:** Tinh chỉnh và kiểm soát Overfitting.\n3. **Test:** Nghiệm thu kết quả cuối cùng.","metadata":{}},{"cell_type":"code","source":"# ==========================================\n# TRÍCH XUẤT ĐẶC TRƯNG VÀ NHÃN\n# ==========================================\nprint(\"[2] Đang tách ma trận tính toán...\")\n\n# Tập Huấn luyện (Train)\nX_train = train_df.drop(['ID', 'Class'], axis=1)\ny_train = train_df['Class'] - 1 \n\n# Tập Kiểm định (Validation)\nX_val = val_df.drop(['ID', 'Class'], axis=1)\ny_val = val_df['Class'] - 1\n\n# Tập Kiểm thử nội bộ (Test)\nX_test = test_df.drop(['ID', 'Class'], axis=1)\ny_test = test_df['Class'] - 1\n\nprint(f\" -> Dữ liệu sẵn sàng! Cấu trúc ma trận X_train: {X_train.shape}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-19T22:43:48.796854Z","iopub.execute_input":"2026-07-19T22:43:48.797155Z","iopub.status.idle":"2026-07-19T22:43:48.825095Z","shell.execute_reply.started":"2026-07-19T22:43:48.797130Z","shell.execute_reply":"2026-07-19T22:43:48.824297Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 4. Phân tích thống kê và Mất cân bằng lớp (EDA)\n\nThực hiện rà soát mật độ mẫu của 9 họ mã độc:\n* **Lớp đa số:** Class 3 (Kelihos_v3) chiếm ưu thế tuyệt đối (~27%).\n* **Thách thức (Class Imbalance):** Class 5 (Simda) chỉ có **42 mẫu** ($< 0.5\\%$).\n* **Hệ quả:** Nếu không xử lý, mô hình sẽ bị \"mù\" lớp hiếm, gây ra rủi ro bảo mật cực lớn khi bỏ lọt các dòng mã độc ít gặp.","metadata":{}},{"cell_type":"code","source":"# ==========================================\n# THIẾT LẬP CẤU HÌNH & TRỌNG SỐ\n# ==========================================\n# 1. Tính toán trọng số cân bằng lớp\nsample_weights = compute_sample_weight(class_weight='balanced', y=y_train)\n\n# 2. Khai báo kiến trúc XGBoost cho 413 tính năng\nmodel = XGBClassifier(\n    n_estimators=1000, \n    learning_rate=0.05, \n    max_depth=5, \n    subsample=0.8, \n    \n    colsample_bytree=0.3,  \n    reg_alpha=1.5,         \n    reg_lambda=2.0,        \n    \n    # Thiết lập phần cứng và giám sát\n    tree_method='hist', \n    device='cuda',         \n    objective='multi:softprob', \n    num_class=9, \n    random_state=42,\n    early_stopping_rounds=50\n)\nprint(\" -> Cấu hình XGBoost đã được nạp vào bộ nhớ.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-19T22:43:48.826078Z","iopub.execute_input":"2026-07-19T22:43:48.826386Z","iopub.status.idle":"2026-07-19T22:43:48.841920Z","shell.execute_reply.started":"2026-07-19T22:43:48.826363Z","shell.execute_reply":"2026-07-19T22:43:48.841106Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 5. Huấn luyện mô hình XGBoost (Baseline Configuration)\n\nThiết lập kiến trúc Gradient Boosting đa tầng với cơ chế **Điều chuẩn (Regularization L1/L2)** tích hợp sẵn. Tại đây, chúng ta tập trung vào việc tận dụng ranh giới phân tách sắc bén của 413 đặc trưng tĩnh để nhận diện bản chất hành vi mã độc.","metadata":{}},{"cell_type":"code","source":"# ==========================================\n# THỰC THI HUẤN LUYỆN (TRAINING)\n# ==========================================\nprint(\"\\n[4] Tiến trình Training bắt đầu (Kích hoạt GPU)...\")\nstart_train = time.time()\n\n# Tiến hành fit dữ liệu\nmodel.fit(\n    X_train, y_train,\n    sample_weight=sample_weights,\n    eval_set=[(X_train, y_train), (X_val, y_val)],\n    verbose=100  # Log tiến độ sau mỗi 100 cây\n)\n\ntrain_time = time.time() - start_train\nprint(f\"\\n[OK] Quá trình học kết thúc sau {train_time:.2f} giây.\")\nprint(f\"-> Điểm neo tối ưu được chốt ở cây quyết định số: {model.best_iteration}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-19T22:43:48.843467Z","iopub.execute_input":"2026-07-19T22:43:48.843805Z","iopub.status.idle":"2026-07-19T22:44:01.280904Z","shell.execute_reply.started":"2026-07-19T22:43:48.843775Z","shell.execute_reply":"2026-07-19T22:44:01.280093Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ==========================================\n# DỰ ĐOÁN & XUẤT BÁO CÁO (INFERENCE)\n# ==========================================\nprint(\"\\n[5] Bắt đầu quá trình Nghiệm thu trên tập Test nội bộ...\")\n\nmodel.set_params(device='cpu') \n\nstart_test = time.time()\ny_pred = model.predict(X_test)\ny_prob = model.predict_proba(X_test)\ninference_time = time.time() - start_test\n\n# Tính toán các metric\nmacro_f1 = f1_score(y_test, y_pred, average='macro')\nloss = log_loss(y_test, y_prob)\nacc = accuracy_score(y_test, y_pred)\n\nprint(\"=\"*50)\nprint(\"BÁO CÁO NGHIỆM THU - DỮ LIỆU 413 ĐẶC TRƯNG\")\nprint(\"=\"*50)\nprint(f\" Tốc độ quét AI : {inference_time:.4f} s\")\nprint(f\" Macro F1-Score : {macro_f1:.4f}\")\nprint(f\" Log Loss       : {loss:.4f}\")\nprint(f\" Accuracy       : {acc:.4f}\\n\")\n\n# BÁO CÁO CHI TIẾT TỪNG LỚP\ntarget_names = [f'Class {i}' for i in range(1, 10)]\nprint(\" BẢNG PHÂN TÍCH CHUYÊN SÂU TỪNG MÃ ĐỘC:\")\nprint(classification_report(y_test, y_pred, target_names=target_names))\n\n# VẼ MA TRẬN NHẦM LẪN (CONFUSION MATRIX)\ncm = confusion_matrix(y_test, y_pred)\nplt.figure(figsize=(10, 8))\nsns.heatmap(cm, annot=True, fmt='d', cmap='Blues', \n            xticklabels=target_names, yticklabels=target_names)\nplt.title('MA TRẬN NHẦM LẪN - ĐÁNH GIÁ NỘI BỘ', fontsize=14, pad=15)\nplt.ylabel('Thực tế (Ground Truth)', fontsize=12)\nplt.xlabel('Dự đoán (Prediction)', fontsize=12)\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-19T22:44:01.281924Z","iopub.execute_input":"2026-07-19T22:44:01.282329Z","iopub.status.idle":"2026-07-19T22:44:01.876861Z","shell.execute_reply.started":"2026-07-19T22:44:01.282295Z","shell.execute_reply":"2026-07-19T22:44:01.876037Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"\\n Đang nạp file Test của Ban tổ chức...\")\ntest_path = '/kaggle/input/notebooks/hnlanh/test-data-feature-malware-classification/REAL_TEST_FEATURES_KAGGLE.csv'\nreal_test_df = pd.read_csv(test_path)\n\ntest_ids = real_test_df['ID']\nX_kaggle = real_test_df.drop(['ID'], axis=1)\n\nif X_kaggle.shape[1] != X_train.shape[1]:\n    raise ValueError(f\"LỖI: Tập Train có {X_train.shape[1]} cột, nhưng tập Test lại có {X_kaggle.shape[1]} cột.\")\nelse:\n    print(f\"Kích thước chuẩn xác: {X_kaggle.shape[1]} đặc trưng.\")\n\nmodel.set_params(device='cpu') \nstart_infer = time.time()\n\ny_prob_submit = model.predict_proba(X_kaggle)\n\n# 4. SUBMISSION FORMAT CHUẨN\nprint(\"\\nLên khuôn định dạng Submission Kaggle...\")\n\nsubmission_df = pd.DataFrame({'Id': test_ids})\nfor i in range(1, 10):\n    submission_df[f'Prediction{i}'] = y_prob_submit[:, i-1]\n\nsubmit_name = \"XGBoost_413_Final_Submit.csv\"\nsubmission_df.to_csv(submit_name, index=False)\n\nprint(\"=\"*60)\nprint(f\"XUẤT XƯỞNG THÀNH CÔNG! File nộp bài: {submit_name}\")\nprint(\"=\"*60)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-19T23:02:06.946356Z","iopub.execute_input":"2026-07-19T23:02:06.946799Z","iopub.status.idle":"2026-07-19T23:02:07.834980Z","shell.execute_reply.started":"2026-07-19T23:02:06.946768Z","shell.execute_reply":"2026-07-19T23:02:07.834393Z"}},"outputs":[],"execution_count":null}]}