python_mmdt:KNN机器学习分类结果测试分析
本文为看雪论坛优秀文章
看雪论坛作者ID:大大薇薇
一
概述
二
评估结论
三
项目信息
四
KNN模型结果分析
基本信息
KNN模型信息
测试文件集信息
测试方法
TP表示实际标签为真(恶意),预测标签为真(恶意)的数目
TN表示实际标签为假(干净),预测标签为假(干净)的数目
FP表示实际标签为假(干净),预测标签为真(恶意)的数目
FN表示实际标签为真(恶意),预测标签为假(干净)的数目
准确率ACC表示所有预测标签正确的数量占比(可以理解为KNN模型的检出率),计算公式为:ACC = (TP + TN)/(TP + TN + FP + FN)
精确率PRE表示所有实际为真(恶意)的数量在预测为真(恶意)的占比(可以理解为KNN模型对检测的恶意样本的结果可信度),计算公式为:PRE = TP/(TP + FP)
召回率REC表示所有预测为真(恶意)的数量在实际为真(恶意)的占比(可以理解为KNN模型对恶意样本的检出覆盖能力),计算公式为:REC = TP/(TP + FN)
测试代码
# -*- coding: utf-8 -*-
import sys
import requests
from python_mmdt.mmdt.common import mmdt_load
# 相似度判定阈值,阈值取两个,0.95和0.90
dlt = 0.95
def mmdt_scan_online_check():
file_name = sys.argv[1]
# 加载测试数据
features = mmdt_load(file_name)
# 4个指标项
TP = 0
TN = 0
FP = 0
FN = 0
count = 0
print('检测结果,文件md5,真实标签,相似文件,预测标签,相似度')
for feature in features:
count += 1
tmp = feature.strip().split(":")
file_mmdt = ':'.join(tmp[:2])
tag = tmp[2]
file_sha1 = tmp[3]
data = {
"md5": file_sha1,
"sha1": file_sha1,
"file_name": file_sha1,
"mmdt": file_mmdt,
"data": {}
}
r = requests.post(url='http://146.56.242.184/mmdt/scan', json=data)
r_data = r.json()
if r_data.get('status', 0) == 20001:
status = r_data.get('status', 0)
message = r_data.get('message', '')
print('文件md5: %s, 状态码: %d, 提交信息: %s' % (file_sha1, status, message))
else:
label = r_data.get('data', {}).get('label', 'unknown')
sim_hash = r_data.get('data', {}).get('similars', [])[0].get('hash', 'None')
sim = r_data.get('data', {}).get('similars', [])[0].get('sim', 0.0)
check_result = ''
# 统计隐藏条件,实际标签与预测标签一致,才可判定为TP,记为正确分类
if tag == label and sim > dlt:
TP += 1
check_result = '正确'
elif tag == 'clean' and sim > dlt:
FP += 1
check_result = '错误'
elif tag == 'clean' and sim <= dlt:
TN += 1
check_result = '正确'
else:
FN += 1
check_result = '错误'
print('%s,%s,%s,%s,%s,%.5f' % (check_result, file_sha1, tag, sim_hash, label, sim))
if count >= 500:
break
print('测试mmdthash总数:%d' % count)
print('检测正确总数:%d' % (TP + TN))
print('检测错误总数:%d' % (FP + FN))
print('检测TP总数:%d' % TP)
print('检测TN总数:%d' % TN)
print('检测FP总数:%d' % FP)
print('检测FN总数:%d' % FN)
print('检测准确率ACC:%.3f' % ((TP + TN)/(TP + TN + FP + FN)))
print('检测精确率PRE:%.3f' % (TP/(TP + FP)))
print('检测召回率REC:%.3f' % (TP/(TP + FN)))
def main():
mmdt_scan_online_check()
if __name__ == '__main__':
main()
测试结果如下:
KNN模型检测的准确率ACC高于80%,召回率REC高于60%
0.95指标下的准确率ACC比0.90指标下的准确率ACC提升了3.68‰,准确率ACC达到81.8%
0.95指标下的精确率PRE比0.90指标下的精确率PRE提升了83.42‰,精确率PRE达到100%
0.95指标下的召回率REC比0.90指标下的召回率REC降低了72.99‰,召回率REC达到63.5%
0.95指标下,没有发现存在误报(FP=0)
综合衡量,0.95可设定为初始判定阈值:不低于0.95的判定结果可初步判定为可信;低于0.95的判定结果可初步判定为不可信
分类错误样本抽样分析
相似度等于1的错误:gandcrypt和gandcrab属于同一个恶意家族的不同名称,相似度等于1的此类检测结果正确;
相似度大于0.99,小于1的错误:由于agent样本的标签错误导致,通过VT查询,agent样本实际也为klez,检测结果正确;
相似度大于0.95,小于0.99的错误:两个文件差异很大,mmdthash问题,确认检测结果错误。
相似度大于0.95的错误:同0.95阈值的分类错误;
相似度大于0.94,小于0.95的错误:检测结果确认全部错误,如将UPX壳的文件和Delphi编译文件关联,将NSIS文件和word文件关联,将PE文件和excel文件关联;
相似度低于0.94的错误:绝大部分检出错误,错误原因很多,包含部分少量正确结果。
备注
看雪ID:大大薇薇
https://bbs.pediy.com/user-home-467421.htm
# 往期推荐
3.Windows PrintNightmare 漏洞复现分析
球分享
球点赞
球在看
点击“阅读原文”,了解更多!