---
# System prepended metadata

title: '20241015'

---

# 20241015
## 開會紀錄
* 也有可能是2018,2019的資料特徵與2017資料特徵差異較大，因此看起來有點像overfitting
* 在攻擊時，靶機應該要做瀏覽網頁之類的正常操作
* 稍微簡化一下目錄
* 說明一下我們有自動化，手動是為了讓評審更清楚
* portscan不用重複執行
* 22port 可以做ssh暴力破解攻擊密碼自動帶入
* watch 可以定時執行
## 針對開會紀錄做調整
* 將攻擊改為使用 ssh 
    * [參考此網址](https://medium.com/@niman.ransindu/brute-forcing-ssh-on-metasploitable-2-using-metasploit-bd94baa2d1cb)
* 在虛擬機寫自動化腳本，能夠每三分鐘擷取封包並回傳本機
* 本機不斷偵測資料夾是否有pcap，有的話轉成csv並丟進模型偵測
# 20241008
* `scp:sudo scp portscan_00001_20241008213251.pcap user@192.168.126.1:/C:/Users/user/Desktop/special/CapturePacket`
* `wireshark:sudo tshark -i ens33 -w /portscan.pcap -b filesize:1000000 -a duration:30`
* 可用攻擊
* > `auxiliary/scanner/portscan/tcp `

## 可能被的問題
* 為什麼只用新label 資料？
    > * 我們可以拿到資料集的時候代表攻擊手法已經迭代了至少一輪，所以舊的攻擊資料就比較不需要看了
* albert 是怎麼做到比 bert 更好的
    > * 將嵌入矩陣拆分為兩個較小的矩陣。
    > * 使用重複層在群組之間進行分割。
* albert的pretrain資料都是日常說話的內容，可能沒辦法做特徵的訓練
    > * ![image](https://hackmd.io/_uploads/S1sfnc8J1g.png)
* 每次訓練放進去的資料(2017 18 19)量不太一樣，可能造成過度強化某年的資料& 特徵
    > * 我們每個惡意攻擊都有設上限資料，所以不會有一個攻擊資料量特別大。另外冷門攻擊會較難偵測，這個可以做為專題的延伸去進行。
* 把特徵做成字串給模型訓練，真的能夠辨識出來嗎
    > * 這個問題比較難驗證，所以我們的方式是看實驗數據。用同一包資料集測試f1 score可以達到0.99，用metaspliot打出資料集裡面包含的攻擊流量也可以偵測出來
* 如果是偵測外對內，應該要在伺服器偵測，不是個人電腦
    > * 我們是放在個人電腦，並且內到外、外到內的流量都會擷取
* 跟EDR的差別
    > * EDR主要 focus 在關注設備上的檔案、註冊表、程序，監控端點有無被攻擊行為並提供回應
    > * IDS 是主要 focus 網路流量，也不局限於只能看某一台端點
* 個人的防火橋怎麼封包偵測
    > * 我們是在個人電腦上抓取封包，並將封包丟回server檢測
* 不能判斷加密流量？why不做？要怎麼做？
   > * 成本考量、安全和隱私考量
* 會不會同樣資料每次偵測出來不一樣
   > * 理論上相同資料都可以獲得一樣的成果，經過我們的實驗也是如此
* 模型放在client端可能會被升級壞
   > * 模型放在server，client只抓流量所以不會有問題
* 那些攻擊有效？其他攻擊不能？
    > * 訓練集有出現過的攻擊，都可以分辨出來，尤其是大眾攻擊，冷門攻擊會較難分辨。並且有些沒看過的攻擊，他還是可以分辨出來，可能某個特徵大到特別誇張，但她沒看過這個攻擊，他還是會偵測出來。
* 為什麼不直接偵測出是哪種攻擊？
    > * 由於要偵測是哪種攻擊的話需要的訓練量及資料量都會更加龐大，基於效率的顧慮才沒有做攻擊的分類 
* best_model 偵測沒看過的流量 f1 score 極差，這樣是不是代表 overfitting 了 
    > * 攻擊日新月異，部分特徵變化可能比較大，有些流量沒辦法偵測是正常，所以我們會使用增量學習來更新server的模型，讓使用者回傳封包的時候盡可能使用最新的模型
    > 2017, 2018 特徵跟 2019 的特徵差距較大，所以 best_model 對 2019 辨識度會較差
* 收到 alert 然後?會提供更多線索解決問題嗎？
    > * 我們模型的目的就是為了及時偵測，讓管理者可以動態調整應對攻擊行為，並非主動封鎖或是阻擋流量
* 貢獻、跟一般模型不一樣的點、困難的地方
    > * cicflowmeter 環境問題、缺少真實惡意流量實測模型
* 模型是根據封包中的什麼特徵判斷惡意流量
    > * 每個攻擊的判斷標準不一樣，例如：
    > FTP-Patator、SSH-Patator，在 Init Win Fwd Bytes 特徵中會較大
    > DDoS、DoS Hulk、DoS GoldenEye：Bwd Packet Length Std
    > ![image](https://hackmd.io/_uploads/H1TNWpD-Jx.png)
* 如果搶票平台使用此模型，一次湧入大量流量會不會被誤判成DDOS?
    > * 可能會，因為都有可能會造成 Bwd Packet Length Std 過大，可能的辦法可以設定某時段降低告警的基準，讓模型在該時段允許大量流量進入。也可以分析封包頻率，搶票行為可能在某段時間內急劇增加但短暫，且較有規律；攻擊通常會隨機且大範圍分散，且較無規律。
# 專題
# 20241001 + 1 開會後
* 重新生成好壞平衡資料集

| Bad:Good = 3242:4000的資料集_3(2017 - 2019) | Best_model | Retrained_model | model_2017_to_2019 |
| ------------------------------------------- | ---------- | --------------- | ------------------ |
| tp                                          | 397        | 2668            | 2243               |
| tn                                          | 3979       | 1936            | 3955               |
| fn                                          | 2844       | 573             | 998                |
| fp                                          | 21         | 2064            | 45                 |
| f1                                          | 0.7353     | 0.669           | 0.811              |
> retrain model沒辦法達到直接訓練三年資料的效果

| Bad:Good = 4000:4000的資料集_4(2017 - 2019) | Best_model | Retrained_model | model_2017_to_2019 |
| ------------------------------------------- | ---------- | --------------- | ------------------ |
| tp                                          | 95         | 3880            | 2155               |
| tn                                          | 3975       | 1915            | 3950               |
| fn                                          | 3905       | 120             | 1845               |
| fp                                          | 25         | 2085            | 50                 |
| f1                                          | 0.046      | 0.778           | 0.695              |

> * 下次要check retrain model和model 2017 to 2019的訓練資料好壞分布是否一樣
> * 猜測是retrain model太多壞得導致她會無腦猜壞(如果兩個訓練資料分布不一樣則成立)
> * 
## 調整部分f1 score的數值
* 因為原本錯把tp tn搞混
* 調整過後

| each_1 | Retrained_model | model_2017_to_2019 |
| ------ | --------------- | ------------------ |
| f1     | 0.9077          | 0.6786             |
> each_1資料集不平衡，造成其實f1失準


# 20241001 開會
* 好壞各半的資料集拿來estimation
    * 但沒有辦法反映出真實世界好流量比較多

## 指標
* f1
    * 目標抓惡意：抓到的應該是true positive，看在意的是什麼東西
* roc
## 驗證過擬合
* kfold
* 拿2017去驗證2018 2019的資料
    * 理論上2017的模型也要可以理解2018 2019的東西
## 結論
* 可能只有2017的模型
    * 如果用平衡資料測試，表現是ok的，可以放在專題裡面呈現
* 有系統UI可用
* demo
    * 伯耀學長
    * 架三台vmware，vnet，Metasploit，
    * 
* hyper parameter
    ```py
    def PrepareModel():
        Args = ClassificationArgs(
            overwrite_output_dir = True, 
            num_train_epochs=1, 
            train_batch_size=128, 
            evaluate_during_training=False, 
            logging_steps=10,
            fp16=True,
            wandb_project="Use GPU"
        )

        model = ClassificationModel(
                    "albert", 
                    "albert-base-v2",
                    use_cuda=True,
                    cuda_device=0,
                    args= Args
        )
        return(Args, model)
    ```
* wandb疊圖：trainning lost
    * 每次model
    * 看有沒有過擬合


# 20240928
| <font color="#FF0000">2017-2019 model</font> | 2017_1 | 2017_2 | 2018_1 | 2018_2 | 2019_1 | 2019_2 | each_1 | each_2 |
| -------------------------------------------- | ------ | ------ | ------ | ------ | ------ | ------ | ------ | ------ |
| number of bad data                           | 9849   | 2268   | 52093  | 2687   | 927613 | 2400   | 530559 | 6119   |
| number of total data                         | 25824  | 2721   | 143300 | 3224   | 984476 | 2880   | 725355 | 7342   |
| ==                                           |        |        |        |        |        |        |        |        |
| tp                                           | 3594   | 516    | 37225  | 1440   | 472226 | 1217   | 273788 | 3312   |
| tn                                           | 15051  | 422    | 89994  | 531    | 55204  | 466    | 192273 | 1205   |
| fn                                           | 6255   | 1752   | 14868  | 1247   | 455387 | 1183   | 256771 | 2807   |
| fp                                           | 924    | 31     | 1213   | 6      | 1659   | 14     | 2523   | 18     |
| ==                                           |        |        |        |        |        |        |        |        |
| f1 score         #                           | 0.8074 | 0.3213 | 0.9180 | 0.4587 | 0.1946 | 0.4378 | #0.6786 | 0.4604 |
| mcc              #                           | 0.3926 | 0.1479 | 0.7614 | 0.393  | 0.2241 | 0.36   | 0.4591 | 0.3941 |
| accuracy          #                          | 0.722  | 0.345  | 0.8878 | 0.7244 | 0.5357 | 0.584  | 0.643  | 0.615  |

| <font color="#FF0000">best model</font> | 2017_1 | 2017_2 | 2018_1 | 2018_2 | 2019_1 | 2019_2 | each_1 | each_2 |
| --------------------------------------- | ------ | ------ | ------ | ------ | ------ | ------ | ------ | ------ |
| number of bad data                      | 9849   | 2268   | 52093  | 2687   | 927613 | 2400   | 530559 | 6119   |
| number of total data                    | 25824  | 2721   | 143300 | 3224   | 984476 | 2880   | 725355 | 7342   |
| ==                                      |        |        |        |        |        |        |        |        |
| tp                                      | 9810   | 2122   | 9316   | 486    | 726    | 14     | 7715   | 1172   |
| tn                                      | 15933  | 450    | 90802  | 533    | 56661  | 479    | 193887 | 1218   |
| fn                                      | 39     | 146    | 42777  | 2201   | 926887 | 2386   | 522844 | 4947   |
| fp                                      | 42     | 3      | 405    | 4      | 202    | 1      | 909    | 5      |
| ==                                      |        |        |        |        |        |        |        |        |
| f1 score  #                             | 0.9975 | 0.858  | 0.8079 | 0.3259 | 0.1089 | 0.2864 | 0.4254 | 0.3297 |
| mcc           #                         | 0.9934 | 0.8367 | 0.3336 | 0.18   | -0.021 | 0.0194 | 0.0404 | 0.1904 |
| accuracy        #                       | 0.997  | 0.945  | 0.7    | 0.316  | 0.06   | 0.5844 | 0.278  | 0.3255 |

# 20240924
* 使用三種模型測試`pure_dataset_for_estimation`
    * 發現有沒有`utili.shuffle()`好像沒差
* f1 score直接寫在下面的表格

# 20240922
* 新增測試用資料集 `create_pure_dataset_for_estimation.py`
    * dir = special/processed_data/pure_dataset_for_estimation/
    * 使用資料及之前應該要使用`utili.shuffle()`打亂
    * 結尾_1表示壞流量依照原始比例抽樣（不保證跟原始比例一樣）
    * 結尾_2表示壞流量調整成相同比例抽樣（不保證比例一樣）

| <font color="#FF0000">retrain model</font> | 2017_1 | 2017_2 | 2018_1 | 2018_2 | 2019_1 | 2019_2 | each_1  | each_2 |
| ------------------------------------------ | ------ | ------ | ------ | ------ | ------ | ------ | ------- | ------ |
| number of bad data                         | 9849   | 2268   | 52093  | 2687   | 927613 | 2400   | 530559  | 6119   |
| number of total data                       | 25824  | 2721   | 143300 | 3224   | 984476 | 2880   | 725355  | 7342   |
| ==                                         |        |        |        |        |        |        |         |        |
| tp                                         | 5990   | 1026   | 40594  | 1771   | 924796 | 2354   | 522370  | 4815   |
| tn                                         | 14269  | 399    | 45108  | 271    | 1509   | 20     | 96774   | 561    |
| fn                                         | 3859   | 1242   | 11499  | 916    | 2817   | 46     | 8189    | 1304   |
| fp                                         | 1706   | 54     | 46099  | 266    | 55354  | 460    | 98022   | 662    |
| ==                                         |        |        |        |        |        |        |         |        |
| f1 score  #                                | 0.8368 | 0.381  | 0.610  | 0.3144 | 0.0493 | 0.0733 | #0.9077 | 0.3633 |
| mcc                                        | 0.5325 | 0.254  | 0.269  | 0.1265 | 0.083  | 0.056  | 0.6064  | 0.2102 |
| accuracy                                   | 0.785  | 0.524  | 0.6    | 0.633  | 0.94   | 0.8243 | 0.854   | 0.7322 |

> _2系列表現差有可能是因為我們的model能應對的攻擊類型是資料量比較龐大的那幾種(ex.DOS,DDOS)，因此若冷門攻擊的數量也跟其他攻擊一樣多時，評估出來的結果就會相對較差。
> 另外，_2系列通常精準度降低，原因為 fp 過大

# 20240919 開會
- [x] 測試資料集
    * 三個 model 的地方：都不到10%不能解釋f1 score很高
    * 可能是有問題
- [ ] 重新做大的 Retrain 的 model
- [ ] 2017-2019一次訓練好的 model
    * 時間不夠？

# 20240917
## 專題期末報告
* 參考學長的範本完成了一個19頁的報告
# 20240916
## Retrain 更多資料結果
* 一樣為 best_model當base，加入 2018-2019 的部分資料進行 retrain
    * Retrain 時間：大約 34 小時
    * 約 1200000 良性資料、1200000~1500000(因為有些資料極少，所以用推估的方式) 惡性資料
    * f1 score : 0.997
> ![image](https://hackmd.io/_uploads/rykPyoFTC.png)
> ![image](https://hackmd.io/_uploads/Sy1tJiFaR.png)
> ![image](https://hackmd.io/_uploads/BJkOyjYpA.png)
## 測試結果

| Column 1    | Retrained_model |
| ----------- | --------------- |
| Bad(439)    | 87.69%(385)     |
| Good(56863) | ==2.66%(1509)== |


# 20240914
## Retrain
* 將best_model當base，加入 2018-2019 的部分資料進行 retrain
    * 約 30000 良性資料、30000 惡性資料
    * f1 score : 0.987
> ![image](https://hackmd.io/_uploads/HJZQkoz6R.png)
> ![image](https://hackmd.io/_uploads/H1rBkofTR.png)
> ![image](https://hackmd.io/_uploads/ryBN1oza0.png)
## 測試結果

|             | Best_model(2017) | Retrained_model | 2017_to_2019_model |
| ----------- | ---------------- | --------------- | ------------------ |
| Bad(439)    | 5.23%(23)        | 76.08%(334)     | 9.79%(43)          |
| Good(56863) | 99.64%(56661)    | 75.66%(43020)   | 97.08%(55204)      |
        
## 專題競賽
* 修改期中簡報
* 修改期中報告

# 20240819
* 用舊的模型判斷新攻擊確實會有點判斷不太出來
    * 成功率太低ㄌ
    * 可以解讀為不論在哪個年度XSS的特徵都很相似
    * 但其他攻擊的特徵可能就每年都在變化
    * how to verify?
* 這結果可以驗證出模型需要一直更新以因應逐年進化的攻擊手法
    * model retraining
* 可以看看舊模型能否預測18之資料，若可以可能就不用那麼勤勞更新模型
    * 17 18資料較相似
## next step
* UI 
* 先看Dataset哪些較相同
    * 沒看過的再在原本的model上retrain,improving our model.
    * 2017's model當base去retrain.
    * 先查查看相關資料
* 把整個model架構完善起來，Demo更讚:+1: 
* 看看是否能分辨是哪種攻擊
# 20240808
* 成功訓練的資料（以2019為主，從2017、2018取沒看過的攻擊）
    > * 前一個資料量只訓練了一天就結束了，而且 batch 只有 64，所以把資料量放大三倍，並且batch 設 128，以為會跑兩天多，結果跑了十六天
    > * 33 個攻擊手法
    > * 資料量 : 
        * 訓練資料量 : 20721054
        * 測試資料量 : 647534
        * 大約一半的資料量，所以粗估大約 8 GB
    > * f1 score : 0.98987
    > * 不過觀察 training loss 認為應該不用訓練到這麼久，差不多四分之一或五分之二的時間就好了
    > ![image](https://hackmd.io/_uploads/SkPe4wf5R.png)
* 用之前僅 2017 的模型判斷沒看過的攻擊
    > 2017 的惡意攻擊
    > ![image](https://hackmd.io/_uploads/Sy6u42eoA.png)
    > Brute Force -XSS_dataset
    > 大概一半可以預測出來
    > ![image](https://hackmd.io/_uploads/r1boGhxoR.png)
    > DDOS attack-LOIC-UDP_dataset
    > 只有預測出來一個
    > ![image](https://hackmd.io/_uploads/Skj0MnxoC.png)
    > FTP-BruteForce_dataset
    > 預測出零個
    > ![image](https://hackmd.io/_uploads/H1PPmnxiC.png)
    > WebDDoS_dataset
    > 預測出一點點
    > ![image](https://hackmd.io/_uploads/B1vWEnloR.png)

# 20240703
* 整理後的資料（以2019為主，從2017、2018取沒看過的攻擊）
    * 33 個攻擊手法
    * BENIGN data : 5.38 GB (2018 的 BENIGN 最多，方便做比例調整)
    * BAD data : 16.6 GB
* 之前訓練的資料量(2017 整理過的)
    * BAD data : 184 MB
    * 因為良性:惡意 = 1:1，推測良性不超過也同樣約 200 MB
* 上個月一直訓練失敗的 2017~2019 全部加起來約 2X GB
* total:4244萬筆資料
    * 資料量太大，直接用vsc跑會memory error
    * 用terminal可跑
    * 為了避免BAD data被BENIGN稀釋，跟舊版採用一樣的1:1
    > ![image](https://hackmd.io/_uploads/BJ7a-Zxu0.png)
    > * 跑到開始訓練的時候就斷掉（開始跑-讀取-輸入資料大約52小時）
    > * 調整訓練的batch (from 128 to 64) 重新訓練

# 20240626
## 開會
* 加CTF是甚麼
* 長條圖的數據
* 2018, 2019, 2017的比較
* 根據不同attack pattern 調整dataset
    * 只取同一個attack pattern 的最新年度為主
    * 例如DoS在三個年度都有，可以只使用2019的
    * 盡量把比例抓得跟原本2017的比例一樣
    * 2019單純train一份跟2019+2018+2017的去看哪個好
* 之後可以記錄一下有用多少筆良性惡性的流量來train，比較好去抓我們硬體的threshold
* 拿2019的資料去2017 model detect
    * 有結果優先傳群組



# 20240626
## 新增settings
* 可以自定義背景顏色
* 可以輸入使用者名稱及email
* ![image](https://hackmd.io/_uploads/Bk-CuLFUR.png)

## CICIDS2017,2018,2019的資料前處理
* 每年dataset的feature都有點不一樣，將其調整成跟2017一樣的格式。
* 逐年按照label分成個dataset。
* 分年分將壞資料分為各個小檔案(batch)，以利於讀取(避免memory不足)。

## 預計進度
* 利用2018跟2019之dataset來增進model效能。
* 改善UI介面。

# 20240619
## 小小重構
* 把`alert_custom.py`裡面的很多function寫成更OOP& 好閱讀
## 更新UI
* 新增Initial page，之後規劃可以連動run& predict讓使用者即時檢測
* 新增Settings page，之後規劃可以讓使用者輸入包含email的資料，以及其他自定義的功能

# 20240612
## 實作圖表分析
> ![image](https://hackmd.io/_uploads/SyMiOxxUR.png)
## 擴增訓練資料
* 增加 cicids2018, cicids2019 資料集
### 問題
* 資料量太大，一次處理太多資料導致 error or crash
* 目前暫時使用批次處理的方式，但跑了三天還沒 load 完

# 20240529
## sidebar
* 因為之後預計想在 IDS 上面加更多數據，所以新增 sidebar 能夠切換
## color
* 有更換 color 但還不確定是不是最終要的配色(可能會再改)
## 功能性需求
### alert
* 判斷到惡意流量會強制跳出 alert 頁面
### log
> 現在的畫面
> ![image](https://hackmd.io/_uploads/r16s7s4NR.png)
* log 檔裡面的所有惡意流量
### 圖表分析
* 能夠觀察惡意流量的趨勢、分布等等
* 折線圖、分類統計
### setting
* 設定使用者告警 email
* 自定義背景顏色(optional)
### 彩蛋
* 偷偷在裡面放幾個 flag 給使用者打

# 20240522
## alert UI
* 找到比 tkinter 更厲害的套件 customtkinter
* 解決排版問題
* 根據視窗大小自適應排版
* 增加 slidebar
* 按鈕
> 看起來帥多了 :100: 
> ![image](https://hackmd.io/_uploads/Bk_Wf9iQA.png)

# 20240515
## 評審提問
* 收到 alert 然後?
    * 提供更多線索解決問題
* 貢獻、跟一般模型不一樣的點、困難的地方
* 目前只能偵測本地端流量
    * 裝在 server 端
## 期中試報
* 不用講太仔細，重點在包裝。
* any question 後面加上附錄等等，預判評審的問題
* 動機
* 架構改為成果階段
* 技術方法改平衡一點
* IDS 旁邊太空

# 20240512
* 修改簡報
* 內部試報
## 期中報告疑問
* 是否有需要加入 IDS 介面的部分?
* 在簡報中是否要加入改善方向，還是只要報告進度內容即可

# 20240508
* 修改期中摘要報告書
* 製作簡報

# 20240424
## CTF切小份去偵測
* 上次問題解決辦法
    * 切過後的檔案會變成 pcapng 檔，故它會顯示找不到 pcap 檔案
    * 將 cicflowmeter 裡判斷是否為 pcap 檔程式註解，並直接 return true => 不判斷是否為 pcap 檔就執行
    * 新建一個 docker image run 修改後的 cicflowmeter 
* source = `1_split_00042_20180813013039.pcap`
> ![image](https://hackmd.io/_uploads/rk_rclL-0.png)

## `send_email.py`
* 自動化傳送告警email
* 用html在信件中提供觸發告警的流量的相關訊息
    > ![image](https://hackmd.io/_uploads/HJiDZ5U-0.png)
:::info
### to be improved
* [ ] 只附加這次新增的惡意流量
:::

## `detect.py`
* 處理存入`warning_log.csv`的格式問題

## 專題期中報告書
* 在很醜的格式架構中盡量維持整潔。

# 20240417
## `main.py`
* 用thread同步執行抓封包& 偵測
* 把自動發送告警email加入pipeline裡面
## 儲存預測結果 log 檔
* 存到`warning_log.csv` 
* 顯示本次新增的warning
:::info
### to be improved
* [ ] 七天之後會刪除舊的資料
* [x] 連接告警email
:::

## CTF切小份去偵測
![image](https://hackmd.io/_uploads/HkyNxHaxC.png)
* 但是他隨後就壞掉不能跑了
    * 目前了解可能是docker出了問題，沒辦法把pcap轉成csv繼續後面的動作
    * 會顯示找不到pcap但明明就在那邊
:::info
### to be improved
* [x] 穩定pipeline
* [ ] 去track原本的pcap在wireshark看是不是有惡意操作例如惡意字串...
* [ ] 惡意的wireshark資料存起來給學長姐驗證
:::

## 本周待辦
:::info
* [x] 儲存預測結果 log 檔
* [x] CTF切小份去偵測
    * [ ] 去track原本的pcap在wireshark看是不是有惡意操作例如惡意字串...
    * [ ] 惡意的wireshark資料存起來給學長姐驗證

## 下次
* [x] 專題期中報告
    * [x] 大方向就好了
    * [x] 不要提供實驗結果
    * [ ] 進度問題：修改演算法
    * [ ] 收到告警之後：希望再開發一個模型協助辨識是哪種攻擊，才能讓使用者更了解並且完備的預防攻擊
        * 分類器？
        * 說故事機器人？
* [x] 或許偵測到惡意流量可以傳 gmail 等等的
* [x] 利用 fork 等子程序方式寫，讓程式能邊預測邊抓封包
* [x] 將 `main.py` 寫得更完整(目前只有加上 detect, alert)

## 有空
* [ ] 美化 alert UI
* [x] 偵測更多的流量
:::









# 20240410
> [name=all]
## 自動抓封包
* 將 wireshark 改為使用 tshark，並利用 subprocess 在背景執行
* tshark 是利用 command line 執行 wireshark 的動作
## 把程式變漂亮
## 寫了一個正式版的 `main.py`
* 預計之後會把整個 pipeline 放在這裡
## 模型偵測
* 他會偵測了
* wireshark 抓下來的流量
    * 全部都 0
* ALL_DDoS 的流量
    * 全部都 1
* 可以一次預測很多封包，輸出改成 list[int] 以方便使用
## 神聖第一跑
* 上次開會結束時下載的 ctf 有 50 GB
* 從 2024/4/10 21:30 開始執行
* 約執行一小時半結束，但似乎有 Error
:::info
### 待辦
* [x] 利用 fork 等子程序方式寫，讓程式能邊預測邊抓封包
* [x] 將 `main.py` 寫得更完整(目前只有加上 detect, alert)
* [ ] 美化 alert UI
* [ ] 偵測更多的流量
* [x] 儲存預測結果 log 檔
    * [ ] 多久刪除依次
* [x] 或許偵測到惡意流量可以傳 gmail 等等的?
:::

# 20240403
> [name=all]
## cicflowmeter
* 成功藉由 docker run cicflowmeter
* 使用 python 控制 pcap 轉 csv
## 模型預測
* 能夠使用訓練好的模型進行預測
* 輸出疑似是針對每個attributes的預測，不確定配比或是整體預測的結果
    > ![image](https://hackmd.io/_uploads/SyKQjoq1A.png)
## [網路上提供的惡意流量pcap檔](https://wiki.wireshark.org/SampleCaptures)
* 通常一個檔案裡面只有兩三筆流量，都是有問題的
* 也有機會找到[別人打CTF的流量](https://www.netresec.com/?page=PcapFiles)
* 有些檔案cicflowmeters沒辦法擷取出可用特徵
* 只確定是好/壞流量，幾乎沒有label

:::info
* [x] rm attribute [IP, timestmp] from model 
    * [x] take ref from cicflometer machine learning dataset
    * [x] check features of train data and real data are the same
* [ ] manule of simpletransformers.ClassificationModel.predict()
* [x] use pure bad traffic
* [x] use CTF traffic
* [x] learning curve implementation
* [ ] GUI upgrade

有空
* [x] 驗證模型是否能成功判讀(缺少惡意流量)
* [x] overfitting
* [ ] 有辦法更新model
* [ ] 知道是哪種攻擊
:::

# 20240327
> [name=all]
## 訓練結果
### evaluate_during_training = False(train and test 為 8:2)
### 訓練時間只有十個小時!!!!! :100: 
#### 第一次
> f1 score = 0.9903
> ![image](https://hackmd.io/_uploads/SJ9Qg7s0p.png)
> ![image](https://hackmd.io/_uploads/B1eZreQjRa.png)
#### 第二次
> f1 score = 0.9919
> ![image](https://hackmd.io/_uploads/Sy6ABynCa.png)
> ![image](https://hackmd.io/_uploads/S1xx8khCp.png)
#### 第三次
> f1 score = 0.9886
> 因為圖都差不多就不放上來了
### only train and eval (8:2)
> f1 score = 0.993
> 時長 2 天多(3倍時間)
> ![image](https://hackmd.io/_uploads/SyXFNulJA.png)
> ![image](https://hackmd.io/_uploads/BkV94Ol1A.png)
## 結論:
![image](https://hackmd.io/_uploads/ByEX1YeyR.png)
1. train and test = 8:2 與之前所測的所有模型差距都極小，故為目前最佳之模型!!!
2. train_loss 如果隨著訓練逐漸降低，代表有成功學習到。
3. 但通常搭配 eval_loss 觀察會更好，eval_loss 與 train_loss 長的非常相近並且均隨著時間降低是個良好的現象，降低 overfitting 發生的機率。
4. 雖然沒有驗證集速度最快、效率最高，但缺點是也缺少了一些評估模型的標準。如eval_loss, auroc, confusion matrix等，雖可以查看最終test的結果，卻沒辦法觀察到預測test過程中的數據。

# 20240320
> [name=all]
## training-validating-testing 為 6:2:2
> f1 score = 0.9904
> 相較於之前**錯誤**的結果有下降一點，但還是有0.99的成績，並且結果更為正確了
> ![image](https://hackmd.io/_uploads/r1-rkXo0p.png)
> ![image](https://hackmd.io/_uploads/r1Xwy7jAa.png)
> ![image](https://hackmd.io/_uploads/B1rd1XjRp.png)
## 建立虛擬環境
* Python3.11.8 to run cicflowmeter
    * 還是跳出一樣的報錯
## 使用訓練好的模型
* 測試過後目前是正常的，但缺少惡意流量，可能再修改一下GUI
:::info
待解決問題
* [x] 表格整理所有run test
* [x] wsl嘗試cicflowmeter
* [x] GUI upgrade
* [x] 有沒有網路上已經標好的資料 
* [x] learning curve implementation

有空
* [x] 驗證模型是否能成功判讀(缺少惡意流量)
* [x] overfitting
* [x] 有辦法更新model
:::

# 20240313
> [name=all]
## 如果只用好資料訓練，能不能讓模型分辨出壞資料
* [resource](https://support.reinfer.io/support/solutions/articles/48001161955-understanding-and-increasing-coverage)
    > * As a metric, coverage is a very helpful way of understanding if you've captured all of the different potential concepts in your dataset, and whether you've provided enough varied training examples for them so that the platform can effectively predict them.
    > * ==In almost all cases, the higher a model's coverage is the better it performs==, but it should not be considered in isolation when checking model performance. 
* [未見過資料的分類](https://blog.csdn.net/u010165147/article/details/54429644)
    > * ==所以生成模型更不容易像判別模型那樣將未見過類別分類為錯誤類別==
* [機器學習101](https://ithelp.ithome.com.tw/m/articles/10240556)
:::info
自然語言處理下課時詢問王正豪老師的結論 : 
* 如果進行分類的話，通常label訓練集越平衡越好，如果有一邊的label特別多，預測結果會較不準確。
* 如果要預測未看過的label的話可以嘗試使用one class classification
    * 運作原理是需要有一個計算公式，並且設置一個門檻
    * 利用特徵數據套入公式取得一個值，如果值大於門檻為1，小於門檻為0。
:::

## GitHub
* 之前不小心commit到編譯過後的檔案，所以超過2 gigabyte推不上GitHub
:::danger
### GitIgnore改成白名單
:::

## Overfitting detection
* 之後比對每次模型的f1

## 修改程式
### 因為之前耍笨，所以 validating 跟 testing 是同個 data ，結果有失公正
1. 將 evaluate_during_training 設為 False
    * validating = na
2. 訓練中的測試集及最後評估模型的測試集均為 train_data
    * 測試 overfitting
4. 將全部資料分為 6:2:2 ，分別為training-validating-testing

# 20240306
>[name=all]
## 會議記錄
* 下次可以試試看把eval的資料集跟train的一樣，看看結果會不會overfitting，因為如果成功率太高就很有機率是overfitting，我們的f1 score有點過高
* How to convert .pcap to .csv 
    * 現在的方法可能沒那麼適合，找找看是否有類似網站的api可以直接拿來在後段用(less priority)
* 先做出一個雛型，將我們那幾個csv先餵進去看看結果如何
* 我們cicflowmeter出錯有可能是因為python版本不符

:::info
待解決問題
* [x] 建立高版本的python環境嘗試cicflowmeter (不行的話嘗試其他方法)
* [x] check overfitting
* [x] 驗證模型是否能成功判讀
* [x] 嘗試把wireshark擷取的封包改名
:::
## 工作進度
* 使用模型預測 csv 檔
    * 但還不確定預測的準確度
* 做了一個 gui 顯示攻擊的時間、來源IP、目標port、協定
    * 但還沒將所有東西結合，之後會嘗試將所有流程都自動化
![image](https://hackmd.io/_uploads/S1cpBgLpp.png)


# 20240227
>[name=all]
## 將訓練集全部改為良性流量後的結果
* f1 score 為 0
* 似乎因為訓練集沒有惡意流量，導致在預測的時候全部都只會判斷為良性。
* ![image](https://hackmd.io/_uploads/S1RRlKo2a.png)
## 查看是否具有 overfitting
* 查詢到有兩種辦法分別是
    * 觀察 learning curve 
    * 透過 Bias 和 Variance 判斷
* 但第二個要做的步驟偏麻煩，故先嘗試第一種
* 我們討論後認為 overfitting 的可能性不大
## 實作用腳本執行 cicflowmeters 
* PyAutoGUI
* PyGetWindows
:::warning
* 接下來要解決的問題：
    * 能不能再背景執行 這樣就不會干擾正常使用電腦
    * 把model輸出然後自動化偵測壞流量
:::

# 20240220
>[name=all]
## 程式修改
1. 將訓練資料改為全部為良性資料
2. 使訓練集、驗證集維持 8:2 (資料量不變)
    * 假設原本訓練資料為100個，良性與惡意各50個
    * 現在變成訓練資料一樣100個，但良性為100個
    * 驗證集跟原本一樣不變
3. 但後來發現這樣浪費了80%的惡意流量(原本的訓練集惡意流量)
    * 下次訓練會將整體訓練量放大五倍
## wireshark
* 成功使用 wireshark 每三分鐘捕捉一次封包並存為 pcap 檔
## 流量特徵擷取
* 直接把pcap轉成csv沒辦法顯示流量的特徵
* 必須用特定的擷取器如cic flowmeters
### cic flowmeters
* avaliable in Python, Java, etc
* 原本想手刻，但是刻不出來
* 直接用cicids2017 manual提供的解決方案
* "Do not re-invent the wheel"
* but the original Python solution sucks
### 使用Java的版本
* so we changed our way to the Java solution
* 原版太麻煩但是有人提供了GUI的解決方案
* 下載編譯就可以使用
    * [教學](https://denialdoufu.medium.com/cicflowmeter%E4%BD%BF%E7%94%A8%E8%AA%AA%E6%98%8E-windows-a5342bb82f7e)
:::warning
* 接下來要解決的問題：
    * 如何將 **擷取流量-擷取特徵-送進model偵測** 的流程自動化
:::

# 20240218
>[name=all]
## 建議
* 如果只分好流量或不好的
    * 未來攻擊不只15種
    * 只要不是正常流量的就分類成壞流量
* 分兩種就好，good and bad（train好的，判斷異常ㄉ）
* IDS反應速度更快
* 下學期：實作IDS
    * IDS跟AI合作可能有困難點，沒試過
    * 若model判斷為異常，要如何將異常警告讓使用者讀得懂
        * 如何將log file分析結果轉成文字（先處理完IDS在解決這個）
    * 研究如何把AI導入到IDS中（可能要花比較多time QQ）
        * 把model封裝出來？
* 真實去錄封包來試試看
    * 實驗室中會有競賽，可以錄封包
    * 安全程式設計 課堂上的lab
    * 正常的可以自己搜集
* 要抓一下時間比例
:::danger
* 專題deadline：暑假前完成 
:::
# 20240215
> [name=all]
## 改用 albert 模型的訓練結果
> 這次的訓練從圖表上來看，是三種模型中最不穩定的，但有可能是因為模型的訓練方式不同導致的 (此訓練模型剛開始的準確度是三種模型最高的)
> f1 score = 0.9923，但是訓練時間似乎比 RoBERTa 還久
> ![image](https://hackmd.io/_uploads/S1GFYpssa.png)
> ![image](https://hackmd.io/_uploads/ByB9Kpjsa.png)
> ![image](https://hackmd.io/_uploads/ByZPtaosa.png)
> ![image](https://hackmd.io/_uploads/BktiFpiia.png)
## 模型的決定
> 使用過這三種模型後，我們認為 albert 最適合我們這次的專題
> 因為它具有輕量又不失效能的特性，所以我們接下來會以 albert 模型持續研究下去
## 更換資料集
> 接下來我們會先嘗試更換其他資料集，看結果能不能保持 0.99 的高準確度
## 開學後進度
> 開學後可能就會往 CIC flow meter 的方向實作
> 希望在下學期能夠實作出 IDS

# 20240208
> [name=all]
## 改用 RoBERTa 模型的訓練結果
> 相較於之前的訓練，這次訓練較不穩定
> f1 score = 0.9906，訓練約一天半
> 相較於 BERT 而言， RoBERTa 雖是它的優化，但卻沒有更有效率
> 有可能是因為我們的訓練沒有到很龐大，所以只需要使用簡單的模型，效果可能更好
> ![image](https://hackmd.io/_uploads/HyqW1iGi6.png)
> ![image](https://hackmd.io/_uploads/BJwz1jGiT.png)
> ![image](https://hackmd.io/_uploads/ByOXJoMjT.png)
> ![image](https://hackmd.io/_uploads/SkM8JsGs6.png)
## 更換模型訓練
> 我們決定更換成 ALBERT
> 它是更輕量化的 BERT 模型，讓原本 BERT 模型的參數數量大幅下降
> 雖然精準率會降低，但卻可以減少許多 BERT 的訓練成本，所以效率比 BERT 還要更高
> 考慮到我們後面需要實作一個 IDS ，感覺會需要一個更為輕量的模型

# 20240206
> [name=all]
## 將 Epoch 設為 4 的訓練結果
> 訓練較穩定，中間無突然飆高的錯誤
> f1 score = 0.991
> 跟上次 0.992 差不多，下降了0.001
> 所以認為 Epoch = 1 已經差不多是最符合效率的一次訓練了 => 不到 2 天、f1 score = 0.992
> ![image](https://hackmd.io/_uploads/SJ6JA9Msp.png)
> ![image](https://hackmd.io/_uploads/Hy-fA5Gi6.png)
> ![image](https://hackmd.io/_uploads/Skq7R9zja.png)
> ![image](https://hackmd.io/_uploads/BJp4R9fia.png)
## 更換模型訓練
> 原本模型使用 bert 
> 我們先嘗試了gpt2，後來發現程式報錯，因為他們是不同類型的模型
> bert 主要用於分類、gpt2 用於語言生成
> 所以我們改用 RoBERTa
> RoBERTa 可以看作是對 BERT 的一種優化和擴展
> 它通過在訓練過程中對一些參數和策略進行調整，提升了模型的性能

# 20240128
> [name=all]
## GPU Memory
> 觀察了一下是否有使用 GPU Memory ，發現是有使用到的，但只用了 1/4 。
> 於是我們把 train_batch_size 調高，也就是把跑一次 Iteration 的數量變多。
> 從原本的 16 變到 128，也就是一次 16 筆資料變成 128 筆。
> 專屬 GPU 記憶體變為 11.4/12.0 GB，CUDA 狀態也變得很高。
> 另外我們也發現要看的是 GPU 的 CUDA 狀態，而不是使用率，之前不知道為什麼是 3D 的狀態會變很高，使用率也是。
> **結論 : 效率變高超多，上次訓練十天的模型，這次不到兩天就好了。**
> ![image](https://hackmd.io/_uploads/SJiNWO49p.png)
## 重新跑一次好流量與壞流量 1:1 的結果
> f1 score = 0.992 下降 0.006
> 因為我們把 train_batch_size 調高，一個 Epoch 可以跑得 Iteration 數就成比例變少，沒有足夠的梯度下降讓損失函數到平穩的低點。
> 所以決定放大 Epoch 再次訓練。
> 但其實 0.992，就還不錯了，所以應該不用特地調整 Epoch ，只是我們剛好有多餘的時間。
## 新訓練
> 把 Epoch 設為 4 再訓練一次，預計f1 score會再高一點點。

# 20240126
> [name=all]
## 開會紀錄
1. GPU Memory有12G，照理講應該夠用，要檢查一下設定
2. 不用讓他跑完全部資料集，應該算loss function會比較有效率
3. 整理一下新資料集跟原本資料集的label差了哪些
4. CIC flowmeter => 提取真實資料
5. 另一台主機重新run看能不能f1= 0.99
    * 加速收斂?
6. 真實流量可能不能歸納在現有的15類
7. 如何label真實流量
8. 反應時間：如果變成一個應用程式可以多快偵測到並執行主動防護
    * 造成伺服器負擔
    * 發警告也不一定馬上處理
    * => 比較少人研究
    * 排程 => maybe 3min or 5min
9. 其他model

# 20240125
> [name=all]
## 新進度
* 訓練完成(他跑了10天)
* ![image](https://hackmd.io/_uploads/SJccjFyqT.png)
* ![image](https://hackmd.io/_uploads/S1vjjYyc6.png)
* ![image](https://hackmd.io/_uploads/HJH3oYycp.png)
    > * fp不知道為甚麼突然掉很低
* ![image](https://hackmd.io/_uploads/rkohotk9T.png)
    > * tp也跟fp在差不多的時間突然掉很低
* ![image](https://hackmd.io/_uploads/Hyy0jFy9T.png)
    > * ROC曲線的表現感覺很不錯
* f1 = 0.998感覺還不錯
* 但fp跟tp中間不知道為甚麼突然掉很低

# 20240110
> [name=all]

## 遇到問題
* [a new github repo](https://github.com/Rickuan/special)
* memory error
    * allocate **Virtual Memory**
        * 16mb -> 87330mb (start from 2911mb * 30)
    * [high hard fault rate](https://www.mobile01.com/topicdetail.php?f=489&t=3421433)
    * decrease the data size
        > * good vs bad = 1:1
        > * train vs validation = 0.8:0.2
* GPU not found
    * reboot the coomputer
    * disable& ebable the GPU

# 20231231
>[name=all]
## 新進度
* github can push
* use **real** dataset

# 20231231
>[name=all]
## 討論
:::info
- [x] real dataset
- [ ] smaller lr
- [ ] FNR too high => need more Positive(Bad) Traffic
- [x] memory error: github
- [x] do not modify the rate between Positive& Negative
:::

# 20231227
>[name=all]
## 8:2 訓練結果
> 1220
> f1-score : 0.9282
> fn偏多
> 過程較平均，不會有突然的極大極小值
> ![image](https://hackmd.io/_uploads/Syx8AJRwT.png)
> ![image](https://hackmd.io/_uploads/rJfvC1Cwp.png)
> ![image](https://hackmd.io/_uploads/HyQ_CkAvp.png)
## 修改
* 因為 fn 較多，所以我們打算將良性資料 * 1.5 
## 發現
1. 剛開始訓練沒多久就會出現 MemoryError
![image](https://hackmd.io/_uploads/ByDuleRD6.png)
2. 放著不管的話，訓練到一半會壞掉
![image](https://hackmd.io/_uploads/ry0XxxRP6.png)

# 20231219
>[name=all]
## 發現
* 在減少正常流量的過程中，我們發現有一個小地方寫錯了，導致之前的那些結果其實也不是 8:2
## 修改
* 之前的方式 : 
    * 資料全部在同個 dataset 丟進去程式後再進行分類
* 現在的方式 : 
    * 把 Benign, DDoS, DoS, PortScan 四個結果拆成四份 dataset 再丟進去，這樣能夠更有效率的減少正常流量並分成 8:2
## 12/13 同個程式碼再 train 一次的訓練結果
* 目的 : 確認 f1-score 的穩定性(是不是每次都這麼高)
* 備註 : 後來發現程式碼有地方寫錯導致沒有 8:2
> f1-score : 0.9952 (還是很高，但其實是錯誤的結果:-1:)
> ![image](https://hackmd.io/_uploads/rybtGKVDa.png)
> ![image](https://hackmd.io/_uploads/r1t7GYNPa.png)
> ![image](https://hackmd.io/_uploads/SJdVGtNwa.png)


# 20231217
>[name=all]
## 討論內容
* 真實的情況是否如 training 出來的一樣。
* bert 優點 => 我們不用做預處理
:::info
下周進度
先做
* [X] 減少正常的流量
* [x] 觀察錯誤的地方，判斷為何錯誤並加以改進

再做
* [ ] 試試看更換訓練模型

可能可以試試看
* [ ] 增加錯誤的流量 => GAN生成
:::

# 20231213
>[name=all]
## 訓練結果
> 12/07
> 可能因為資料分布不均勻，導致在接近一半的位置會出現許多預測錯誤的情況。
> 但根據 f1 score 的結果顯示，正確率頗高 => 0.9972:+1: :100: 
> ![image](https://hackmd.io/_uploads/ByvcmZPLa.png)
> ![image](https://hackmd.io/_uploads/SJxhXbwI6.png)
> ![image](https://hackmd.io/_uploads/H1b67-wIp.png)
____________________________________________________________
> 12/13
> 因為有對資料先進行處理，資料較為均勻，所以預測錯誤的情況多出現在一開始。
> f1 score 相較於上禮拜略為下降，不過還是很高 => 0.9955
> ![image](https://hackmd.io/_uploads/Hk_gh8sLT.png)
> ![image](https://hackmd.io/_uploads/HkKpoLjIT.png)
> ![image](https://hackmd.io/_uploads/Bkz0jUi8T.png)


* validation first:
* train first:
    * 不管哪個優先都可能被BENIGN稀釋
    * 改善：
        * 非BENIGN吃到2:8就把剩下的BENIGN丟掉
            * 每次測試的筆數會浮動無法掌握
        * 先把全部資料做shuffle後，再抓8:2去訓練看看成果如何，to be continued...

## 分類演算法
* 一開始我們只是把所以資料分成8:2
* 但是沒辦法確保所有種類的攻擊都有被正確的訓練到
* 所以考慮使用新的演算法計算8:2

### 方法一，train優先
* 打亂
* 決定測試筆數
* 遍歷所有資料，並根據不同的 label 分類
    * 如果 train data 的數量還不到所以傳入筆數的80%，設定成 train data
    * 剩下放到 test data
> * 問題：```BENIGN```太多，會把 train data 稀釋掉

### 方法二，test優先
* 打亂
* 決定測試筆數
* 遍歷所有資料，並根據不同的 label 分類
    * 如果 test data 的數量還不到所以傳入筆數的20%，設定成  test data
    * 剩下放到 train data
> * 問題：```BENIGN```太多，會把 test data 稀釋掉

### 方法三，有比例上限
* 打亂
* 決定測試筆數
* 取得所有 label 佔所有傳入資料筆數的比例
* 遍歷所有資料，並根據不同的 label 分類
    * 如果 train data 的數量還不到所以傳入筆數的80%
        * &&  
        * label 在 train data 的比例還沒超過 label 佔所有傳入資料筆數的比例，設定成  train data
    * 剩下放到 test data
> * 解決：避免運氣不好的時候太多特定種類資料，如```BENIGN```，把 test data 空間全部挾持，導致 train data 無法反映真實狀況
> * 問題：有些資料被遍歷的時候不符合資格，都被丟到 test data ，導致沒辦法控制在剛剛好的8:2

### 方法四，有比例上限2
* 打亂
* 決定測試筆數
* 取得所有 label 佔所有傳入資料筆數的比例
* 遍歷所有資料，並根據不同的 label 分類
    * 如果 train data 的數量還不到所以傳入筆數的80%
        * &&  
        * label 在 test data 的比例還沒超過 label 佔所有傳入資料筆數的比例，設定成  test data
    * 如果 test data 的數量還不到所以傳入筆數的20%
        * &&  
        * label 在 test data 的比例還沒超過 label 佔所有傳入資料筆數的比例，設定成  test data
> * 解決：避免運氣不好的時候太多特定種類資料，如```BENIGN```，把 test data 空間全部挾持，導致 train data 無法反映真實狀況
> * 問題：無法符合任一種狀況的資料就會被丟掉

# 20231210
> [name= all]

:::info
* [x] 傳入資料符合比例
* [x] training& validation比例 => 8:2
    * 如果表現不好再調整
* [x] 紀錄running time
* [x] 標準要保持一致才可以看出變化的意義
* [ ] [李弘毅 機器學習課程](https://www.youtube.com/channel/UC2ggjtuuWvxrHHHiaDH1dlQ)
:::

# 20231206
> [name= all]
## 實作train with GPU
* tensorflow-gpu :-1: 
    * 之前測試可以使用cuda ，但是 simpletransformers 不支援（程式碼要大改）
    * 改用 pytorch 執行cuda
* pytorch :accept: 
    * 一開始cuda 是用 11.2.0 ，後來發現pytorch 找不到對應的版本
    	* pip install 找不到一些特殊的版本，所以用手動下載才成功
    * 使用pytorch 後就能成功利用 gpu 運作了

## requirements 
> * cuda : 11.3.0
> * cudnn : 8.2
> * torch : 1.12.0 **+cu113**
> * torchvision : 0.13.1 **+cu113**
> * python : 3.10.10
> * tensorflow-gpu : 2.10.0

## GitHub
* 之前因為檔案太大沒有成功推上去
    > ![image](https://hackmd.io/_uploads/HJxA9d-0r6.png)
* 反正他現在很災難：（
* 先寫了.gitignore 然後手動把重要的檔案丟上去，之後找時間把GitHub 做好

## wandb
* 記錄檔案的時候遇到困難
* 以為是要用 wandb.watch()或是自己寫loss function 然後傳入 wandb.log()
* 但是其實在model 的地方指定專案就好



# 20231203
> [name= all]
## 討論內容
* 版本不要最新，直接看教學可用就好了
* 討論 git 如何做版控 => 換模型、架構不同，基本上就是兩個不同的程式再切 branch
* 可以嘗試用不同模型去做 training

:::info
下周進度
了解
* [ ] 哪些 dataset 是可以使用的

實作：功能
* [x] 實測 gpu

實作：改進
* [x] git ignore：程式編譯產生的不要
* [x] github上面有些太肥的東西砍掉

準備

有空可以做

:::



# 20231130
> [name=思群]
## CUDA終於解決啦!!!
### 環境
* 原本的環境被學長噴爛了QQ
* 在學長的建議下把 anaconda 卸載
* 並使用 vs code 重新建一個環境

### version
* 後來發現 **有可能** 是因為 tensorflow-gpu 目前還無法支援 3.10 以上的 python version，所以嘗試下載python 3.10.10 版本，並下載 tensorflow-gpu 2.10.0 版本，結果就真的成功了。(如下圖)
> ![image](https://hackmd.io/_uploads/HkiP4QLHT.png)

# 20231129
> [name= all]
## 進度
### CUDA
* 安裝很多驅動 including PCI
* 確定安裝好了
    > ![image](https://hackmd.io/_uploads/B1nQJ0NHp.png)

### 但還是不能使用GPU
* anaconda 一直擋
    > ![image](https://hackmd.io/_uploads/B1fMgAVSp.png)
    * 載不了torch, tensorflow, tensorflow_gpu
    * 可能要重新安裝
* tensorflow 版本問題 說最後支援GPU的版本是2.10.0但是要安裝這個版本一直找不到
    > ![image](https://hackmd.io/_uploads/r1i2yRNrT.png)

### wandb
* wandb.init(): initialize the run
* wandb.config(): record hyper perameters for the run
* wandb.log(): record dependent data (tp, fp, etc) for the run
    > * both **config& log** can be display in wandb dashboard
* we add **f1_score& trainning_loss& gobal_step**
    > ![image](https://hackmd.io/_uploads/r10ObRVr6.png)

# 20231122
> [name= all]
## 進度
### 版本控制
* [Github](https://github.com/Rickuan/Huuuuum.git)
* [Git Graph](https://thetrendycoder.com/how-to-add-git-graph-on-vs-code/), the extention, in VSC

### Dataset
* [UNB.ca](https://www.unb.ca/cic/datasets/index.html)
    * IDS, Intrusion Detection Systems, datasets
        > * where we find the CICIDS2017
        * DDoS Attack Dataset (CICEV2023)
        * DDoS Evaluation Dataset (CIC-DDoS2019)
        * IPS/IDS dataset on AWS (CSE-CIC-IDS2018)
        * **Intrusion Detection Evaluation Dataset (CIC-IDS2017)**
        * DoS dataset (application-layer) 2017

### CUDA
* hard to setup
* tensorflow==2.15.0
* cuda_12.3.r12.3/compiler.33492891_0
* we spend most of our time on this 

#### CUDA- Conda- cuDNN- tensorflow dilemma
1. we did not notice the **version collapse** at first
    > [a table shows the competitive version of those packages](https://www.tensorflow.org/install/source#gpu)
3. after re install the right version of CUDA& cuDNN& tensorflow, we found that **tensorflow still failed to detact out GPU**
    > :::warning
    > :::
4. we believe it was because we cannot download the critical package through the scholarship network
    > ![image](https://hackmd.io/_uploads/SkLJMYsVp.png)

### last time wandb
* it is the **precision** rather than recall rate has shaply decrease in the end
:::warning
not finish
:::
* [W&B基礎介紹](https://blog.infuseai.io/weights-biases-ml%E5%AF%A6%E9%A9%97%E6%95%B8%E6%93%9A%E8%BF%BD%E8%B9%A4-eb27a3876203)
    > * project
    > * name
    > * batch_size
    > * epoch_num
    > 
    > :::info
    > * **every perimeters above can be defined at either model.arg, or wandb.init, and use python get() syncing with each outher**
    > * we are not sure about the differences between **wandb.init(), wandb.config(), wandb.log()**
    > :::
    * but after reading this, we still cannot find the way the adjust the figure shown in the chart/ panel

### Dataset
* [what is Training, Validating, and Testing](https://towardsdatascience.com/train-validation-and-test-sets-72cb40cba9e7)
    > * Validating: to **evaluate** the proformance of the model, and prevent from **overfitting**
    * best ratio for T-V-T is 60~80%- 10~20%- 10~20%










# 20231119
> [name= all]

## 討論內容
1. 盡量以F score為主
2. 問wandb的global_step, lr, train_rate為甚麼是點
    * x軸是甚麼意思
    * global_step?
    * loss 應該要可以記錄到real time
    * 可能跟程式的寫法有關係
    * 可能要設定一些語法才能完整記錄這些資訊
3. GPU的memory 沒有爆掉epcho 就可以改大(我看成法大==)
4. 沒有用GPU train?
    a. CUDA?
5. 方向
    a. 先丟正確的參數
    b. 用GPU training
    c. 改善F1
    d. UI for demo
    e. algorithm
    f. 其他dataset
6. recall 為甚麼下降
7. training 的比例 查一下
8. **設定準度的目標：98.5%**
9. modify 資料集：降低positive的，outnumber 太多
10. CICIDS not only 2017

:::info
下周進度
了解
* [x] epocho, batch是甚麼，跟CPU、GPU的關係
* [x] 上個版本recall 為甚麼下降
* [x] training: validation黃金比例
* [x] wandb的各項圖表、數據

實作：功能
* [x] 版本控制
* [x] apply cuda
* [x] a function to show F1 score
* [x] wandb record training loss

實作：改進
* [x] 先丟正確的參數
* [x] 改善F1 score
* [x] 改善資料集

準備
* [x] CICIDS not only 2017

有空可以做
* [ ] UI for demo
* [ ] 改algorithm

:::

# 20231115
> [name= all]

## 新發現！
1. 嘗試一次丟很多attributes進去training
    * string: 
        > ![image](https://hackmd.io/_uploads/Hk0B6VGV6.png)
        > * precision= 0.958
        > 
    * list: 
        > ![image](https://hackmd.io/_uploads/rkCcySGNT.png)
    * 都可以被執行
    * 參數
        > * epoch= 5
        > * batch= 16
        > * lr= 1e-05 
        >   > 預設的 網路上提供 simple transformor 給的
        >   > 如果梯度下降沒辦法收斂就要改lr
        >   > 但是現在loss已經很小
        >   > 所以目前覺得沒問題
        > * Training:Validation= 500:500

2. MultiLabelClassificationModel
    * dealing with not binary cases
    * not the tool we looking for
3. Epoch, Batch, lr
    * [iT解釋](https://ithelp.ithome.com.tw/m/articles/10279206)
    * [StackOVF Question](https://stackoverflow.com/questions/70486977/simpletransformers-model-not-training-on-whole-data-as-shown-in-brackets-under)

## 那算是我們走的歪路嗎？
* 使用bert large會讓電腦爆掉
    * 這應該是cuda沒設定所以跑不起來
* epoch= 10, batch= 32會讓電腦爆掉
* Start training
    > ![image](https://hackmd.io/_uploads/ByKiaVGEa.png)
    * 根本不重要==
    * 只是一開始資料數量不夠，只會predict同一種case
        * all 0/ all 1
    * 看epoch有跑完就是有吃到


# 20231029
> [name= all]
## 討論內容
1. whole paremeters
2. 確認RDP資安問題
3. CICIDS 2017
    * generation flow: 欄位的分類、統整
    * machine learning: 無時間戳記、ip
        * 有可能影響實驗結果
4. wandb.ai
    * read chart
    * 找到哪些資料預測錯誤
5. simple transformer
    * 怎麼丟多個參數
        * 試試看把逗號拿掉變成一個欄位
        * python string processing
6. training
    * 之後train自己的東西可能會花好幾天，如果train到最後出線BUG，那會很容易浪費時間。
      所以每次train之前要詳細確認一下。  
7. demo
    * 如何更好的demo，讓別人覺得我們很專業。
8. after whole paremeters done
    * 分析如何更有效率的餵資料
    * **如果刪除某些資料會更好？**

:::info
下周
* 暫停一次

下下周
* 暫停一次

下下下周
* [x] whole paremeters
:::

# 20231025
> [name= all]

:::danger
實驗室
:::spoiler
"----"
:::

## CICIDS2017
* [a paper talk about this data set](https://www.researchgate.net/profile/Ranjit-Panigrahi/publication/329045441_A_detailed_analysis_of_CICIDS2017_dataset_for_designing_Intrusion_Detection_Systems/links/5c264977a6fdccfc706e43b6/A-detailed-analysis-of-CICIDS2017-dataset-for-designing-Intrusion-Detection-Systems.pdf)
* [an intro to CICFlowmeter](https://blog.csdn.net/Dajian1040556534/article/details/121353809)

## RDP
* 問題:開啟遠端功能後，依舊沒辦法連線過去。
    > * 解決:ApexOne要設定例外對外連線。

## Train with Bert
* 嘗試使用**Flow Duration**測試可以使用Bert
    * total data: 1042558 rows* 80 columns
	> ![](https://hackmd.io/_uploads/B1jqRPLMT.png)
	> * 測試結果發現如果**Flow Duration 太大**，模型會輸出1，偵測出是攻擊
	> 
	> ![](https://hackmd.io/_uploads/r1SELdIzT.png)
	> * 測試結果發現如果**Flow Duration 太小**，模型會輸出0，判斷應該不是攻擊

* 嘗試將訓練好的模型輸出，這樣就不用每次都等超久
	* 不確定檔案位置在哪裡但好像有叫成功過
	* 但是目前都不是完整的訓練資料，所以只是練習一下輸出而已

* 嘗試使用[wandb.ai](https://wandb.ai/home)將結果視覺化
	* 不知道怎麼用
	* test data好像沒有對答案
	* [how to visualize  lost function with wandb.ai](https://wandb.ai/capecape/classification-techniques/reports/Classification-Loss-Functions-Comparing-SoftMax-Cross-Entropy-and-More--VmlldzoxODEwNTM5)
	> * 嘗試使用2000筆資料做測試(確定包含正常情況及異常流量)，並以1500:1500作為訓練、測試資料
	> ![](https://hackmd.io/_uploads/B1IKV98MT.png)
	> * confusion table
	> ![](https://hackmd.io/_uploads/Sy4iEcLGT.png)
    > * learning rate& lost function
    >    > * 但是我們並不清楚怎樣的圖表才是好的
    >    > * 不知道後面要怎麼調整參數

:::info
> 其他找到的東西
> * [中文語言情緒分析](https://www.cc.ntu.edu.tw/chinese/epaper/home/20230620_006504.html)
> * [plotting](https://machinelearningmastery.com/plotting-the-training-and-validation-loss-curves-for-the-transformer-model/)
> * [seems to be able to train the model with multiple parameters ](https://simpletransformers.ai/docs/classification-models/)
> * [also ](https://docs.wandb.ai/guides/integrations/simpletransformers)
> * [to see the hidden layer& parameters of model (?)](https://discuss.pytorch.org/t/how-to-print-models-parameters-with-its-name-and-requires-grad-value/10778/5)
:::

:::info
有空可以做
* [x] train with whole data set
* [x] train with multiple peremeters
    > 用逗號連接？
:::



# 20231022 開會
> [name=kuan, 思群][color=lightgreen]
## 進度回報
## 討論內容
- 主要研究方向放在llama，如果有需要gpt的話之後再說
- simple transformers可以拿網路上其他的套件來用
    - bert
- llama的模型很多是因為有不同的任務
    - 有些是別人訓練好丟上來的
    - 可以看功能有沒有我們要的
    - 之後可以試試看
- 如果有要下載大型model的話，可以在回家前下載，因為超出流量的話，它會下載完，隔天去的時候流量又會歸0
- 過程中有任何**小進度**都可以記在hackmd，禮拜日在針對紀錄做回顧
- 如果有進展的話，可以想一下開會時要如何demo
    - hackmd
    - picture

:::info
下周
* [x] 了解CICIDS的每個參數
* [x]  simple transformers的更困難運用
    * 其他範例
    * 圖表
    * 參數
* [x] 下載防毒軟體、自己電腦設定為白名單
* [x] 遠端盡量用RDP，注意資安

如果真的有空
1. 看懂llama跟llama2的差異
:::

# 20231020
1. reproduce https://clay-atlas.com/blog/2022/05/22/simpletransformers-introduction/
2. replace 13b model with a 7b one because of the hardware requirement
3. find a python syntext to train our model (failed)

# 20231018
1. download llama (unfinsh due to internet traffic reaches the maximun of the day)
2. most of work in main.py
3. register huggingface token in local side
4. data pre processing with more simple way
    * save all variable as "feature", and label data as "label" to improve preformance
    * NOT BEEN TESTED YET
5. feel pain on my teeth