1. 比賽介紹
比賽地址:阿里雲惡意程序檢測新人賽
這個比賽和已結束的第三屆阿里雲安全算法挑戰賽賽題類似,是一個開放的長期賽。
2. 前期准備
因為訓練數據量比較大,本地CPU跑不起來,所以決定用Google的Colaboratory來跑,期間也遇到了幾個坑。
首先是文件上傳比較慢,幾個G的文件直接上傳比較耗時,上傳壓縮包后解壓又出現了問題,最后還是得等着上傳完,期間換了好幾個VPN節點。
解壓縮的問題:用unzip命令解壓,速度很慢,經常解壓到一半就不動了或者與colab的連接斷掉了(可能是網絡問題),在Driver里用Zip Extractor軟件解壓也不成功。
此外,colab分配的環境是臨時環境,文件不會一直保存,剛開始沒注意到這點,文件丟失了一次后,才知道要連接到Google Driver,文件存在Driver里。代碼如下。
Google Colab 連接 Google Driver
新建新的jupyternotebook,在空白的單元格中輸入:
!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}
根據提示,點擊網址並輸入驗證碼確定。新建新的空白單元格,輸入:
!mkdir -p drive
!google-drive-ocamlfuse drive
查看drive目錄是否被掛載成功:
!ls
更改工作目錄:
import os
os.chdir("drive")
3. 查看數據
以training data為例,其他數據同樣可以用pandas查看。
import pandas as pd
train_path = './security_train.csv'
data_train = pd.read_csv(train_path)
查看前5行數據:
data_train.head()
~ | file_id | label | api | tid | index |
---|---|---|---|---|---|
0 | 1 | 5 | LdrLoadDll | 2488 | 0 |
1 | 1 | 5 | LdrGetProcedureAddress | 2488 | 1 |
2 | 1 | 5 | LdrGetProcedureAddress | 2488 | 2 |
3 | 1 | 5 | LdrGetProcedureAddress | 2488 | 3 |
4 | 1 | 5 | LdrGetProcedureAddress | 2488 | 4 |
查看行索引:
data_train.index
RangeIndex(start=0, stop=12955, step=1)
查看列屬性:
data_train.columns
Index(['file_id', 'label', 'api', 'tid', 'index'], dtype='object')
查看數據描述信息:
data_train.describe()
~ | file_id | label | tid | index |
---|---|---|---|---|
count | 8.980669e+07 | 8.980669e+07 | 8.980669e+07 | 8.980669e+07 |
mean | 7.078770e+03 | 3.862835e+00 | 2.533028e+03 | 1.547521e+03 |
std | 3.998794e+03 | 2.393783e+00 | 6.995798e+02 | 1.412249e+03 |
min | 1.000000e+00 | 0.000000e+00 | 1.000000e+02 | 0.000000e+00 |
25% | 3.637000e+03 | 2.000000e+00 | 2.356000e+03 | 3.490000e+02 |
50% | 7.161000e+03 | 5.000000e+00 | 2.564000e+03 | 1.085000e+03 |
75% | 1.055100e+04 | 5.000000e+00 | 2.776000e+03 | 2.503000e+03 |
max | 1.388700e+04 | 7.000000e+00 | 2.089600e+04 | 5.000000e+03 |
4. 模型訓練
數據預處理和模型訓練用的代碼是 RManofCH 分享的代碼,數據量大,在colab上跑了一整天。
其間遇到了一個 'keras.backend' has no attribute 'tf' 的問題,應該是Keras版本的問題
添加包,並將相應的K.tf.xxx修改為tf.xxx即可。
import tensorflow as tf
import tensorflow.keras.backend as B
import tensorflow_hub as hub
from tensorflow.python.keras.engine import Layer
最終成績為:logloss: 0.472666
5. 初次實踐心得
因為是第一次接觸數據競賽,主要是學習了下別人的思路,跑了下訓練代碼,沒有做什么有意義的修改。
感受了下訓練大量數據時的龜速,學習了一下幾個常用模型的思路以及模型融合的方法。
6. 組會總結
1)自己調模型做優化,漸進式學習比較好,逐步提高,跑現成的代碼學到的東西不多,
2)先關注學習過程,結果分數暫時不重要,正式比賽優秀選手都有團隊、套路,還有很大差距,
3)先要分析下數據,理解下問題,根據具體的業務場景做模型選擇,參數調優,不同的業務需要采用不同的解決方法,沒有萬能的策略,