使用H2O自动编码器进行异常检测时有关功能选择和数据工程的问题 问题1 问题2

问题描述

我正在R中使用H2O自动编码器进行异常检测。我没有训练数据集,因此我正在使用data.hex训练模型,然后使用相同的data.hex计算重建误差。 data.hex中重构错误最大的行被认为是异常的。由模型本身计算的模型的均方误差(MSE)将是重建误差的平方之和,然后除以行数(即示例)。下面是该模型的一些sudo代码

# Deeplearning Model

model.dl <- h2o.deeplearning(x = x,training_frame = data.hex,autoencoder = TRUE,activation = "Tanh",hidden = c(25,25,25),variable_importances = TRUE) 

# Anomaly Detection Algorithm 

errors <- h2o.anomaly(model.dl,data.hex,per_feature = FALSE) 

目前,我的data.hex中大约有10个特征(因素),它们都是分类特征。我下面有两个问题:

(1)如果某些功能之间存在显着关联,我是否需要执行功能选择以从10个功能中选择一个子集,然后数据才能进入深度学习模型(autoencoder = TRUE)?还是我不需要,因为数据将进入自动编码器中,该编码器将压缩数据并仅选择最重要的信息,因此功能选择将是多余的吗?

(2)此处使用H2O自动编码器的目的是在data.hex中标识其动作异常的发送方。这是data.hex的两个示例。示例B是示例A的转换版本,通过将示例A中每个发送方/接收方对的所有动作串联在一起。

enter image description here

分别在示例A和示例B中的data.hex上运行模型之后,我得到的是

(a)示例A的MSE(〜0.005)比示例B的MSE大20倍以上;

(b)当我按升序排列重建误差并将其绘制出来(因此误差在图中从左到右增加)时,示例A的重建误差曲线在右端更陡峭(例如,飞涨),而例B的重建误差曲线逐渐增大。

我的问题是,哪种data.hex可以更好地识别异常?

感谢您的见解!

解决方法

问题1

您不需要减少模型中输入要素的数量。我不能说我知道训练期间会发生什么,但是可以像您所说的那样在隐藏层中消除共线/相关特征。您可以考虑调整隐藏节点并查看其行为。 hidden = c(25,25,25)-> hidden = c(25,10,25)hidden = c(15,15)甚至hidden = c(7,5,7)来实现您的一些功能。

问题2

您的模型的目的是什么?您是要确定哪些“发件人/收件人组合”是异常,还是要确定哪些“发件人/收件人+特定动作组合”?如果是前者(“发送者/接收者组合”),我想示例B会更好。

如果您想了解“发送方/接收方组合”并使用示例A,那么您将如何汇总一个发送方-接收方组合的所有操作?您会平均他们的错误吗?

但这听起来像示例A对升序列表中的异常有更多的响应(其中只有几行具有高错误)。我将对不同的行进行采样,以查看错误是否有意义(作为领域专家)。查看是否更高的错误似乎似乎是异常行。