阿里云安全恶意程序检测(速通三)

news2024/11/23 11:17:42

阿里云安全恶意程序检测

  • 特征工程进阶与方案优化
    • pivot特征构建
      • pivot特征
      • pivot特征构建时间
      • pivot特征构建细节特点
    • 业务理解和结果分析
      • 结合模型理解业务
      • 多分类问题预测结果分析
    • 特征工程进阶
      • 基于LightGBM模型验证
      • 模型结果分析
      • 模型测试
  • 优化技巧与解决方案升级
    • 内存管理控制
    • 加速数据处理技巧
    • 其他开源工具包
    • 深度学习解决方案:TextCNN建模
  • 开源方案学习

特征工程进阶与方案优化

pivot特征构建

pivot特征

pivot特征,简言之就是采用pandas pivot操作获得的特征。

pivot特征的本质是分层统计特征,同时也是一种组合特征。很多时候因为样本在每层的表现都不一一样,所以需要我们先对特征进行分层,然后在新层对特征进行构建,此时的特征相较于直接用所有层构建得到的特征更加细化,也更具有代表性。

pivot特征构建步骤如下:
(1) tmp= df.groupby (A) [B]agg (opt) .to_ frame © .reset_ index()。
(2) mp_ pivot = pd.pivot _table ( data-tmp,index = A,columns=B,values=C)。

pivot特征构建时间

当样本在同一层不同面的表现有较大区别时,则需要进行pivot特征的构建。比如,我们有用户在不同商店的购物信息,其中商店就是层,而每个不同的商店就是一个面,即层包含多个面。

再如,我们要判断某个用户是不是重要用户,往往会统计用户过去的购物频率。虽然这是一个很不错的方法,但是它反映的信息却很粗,因为小朋友每天去买零食和商业成功人士每天去购买名牌的次数可能一样。但如果此时我们将其按面展开,就可以得到每个用户每天去不同店的购物次数,此时就可以很明显地将二者区分开,信息表示得也更加细致。

pivot特征构建细节特点

pivot特征构建的细节: pivot 层一般是 categorical类别的特征。

pivot特征的优点:表示得更加细致,往往可以获得更好的效果,有时还可以大大提升模型的性能。缺点:会大大增加特征的冗余度,特征展开后经常会带来特征稀疏的问题。此时冗余的特征不仅会加大存储压力,而且也会大大增加模型训练的资源,同时冗余的特征有时也会降低模型的准确性。

业务理解和结果分析

结合模型理解业务

结合模型特征的重要性理解业务:LightGBM等一类基于树的集成模型和我们理解业务的过程类似,都是层层递进的形式。LightGBMtopN重要性的特征往往也是问题的关键所在,可以思考为什么这些特征重要,对业务会产生什么样的影响等。

多分类问题预测结果分析

在多分类问题中,我们常常会通过观察预测结果的Confusion Matrix 混淆矩阵,来了解哪一类分得不好、 哪两个类经常混淆、能否通过其他的方式来改进等。常见的有混淆矩阵、归一化混淆矩阵等形式,如图4-5-1所示。
在这里插入图片描述

特征工程进阶

每个API调用线程tid的次数

def api_pivot_count_features(df):
    tmp = df.groupby(
        ['file_id',
         'api'])['tid'].count().to_frame('api_tid_count').reset_index()
    tmp_pivot = pd.pivot_table(data=tmp,
                              index = 'file_id',
                              columns = 'api',
                              values = 'api_tid_count',
                              fill_value = 0)
    tmp_pivot.columns = [
        tmp_pivot.columns.names[0] + '_pivot_' + str(col)
        for col in tmp_pivot.columns
    ]
    tmp_pivot.reset_index(inplace = True)
    tmp_pivot = memory_process._memory_process(tmp_pivot)
    return tmp_pivot

每个API调用不同线程tid的次数

def api_pivot_nunique_features(df):
    tmp = df.groupby(
        ['file_id',
         'api'])['tid'].nunique().to_frame('api_tid_nunique').reset_index()
    tmp_pivot = pd.pivot_table(data=tmp,
                              index = 'file_id',
                              columns = 'api',
                              values = 'api_tid_nunique',
                              fill_value = 0)
    tmp_pivot.columns = [
        tmp_pivot.columns.names[0] + '_pivot_' + str(col)
        for col in tmp_pivot.columns
    ]
    tmp_pivot.reset_index(inplace = True)
    tmp_pivot = memory_process._memory_process(tmp_pivot)
    return tmp_pivot

