当分类预测变量的级别可能多于训练数据中出现的级别时,如何构建预测模型

机器算法验证 神经网络 特征选择 分类编码 多类 特征工程
2022-04-07 14:12:16

我创建了一个具有 4 个分类特征和二进制结果的人工神经网络,1 表示可疑或 0 表示非可疑:

  ParentPath                                  ParentExe
0   C:\Program Files (x86)\Wireless AutoSwitch  wrlssw.exe
1   C:\Program Files (x86)\Wireless AutoSwitch  WrlsAutoSW.exs
2   C:\Program Files (x86)\Wireless AutoSwitch  WrlsAutoSW.exs
3   C:\Windows\System32                         svchost.exe
4   C:\Program Files (x86)\Wireless AutoSwitch  WrlsAutoSW.exs

ChildPath                                   ChildExe    Suspicious
C:\Windows\System32                         conhost.exe  0
C:\Program Files (x86)\Wireless AutoSwitch  wrlssw.exe   0 
C:\Program Files (x86)\Wireless AutoSwitch  wrlssw.exe   0
C:\Program Files\Common Files               OfficeC2RClient.exe  0
C:\Program Files (x86)\Wireless AutoSwitch  wrlssw.exe  1
C:\Program Files (x86)\Wireless AutoSwitch  wrlssw.exe  0

我使用 sklearn 进行标签编码和数据的一种热编码:

#Import the dataset
X = DBF2.iloc[:, 0:4].values
#X = DBF2[['ParentProcess', 'ChildProcess']]
y = DBF2.iloc[:, 4].values#.ravel()

#Encoding categorical data
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
#Label Encode Parent Path
labelencoder_X_1 = LabelEncoder()
X[:, 0] = labelencoder_X_1.fit_transform(X[:, 0])
#Label Encode Parent Exe
labelencoder_X_2 = LabelEncoder()
X[:, 1] = labelencoder_X_2.fit_transform(X[:, 1])
#Label Encode Child Path
labelencoder_X_3 = LabelEncoder()
X[:, 2] = labelencoder_X_3.fit_transform(X[:, 2])
#Label Encode Child Exe
labelencoder_X_4 = LabelEncoder()
X[:, 3] = labelencoder_X_4.fit_transform(X[:, 3])

#Create dummy variables
onehotencoder = OneHotEncoder(categorical_features = [0,1,2,3])
X = onehotencoder.fit_transform(X)

我已将数据拆分为训练和测试集,并在我的 GPU 盒上使用 nvidia 1080 运行它。我已经调整了超参数,现在准备使用在生产环境中训练的模型,其中一个测试样本在一次。假设我只想测试一个样本:

   ParentPath            ParentExe     ChildPath           ChildExe
0  C:\Windows\Malicious  badscipt.exe  C:\Windows\System   cmd.exe  

我遇到的问题是训练集看到了正常的 ChildPath "C:\Windows\System" 和 ChildExe "cmd.exe",但是训练集没有看到 ParentPath "C:\Windows\ Malicous”或 ParentExe “badscipt.exe”,因此这些都没有被标记或热编码。 我的大问题是,当并非所有分类变量(在本例中为文件路径和文件名)都可以详尽枚举时,如何构建预测模型?

我见过使用特征散列的例子,但我不确定如何应用它,或者它是否能解决这个问题。任何帮助或指示将不胜感激。

1个回答

无法完全枚举的分类特征容易失败

您发现的挑战是您组织研究项目的自然结果:您的模型没有关于新文件路径或新文件名称的通用信息.exe

这个主题很常见——假设您尝试使用唯一标识符(例如个人的社会安全号码)来预测信用违约。您会发现,通过为每个 SSN 分配风险,您可以在训练数据上做得非常好。但是,当您有不在训练数据中的新 SSN 时,该模型没有可使用的相关信息。

或者,我们可以将这个类比扩展到恶意软件上下文,并且只要有一个查找表,当文件的 sha256 哈希与已知的恶意软件样本匹配时,将某个文件声明为恶意软件:显然,每当(1)有人制作新的恶意软件时,这都会出现问题没有与现有已知恶意软件样本匹配的 sha256 的文件,或者 (2) 有人制作了与已知干净样本具有相同哈希值的恶意软件文件。

概念模型也是一个安全漏洞

从安全的角度来看,这种方法存在概念上的缺陷。每当恶意软件文件位于您的模型认为干净的目录中,并且具有模型认为干净的名称时,恶意软件就会逃避检测。

相反,使用可概括的特征进行静态分析

更稳健的方法是从.exe文件语料库中进行各种测量,并尝试基于这些特征学习模型。这是应用于恶意软件检测的现代机器学习应用程序的最常见方法。这种特征提取引擎的一个开源示例是Hyrum S. Anderson 和 Phil Roth 的EMBEREMBER 论文概述了 PE 文件中恶意软件检测的一些通用特征。

当然,如果您将软件文件表示为固定长度的特征向量,那么您可以将任何标准机器学习模型用于表格数据(回归,,,等),而不仅仅是神经网络。

.exe一种不太常见的方法是通过让神经网络摄取整个.exe二进制文件并根据二进制序列或字节编码序列做出决策来“吃掉整个”。通常这涉及循环和卷积网络结构的组合。

目前,用于恶意软件检测的手工制作功能是最先进的。但是,如果一些聪明的研究人员能够提出一个很好的架构和数据增强策略的组合,可以使无特征的神经网络胜过手工制作的特征向量,我不会感到惊讶。


更一般地说,在编码具有高基数的分类变量的建议折叠具有多个级别的分类变量的原则方法中的建议?也可能有帮助。