在去年11月底的時候,因緣際會下有位學長通知我去參加這個由資策會資安所舉辦的惡意程式分類競賽,這是一個為期一個月的競賽,以競賽時程來說算是相對小品的競賽。以下擷取活動網站的競賽內容:
本次競賽中的每一筆惡意程式 (malware) 均有一組可獨立辨識的 md5 編碼,競賽者須透過人工智慧訓練、推論技術,對每一筆惡意程式進行類別 (class) 可能性的歸屬判定。
總之就是要透過ML/DL的方式來進行惡意程式的分類,期間只有一個月,而資料的大小又蠻大的(train + test ~ 60G)所以其實沒有什麼太多時間做無謂的嘗試,整個時程大約被我分成三個階段,就我自己來說,我覺得所有資料科學競賽的規劃其實都是大同小異的:
- 資料前處理,做一些基本的特徵萃取和建立base line
- 基於baseline開始嘗試一些額外的不同方式
- 大約最後一個禮拜,開始就現有最好的模型版本進行進一步的調參
建立base line
一開始建立base line是很重要的一件事,這可以讓你的其他模型有了比較的依據,如何建立base line?有很多方法,最簡單的就是亂猜:
- 全部都猜某一類別
- 按照類別數量猜機率
如果你的模型分數比上述亂猜得還爛,那就知道一定哪裡有問題,可以立即轉換其他策略。其他建立baseline的方法如透過簡單的ML model(SVM, Regression, RandomForest…)快速得到一個結果都是不錯的方式。
特徵萃取
接下來就是資料前處理,可以上網去看有沒有類似的資訊可以做為萃取特徵的參考。其實找一下就可以發現這次競賽和2016年的微軟惡意程式競賽類型非常相似。於是在此次的競賽我使用了基本的language model - N-gram來做特徵萃取,在資料量龐大N又很大的情況下這一步驟其實花了我不少的時間,不過其實有還不錯的結果。最後使用了N = 1, 3, 4, 7, 10的N-gram模型作為特徵。此外,檔案的壓縮率和檔案大小也有被我納入作為特徵。
進一步的嘗試
透過了基本的特徵取得了一定程度的結果後,中間大約一個禮拜開始嘗試一些比較不同的方式看看是否能取得出乎意料的結果,像是:DL-based的CNN/RNN、其他的feature…不過這個部分最後並沒有提升分數,所以沒有被採用。儘管如此,就競賽的規劃來說這個階段還是必要的,有時候可以發現意想不到的特徵而一舉贏過其他參賽者。
模型調參
在競賽結束大約剩下一個禮拜的時刻,算算時間差不多該停手了,這時候要做的不應該事繼續探索未知的新特徵,而是在自己的模型下如何讓分數變得更好,有參加過競賽的都知道,分數差個0.01都會影響排名,這時候模型參數的好壞就顯得很重要。最後一個禮拜都花grid search在調整xgboost和lightgbm的參數(其實時間來說還非常不夠用,並沒有將模型調到最好),並將兩個模型的結果進行ensemble。
進階處理
這我把它獨立出來說,因為我覺得這個部分其實蠻tricky的,根據不同的競賽、資料集會有不同的應對策略。 比方說這次競賽是以logloss作為評分依據(logloss就是cross entropy),所以這裡就要知道你用accuracy來做的話會很慘(自己就中槍過一次QQ)。 此外log有個特性就是你猜到狠準的時候(越接近1)其實分數就不會影響太多;相對來說猜很不準的時候(很接近0)分數的變動幅度會很可怕,所以就可以想辦法去做probability clip來避免這個問題。 再來,資料有imbalanced的問題時,一定程度會影響模型的預測結果,所以這時候就有兩種方式可以來應對:over-sampling 和 down-sampling,不同方式適用不同的場景。 接下來,模型預測的結果可以透過confusion matrix來看到底分類得狀況如何,如果有某幾類怎麼分都分不好,也可以試著單獨針對那幾類做一些特別的處理。
整個一個月的時間雖然看似很長,但其實非常的短,每個步驟都花了相對大的時間和精力,訓練模型訓練到懷疑人生、調整參數調到懷疑人生、每天12點還要上去看排名看到懷疑人生…
最後,我的public score /private score都在第三名的排名,也有這個榮幸在頒獎典禮上和其他參賽者進行交流和經驗分享,感謝資策會資安所舉辦了這個活動,讓我們可以對資安有更進一步的認識外,也可以認識台灣其他的Data scientist。下面就放個幾張頒獎典禮上的照片當作這篇文章的結尾~