特征获取

%%time
simple_train_fea3 = api_pivot_count_features(train)
simple_test_fea3 = api_pivot_count_features(test)
simple_train_fea4 = api_pivot_nunique_features(train)
simple_test_fea4 = api_pivot_nunique_features(test)

基于LightGBM模型验证

#获取标签
train_label = train[['file_id','label']].drop_duplicates(subset=['file_id','label'],keep='first')
test_submit = test[['file_id']].drop_duplicates(subset=['file_id'],keep='first')
#训练集和测试集的构建,此处将之前提取的特征与新生成的特征进行合并
train_data = train_label.merge(simple_train_fea1,on = 'file_id',how = 'left')
train_data = train_data.merge(simple_train_fea2,on = 'file_id',how = 'left')
train_data = train_data.merge(simple_train_fea3,on = 'file_id',how = 'left')
train_data = train_data.merge(simple_train_fea4,on = 'file_id',how = 'left')

test_submit = test_submit.merge(simple_test_fea1,on = 'file_id',how = 'left')
test_submit = test_submit.merge(simple_test_fea2,on = 'file_id',how = 'left')
test_submit = test_submit.merge(simple_test_fea3,on = 'file_id',how = 'left')
test_submit = test_submit.merge(simple_test_fea4,on = 'file_id',how = 'left')
#关于LGB的自定义评估指标的书写
def lgb_logloss(preds,data):
    labels_ = data.get_label()
    classes_ = np.unique(labels_)
    preds_prob = []
    for i in range(len(classes_)):
        preds_prob.append(preds[i * len(labels_):(i+1)*len(labels_)])
        
    preds_prob_ = np.vstack(preds_prob)
    
    loss = []
    for i in range(preds_prob_.shape[1]):  #样本个数
        sum_ = 0
        for j in range(preds_prob_.shape[0]):  #类别个数
            pred = preds_prob_[j,i]  #第i个样本预测为第j类的概率
            if j == labels_[i]:
                sum_ += np.log(pred)
            else:
                sum_ += np.log(1 - pred)
        loss.append(sum_)
        return 'loss is: ',-1 * (np.sum(loss) / preds_prob_.shape[1]),False
#模型采用5折交叉验证方式
train_features = [
    col for col in train_data.columns if col not in ['label','file_id']
]
train_label = 'label'


%%time
from sklearn.model_selection import StratifiedKFold,KFold
params = {
    'task':'train',
    'num_leaves':255,
    'objective':'multiclass',
    'num_class':8,
    'min_data_in_leaf':50,
    'learning_rate':0.05,
    'feature_fraction':0.85,
    'bagging_fraction':0.85,
    'bagging_freq':5,
    'max_bin':128,
    'random_state':100
}

folds = KFold(n_splits=5,shuffle=True,random_state = 15)  #n_splits = 5定义5折
oof = np.zeros(len(train))

predict_res = 0
models = []
for fold_, (trn_idx,val_idx) in enumerate(folds.split(train_data)):
    print("fold n°{}".format(fold_))
    trn_data = lgb.Dataset(train_data.iloc[trn_idx][train_features],label = train_data.iloc[trn_idx][train_label].values)
    val_data = lgb.Dataset(train_data.iloc[val_idx][train_features],label = train_data.iloc[val_idx][train_label].values)
    
    clf = lgb.train(params,
                   trn_data,
                   num_boost_round = 2000,
                   valid_sets = [trn_data,val_data],
                   verbose_eval = 50,
                   early_stopping_rounds = 100,
                   feval = lgb_logloss)
    models.append(clf)

模型结果分析

特征相关性分析:计算特征之间的相关性系数,并用热力图可视化显示。

这里采样10000个样本,观察其中20个特征的线性相关性。

plt.figure(figsize = [10,8])
sns.heatmap(train_data.iloc[:10000,1:21].corr())

在这里插入图片描述
通过查看特征变量与label的相关性,我们也可以再次验证之前数据探索EDA部分的结论,每个文件调用API的次数与病毒类型是强相关的。

#特征重要性分析
feature_importance = pd.DataFrame()
feature_importance['fea_name'] = train_features
feature_importance['fea_imp'] = clf.feature_importance()
feature_importance = feature_importance.sort_values('fea_imp',ascending = False)
feature_importance.sort_values('fea_imp', ascending = False)
#plt.figure(figsize = [20,10,])
#sns.barplot(x = feature_importance['fea_name'],y = feature_importance['fea_imp'])
plt.figure(figsize = [20,10,])
sns.barplot(x = feature_importance.iloc[:10]['fea_name'],y = feature_importance.iloc[:10]['fea_imp'])

