可预见的未来数据分析和机器学习将成为工作中必备技能,也许已经在某个项目中讨论怎么调参优化,就像过去讨论如何优雅的写 python、如何避免 C++ 内存泄露一样常见。
聚类就是对大量未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度较大而类别间的数据相似度较小。
给定一个有 N 个对象的数据集,构造数据的 k 个簇,k≤n。满足下列条件:
每一个簇至少包含一个对象;
每一个对象属于且仅属于一个簇;
将满足上述条件的 k 个簇称作一个合理划分。
对于给定的类别数目 k,首先给出初始划分,通过迭代改变样本和簇的隶属关系,使得每一次改进之后的划分方案都较前一次好。
K-means 算法也被称为 k 均值,k 值的选择、距离度量及分类决策是三个基本要素。
假定输入样本为 S=x1,x2,...,xm,则算法步骤为:
选择初始的 k 个类别中心μ1μ2…μk;
对于每个样本 xi,将其标记为距离类别中心最近的类别;
将每个类别中心更新为隶属该类别的所有样本的均值;
重复最后两步,直到类别中心的变化小于某阈值。
中止条件:
迭代次数/簇中心变化率/最小平方误差 MSE(MinimumSquared Error)
某专项测试实际业务中,海量样本为同一病毒类型,如何落地为本地能力将是挑战,所有样本都处理工作量大且重复性高,只处理高热样本会落入长尾困境,如果能将 N 个样本通过特征聚类为 K 类,报毒覆盖 K 类则理论会达到覆盖整体的能力,无论效率和产品能力、自动化上都将有收益。
具体的思路如下:
数据清洗:提取相同病毒名的文件
特征提取:提取多维度文件静态特征
聚类:K-means,目标聚类覆盖该类型病毒特征
特征验证:k 个特征对 k 个子编写特征验证通杀性
工具包:NumPy、SkiPy、 Pandas、Skikit-Learn
PE 文件结构和样本特征的关系:常用的恶意文件一般都是基于格式分析,从 PE 文件格式分析来提取文件特征符合业务特征。
这里使用本人在 filefuzz 项目里封装的 pe 解析模块来处理,拉取某报毒类型样本 5722 个, 去除坏 PE 后解析出下列参数做为维度参数
NumberOfSections,SizeOfCode,BaseOfData,ImageBase,SizeOfImage,SizeOfHeaders
,IMAGE_DATA_DIRECTORY[16],IMAGE_DIRECTORY_ENTRY_IMPORT
去重后导入函数为 688,参数维度共 711 个。
处理前特征:
处理后特征:
使用 pandas 加载数据后填充缺失数据,通过特征分布可视化预处理参数观察数据分布。
数据加载
特征归一化
分割训练集和测试集:不同目标参数训练结果如下:
y=voice_data['NumberOfSections'].values+voice_data['SizeOfCode'].values
y=voice_data['NumberOfSections'].values+voice_data['SizeOfImage'].values
y = voice_data['NumberOfSections'].values, 此时目标参数区分度有效性最高,准确率也达到 99%。
sklearn 函数介绍:
train_test_split 将给定数据集 X 和类别标签 Y,按一定比例随机切分为训练集和测试集。
X_train,X_test,y_train,y_test =train_test_split(train_data,train_target,test_size=0.4, random_state=0)
train_data: 所要划分的样本特征集
train_target:所要划分的样本结果
test_size:样本占比
random_state:是随机数的种子。
http://scikit-learn.org/0.16/modules/generated/sklearn.cross_validation.train_test_split.html
cross_val_score 交叉验证函数
scores = cross_val_score(clf, raw_data,raw_target, cv=5, score_func=None)
clf:表示不同分类器,例支持向量 clf=svm.SVC(kernel=’linear’, C=1)
raw_data:原始数据
raw_target:原始类别标号
cv:不同的 cross validation 的方法
cross_val_score:不同划分 raw_data 在 test_data 得到分类的准确率。
http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html
代码简要:
k 个特征对 k 个子类编写特征验证通杀性,样本处理数量从 4726 下降到 K 类集合。
通过对大量同质数据的聚类,对测试集合的覆盖度和效率都有显著收益,对长尾问题解决也提供了可行的思路方法。
http://scikit-learn.org/stable/
<<统计学习方法>>
<<计算机病毒防范艺术>>
<<机器学习>>
关注腾讯移动品质中心 TMQ,获取更多测试干货!
版权所属,禁止转载!!!