数据说明
训练数据共有 file_id、label、api、tid、index 5个字段
测试数据共有 file_id、api、tid、index 4个字段
每个 file_id 对应一个 label 用来标记程序的种类,每个 file_id 有多个 tid,每个 tid 会调用多个 api,api 按照调用的先后顺序编号多个 index
这是一个序列分类的问题,从一串超长的文本序列中提取出信息并进行分类。
特征工程
- 文本预处理
不同于传统的中文文本分类,不需要进行分词、去停用词处理,并且数据经过处理,没有缺失值异常值等。
这里先按照 file_id 分组,设置 labels 和 files 列表,分别用来存储对应 file_id 的种类和 api 拼接序列,最后将 labels 和 files 存储为 pkl 文件
labels = []
files = []
data = pd.read_csv(path)
group_fileid = data.groupby('file_id')
for file_name, file_group in group_fileid:
file_labels = file_group['label'].values[0] # 属于哪一类病毒
result = file_group.sort_values(['tid', 'index'], ascending=True) # 按照 tid 和 index 升序排列
api_sequence = ' '.join(result['api']) # 把 api 拼接起来
labels.append(file_labels)
files.append(api_sequence)
with open("security_train.csv.pkl", 'wb') as f:
pickle.dump(labels, f)
pickle.dump(files, f)
- 特征提取
因为所给数据特征维度不高,这里所有特征都进行选取
- 文本表示
接下来的文本表示会分别使用不同方法,探索不同表示方法对模型的效果及思考所得结果的原因。