第二届微软恶意软件预测挑战赛初探

Kaggle上最新举办的第二届微软恶意软件预测挑战赛,文章首发阿里云先知平台,更新到博客。

0x01 比赛简介

比赛目的

这个Kaggle比赛是由微软联合美国东北大学、佐治亚理工学院共同推出的比赛,本次比赛的主题是恶意软件攻击预测。恶意软件行业仍然是一个组织有序、涉及资金量大的致力于规避传统安全措施的市场,一旦计算机被恶意软件感染,犯罪分子就会以多种方式伤害消费者和企业。微软用于超过10亿的企业和消费者客户,非常重视这一问题,并在提高安全性方面投入了大量资金。作为其整体战略的一部分,微软正在挑战数据科学技术用来预测机器是否很快就会被恶意软件攻击。与之前2015年的恶意软件挑战赛一样,微软正在为Kagglers提供前所未有的恶意软件数据集,以鼓励在预测恶意软件发生的有效技术方面取得开源进展。你能帮助保护超过10亿台机器免受损伤吗?

数据集

此次竞赛的目标是根据该计算机的不同属性预测Windows计算机被各种恶意软件感染的可能性。数据集是通过Microsoft端点保护方案和Windows Defender收集的心跳和威胁报告组合生成的。此数据集中的每一行对应一台机器,由MachineIdentifier唯一标识。HasDetections是标签,表示在机器上检测到恶意软件。我们需要使用train.csv中的树形和标签,去预测test.csv中每台机器的HasDetections值。用于创建此数据集的抽样方法旨在满足某些业务约束,包括用户隐私以及计算机运行的时间段。恶意软件预测本质上是一个时间序列问题,但由于引入了新机器,在线和离线的机器,接收补丁的机器,接收新操作系统的机器等,它变得很复杂。虽然此处提供的数据集已经过大致按时间划分,上述问题和抽样要求可能导致交叉验证分数在公榜和私榜之间存在一些差异!此外,该数据集并不代表微软客户的机器;它已被抽样以包含更大比例的恶意软件机器。

其中,比赛一共给了三个数据文件,分别是:

  • sample_submission.csv:格式正确的提交示例

  • test.csv:测试集

  • train.csv:训练集

给出的特征的含义:

  • MachineIdentifier:机器ID

  • ProductName:Defender状态信息,例如:win8defender

  • EngineVersion:Defender状态信息,例如:1.1.12603.0

  • AppVersion:Defender状态信息,例如:4.9.10586.0

  • AvSigVersion:Defender状态信息,例如:1.217.1014.0

  • IsBeta:Defender状态信息,例如:false

  • RtpStateBitfield:NA

  • IsSxsPassiveMode:NA

  • DefaultBrowserIdentifier:机器默认浏览器的ID标识

  • AVProductStatesIdentifier:用户的反病毒软件特殊配置的ID标识

  • ......................................................

  • Census_ProcessorCoreCount:统计_处理器核数

  • Census_OSVersion:统计_系统详细版本号,例如10.0.0130.0
    等等,一共83个属性。

提交要求

这个比赛使用的是ROC曲线下的面积AUC来评价模型。最后提交的文件为csv格式,它包含MachineIdentifier和HasDetections两列,第一列是机器的id,后一列是预测被感染的概率。

0x02 探索性数据分析(Exploratory Data Analysis)

在进行建模之前,我们都会对原始数据进行一些可视化探索,以便更快地熟悉数据,更有效进行之后的特征工程和建模。我们先导入一些EDA过程中所需要的包:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os

其中numpy和pandas是数据分析处理中最流行的包,matplotlib和seaborn两个包用来绘制可视化图像。

数据初探

使用pandas打开训练集train.csv,因为训练集大小为4.4G,pandas读取大文件有几种方式,比如read_csv函数有个参数chunksize,通过指定一个chunksize分块大小来读取文件。这里用到另一个读取大文件的trick,预先指定csv文件中每一列的数据类型,这样pandas就不会在读取csv文件时按照默认数据类型来读取csv列数据,比如指定csv文件中某列数据为category类型,pandas读取此列时就会使用我们指定的数据类型读取此列数据,而不是使用默认的objects类型,可以节省较大内存空间。

取前五行观测,

我们可以看到给定的数据中主要包含各种类型的特征,有数值型特征和类别型特征,观察数据类型,正好对应刚才的trick中指定的数据类型。

看一下训练集和测试集分别有多少

目标变量

在深入探索之前,我们先看看目标变量HasDetections

可以看到正负样本均衡

数值型特征

先看一下数值型特征的一些统计特征

其中min=0,max=1的特征值是0/1型的二值化特征,总共有20个

类别型特征

平台Platform

先看看platform的分布

再看看不同HasDetections的Platform分布

产品名称ProductName

看一下不同HasDetections的ProductName分布

看一下已被感染的ProductName分布比例情况

电池类型Census_InternalBatteryType

作图发现电池类型大多数都是锂离子电池,对于HasDetections的区分度贡献很小。直观来想,恶意软件的攻击对于锂离子电池的机器不会有所偏好吧。
可以看到这几个类别型特征对于区分HasDetection作用并不是很大,需要我们分析的还有很多。

0x03 Baseline

lightGBM可以直接处理category型数据和缺省值数据,直接用lightGBM训练训练集数据,共计81个特征。

def modeling_cross_validation(params, X, y, nr_folds=5):
    clfs = list()
    oof_preds = np.zeros(X.shape[0])
    kfolds = StratifiedKFold(n_splits=nr_folds, shuffle=False, random_state=42)
    for n_fold, (trn_idx, val_idx) in enumerate(kfolds.split(X, y)):
    X_train, y_train = X.iloc[trn_idx], y.iloc[trn_idx]
    X_valid, y_valid = X.iloc[val_idx], y.iloc[val_idx]
    print("Fold {}".format(n_fold+1))
    model = lgb.LGBMClassifier(**params)
    model.fit(
    X_train, y_train,
    eval_set=[(X_valid, y_valid)],
    verbose=200, eval_metric='auc',
    early_stopping_rounds=150
    )

    clfs.append(model)
    oof_preds[val_idx] = model.predict(X_valid, num_iteration=model.best_iteration_)

    score = roc_auc_score(y, oof_preds)
    print(score)
    return clfs, score

本地预测测试集,本地最好AUC为0.666744,最终Kaggle公榜分数为0.678,暂时排名70/314。看一下前面队伍的分数,第一名的分数是0.694,第十名的分数是0.688,其他的分数主要集中在0.678,多达30-40人,分数差距并不大,猜想是因为大家处理数据的方式大同小异,都是直接塞到模型里训练,没有真正的做数值类型和类别类型特征的特征工程,我暂时也没有什么好的处理方式,接下来想用NLP来试试。很难得有安全数据分析比赛,有没有安全数据分析的老铁一起组队呀。Baseline代码在AI for Securit Testing

0x04 Reference

https://www.kaggle.com/c/microsoft-malware-prediction
https://www.kaggle.com/theoviel/load-the-totality-of-the-data
https://www.kaggle.com/delayedkarma/the-story-so-far-lb-0-673
https://plushunter.github.io/2017/06/13/kaggle%E7%B3%BB%E5%88%97%EF%BC%882%EF%BC%89%EF%BC%9ARental%20Listing%20Inquiries%EF%BC%88%E4%B8%80%EF%BC%89%EF%BC%9AEDA/

标签: none

「请我喝冰阔乐,您的支持将鼓励我继续创作!」

使用微信扫描二维码完成支付

仅有一条评论

  1. [...]第二届微软恶意软件预测挑战赛初探[...]

添加新评论