在这里插入图片描述

plt.figure(figsize = [20,10,])
sns.barplot(x = feature_importance['fea_name'],y = feature_importance['fea_imp'])

在这里插入图片描述
对特征的重要性分析也再一次验证了我们的想法:

API的调用次数及API的调用类别数是最重要的两个特征,也就是说不同的病毒常常会调用不同的API,而且因为有些病毒需要复制自身的原因,调用API 的次数会非常多;第三到第五强的都是线程统计特征,这也较为容易理解,因为木马等病毒经常需要通过线程监听一些内容,所以在线程数量的使用上也会表现的略不相同。

树模型绘制。我们把LightGBM的树模型依次输出,并结合绘制的树模型进行业务的理解。

#树模型绘制。把LightGBM的树模型依次输出,并结合绘制的树模型进行业务的理解
ax = lgb.plot_tree(clf,
                  tree_index =1,
                  figsize = (20,8),
                  show_info = ['split_gain'])
plt.show()

模型测试

优化技巧与解决方案升级

内存管理控制

利用数据类型控制内存。首先判断特征列取值的最小表示范围,然后进行类型转换,如float64转换为float16 等。

加速数据处理技巧

1.加速Pandas的merge
当数据量较大时,Pandas的merge操作相比基于object的merge操作耗时,在比赛中index经常会编码成一个非常复杂的字符串序列,此时我们可以直接将index编码为简单的数字,然后存储映射的字典,再对数字进行merge,最后通过字典映射回来。

2.加速Pandas分位数的特征提取
在比赛中经常会遇到提取各种分位数的问题,这时有些选手经常会枚举分位数特征,但如果每次都自定义一个分位数提取函数会极其耗时。这时就可以考虑将所有分位数的提取用一个函数实现,返回一个分位数的list,这样就无须再进行多次分位数的提取了。

3.用Numpy替换Pandas
由于Numpy的操作比Pandas操作得快,因此当Pandas全部是数值等特征时,可以考虑,将其转换为Numpy再进行特征提取。

其他开源工具包

  1. Github的Dask
  2. Github的Numba

深度学习解决方案:TextCNN建模

开源方案学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1181747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【配置】如何在打包Spring Boot项目时按需使用日常、测试、预发、正式环境的配置文件

文章目录 前言1. 创建5个配置文件2. 在pom.xml文件中如下配置3. 在application.properties中加入环境变量 前言 在我们开发项目的时候,一般有四套环境:日常、测试、预发、正式。日常环境作为我们开发环境;测试环境给测试同学测试功能&#x…

基于厨师算法的无人机航迹规划-附代码

基于厨师算法的无人机航迹规划 文章目录 基于厨师算法的无人机航迹规划1.厨师搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用厨师算法来优化无人机航迹规划。 1.厨师搜索算法 …

Canal同步Mysql数据到ES以及Springboot项目查询ES数据

1、环境准备 服务器:Centos7 Jdk版本:1.8 Mysql版本:5.7.44 Canal版本:1.17 Es版本:7.12.1 kibana版本:7.12.1 软件包下载地址:链接:https://pan.baidu.com/s/1jRpCJP0-hr9aI…

C++进阶篇4---番外-AVL树

一、AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查 找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962年发明了一…

Microsoft Dynamics 365 CE 扩展定制 - 8. DevOps

在本章中,我们将介绍以下内容: 使用PowerShell导出Dynamics 365解决方案使用PowerShell部署解决方案构建解决方案层次结构修补解决方案暂存解决方案使用SolutionPackager在源代码管理中保存解决方案使用PackageDeployer将您的解决方案与配置数据打包基于解决方案版本增量触发…

缓存-基础理论和Guava Cache介绍

缓存-基础理论和Guava Cache介绍 缓存基础理论 缓存的容量和扩容 缓存初始容量、最大容量,扩容阈值以及相应的扩容实现。 缓存分类 本地缓存:运行于本进程中的缓存, 如Java的 concurrentHashMap, Ehcache,Guava Cache。 分布式缓…

3.Netty中Channel通道概述

