# 什麼是NSL-KDD?
## 原始KDD資料集的問題
1.數據不平衡:
* 某些類別(例如 normal 和 neptune 攻擊)佔據了絕大部分記錄,而其他類別(如 U2R 和 R2L 攻擊)數量極少。
* 導致模型容易傾向於常見類別,忽略稀有類別。
2. 冗餘樣本:
* 許多樣本之間幾乎完全相同,對分類器的學習幾乎沒有貢獻,但增加了計算成本。
3.模型性能評估不準確:
* 由於大量重複和容易分類的樣本,分類器在測試集上的表現過於「樂觀」。
* 很難準確比較不同機器學習模型的優劣。
關於NSL99可以查看
“M. Tavallaee, E. Bagheri, W. Lu, and A. Ghorbani, “**A Detailed Analysis of the KDD CUP 99 Data Set,**” Submitted to Second IEEE Symposium on Computational Intelligence for Security and Defense Applications (CISDA), 2009.”
## NSL-KDD
NSL-KDD數據集是在KDD Cup 1999(KDD99)數據集的基礎上進行精練和優化而構建的,主要解決原始數據中存在的冗餘紀錄和類別不平衡的問題
* 它不包括train 集中的冗餘記錄,因此分類器不會偏向於更頻繁的記錄。
* 建議的測試集中沒有重複記錄;因此,學習者的表現不會受到對頻繁記錄具有更高檢出率的方法的影響。
* 從每個 difficultylevel 組中選定的記錄數與原始 KDD 數據集中的記錄百分比成反比。因此,不同機器學習方法的分類率差異範圍更大,這使得準確評估不同的學習技術更加高效。
* train 集和測試集中的記錄數是合理的,這使得在整個集上運行 Experiments 的成本很高,而無需隨機選擇一小部分。因此,不同研究工作的評價結果將是一致和可比的。
### Difficulty Level 是什麼?
為了解決KDD Cup 1999的問題,NSL-KDD 資料集 引入了 Difficulty Level,其目的是衡量每條記錄對機器學習分類器的「分類難度」。這是通過以下方法實現的:
#### 1. 定義 Difficulty Level
Difficulty Level 是由一個基準分類器(如決策樹)對資料進行分類時,根據以下條件計算的:
* 記錄是否被正確分類。
* 該記錄需要多少層分支(或計算量)才能正確分類。
#### 2. 具體步驟
1. 使用基準分類器(例如決策樹或簡單的機器學習模型)對資料進行分類:
* 每條記錄的分類結果會被記錄下來。
2. 根據分類器的行為,為每條記錄分配一個難度等級:
* 容易分類的樣本:被分類器輕鬆正確分類,難度等級低。
* 難分類的樣本:需要複雜的規則或被錯誤分類,難度等級高。
3. 將樣本按 Difficulty Level 分組,並對每組進行抽樣,確保難分類樣本被保留更多比例。
4. 對每條記錄分配一個 Difficulty Level:
* 通常以數字表示(如 1, 2, 3 等),或與標籤(label)配合使用。
* 這些等級用於後續的資料抽樣和保留策略。
### NSL-KDD 為什麼有 Difficulty Level
NSL-KDD 的設計者引入 Difficulty Level 是為了解決原始 KDD Cup 1999 資料集的缺陷:
1. 提升分類器區分能力的評估準確性:
* Difficulty Level 幫助強調困難樣本在資料集中的重要性。
* 它是根據基準分類器(例如決策樹)預測正確與否,以及分類難度的評估來計算的。
1. 減少冗餘數據:
* 過於簡單且冗餘的樣本被移除,而高難度樣本被保留更多。
1. 適配多樣化的機器學習方法:
* 引入 Difficulty Level 可以讓分類器的性能差異更加明顯,從而更有效地評估不同算法。
### 為什麼 ARFF 檔案沒有 Difficulty Level
ARFF 格式 的目的是為機器學習工具(例如 Weka)準備數據,並簡化模型訓練和測試的過程。因此:
1. ARFF 文件僅保留必要特徵和標籤:
* 它的格式設計目的是清晰和簡潔。
* Difficulty Level 被視為輔助信息,而非模型所需的主要特徵,通常被排除。
1. Weka 和 ARFF 的特徵結構要求:
* 在 ARFF 文件中,所有特徵應該是直接相關的數據特徵,而不是元數據(如 Difficulty Level)。
### 為什麼 TXT 文件有 Difficulty Level
TXT 文件 的格式設計通常包含更廣泛的輔助信息,因為它的使用場景更加靈活:
1. 輔助分析:
* TXT 文件中的 Difficulty Level 可供研究者進行進一步分析,例如檢查特定難度樣本的分類效果。
1. 來源數據的完整性:
* TXT 文件可能包含額外的列,例如 Difficulty Level,是用於標記樣本的分類難度等級。
1. 保留原始數據設計的透明性:
* 在某些情況下,研究者需要完整的數據資訊,包括 Difficulty Level。
### 小結
* ARFF 文件沒有 Difficulty Level 是因為它專為簡潔、高效的機器學習建模設計。
* TXT 文件保留 Difficulty Level,是為了輔助分析和數據集設計的透明性。
* 如果需要將兩者結合,可以通過數據處理工具(如 Pandas)進行合併和轉換。
---
NSL-KDD的資料集
* KDDTrain+.ARFF
完整的 NSL-KDD 訓練集,帶有 ARFF 格式的二進位標籤
* KDDTrain+.TXT
完整的NSL-KDD 訓練集,包括 CSV 格式的攻擊類型標籤和難度級別
* KDDTrain+_20Percent.ARFF
KDDTrain+.arff 檔的 20% 子集
* KDDTrain+_20Percent.TXT
KDDTrain+.txt 檔的 20% 子集
* KDDTest+.ARFF
完整的 NSL-KDD 測試集,帶有 ARFF 格式的二進位標籤
* KDDTest+.TXT
完整的NSL-KDD測試集,包括 CSV 格式的攻擊類型標籤和難度級別
* KDDTest-21.ARFF
KDDTest+.arff 檔的子集,其中不包括難度級別為 21 的紀錄
* KDDTest-21.TXT
KDDTest+.txt 檔的子集,其中不包含難度級別為 21 的記錄
---
Train

