如何从多个模型缩放来自 AutoEncoder 的输出?

数据挖掘 自动编码器 特征缩放 离群值
2021-09-24 19:49:25

我有一个问题,到目前为止我无法在搜索中找到任何答案。

背景

我正在研究使用自动编码器的机器上的异常检测问题。我正在为每台机器构建一个模型文件,因为机器的时间行为变化很大。

我有5个特点:

  • 介于 0 和 x 之间的数字整数(x 因机器而异)
  • 其他 4 个特性是分类的(在尝试了 LabelEncoding 之后,我的架构更喜欢 One-Hot 编码)

我尝试使用归一化(MinMaxScaler 和 StandardScaler)来缩放数值特征,但这根本没有产生很好的结果。

作为缩放输入的替代方法 - 我决定使用 scikit 的 MinMaxScaler 来缩放输出。这样我就可以有 1 个通用阈值,我可以将其应用于不同的模型来识别异常。

尽管到目前为止这已经产生了最好的结果 - 在实践中,输出变得过于两极分化为 0 或 1,因此我错过了我不应该的异常值。

问题

我可以在我的自动编码器的输出上使用什么缩放技术,以便我可以在所有模型中应用 1 个通用阈值来识别异常?

2个回答

我总是建议使用StandardScaler()而不是MinMaxScaler(). 原因是后者对异常值过于敏感。想象一下在 [0, 1] 区间内缩小给定向量:

[1, 2, 3, 4, 999]

您的大部分数据将被压缩在 [0, 1] 区间的微小子空间中,从而导致荒谬的压缩。如果您使用StandardScaler(). 鉴于您正在尝试检测异常观察结果,这看起来特别相关。(只有当我确定给定变量在给定的值范围内时,我才会使用 min-max 缩放。)

但最重要的是:你的输出有什么问题?据我们所知,它们可能不是由于缩放。


更新:

最近,我发现一种非常有效的缩放技术是健壮的 min-max scaling它的工作原理就像一个最小值-最大值,但不是在最小值和最大值之间完成,而是在最小值和某个百分位数之间完成(通常在 95-99 之间)。当您的数据集遭受非常少(但影响较大)的异常值时,这非常有效。此方法可确保 95-99% 的数据集正确缩放[0,1],而很少有异常值会超出范围值。

我可以在我的自动编码器的输出上使用什么缩放技术,以便我可以在所有模型中应用 1 个通用阈值来识别异常?

馊主意。

因为:

我正在为每台机器构建一个模型文件,因为机器的时间行为变化很大。

自动编码器将尝试学习机器输出的一般表示(或其执行统计数据 - 或者您可以从机器行为中获得的任何数字)并将其理解为机器的一般图像。这是暂时的,所以如果您有两台机器:

  • 机器 A:整个上午几乎什么都不做,每天下午 1 点左右以几乎 100% 的 CPU 执行,下午以 10-20% 的 CPU 运行。
  • 机器 B:全天以 50-60% 的速度工作。

这是一个简单的问题,但是:

  • 早上 9 点 CPU 达到 50% 是机器 1 的异常情况,但绝对不是机器 2 的异常情况。
  • 3% 的 CPU 始终是机器 B 的异常,但绝对不是机器 A 早上的异常。

没有缩放会使这两个异常在一个尺度上结合在一起(可以进行思想实验,绘制每日 CPU 使用情况,然后尝试对这两个函数执行功能转换,以使它们看起来相同)。

一个在不同时间具有与另一个非常不同的值这一事实使关系非线性。此外,这种关系也不能以微不足道的非线性方式等同,例如:要等同于两个 CPU 使用函数的导数,需要导数非常高,以至于两个导数都为零 - 这意味着一个人将丢失有关数据的所有信息那一点。