器學(xué)習(xí)驅(qū)動(dòng)的惡意流量識(shí)別:特征設(shè)計(jì)、模型調(diào)參與評(píng)估實(shí)戰(zhàn))
搞畢設(shè)選了“基于機(jī)器學(xué)習(xí)的惡意流量識(shí)別檢測(cè)”這個(gè)方向說(shuō)實(shí)話(huà)一開(kāi)始心里是有點(diǎn)沒(méi)底的。這個(gè)題目聽(tīng)起來(lái)就帶著一股“硬核”味道真正動(dòng)手之后才發(fā)現(xiàn)它牽扯到網(wǎng)絡(luò)攻防、流量分析、數(shù)據(jù)挖掘、模型訓(xùn)練與評(píng)估這一整條長(zhǎng)鏈條任何一個(gè)環(huán)節(jié)掉鏈子都做不出一個(gè)像樣的系統(tǒng)。但也正因?yàn)殒湕l長(zhǎng)、內(nèi)容多這個(gè)方向的含金量很足無(wú)論是對(duì)付畢業(yè)答辯、面試找工作還是以后想往網(wǎng)絡(luò)安全或數(shù)據(jù)科學(xué)方向繼續(xù)深耕都是一塊很扎實(shí)的底子。這篇文章把我從選題到落地的完整過(guò)程包括踩過(guò)的坑、調(diào)參的經(jīng)驗(yàn)、對(duì)評(píng)估指標(biāo)的理解一次性整理出來(lái)。不管你是正在為畢設(shè)選題發(fā)愁還是已經(jīng)開(kāi)題想找點(diǎn)參考或者是剛?cè)腴T(mén)網(wǎng)絡(luò)安全想了解機(jī)器學(xué)習(xí)在這個(gè)場(chǎng)景里怎么落地這篇文章都能給你一些實(shí)在的參考。1. 項(xiàng)目核心思路與整體設(shè)計(jì)1.1 為什么不用傳統(tǒng)規(guī)則方案而是上機(jī)器學(xué)習(xí)很多人在做惡意流量識(shí)別時(shí)第一反應(yīng)都是走傳統(tǒng)規(guī)則路線(xiàn)提取流量的特征比如源IP、目的IP、端口、協(xié)議類(lèi)型再根據(jù)已知攻擊行為的特征建立規(guī)則庫(kù)命中規(guī)則就判定為惡意。這種思路本身沒(méi)錯(cuò)但它有很明顯的天花板。傳統(tǒng)規(guī)則方案的第一個(gè)問(wèn)題是只能識(shí)別已知攻擊。規(guī)則庫(kù)里的每一條規(guī)則都是安全工程師人工總結(jié)出來(lái)的對(duì)于變種攻擊或者從未出現(xiàn)過(guò)的攻擊方式規(guī)則庫(kù)基本無(wú)能為力。第二個(gè)問(wèn)題是誤報(bào)率和漏報(bào)率很難平衡。規(guī)則設(shè)得松惡意流量容易漏過(guò)去規(guī)則設(shè)得緊正常流量又被大量誤殺。第三個(gè)問(wèn)題更現(xiàn)實(shí)維護(hù)成本高。網(wǎng)絡(luò)環(huán)境里流量形態(tài)千變?nèi)f化規(guī)則庫(kù)要持續(xù)人工更新對(duì)人力資源的要求很重。機(jī)器學(xué)習(xí)方案的邏輯完全不同。它不是靠人去總結(jié)攻擊特征而是把大量已知的惡意流量和正常流量喂給模型讓模型自己去學(xué)習(xí)兩者之間隱藏的差異。這些差異可能很微妙比如某個(gè)端口的流量在凌晨出現(xiàn)規(guī)律性的小包突發(fā)或者某個(gè)IP的訪問(wèn)時(shí)間間隔呈現(xiàn)極其均勻的節(jié)律性這些都是人眼很難直接總結(jié)、但模型能捕捉到的模式。打個(gè)比方傳統(tǒng)規(guī)則方案像安檢員拿著一份“嫌疑人員名單”看到名單上的人就攔下來(lái)而機(jī)器學(xué)習(xí)方案更像行為分析員不看身份只看這個(gè)人是不是左顧右盼、來(lái)回踱步、行為異常。后者顯然更能應(yīng)對(duì)“換了身份但行為可疑”的情況。1.2 系統(tǒng)整體架構(gòu)怎么搭整個(gè)系統(tǒng)的架構(gòu)我分成了四個(gè)層次數(shù)據(jù)采集層、特征工程層、模型訓(xùn)練層、判定與輸出層。數(shù)據(jù)采集層負(fù)責(zé)獲取網(wǎng)絡(luò)流量數(shù)據(jù)。畢設(shè)場(chǎng)景下一般有兩種來(lái)源一種是使用公開(kāi)的學(xué)術(shù)流量數(shù)據(jù)集另一種是在實(shí)驗(yàn)環(huán)境里自己抓包采集。我實(shí)際做的時(shí)候是兩者結(jié)合公開(kāi)數(shù)據(jù)保證模型訓(xùn)練的樣本量自采數(shù)據(jù)用來(lái)驗(yàn)證模型在真實(shí)場(chǎng)景里的泛化能力。注意自己抓包的時(shí)候一定要在可控的隔離環(huán)境里進(jìn)行不要直接在公共網(wǎng)絡(luò)上做實(shí)驗(yàn)。特征工程層是整個(gè)系統(tǒng)的核心負(fù)責(zé)把原始流量轉(zhuǎn)換成模型能理解的特征矩陣。原始流量是二進(jìn)制的報(bào)文沒(méi)法直接丟進(jìn)模型必須先解析成結(jié)構(gòu)化的元數(shù)據(jù)然后再提取出有區(qū)分度的特征。這一層的工作量占到了整個(gè)項(xiàng)目的六成以上后面我會(huì)專(zhuān)門(mén)展開(kāi)講。模型訓(xùn)練層就是選擇算法、切分?jǐn)?shù)據(jù)、調(diào)參評(píng)估這一套流程。這個(gè)環(huán)節(jié)看似標(biāo)準(zhǔn)但里面的坑非常多尤其是數(shù)據(jù)泄露、類(lèi)別不平衡、過(guò)擬合這幾個(gè)問(wèn)題任何一個(gè)處理不當(dāng)都會(huì)讓模型在測(cè)試集上表現(xiàn)虛高一到真實(shí)場(chǎng)景就原形畢露。判定與輸出層是面向用戶(hù)的輸入一段流量經(jīng)過(guò)特征提取和模型推理輸出它是正常流量還是惡意流量同時(shí)給出置信度分?jǐn)?shù)。置信度這個(gè)輸出非常關(guān)鍵因?yàn)榱髁孔R(shí)別不像垃圾郵件分類(lèi)那么單純一個(gè)低置信度的判定結(jié)果應(yīng)該觸發(fā)人工審核或更嚴(yán)格的二次分析而不是直接一刀切。2. 數(shù)據(jù)獲取與特征工程實(shí)戰(zhàn)2.1 數(shù)據(jù)集怎么選樣本結(jié)構(gòu)怎么看做監(jiān)督學(xué)習(xí)數(shù)據(jù)就是地基。你在網(wǎng)上能找到公開(kāi)的學(xué)術(shù)流量數(shù)據(jù)集包含多種攻擊類(lèi)型的流量樣本比如掃描探測(cè)、暴力破解、拒絕服務(wù)、Web注入攻擊等。首先建議下載的版本要選更新一點(diǎn)的因?yàn)榱髁繑?shù)據(jù)集也存在“過(guò)時(shí)”問(wèn)題幾年前采集的樣本和今天的真實(shí)網(wǎng)絡(luò)環(huán)境差別很大模型學(xué)到的模式可能已經(jīng)失真了。我選數(shù)據(jù)集時(shí)的篩選標(biāo)準(zhǔn)有三個(gè)樣本量要足夠每個(gè)類(lèi)別至少要有幾千條樣本太少的話(huà)模型學(xué)不到穩(wěn)定的模式類(lèi)別覆蓋要全面既要有常見(jiàn)的攻擊類(lèi)型也要有足夠多的正常流量最好是接近真實(shí)環(huán)境的比例特征字段要完整有些數(shù)據(jù)集直接提供特征CSV省去了解析pcap的時(shí)間但也意味著你受限于原始特征無(wú)法自己定制另外提醒一下如果數(shù)據(jù)集里的惡意流量和正常流量比例是50%對(duì)50%這跟真實(shí)場(chǎng)景差距很大?,F(xiàn)實(shí)中惡意流量往往是少數(shù)可能只占到總流量的1%到5%。所以我在訓(xùn)練時(shí)會(huì)先按原始比例測(cè)試模型表現(xiàn)再評(píng)估在類(lèi)別不平衡情況下的表現(xiàn)這樣更有參考意義。2.2 特征設(shè)計(jì)到底從流量里提取什么這是整個(gè)項(xiàng)目里最重要的一步。特征設(shè)計(jì)得好不好直接決定了模型的天花板。很多人一上來(lái)就堆特征把能算的都算上讓模型自己篩選但我的經(jīng)驗(yàn)是好的特征設(shè)計(jì)不是堆數(shù)量而是理解攻擊行為會(huì)在流量里留下什么痕跡。我把特征分成四大類(lèi)第一類(lèi)是流統(tǒng)計(jì)特征。每一組流量可以看成一條“流”比如同一個(gè)五元組源IP、源端口、目的IP、目的端口、協(xié)議下的雙向包序列。對(duì)每個(gè)流計(jì)算包長(zhǎng)的均值、方差、最大值、最小值、包數(shù)量、字節(jié)總數(shù)等。這些統(tǒng)計(jì)量能粗粒度地反映流量形態(tài)。比如一個(gè)正常的網(wǎng)頁(yè)訪問(wèn)數(shù)據(jù)包的包長(zhǎng)分布比較散有大包有小包而某些惡意掃描工具的流量包長(zhǎng)可能異常均勻。第二類(lèi)是時(shí)間相關(guān)特征。包括包到達(dá)時(shí)間間隔的均值與方差、流的持續(xù)時(shí)間、每秒包數(shù)等。這一類(lèi)特征尤其擅長(zhǎng)識(shí)別機(jī)械化行為。我基于實(shí)際項(xiàng)目場(chǎng)景做特征提取時(shí)發(fā)現(xiàn)很多惡意工具發(fā)包的節(jié)奏是嚴(yán)格恒定的時(shí)間間隔幾乎是一個(gè)常數(shù)而人類(lèi)操作產(chǎn)生的流量時(shí)間間隔有自然的隨機(jī)性。這一差異在特征分布上非常明顯模型很容易學(xué)到。第三類(lèi)是協(xié)議特征。比如TCP標(biāo)志位分布、端口分布、協(xié)議類(lèi)型占比。某些攻擊行為會(huì)有獨(dú)特的協(xié)議指紋比如SYN Flood攻擊里SYN包的比例異常高而正常握手流程中SUN包是成對(duì)出現(xiàn)且比例穩(wěn)定。這個(gè)特征維度不需要太復(fù)雜但信息量很大。第四類(lèi)是載荷特征。包括載荷大小的分布、載荷內(nèi)容熵值。如果一段流量的載荷熵值非常高大概率是加密數(shù)據(jù)或經(jīng)過(guò)混淆的工具產(chǎn)生的流量。對(duì)于二進(jìn)制協(xié)議的識(shí)別載荷熵是一個(gè)逃不掉的核心特征。我在實(shí)際動(dòng)手時(shí)用的組合方案是從流量文件或CSV樣本中提取上述四類(lèi)特征最終形成一張以“流”為單位的特征表每一行是一條流每一列是一個(gè)特征。上面這幾類(lèi)加起來(lái)大概40個(gè)左右的特征對(duì)畢設(shè)來(lái)說(shuō)完全夠用了。特征不是越多越好很多高度相關(guān)的特征只會(huì)增加模型復(fù)雜度和過(guò)擬合風(fēng)險(xiǎn)。2.3 特征處理的關(guān)鍵細(xì)節(jié)特征提取完之后還必須經(jīng)過(guò)幾步處理才能真正投入訓(xùn)練這里每一步都有講究。首先是數(shù)據(jù)清洗。原始數(shù)據(jù)里經(jīng)常有空值、異常值、Inf值我的做法是使用數(shù)據(jù)的均值或者中位數(shù)進(jìn)行填充然后處理異常的大數(shù)值避免個(gè)別極端值把模型帶偏。然后是特征歸一化。不同特征的量綱差很多包長(zhǎng)可能是幾千字節(jié)時(shí)間間隔卻只有幾毫秒。如果不做歸一化梯度下降類(lèi)的算法很容易被數(shù)值大的特征主導(dǎo)樹(shù)模型雖然不怕這個(gè)但統(tǒng)一歸一化對(duì)后續(xù)換其他模型做對(duì)比有好處。我用的是Z-Score標(biāo)準(zhǔn)化讓每個(gè)特征均值為0、標(biāo)準(zhǔn)差為1。還有一個(gè)非常關(guān)鍵的細(xì)節(jié)數(shù)據(jù)的劃分順序。我當(dāng)時(shí)差點(diǎn)踩坑差點(diǎn)先對(duì)整個(gè)數(shù)據(jù)集做歸一化再切分訓(xùn)練集和測(cè)試集這是典型的遲早翻車(chē)的操作。因?yàn)闅w一化要用到全局的均值和方差如果這個(gè)統(tǒng)計(jì)量是在包含測(cè)試集的所有數(shù)據(jù)上計(jì)算出來(lái)的那測(cè)試集的信息就已經(jīng)在訓(xùn)練階段被模型間接看到了測(cè)試結(jié)果會(huì)虛高。正確做法是先切分?jǐn)?shù)據(jù)再在訓(xùn)練集上擬合標(biāo)準(zhǔn)化器再分別應(yīng)用到訓(xùn)練集和測(cè)試集上。3. 模型選型、訓(xùn)練與調(diào)參實(shí)錄3.1 模型選型從傳統(tǒng)模型到深度學(xué)習(xí)的取舍模型選型這塊我做了好幾組對(duì)比實(shí)驗(yàn)。這里放一個(gè)我當(dāng)時(shí)用來(lái)做決策的對(duì)照表整理了很多人在這個(gè)場(chǎng)景下的經(jīng)驗(yàn)?zāi)P蛢?yōu)點(diǎn)缺點(diǎn)適用場(chǎng)景邏輯回歸訓(xùn)練快、可解釋性極強(qiáng)非線(xiàn)性表達(dá)能力弱特征交互學(xué)不到快速基線(xiàn)、特征篩選、上線(xiàn)低保底方案隨機(jī)森林非線(xiàn)性強(qiáng)、不需要精細(xì)調(diào)參、容錯(cuò)高數(shù)據(jù)集大時(shí)推理偏慢、可解釋性稍弱絕大多數(shù)畢設(shè)項(xiàng)目的首選基線(xiàn)XGBoost/LightGBM性能上限高、工程優(yōu)化好、GPU加速調(diào)參復(fù)雜、過(guò)擬合風(fēng)險(xiǎn)需要控制競(jìng)賽和數(shù)據(jù)競(jìng)賽場(chǎng)景的頂配方案CNN能自動(dòng)學(xué)習(xí)局部模式適合載荷內(nèi)容分類(lèi)需要把流量處理成矩陣可解釋性差針對(duì)載荷內(nèi)容判別、加密流量識(shí)別LSTM/GRU能建模序列依賴(lài)適合時(shí)間相關(guān)特征訓(xùn)練慢、數(shù)據(jù)需求大、容易過(guò)擬合序列特征明顯的流量識(shí)別任務(wù)從我實(shí)際測(cè)試的情況來(lái)看如果特征做得好隨機(jī)森林和XGBoost已經(jīng)能達(dá)到非常高的性能上限。我甚至可以說(shuō)一句得罪人的話(huà)在畢設(shè)場(chǎng)景下一上來(lái)就奔著深度學(xué)習(xí)跑往往會(huì)因?yàn)閿?shù)據(jù)量不夠?qū)е滦Ч蝗鐦?shù)模型而且調(diào)試復(fù)雜度和時(shí)間成本會(huì)翻倍提高。建議先做樹(shù)模型拿到強(qiáng)基線(xiàn)再根據(jù)精力決定要不要嘗試深度模型。3.2 數(shù)據(jù)劃分與交叉驗(yàn)證怎么配數(shù)據(jù)劃分的比例我用的是訓(xùn)練集70%、驗(yàn)證集15%、測(cè)試集15%。測(cè)試集必須獨(dú)立還要保證每個(gè)類(lèi)別的比例和原始數(shù)據(jù)集一致所以要加分層抽樣。我在項(xiàng)目里就是用分層抽樣函數(shù)直接處理能保證訓(xùn)練集、驗(yàn)證集、測(cè)試集里正負(fù)樣本的比例基本一致避免某些類(lèi)在某個(gè)集里過(guò)大或過(guò)小影響評(píng)估公平性。交叉驗(yàn)證我用的是5折。也就是把訓(xùn)練集再隨機(jī)切分為5份每次用4份做訓(xùn)練、1份做驗(yàn)證循環(huán)5次最后取驗(yàn)證指標(biāo)的平均值。為什么不用更常見(jiàn)的10折因?yàn)榱髁繑?shù)據(jù)量本身不小5折已經(jīng)足夠穩(wěn)定而且每一折訓(xùn)練一個(gè)模型的時(shí)間要少一半迭代調(diào)參時(shí)效率很重要。調(diào)參順序上先粗后細(xì)。第一步確定樹(shù)模型的數(shù)量我用的是交叉驗(yàn)證看收斂曲線(xiàn)的方法模型棵樹(shù)從100到1000看性能在哪個(gè)范圍開(kāi)始飽和我測(cè)下來(lái)在400到600棵時(shí)增益就很小了。第二步調(diào)樹(shù)的深度和葉子節(jié)點(diǎn)的最小樣本數(shù)。深度從3到10這樣試超過(guò)8之后性能就開(kāi)始出現(xiàn)下降趨勢(shì)說(shuō)明模型變得過(guò)擬合了。第三步調(diào)學(xué)習(xí)率從0.1降到0.05代價(jià)是棵樹(shù)要增多但驗(yàn)證集指標(biāo)確實(shí)會(huì)好一點(diǎn)點(diǎn)。調(diào)參沒(méi)有玄學(xué)就是網(wǎng)格搜索加交叉驗(yàn)證拿數(shù)據(jù)說(shuō)話(huà)。3.3 代價(jià)敏感與閾值調(diào)整很多人在做分類(lèi)任務(wù)時(shí)默認(rèn)把概率閾值定在0.5也就是模型預(yù)測(cè)惡意概率大于50%就判定為惡意。這在流量識(shí)別場(chǎng)景里是有問(wèn)題的。惡意流量檢測(cè)屬于典型的代價(jià)不均衡問(wèn)題把惡意流量放過(guò)去漏報(bào)可能讓整個(gè)網(wǎng)絡(luò)被滲透、數(shù)據(jù)被竊取把正常流量攔下來(lái)誤報(bào)最多是讓用戶(hù)多刷新一次頁(yè)面。漏報(bào)的代價(jià)遠(yuǎn)高于誤報(bào)。所以我做了一件事在驗(yàn)證集上遍歷不同的閾值找一個(gè)讓F1分?jǐn)?shù)最大化、同時(shí)漏報(bào)率不過(guò)高的折中點(diǎn)。實(shí)測(cè)下來(lái)把閾值從0.5降到0.3左右召回率能提升好幾個(gè)百分點(diǎn)而精確率只下降很少。這個(gè)經(jīng)驗(yàn)特別重要分享給所有做安全類(lèi)目分類(lèi)任務(wù)的人默認(rèn)閾值只是起點(diǎn)不是答案。我在訓(xùn)練過(guò)程中還用了類(lèi)別權(quán)重來(lái)讓模型更重視少數(shù)類(lèi)。具體做法是把少數(shù)類(lèi)的權(quán)重調(diào)高相當(dāng)于告訴模型“分錯(cuò)這類(lèi)樣本的代價(jià)更大”模型自然會(huì)傾斜優(yōu)化少數(shù)類(lèi)的識(shí)別效果。4. 評(píng)估體系與效果分析4.1 千萬(wàn)別只盯著準(zhǔn)確率流量識(shí)別場(chǎng)景里最容易踩的坑就是拿準(zhǔn)確率當(dāng)唯一指標(biāo)。舉個(gè)例子如果數(shù)據(jù)集中95%是正常流量5%是惡意流量那么一個(gè)什么都不做、無(wú)腦全判正常的模型準(zhǔn)確率也有95%。這看起來(lái)很高但它毫無(wú)檢測(cè)能力就是個(gè)廢物模型。所以我的評(píng)估體系核心看的是三個(gè)維度精確率、召回率、F1分?jǐn)?shù)外加混淆矩陣和ROC-AUC。精確率衡量的是你判定的惡意流量里有多少是真的惡意召回率衡量的是所有真實(shí)惡意流量里有多少被你抓到了。F1是兩者的調(diào)和平均綜合反映模型在類(lèi)別不平衡下的表現(xiàn)。ROC-AUC則是一個(gè)跟閾值無(wú)關(guān)的排序能力指標(biāo)適合評(píng)估模型本身的判別力。我實(shí)際測(cè)試下來(lái)的結(jié)果是這樣的框架隨機(jī)森林基線(xiàn)模型在測(cè)試集上的AUC能夠達(dá)到0.98以上F1在0.95附近XGBoost把F1往上提到了0.96到0.97。這個(gè)看起來(lái)提升不大但對(duì)于惡意流量檢測(cè)來(lái)說(shuō)假陽(yáng)性率哪怕只下降1%都意味著大量正常用戶(hù)不被誤傷。在安全場(chǎng)景里幾個(gè)百分點(diǎn)的差距實(shí)際體驗(yàn)差別是非常明顯的。4.2 混淆矩陣怎么讀才有意義混淆矩陣這四個(gè)格子在流量識(shí)別場(chǎng)景里各有各的意義。真正惡意且被判為惡意的是真正例。這部分是你實(shí)打?qū)嵶サ降墓袅髁繑?shù)量越多越好。真正正常且被判為正常的是真負(fù)例。這部分用戶(hù)流量不受打擾模型做得好這個(gè)數(shù)值自然高。關(guān)鍵是那兩種錯(cuò)誤。正常流量被誤判成惡意是假正例。這類(lèi)誤報(bào)的直接后果是用戶(hù)的正常請(qǐng)求被阻斷嚴(yán)重的時(shí)候甚至?xí)l(fā)業(yè)務(wù)事故。惡意流量被判成正常是假負(fù)例這是安全場(chǎng)景里最不能接受的錯(cuò)誤因?yàn)槁┑舻墓袅髁恐苯永@過(guò)了防線(xiàn)。我調(diào)閾值和類(lèi)別權(quán)重本質(zhì)就是在假正例和假負(fù)例之間找一個(gè)最適合業(yè)務(wù)訴求的平衡點(diǎn)。我做完這次實(shí)驗(yàn)后對(duì)評(píng)估指標(biāo)的理解發(fā)生了很大變化。以前覺(jué)得模型訓(xùn)練完打印一行準(zhǔn)確率0.97就很開(kāi)心現(xiàn)在拿到結(jié)果第一反應(yīng)是打開(kāi)混淆矩陣看那四個(gè)格子的分布尤其是假負(fù)例那一格。4.3 類(lèi)別不平衡問(wèn)題的處理流量識(shí)別場(chǎng)景天然存在類(lèi)別不平衡惡意流量永遠(yuǎn)是少數(shù)。我的處理分三層。第一層是算法層面調(diào)整類(lèi)別權(quán)重。讓模型知道分錯(cuò)少數(shù)類(lèi)的代價(jià)更高這是最簡(jiǎn)單也最有效的手段我用完之后召回率提升很明顯。第二層是數(shù)據(jù)層面對(duì)少數(shù)類(lèi)做過(guò)采樣或者對(duì)多數(shù)類(lèi)做欠采樣。我試過(guò)SMOTE過(guò)采樣法通過(guò)在已有惡意樣本的特征空間里插值合成新樣本而不是簡(jiǎn)單復(fù)制效果比普通復(fù)制好不少。但要注意一個(gè)原則過(guò)采樣只能在訓(xùn)練集上做絕對(duì)不能碰測(cè)試集否則評(píng)估結(jié)果完全失真。第三層是閾值層面就是前面說(shuō)的遍歷閾值找最優(yōu)切分點(diǎn)這也是最容易被忽略但性?xún)r(jià)比極高的一步。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 數(shù)據(jù)泄露最隱蔽又最致命的問(wèn)題這是我這次項(xiàng)目里遇到的最大坑值得單獨(dú)拿出來(lái)說(shuō)。所謂數(shù)據(jù)泄露就是測(cè)試集的“答案”在訓(xùn)練過(guò)程中被模型看到了導(dǎo)致測(cè)試指標(biāo)虛高。遇到這種情況模型在實(shí)驗(yàn)室里表現(xiàn)完美放到真實(shí)網(wǎng)絡(luò)環(huán)境里就原形畢露。流量識(shí)別里最常見(jiàn)的幾個(gè)泄露源一個(gè)是對(duì)整個(gè)數(shù)據(jù)集先做標(biāo)準(zhǔn)化再劃分訓(xùn)練測(cè)試集這會(huì)導(dǎo)致測(cè)試集的分布信息間接進(jìn)入訓(xùn)練過(guò)程另一個(gè)是特征提取時(shí)用了未來(lái)的信息比如用一整段時(shí)間窗口的中心統(tǒng)計(jì)量去描述某個(gè)時(shí)間點(diǎn)的流行為本質(zhì)上你的特征里已經(jīng)包含了測(cè)試期之后的信息。我在項(xiàng)目迭代到第三版時(shí)發(fā)現(xiàn)了這個(gè)問(wèn)題原因是測(cè)試集AUC高得離譜接近0.999。當(dāng)時(shí)就覺(jué)得不對(duì)勁排查之后發(fā)現(xiàn)是特征提取腳本里用到了全局均值。修復(fù)之后AUC降到了0.98附近這才是真實(shí)的水平。所以建議做這類(lèi)項(xiàng)目的同學(xué)在拿到一個(gè)異常高的指標(biāo)時(shí)先懷疑是不是數(shù)據(jù)泄露了。5.2 過(guò)擬合與模型復(fù)雜度控制樹(shù)模型在特征過(guò)多但樣本不夠時(shí)會(huì)非常容易過(guò)擬合。我之前一版模型在訓(xùn)練集上的F1是0.99測(cè)試集卻掉到了0.88這就是教科書(shū)式的過(guò)擬合??刂七^(guò)擬合我有三個(gè)手段。第一個(gè)是限制樹(shù)的復(fù)雜度調(diào)小樹(shù)的深度和葉子節(jié)點(diǎn)最小樣本數(shù)。第二個(gè)是增加正則化參數(shù)這個(gè)在XGBoost里表現(xiàn)得尤其明顯。第三個(gè)是早停法每次迭代后看驗(yàn)證集指標(biāo)如果連續(xù)50輪沒(méi)有提升就停止訓(xùn)練可以保存最優(yōu)模型而不是最后一輪模型這個(gè)技巧能顯著降低最后的過(guò)擬合風(fēng)險(xiǎn)。5.3 實(shí)時(shí)檢測(cè)延遲怎么優(yōu)化訓(xùn)練只是一個(gè)環(huán)節(jié)模型上線(xiàn)做實(shí)時(shí)推理的時(shí)候會(huì)遇到性能問(wèn)題。我的檢測(cè)模塊要對(duì)每條流做特征提取然后喂給模型預(yù)測(cè)實(shí)測(cè)下來(lái)特征提取的耗時(shí)遠(yuǎn)大于模型推理本身。優(yōu)化方案也分了層級(jí)。第一層是批量推理把一秒內(nèi)到達(dá)的流量打包成一個(gè)矩陣丟給模型一次預(yù)測(cè)幾百條吞吐量立刻提升。第二層是特征緩存復(fù)用同一五元組持續(xù)產(chǎn)生的流量很多中間統(tǒng)計(jì)量可以增量更新不必每次從頭計(jì)算。第三層是把模型導(dǎo)出成輕量級(jí)格式推理速度快很多部署也方便。這三層優(yōu)化做完之后單條流的平均處理時(shí)間從十幾毫秒降到了幾毫秒已經(jīng)可以滿(mǎn)足中等規(guī)模場(chǎng)景下的實(shí)時(shí)檢測(cè)需求。5.4 排查速查表把這次項(xiàng)目里遇到的典型問(wèn)題整理成一個(gè)速查表方便回頭查看。問(wèn)題表現(xiàn)可能原因排查手段訓(xùn)練集指標(biāo)極高、測(cè)試集大幅下降過(guò)擬合檢查樹(shù)深度限制增加正則化用早停測(cè)試集AUC接近1.0疑似數(shù)據(jù)泄露檢查標(biāo)準(zhǔn)化時(shí)機(jī)、特征是否用了未來(lái)信息精確率極高、召回率極低閾值設(shè)置偏高遍歷閾值平衡精確率和召回率召回率極高、精確率極低類(lèi)別權(quán)重過(guò)大降低少數(shù)類(lèi)權(quán)重重新評(píng)估真實(shí)環(huán)境效果遠(yuǎn)差于測(cè)試訓(xùn)練數(shù)據(jù)和真實(shí)數(shù)據(jù)分布差異大增加數(shù)據(jù)來(lái)源多樣性做好特征歸一化6. 項(xiàng)目總結(jié)與擴(kuò)展方向做這個(gè)項(xiàng)目的半年里我最大的體會(huì)是模型訓(xùn)練只是水面之上的一角水面之下的數(shù)據(jù)理解、特征設(shè)計(jì)、評(píng)估權(quán)衡才是真正的工程核心。很多人把機(jī)器學(xué)習(xí)項(xiàng)目理解成調(diào)參大賽但拿這個(gè)做畢設(shè)你會(huì)發(fā)現(xiàn)最有挑戰(zhàn)的部分是你如何設(shè)計(jì)一個(gè)能真實(shí)反映攻擊行為的特征體系以及你如何理解評(píng)估指標(biāo)背后每一類(lèi)錯(cuò)誤的代價(jià)。如果后面想在這個(gè)項(xiàng)目基礎(chǔ)上做擴(kuò)展有幾條路是性?xún)r(jià)比很高的把檢測(cè)粒度從“流”升級(jí)到“會(huì)話(huà)”甚至“用戶(hù)行為序列”可以抓到更多慢速攻擊加入在線(xiàn)學(xué)習(xí)機(jī)制讓模型能根據(jù)新出現(xiàn)的流量類(lèi)型做增量更新把檢測(cè)結(jié)果接入自動(dòng)化響應(yīng)模塊這樣就從“能發(fā)現(xiàn)”升級(jí)到了“能處置”。這幾個(gè)方向都能顯著提升項(xiàng)目的完整度和深度。最后再分享一個(gè)小技巧訓(xùn)練過(guò)程中保存特征版本和模型版本的習(xí)慣一定要養(yǎng)成每次實(shí)驗(yàn)記錄使用的數(shù)據(jù)、特征腳本、超參數(shù)和評(píng)估結(jié)果。這個(gè)習(xí)慣讓我的復(fù)盤(pán)效率高了很多答辯時(shí)講項(xiàng)目演進(jìn)的邏輯也特別清晰。希望這些經(jīng)驗(yàn)?zāi)軒湍闵僮咭恍澛贰?