Test

這兩張圖代表著
* 每條記錄都被多個學習器(learners)進行分類。
* 如果一條記錄被所有 21 個學習器(7 種不同的算法,各訓練 3 次)正確分類,則其 #successfulPrediction 值為 21,代表這條記錄非常容易分類。
* 如果一條記錄僅被少數學習器正確分類,則其 #successfulPrediction 值較低,代表這條記錄分類難度較高。
* 訓練集:
* 約 98% 的記錄 被所有 21 個學習器正確分類(#successfulPrediction = 21)。
* 圖表中顯示,大多數記錄的難度等級為 21,只有少量記錄屬於難分類的範圍(例如,#successfulPrediction 在 0-20 之間)。
* 測試集:
* 約 86% 的記錄 被所有學習器正確分類。
* 測試集中較多的記錄屬於中等或高難度分類範圍,難分類的記錄比訓練集更多。
### 資料集內容
##### KDDTest+.arff
```
0,tcp,private,REJ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,10,0.00,0.00,1.00,1.00,0.04,0.06,0.00,255,10,0.04,0.06,0.00,0.00,0.00,0.00,1.00,1.00,anomaly
```
| 項目 | 內容 ||
|------|---------|-|
| 1-9 | TCP連接的基本特徵|0,tcp,private,REJ,0,0,0,0,0|
| 10-22| TCP連接的內容特徵|0,0,0,0,0,0,0,0,0,0,0,0,0|
| 23-31| 基於時間的網路流量統計特徵|229,10,0.00,0.00,1.00,1.00,0.04,0.06,0.00|
| 32-41| 基於主機的網路流量統計特徵|255,10,0.04,0.06,0.00,0.00,0.00,0.00,1.00,1.00|
### TCP連接的基本特徵
| 特徵名稱 | 描述 | 類型 |
|----------------------|------------------------------------------------------------------------------------------|--------|
| duration | 連線持續時間(秒) | 連續型 |
| protocol_type | 協議類型(例如:tcp、udp、icmp) | 離散型 |
| service | 目標端的網路服務(例如:http、telnet) | 離散型 |
| flag | 連線狀態標誌(例如:SF、REJ) | 離散型 |
| src_bytes | 從源主機到目的主機的資料位元組數 | 連續型 |
| dst_bytes | 從目的主機到源主機的資料位元組數 | 連續型 |
| land | 若連線來自/到相同的主機/埠則為 1,否則為 0 | 離散型 |
| wrong_fragment | 錯誤片段的數量 | 連續型 |
| urgent | 加急封包的數量 | 連續型 |
### TCP連接的內容特徵
| 特徵名稱 | 描述 | 類型 |
|----------------------|------------------------------------------------------------------------------------------|--------|
| hot | 訪問系統敏感檔案和目錄的次數 | 連續型 |
| num_failed_logins | 登入嘗試失敗的次數 | 連續型 |
| logged_in | 若成功登入則為 1,否則為 0 | 離散型 |
| num_compromised | 被入侵狀態的次數 | 連續型 |
| root_shell | 若獲取 root shell 則為 1,否則為 0 | 離散型 |
| su_attempted | 若嘗試過 'su root' 命令則為 1,否則為 0 | 離散型 |
| num_root | 以 root 身份進行的操作次數 | 連續型 |
| num_file_creations | 檔案建立操作的次數 | 連續型 |
| num_shells | 獲取 shell 的次數 | 連續型 |
| num_access_files | 訪問控制檔案的操作次數 | 連續型 |
| num_outbound_cmds | 在 FTP 會話中執行的外部指令數量(在此資料集中,此特徵的值皆為 0) | 連續型 |
| is_host_login | 若登入屬於 'hot' 清單則為 1,否則為 0(如超級使用者或管理員登入) | 離散型 |
| is_guest_login | 若為 guest 登入則為 1,否則為 0 | 離散型 |
### 基於時間的網路流量統計特徵
| 特徵名稱 | 描述 | 類型 |
|----------------------|------------------------------------------------------------------------------------------|--------|
| count | 過去兩秒內與當前連線具有相同目標主機的連線數 | 連續型 |
| srv_count | 過去兩秒內與當前連線具有相同服務的連線數 | 連續型 |
| serror_rate | 在過去兩秒內的連線中,出現 SYN 錯誤的比例 | 連續型 |
| srv_serror_rate | 在過去兩秒內與相同服務的連線中,出現 SYN 錯誤的比例 | 連續型 |
| rerror_rate | 在過去兩秒內的連線中,出現 RST 錯誤的比例 | 連續型 |
| srv_rerror_rate | 在過去兩秒內與相同服務的連線中,出現 RST 錯誤的比例 | 連續型 |
| same_srv_rate | 在過去兩秒內的連線中,與相同服務的連線比例 | 連續型 |
| diff_srv_rate | 在過去兩秒內的連線中,與不同服務的連線比例 | 連續型 |
| srv_diff_host_rate | 在過去兩秒內與相同服務的連線中,與不同主機的連線比例 | 連續型 |
* count、serror_rate、rerror_rate、same_srv_rate、diff_srv_rate 這五個特徵屬於 same host 特徵,其前提是與當前連線具有相同目標主機的連線。
* 而 srv_count、srv_serror_rate、srv_rerror_rate、srv_diff_host_rate 這四個特徵屬於 same service 特徵,其前提是與當前連線具有相同服務的連線。
##### 1. Same Host
* 定義:
* 描述的是與當前連接的 目標主機(Target Host) 有關的特徵。
* 前提條件:
* 這些特徵只考慮與當前連接擁有相同目標主機(dst_host)的連接。
* 應用:
* 幫助判斷特定主機是否可能成為攻擊目標。
* 偵測針對單一主機的攻擊行為,例如 DoS(拒絕服務攻擊)。
* 特徵:
* count:過去兩秒內與當前連接具有相同目標主機的連接數。
* serror_rate:這些連接中出現 SYN 錯誤的比例。
* rerror_rate:這些連接中出現 RST 錯誤的比例。
* same_srv_rate:這些連接中與當前連接具有相同服務的比例。
* diff_srv_rate:這些連接中與當前連接具有不同服務的比例。
##### 2. Same Service
* 定義:
* 描述的是與當前連接的 目標服務(Target Service) 有關的特徵。
* 前提條件:
* 這些特徵只考慮與當前連接擁有相同服務(service)的連接。
* 應用:
* 幫助判斷特定服務是否可能成為攻擊目標。
* 偵測針對某一類服務(如 HTTP、FTP)的攻擊,例如暴力破解密碼。
* 特徵:
* srv_count:過去兩秒內與當前連接具有相同服務的連接數。
* srv_serror_rate:這些連接中出現 SYN 錯誤的比例。
* srv_rerror_rate:這些連接中出現 RST 錯誤的比例。
* srv_diff_host_rate:這些連接中與當前連接具有相同服務但不同主機的比例。
### 基於主機的網路流量統計特徵
| 特徵名稱 | 描述 | 類型 |
|----------------------|------------------------------------------------------------------------------------------|--------|
| dst_host_count | 當前連線的目的主機在過去兩秒內的連線數 | 連續型 |
| dst_host_srv_count | 當前連線的目的主機在過去兩秒內與相同服務的連線數 | 連續型 |
| dst_host_same_srv_rate | 當前連線的目的主機在過去兩秒內,與相同服務的連線比例 | 連續型 |
| dst_host_diff_srv_rate | 當前連線的目的主機在過去兩秒內,與不同服務的連線比例 | 連續型 |
| dst_host_same_src_port_rate | 當前連線的目的主機在過去兩秒內,與相同源埠的連線比例 | 連續型 |
| dst_host_srv_diff_host_rate | 當前連線的目的主機在過去兩秒內,與相同服務但不同主機的連線比例 | 連續型 |
| dst_host_serror_rate | 當前連線的目的主機在過去兩秒內,出現 SYN 錯誤的比例 | 連續型 |
| dst_host_srv_serror_rate | 當前連線的目的主機在過去兩秒內,與相同服務的連線中,出現 SYN 錯誤的比例 | 連續型 |
| dst_host_rerror_rate | 當前連線的目的主機在過去兩秒內,出現 RST 錯誤的比例 | 連續型 |
| dst_host_srv_rerror_rate | 當前連線的目的主機在過去兩秒內,與相同服務的連線中,出現 RST 錯誤的比例 | 連續型 |
| label | 連線的標籤(正常或攻擊類型) | 離散型 |
---
## 參考資料
* [KDD99数据集的特征(Features)介绍](https://monrain.github.io/2021/01/17/KDD99数据集的特征(Features)介绍/)
* [KDD99数据集与NSL-KDD数据集介绍](https://mathpretty.com/10244.html)
* [KDD Cup 1999 Data](http://kdd.ics.uci.edu/databases/kddcup99/kddcup99.html)
* [NSL-KDD Kaggle](https://www.kaggle.com/datasets/hassan06/nslkdd)
* [A Detailed Analysis on NSL-KDD Dataset using various Machine Learning Techniques for Intrusion Detection](https://turcomat.org/index.php/turkbilmat/article/view/6333)