本文正在参加「金石计划 . 分割6万现金大奖」

前语

在之前的博文 【AI】浅析歹意文件静态检测及部分问题解决思路 中,博主提及过歹意文件静态检测的一种方法,并因而练习了模型,由于样本量巨大以及资源有限,练习一个 epoch 就需求一周多的时刻,因而就先拿练习过一个 epoch 的模型来进行测验;

拉取测验集

既然是要用来测验的样本,那么咱们要尽可能的与练习集以及验证会集的样本不相同,因而,最好在一开端就做好分类,或者能够借用调集 set 的特性来整合;

咱们先用练习集和验证集进行测验,伪代码如下:

with open('...pkl', 'rb') as f:
    train_data = pickle.load(f)
with open('...pkl', 'rb') as f:
    val_data = pickle.load(f)
train_data_ = [x[0] for x in train_data]
val_data_ = [x[0] for x in val_data]
zz = set(train_data_) - set(val_data_)

【AI】恶意文件静态检测模型检验及小结

能够看到数量是完全相同的,因而练习集和验证集没有交集,即两者之间没有重复的样本;

接下来咱们就开端拉去测验集,先从 Metadata_PE 表中去获取到 pathsha256 字段,然后在依据 sha256Event_PE_lab_22_11_24 表中进行查询 lab 标签;

【AI】恶意文件静态检测模型检验及小结

这儿的话,能够依据联合索引,直接从数据库中将全部数据导入,借用 pymsqlpandas 的包,在 python 中处理的速度比原生 SQL 要快不少,不过由于数据量较大,导入也耗费的一定的时刻:

【AI】恶意文件静态检测模型检验及小结

导入完成之后便是对数据进行处理:

new_sample_df = sample_df[sample_df['date'] >= pd.Timestamp('2022-12-01')]
pd.merge(new_sample_df, label_df, on="sha256")

这儿的话,依据入库时刻进行拉取,选取 2022-12-01 之后入库的样本:

【AI】恶意文件静态检测模型检验及小结

由于这儿只需求 exe 类型的文件,所以还需求再进行一次判别,样本量过大可采纳多线程 ThreadPoolExecutor

if pefile.PE(path).is_exe():
    ...

全部完成之后,便是咱们需求的测验集了;

【AI】恶意文件静态检测模型检验及小结

查验模型

咱们先将刚刚准备好的测验集进行导入:

test_loader = DataLoader(...)

然后传入到模型中,获取猜测值,并核算丢失:

# 特征值,模型的输入
test_x = batch_data[0].to(torch.float32).to(device)
# 猜测值,模型的输出,两个值分别为是非样本概率,如 [0.4052, -0.3841]
out = model(test_x)
# 标签值,用于核算丢失
label = batch_data[1].to(device)
# 猜测值与实在值之间的丢失
loss = criterion(out, label.long())
# 一个 batch 的大小
val_size += label.size(0)
# 一个 batch 的丢失,loss.item() 每个样本的平均丢失
running_loss += loss.item() * label.size(0)

由于是查验模型,咱们需求去评价模型的好坏,判别是否为歹意文件其实便是个二分类问题,这儿的话运用混杂矩阵:

猜测值0 猜测值1
实在值0 TN FP
实在值1 FN TP
  • TN:实在值是0,猜测值是0,即咱们猜测是 negative,猜测正确了。
  • FP:实在值是0,猜测值是1,即咱们猜测是 positive,猜测错误了。
  • FN:实在值是1,猜测值是0,即咱们猜测是 negative,猜测错误了。
  • TP:实在值是1,猜测值是1,即咱们猜测是 positive,猜测正确了。

accuracy_score = (TP+TN) / (TP+TN+FP+FN):函数核算分类准确率,回来被正确分类的样本份额(default)或者是数量(normalize=False)。

精准率(查准率)和召回率(查全率)等目标对衡量机器学习的模型性能在某些场合下要比 accuracy 更好。

精准率:precision = TP / (TP+FP)。所谓的精准率是:分母为一切猜测为1的个数,分子是其中猜测对了的个数,即猜测为正的样本中,实践为正的份额。

召回率:recall = TP / (TP+FN)。所谓的召回率是:一切实在值为1的数据中,猜测对了的个数,也便是咱们重视的那个事件实在的产生情况下,咱们成功猜测的份额是多少。

接下来,咱们就依据猜测值和标签值来进行核算:

preds_n = preds_sg
label_n = label_sg
# zes: [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 
zes = np.zeros(label.size(0))
# ons: [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
ons = np.ones(label.size(0))
preds_np = preds_n
label_np = label_n.reshape(-1)
train_correct01 = int(((preds_np == zes) & (label_np == ons)).sum())
train_correct10 = int(((preds_np == ons) & (label_np == zes)).sum())
train_correct11 = int(((preds_np == ons) & (label_np == ons)).sum())
train_correct00 = int(((preds_np == zes) & (label_np == zes)).sum())
FN += train_correct01
FP += train_correct10
TP += train_correct11
TN += train_correct00
accuracy_score = (TP+TN) / (TP+TN+FP+FN)
precision = TP / (TP+FP)
recall = TP / (TP+FN)

这儿的话就用几个 batch 来略作查验:

【AI】恶意文件静态检测模型检验及小结

其实看的出模型的作用挺差的;

排查问题

由上可知,咱们练习了一段时刻的模型作用并不抱负,这是为什么呢?

看了一下过往的日志,发现一个问题:

【AI】恶意文件静态检测模型检验及小结

一个 batch 里的一切猜测值都是相同的?怪事;

再去看看自己练习集里的样本,发现是各不相同的:

【AI】恶意文件静态检测模型检验及小结

那便是梯度消失导致了这一问题…

现在的一个解决方案便是替换模型,换成一个小模型,之后练习的作用怎么,会更新在之后的博文里,敬请等待!

后记

以上便是【AI】歹意文件静态检测模型查验及小结的全部内容了。

本文介绍了拉取数据集的一些小细节,以及怎么对模型进行查验,排查相关问题,希望对大家有所帮助!

上篇精讲:【AI】浅谈运用正则化防止过拟合(下)

我是,等待你的重视;

创作不易,请多多支撑;

系列专栏:AI 项目实战