Selector 模型 Java NIO 是基于 Selector 模型来实现非阻塞的 I/O。Netty 底层是基于 Java NIO 实现的,因此也使用了 Selector 模型。 Selector 模型解决了传统的阻塞 I/O 编程一个客户端一个线程的问题。Selector 提供了一种机制,用于监视一个或多个 …

如何成为C++大神?五个技巧助你提升编程水平

一名优秀的C程序员是如何炼成的?这个问题一直困扰着许多人,尤其是那些刚刚踏入编程的世界的新手。C作为一门强大而复杂的编程语言,的确需要一些特殊的技巧和策略才能掌握。但幸运的是,成为一名出色的C程序员并不是不可能的任务。在…

【算法练习Day41】买卖股票的最佳时机买卖股票的最佳时机 II

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 买卖股票的最佳时机买卖股票…

办公神器!2024年值得拥有的10款在线画板软件!

随着科技的进步和互联网的普及,我们工作、学习和生活方式发生了翻天覆地的变化。在线画板软件就是在这个背景下应运而生的一种便捷工具。它不仅满足了我们随时随地绘制图像、演示思路的需求,还提供了协同编辑、云存储等功能,使得团队协作变得…

Java面试题(高频、有答案,全网最强)

原文网址:Java面试题(高频、有答案,全网最强)-CSDN博客 这是一套全网最强的Java面试题,吊打网上所有Java面试题。 此套面试题的威力:看过这套题的朋友、同事、粉丝参加了面试后说,他们面试被问…

基于C#的GRPC

GRPC gRPC(gRPC Remote Procedure Call)是由Google开发的高性能、跨语言的远程过程调用框架。它基于HTTP/2协议进行通信,支持多种编程语言,包括C, C#, Java, Python等,使不同语言的应用程序可以通过远程调用相互通信。…

SPASS教程-入门

常用的统计工具 EXCEL 严格说来并不是统计软件,但作为数据表格软件,有一定统计计算功能。对于简单分析,Excel还算方便,但随着问题的深入,Excel就不那么“傻瓜”,需要使用函数,甚至根本没有相应…

​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​

软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】 课本里章节里所有蓝色字体的思维导图

Spire.Office for Java 8.10.2 同步更新Crk

Spire.Office for Java 是 E-iceblue 提供的企业级 Office Java API 的组合。它包括Spire.Doc for Java、Spire.XLS for Java、Spire.Presentation for Java、Spire.PDF for Java和Spire.Barcode for Java。 开发人员可以使用Spire.Office for Java在Java应用程序中执行各种办…

【electron】【附排查清单】记录一次逆向过程中,fetch无法请求http的疑难杂症(net::ERR_BLOCKED_BY_CLIENT)

▒ 目录 ▒ 🛫 导读需求开发环境 1️⃣ Adblock等插件拦截2️⃣ 【失败】Content-Security-Policy启动服务器json-serverhtml中的meta字段 3️⃣ 【失败】https vs httpwebPreferences & allowRunningInsecureContent disable-features 4️⃣ 【失败】检测fetch…

技术分享 | app自动化测试(Android)--元素定位方式与隐式等待

元素定位是 UI 自动化测试中最关键的一步,假如没有定位到元素,也就无法完成对页面的操作。那么在页面中如何定位到想要的元素,本小节讨论 Appium 元素定位方式。 Appium的元素定位方式 定位页面的元素有很多方式,比如可以通过 I…

初识Java 17-2 反射

目录 转型前检查 构建例子:生成层次结构 优化Creator:使用类字面量 优化PetCounter:动态验证类型 更通用的递归计数 注册工厂 本笔记参考自: 《On Java 中文版》 转型前检查 当我们使用传统的类型转换,例如&…

实战!工作中常用的设计模式

文章目录 前言一、策略模式1.1、 业务场景1.2 、策略模式定义1.3、 策略模式使用1.3.1、一个接口,两个方法1.3.2、不同策略的差异化实现1.3.3、使用策略模式 二、责任链模式2.1、业务场景2.2、责任链模式定义2.3、责任链模式使用2.3.1、一个接口或者抽象类2.3.2、每…

11.7加减计数器,可置位~,数字钟分秒,串转并,串累加转并,24位串并128,流水乘法器,一些乘法器

信号发生器 方波,就是一段时间内都输出相同的信号 锯齿波就是递增 三角波就是先增后减 加减计数器 当mode为1则加,Mode为0则减;只要为0就输出zero 这样会出问题,因为要求是十进制,但是这里并没有考虑到9之后怎么办&a…