天池比赛实践——阿里云安全恶意程序检测(基于机器学习算法XGBoost)
比赛链接:https://tianchi.aliyun.com/competition/entrance/231694/introduction?spm=5176.12281949.1003.10.72ad76d8Azb5Xq
赛题背景
恶意软件是一种被设计用来对目标计算机造成破坏或者占用目标计算机资源的软件,传统的恶意软件包括蠕虫、木马等,这些恶意软件严重侵犯用户合法权益,甚至将为用户及他人带来巨大的经济或其他形式的利益损失。近年来随着虚拟货币进入大众视野,挖矿类的恶意程序也开始大量涌现,黑客通过入侵恶意挖矿程序获取巨额收益。当前恶意软件的检测技术主要有特征码检测、行为检测和启发式检测等,配合使用机器学习可以在一定程度上提高泛化能力,提升恶意样本的识别率。
赛题说明
本题目提供的数据来自文件(windows 可执行程序)经过沙箱程序模拟运行后的API指令序列,全为windows二进制可执行程序,经过脱敏处理。
本题目提供的样本数据均来自于从互联网。其中恶意文件的类型有感染型病毒、木马程序、挖矿程序、DDOS木马、勒索病毒等,数据总计6亿条。
数据说明
1)训练数据(train.zip):调用记录近9000万次,文件1万多个(以文件编号汇总),字段描述如下:
注1:一个文件调用的api数量有可能很多,对于一个tid中调用超过5000个api的文件,我们进行了截断,按照顺序保留了每个tid前5000个api的记录。
注2:不同线程tid之间没有顺序关系,同一个tid里的index由小到大代表调用的先后顺序关系。
注3:index是单个文件在沙箱执行时的全局顺序,由于沙箱执行时间有精度限制,所以会出现一个index上出现同线程或者不同线程都在执行多次api的情况,可以保证同tid内部的顺序,但不保证连续。
2)测试数据(test.zip):调用记录近8000万次,文件1万多个。
说明:格式除了没有label字段,其他数据规格与训练数据一致。
评测指标
1.选手的结果文件包含9个字段:file_id(bigint)、和八个分类的预测概率prob0, prob1, prob2, prob3, prob4, prob5 ,prob6,prob7 (类型double,范围在[0,1]之间,精度保留小数点后5位,prob<=0.0我们会替换为1e-6,prob>=1.0我们会替换为1.0-1e-6)。选手必须保证每一行的|prob0+prob1+prob2+prob3+prob4+prob5+prob6+prob7-1.0|<1e-6,且将列名按如下顺序写入提交结果文件的第一行,作为表头:file_id,prob0,prob1,prob2,prob3,prob4,prob5,prob6,prob7。
2.分数采用logloss计算公式如下:
M代表分类数,N代表测试集样本数,yij代表第i个样本是否为类别j(是1,否0),Pij代表选手提交的第i个样本被预测为类别j的概率(prob),最终公布的logloss保留小数点后6位。
解题思路:参考文章https://xz.aliyun.com/t/3704#toc-0(有改动)
具体步骤:
(1)数据预处理:
1.1)CSV数据集数据量太大,无法一次性纳入内存,通过pandas对象的iterator选项以及get_chunk实现分批次读入内存,最后将数据集concat起来
import pandas as pd
import time
path1 ='C:/Users/Administrator/Desktop/天池比赛实践/阿里云安全恶意程序检测/security_train.csv'
path2 ='C:/Users/Administrator/Desktop/天池比赛实践/阿里云安全恶意程序检测/security_test.csv'
# iterator=True,得到一个迭代器,还有一个nrows指定读取的数目,还有一个chunksize每一次读多少.
# 文件预处理
def FileChunker(path):temp=pd.read_csv(path,engine='python',iterator=True)loop=TruechunkSize = 10000chunks = []while loop:try:chunk = temp.get_chunk(chunkSize)chunks.append(chunk)except StopIteration:loop = Falseprint("Iteration is stopped.")data = pd.concat(chunks, ignore_index= True,axis=0)return data
1.2)把每个样本根据file_id进行分组,对每个分组把多个线程内部的API CALL调用序列排好,再把每个线程排好后的序列拼接成一个超长的字符串
def read_train_file(path):labels = []files = []data=FileChunker(path)#for data in data1:goup_fileid = data.groupby('file_id') # 不同的文件file_idfor file_name, file_group in goup_fileid:#print(file_name)file_labels = file_group['label'].values[0] # 获取labelresult = file_group.sort_values(['tid', 'index'], ascending=True) # 根据线程和顺序排列api_sequence = ' '.join(result['api'])labels.append(file_labels)files.append(api_sequence)#print(labels)#print(files)with open(path.split('/')[-1] + ".txt", 'a+') as f:for i in range(len(labels)):f.write(str(labels[i]) + ' ' + files[i] + '\n')
read_train_file(path1)
1.3)label和超长文本特征的转化为PKL文件,方便读入
import pandas as pd
import numpy as np
import pickle
path1="C:/Users/Liuwj/Desktop/天池比赛实践/阿里云安全恶意程序检测/security_train.txt"
def load_train2h5py(path):labels = []files = []with open(path) as f:for i in f.readlines():i = i.strip('\n')labels.append(i[0])files.append(i[1:])labels = np.asarray(labels)with open("security_train.pkl", 'wb') as f:pickle.dump(labels, f)pickle.dump(files, f)
load_train2h5py(path1)
(2)利用sklearn中的TfidfTransformer统计文本中每个单词或相连词语(n-gram)的tf-idf权值,以评估词对于一个文档集或一个语料库中的其中一个文档的重要程度:
这里选择3-gram,且忽略低于0.1,高于0.8的文档频率的词条,最后选择高斯映射实现降维,因为传统的机器学习方法XGBoost在高维稀疏的数据集上表现不如神经网络。
import pickle
from sklearn.feature_extraction.text import TfidfVectorizer
import time
import numpy as np
from sklearn.decomposition import PCA
from sklearn.random_projection import GaussianRandomProjection
from sklearn.random_projection import SparseRandomProjection
from sklearn import manifold
start = time.clock()
with open("security_train.pkl", "rb") as f: # 加载PKL文件,训练数据labels = pickle.load(f)files = pickle.load(f)
print("start tfidf...")
vectorizer = TfidfVectorizer(ngram_range=(1, 3), min_df=0.100000, max_df=0.800000, ) # tf-idf特征抽取ngram_range=(1,5)
train_features = vectorizer.fit_transform(files) # 将api长序列进行TFIDF,作为样本特征
print(" TFIDF Finish!")
# 降维
#执行映射,我们把维度降为500
print("demension reduction start!")
print("phase 1")
transformer = GaussianRandomProjection(n_components=500)
train_features = transformer.fit_transform(train_features)
#transformer = SparseRandomProjection(n_components=500, random_state=0)
#train_features = transformer.fit_transform(train_features )
#transformer=PCA(n_components=500)
#train_features=transformer.fit(train_features)
print("phase 2")
print("demension reduction start!")
print(train_features.shape) # 打印出转换后的向量形态
with open("tfidf_feature_no_limit.pkl", 'wb') as f: # picklepickle.dump(train_features, f)
with open("tfidf_feature_no_limit.pkl", 'rb') as f:train_features = pickle.load(f)
print(train_features.shape)
print(" PKL Finish!")
end = time.clock()
print("time is:",int(end-start))
(3)XGBoost实现多分类
import pickle
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
import time
import csv
import xgboost as xgb
from sklearn.model_selection import StratifiedKFold
import numpy as np
from sklearn.externals import joblib
start = time.clock()
with open("security_train.pkl", "rb") as f: # 加载PKL文件,训练数据labels = pickle.load(f)
with open("tfidf_feature_no_limit.pkl", 'rb') as f: # 加载train_features = pickle.load(f)
print(train_features.shape)
print(labels.shape)
print("File Loading Finish")
# 5-Fold Cross
skf = StratifiedKFold(n_splits=5, random_state=0, shuffle=True)
print("StratifiedKFold Finish ")
for i, (tr_ind, te_ind) in enumerate(skf.split(train_features, labels)): # 迭代训练X_train, X_train_label = train_features[tr_ind], labels[tr_ind]X_val, X_val_label = train_features[te_ind], labels[te_ind]print('FOLD: {}'.format(str(i))) # 训练第几次print( len(tr_ind),len(te_ind)) # XGBdtrain = xgb.DMatrix(X_train, label=X_train_label) # XGBoost自定义了一个数据矩阵类DMatrix,优化了存储和运算速度dtest = xgb.DMatrix(X_val, label=X_val_label)# dout = xgb.DMatrix(out_features)## 参数设置#max_depth: 树的最大深度。缺省值为6,取值范围为:[1,∞]#eta:为了防止过拟合,更新过程中用到的收缩步长。在每次提升计算之后,算法会直接获得新特征的权重。 #eta通过缩减特征的权重使提升计算过程更加保守。缺省值为0.3,取值范围为:[0,1]#silent:取0时表示打印出运行时信息,取1时表示以缄默方式运行,不打印运行时信息。缺省值为0#objective: 定义学习任务及相应的学习目标,“binary:logistic” 表示二分类的逻辑回归问题,输出为概率。 param = {'max_depth': 5, 'eta': 0.1, 'eval_metric': 'mlogloss', 'silent': 1, 'objective': 'multi:softmax','num_class': 8, 'subsample': 0.8,'colsample_bytree': 0.85} evallist = [(dtrain, 'train'), (dtest, 'val')] # 测试 , (dtrain, 'train')num_round = 300 # 循环次数print('XGB begin')bst = xgb.train(param, dtrain, num_round, evallist, early_stopping_rounds=50)print("XGB finish")# dtr = xgb.DMatrix(train_features)????pred_val = bst.predict(dtest) # 验证集预测错误概率print ('predicting, classification error=%f' % (sum( int(pred_val[i]) != int(X_val_label[i]) for i in range(len(X_val_label))) /len(X_val_label)))
print("start saving model")
joblib.dump(bst, "train_model.m")
print("done!")
end = time.clock()
print("time is:",int(end- start))
本文仅给出模型调参用到的交叉验证结果,上交文件的代码可参考原作者文章:https://xz.aliyun.com/t/3704#toc-0
本文代码:https://github.com/wait1ess/TianChi
成绩如下(未经调参):
天池比赛实践——阿里云安全恶意程序检测(基于机器学习算法XGBoost)相关推荐
- 阿里云天池大赛赛题(机器学习)——阿里云安全恶意程序检测(完整代码)
目录 赛题背景 全代码(ML 和 DL) 特征工程进阶与方案优化 代码 特征工程进阶部分 基于LightGBM 的模型验证 模型测试 深度学习解决方案:TextCNN建模 代码 数据读取 数据预处理 ...
- [当人工智能遇上安全] 5.基于机器学习算法的主机恶意代码识别研究
您或许知道,作者后续分享网络安全的文章会越来越少.但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个<当人工智能遇上安全>系列博客,详细介绍人工智能与安全相关的论文. ...
- 解密阿里云安全女程序员维棠 、牵尘代码诗!
云栖社区为此推出"三七"女生节特别分享,16位才华横溢的阿里女生们同一时间分享了自己写的代码诗和她们推荐的书单. 你知道维棠女程序员代码的释义吗?快来解密吧!评论回复哦! whil ...
- 解密阿里云安全女程序员维棠 、牵尘代码诗! 1
云栖社区为此推出"三七"女生节特别分享,16位才华横溢的阿里女生们同一时间分享了自己写的代码诗和她们推荐的书单. 你知道维棠女程序员代码的释义吗?快来解密吧!评论回复哦! whil ...
- 欺诈检测的机器学习算法及企业级欺诈检测方案!
各行各业的欺诈者一直存在,尤其是金融服务行业欺诈性事件更是数不胜数.为了阻止欺诈事件的产生,反欺诈者也越来越多.随着人工智能在计算机领域的发展,使用机器学习进行欺诈检测已在许多行业中流行起来. 本文中 ...
- 阿里实习生笔试程序检测题目
昨天晚上偶然看到同学在做阿里实习生笔试中的程序编码检测,题目如下给定两个数组A和B,假定其中有四个元素即为:A=[a1,a2,a3,a4] B=[b1,b2,b3,b4]; 那么将B中的元素插入到A ...
- 期末作业——基于机器学习算法的LOL比赛预测(求高分,拜托拜托)
前言:2018年5月2日,各大高校男生宿舍不约而同的爆发出尖叫和呼喊声.难道是"单身少年们"集体受到刺激,而引发的集体抗议吗?在这一切的背后究竟隐藏着怎样的秘密? 其实真相是: 一 ...
- 二十三.基于机器学习的恶意请求识别及安全领域中的机器学习
这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步.前文分享了Web渗透的第一步工作,涉及网站信息.域名信息.端口信息.敏感信息及指纹 ...
- [系统安全] 三十三.恶意代码检测(3)基于机器学习的恶意代码检测技术
您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...
- 深度学习在恶意代码检测方面的应用简单调研
随着互联网的繁荣,现阶段的恶意代码也呈现出快速发展的趋势,主要表现为变种数量多.传播速度快.影响范围广.在这样的形势下,传统的恶意代码检测方法已经无法满足人们对恶意代码检测的要求.比如基于签名特征码的 ...
最新文章
- 网络延迟和数据包丢失对网络性能的影响—Vecloud微云
- SAP SD模块几个透明表
- Linux TCP server系列(4)-浅谈listen与大并发TCP连接
- 【升职加薪必备架构图】Springboot学习路线汇总
- 自定义帆软报表的导出
- 【01】如何在XMind中排列自由主题
- 【内推】AI独角兽-数美科技-NLP/CV/ASR等开放百余岗位,薪资诱人
- qtp(QuickTest Professional)的下载安装
- 聊聊广告系统里的匀速投放
- 11、生成带参数二维码应用场景
- 棋牌游戏开发运营技巧列举 如何才能提高平台留存率
- 解决联想笔记本 FN键不起作用的方法
- android.mk 条件编译,android openSSL 的苦逼历程
- 首批学习Java的人,如今怎么样了?
- 电脑文件夹怎么批量重命名
- 汇编语言实现 大小写字母转换
- Racket编程指南——23 Racket和Scheme的方言
- JAVA简易网页浏览器
- linux系统yade安装,yade-ArchLinux
- b2b2c系统jwt权限源码分享part1
热门文章
- 程序免杀技术之——特征码
- 用计算机怎么算加权标准差,Tableau,如何计算加权标准差
- 大数据思维的核心是什么?
- Bytom BIP-32协议和BIP-44协议
- ps动作保存不覆盖原文件_Photoshop从入门到精通:图像的基本操作,新建打开保存关闭文件...
- cmd看excel有多少个子表_如何将一个 Excel 工作簿中的多个工作表合并成一个工作表?...
- 机器学习(六)—— 分类
- 实体-联系图(ER图)
- win7系统启动到一半停止_win7系统装到一半电脑死机怎么办
- 外贸业务员询盘处理方法技巧 Google开发客户方法找网址和邮箱