水处理异常检测方法的砍伐过程

水处理异常检测方法的砍伐过程

image

物联网技术在现代企业中扮演着至关重要的角色,传统企业在改造运用物联网产品的过程中,其中有一项比较重要的期望--“实时的业务洞察力”,通过物联网技术了解企业当前业务流上的实时情况。不同行业对实时数据的需求各有侧重,例如在物流配送领域,企业可能更关注车辆的实时位置和运动轨迹;而在污水处理行业,则更加注重设备的实时运行状态和效率。

在污水处理行业,实时监控系统不仅可以实时收集和分析来自各种传感器的数据,如流量计、PH计、溶解氧传感器等,还能通过这些数据监控整个处理过程的效率和安全性。这种监控对于确保水质符合环保标准和预防环境污染至关重要。

为了减少人工干预并提高效率,自动化异常检测系统显得尤为重要。系统根据实时分析收集到的数据,并自动判断当前的运行指标是否正常。这里就需要一套异常检测的方法。

年初的时候,跟我们行业的“网红”(褒义)专家范老师,一起交流讨论过一个产品“运维管家小助手”的应用,辅助企业水处理中一些异常的决策,在取得企业现场的实时数据指标后,输入我们配置好的计算工式,计算出这些数据指标的健康值,并对于异常数据提供对应的建议性解决方案。这里面的计算工式当时就是用了阀值法实现的。

表格

7.5-8

16-20 或 32-38

温度

25-32

4分

Ph

16以下 或 38以上

20-25

7-7.5 或 8-9

小于7 或 大于9

5分

2分

1分

指标

3分

近期,在执行公司一个农村污水处理项目上时,也同样把这个阀值法应用在了其中,实现简易的农污终端实时健康自检服务,然在过程中发现阈值法的一些不足,并尝试寻找其它解决方案,本文就是尝试寻找其它解决方案的过程记录。

那怎么用阈值法的呢

阈值法是最简单直观的异常检测方法。它的基本思路是为每个监测指标设定一个正常范围,当数据超出这个范围时,就判定为异常。

在农村污水处理系统中,我们通常会监测多个水质指标,如COD(化学需氧量)、氨氮、总磷等。对于每个指标,我们都需要根据国家标准或专家经验,设定一个正常范围,即阈值。

用一个最常见的例子说明,这张化验表就是阈值法,数据结果和参考区间,数据结果在参考区间之外的则提示异常。

image

根据污水处理的国家标准和行业经验,pH值通常应该在6~9之间。结合专家经验和历史数据,我们可以将pH的正常范围设定为7.5-8。这意味着:

  • 当pH值在7.5-8之间时,认为处理系统运行正常。
  • 当pH值在7-7.5之间或8-9之间时,虽然满足排放标准,但可能存在设备故障或数据异常,需要引起注意。
  • 当pH值低于7或高于9时时,说明处理效果不达标,需要及时调整工艺参数或检查设备。

image

在实际应用中,我们可以为每个监测指标设定两个阈值:下限阈值和上限阈值。数据低于下限或高于上限,都会被判定为异常。有时候为了区别异常程度,我们可以把这个上限和下限,分别设置不同的区间等级。

image

在实际场景中,我们有时候判断的不是单个指标,是两个或多个指标之间的关联关系,假设碱度是进水氨氮的7.2倍是最正常的情况,那我们就把阈值的判断公式修改为:碱度/进水氨氮

image

阈值法的优点
  • 阈值法的原理很容易理解,在系统中实现的时候也比较简单,不需要复杂的模型和算法。
  • 实时性强,基本上可以实现同步判断出每一个监测值是否异常,及时发现问题。
  • 可解释性强,就跟医院的化验单一样,异常原因很容易理解,就是你的指标高了或者低了(超出正常范围)
  • 计算成本低,阈值法只需要做简单的数值比较,计算量小,非常适合在线实时处理。

当然说了阈值法的优点,在思考阈值法的时候,也会遇到它相对不成熟或者比较不足的地方。

阈值法最基本的是阈值的设定,这是前置条件,如果前置条件不存在,则判断结果都不成立。阈值的设定来自于行业标准和专家经验,行业标准做为基本参考,专家基于经验给出一个设定值,不同的专家会给出不同的值,现场的不一样的环境也会影响设定值不一样,我们需要得到一个合适的标准值,就变成了一个有一定挑战量的过程。

假设这个阈值,我不想设,啥也别说,我就是不想设,又或者我们还没有沟通设定好一个阈值法,我们怎么判断出这一个指标是否正常呢?

3σ(西格玛)法则/68–95–99.7法则闪亮登场:

在统计上,68–95–99.7法则(68–95–99.7 rule)是在正态分布中,距平均值小于一个标准差、二个标准差、三个标准差以内的百分比,更精确的数字是68.27%、95.45%及99.73%。若用数学用语表示,其算式如下,其中X为正态分布随机变量的观测值,μ为分布的平均值,而σ为标准差:

image

image

通俗的讲,如果一个数据点偏离平均值超过3倍标准差,那么它很可能是异常点。

  1. 如果数据服从正态分布,那么约有68.27%的数据点落在平均值±1个标准差的范围内,约有95.45%的数据点落在平均值±2个标准差的范围内,约有99.73%的数据点落在平均值±3个标准差的范围内。
  2. 超出平均值±3个标准差的数据点是很少见的,在正态分布下,这样的数据点出现的概率只有0.27%。因此,如果一个数据点超出了这个范围,我们有理由怀疑它是异常的。

当然,现实中的数据往往不会完全服从正态分布,但是根据中心极限定理,许多独立随机变量的和的分布会趋于正态分布。

让我们假设一个3σ(西格玛)法则在系统中的使用方法:
  1. 数据准备。收集一段时间内(如一个月)的历史数据,包括各个监测指标的时间序列数据。
  2. 计算指标的均值和标准差。对每个监测指标,计算其历史数据的平均值μ和标准差σ。
  3. 确定异常阈值。根据3-σ原则,设定异常阈值为[μ-3σ, μ+3σ]。
  4. 实时异常检测。对于实时监测到的每个数据点x_t,判断其是否超出异常阈值:
    • 如果 x_t < μ-3σ 或 x_t > μ+3σ,则判定为异常,发出警报;
    • 否则,判定为正常,继续监测。
我们继续以pH值为例:

假设我们收集了过去一个月的pH值数据,发现其平均值为7.8,标准差为0.1。

根据3-σ原则,我们可以设定pH值的异常阈值为:

  • 下限: 7.8 - 3 * 0.1 = 7.5
  • 上限: 7.8 + 3 * 0.1 = 8.1

那么在实时监测中,如果某个时刻的pH值低于7.5或高于8.1,我们就会判定其为异常,并发出警报。

这样就解决了,如果没有阈值设定的指标的异常监测,而且3-σ原则还解决掉阈值法的另一个固定、死板的不足。3-σ原则有很好的自适应性,异常阈值是根据历史数据平均算出来的,比如因为环境因素上个月的历史平均值高了,但是属正常情况,阈值法如果不调整设置还是会判断为异常,3-σ原则自适应调整了异常阈值,则会判断为正常。

当然从另一个角度看,就是它的实时性不够,如果我当月的环境改变了,我需要调整异常判断标准,阈值法可以直接调整阈值设定,而3-σ原则由于其实现原理,计算出来的异常阈值已经失效。

所以在项目中,我们会把不同的异常监测方法组合起来使用,在最后介绍。

3-σ原则具有更好的理论依据,基于数据的统计特性提出的,而不是凭经验猜测。

3-σ法则的优点

  1. 简单易实现。3-σ原则的计算过程很简单,只需要计算均值和标准差,然后确定阈值,易于在各种系统中实现和部署。
  2. 可解释性强。3-σ原则给出的异常判断结果是明确的,异常的严重程度可以用偏离均值的标准差数量来衡量,便于理解和解释。
  3. 计算成本低。与许多高级异常检测算法相比,3-σ原则的计算量非常小,可以实时处理大量数据,非常适合在线监测场景。

OK,那么问题来了,如果历史数据也没有呢?怎么监测一个值是否异常?

那么又或者我需要多指标联动检测异常呢?

image

本着IOT为用户服务,产品为用户服务的心态,我们基于这种情况继续解决问题。

3-σ法则从历史数据取均值,可以看作为从纵向解决问题,现在纵向没有了,我们从横向行不行呢?

我们项目的终端通常情况下不会是一个,假设我们有50个终端,那实时数据里面最少就会有50个pH值,大部分值都密集的聚在一起,有少数点远离高度区,分而比较稀疏,这些点通常就是异常点。

这是孤立森林算法

image

孤立森林 (Isolation Forest, iForest)是一个基于Ensemble的快速离群点检测方法,具有线性时间复杂度和高精准度,是符合大数据处理要求的State-of-the-art算法。由南京大学周志华教授等人于2008年首次提出,之后又于2012年提出了改进版本。适用于连续数据(Continuous numerical data)的异常检测,与其他异常检测算法通过距离、密度等量化指标来刻画样本间的疏离程度不同,孤立森林算法通过对样本点的孤立来检测异常值。

image

  • 孤立森林算法通过随机选择特征和在所选特征的最大最小值之间随机选择切分点,递归地把数据集划分成越来越小的子空间,直到每个子空间只包含一个数据点(或达到最大分割次数)。这个过程就是建立一棵"孤立树"(iTree)。
  • 由于异常点容易被孤立出来,所以异常点被孤立到叶子节点所需的平均划分次数较少,到达叶子节点的路径也较短。而正常点需要更多次划分才会被完全孤立。
  • 重复以上步骤建立多棵iTree,形成一片"孤立森林"(iForest)。对每个数据点,取其在所有iTree上的平均路径长度作为其异常分数。异常点的分数会明显偏低。

image

用一个例子来说明一下,用孤立森林算法来逐步分析

假设我们有以下50个pH值数据:

7.2, 8.1, 6.9, 7.5, 7.8, 6.5, 8.3, 7.1, 7.6, 8.0,
6.8, 7.3, 7.9, 6.6, 8.2, 7.0, 7.7, 6.7, 8.4, 7.4,
6.4, 8.5, 6.3, 7.2, 8.1, 6.9, 7.5, 7.8, 6.5, 8.3,
7.1, 7.6, 8.0, 6.8, 7.3, 5.2, 6.6, 9.2, 7.0, 7.7,
6.7, 8.4, 7.4, 6.4, 8.5, 6.3, 7.2, 8.1, 4.9, 8.8

一、随机选择特征和分割点,递归划分数据空间:

第一次划分:随机选择pH值作为划分特征,随机选择7.5作为分割点,将数据分为两部分:

  • 左子树:6.4, 6.3, 6.5, 6.6, 6.7, 6.8, 6.9, 7.0, 7.1, 7.2, 7.3, 7.4, 5.2, 4.9
  • 右子树:7.6, 7.7, 7.8, 7.9, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5, 9.2, 8.8

第二次划分:在左子树中,随机选择6.5作为分割点,将数据进一步划分:

  • 左子树:6.4, 6.3, 5.2, 4.9
  • 右子树:6.6, 6.7, 6.8, 6.9, 7.0, 7.1, 7.2, 7.3, 7.4

第三次划分:在右子树中,随机选择8.0作为分割点,将数据进一步划分:

  • 左子树:7.6, 7.7, 7.8, 7.9
  • 右子树:8.1, 8.2, 8.3, 8.4, 8.5, 9.2, 8.8

以此类推,直到每个子树只包含一个数据点或达到最大树高。

二、计算每个数据点的路径长度:

对于每个数据点,我们计算它在上述划分过程中被孤立出来的路径长度。例如:

  • 对于数据点7.2,它在第一次划分时进入左子树,在第二次划分时进入右子树,然后被孤立,因此其路径长度为3。
  • 对于数据点9.2,它在第一次划分时进入右子树,在第三次划分时进入右子树,然后被孤立,因此其路径长度为3。
  • 对于数据点4.9,它在第一次划分时进入左子树,在第二次划分时进入左子树,然后被孤立,因此其路径长度为3。

三、重复多次划分,计算平均路径长度:

我们重复多次(如100次)上述随机划分和路径长度计算的过程,对每个数据点的路径长度取平均值。这个平均值就是该数据点的异常分数。

四、根据异常分数识别异常值:

我们计算所有数据点的平均路径长度(异常分数),发现:

  • 大多数数据点的异常分数在4~5之间,这些是正常的pH值。
  • 数据点5.2和9.2的异常分数约为3,明显低于其他点,这表明它们可能是异常值。
  • 数据点4.9的异常分数最低,约为2.5,这表明它是最明显的异常值。

五、结论:

通过上述分析,我们识别出了三个可能的异常值:4.9, 5.2和9.2。

孤立森林算法通过随机划分数据空间,计算数据点的路径长度,来识别出那些与大多数数据点不一致的异常值。这种方法不需要对数据的分布做任何假设,也不需要预先设定异常的阈值,因此非常灵活和通用。

孤立森林算法的优点

  • 适用于高维数据。孤立森林算法可以自动处理多个特征,无需手动设定每个特征的阈值,因此孤立森林算法可以解决3-σ法则没有的多指标联动检测问题。
  • 对异常类型没有限制。孤立森林算法不假设数据的分布形式,也不限制异常的类型,因此可以检测出各种类型的异常,包括全局异常和局部异常。
  • 可以自动适应数据分布。孤立森林算法通过随机划分数据空间,可以自动适应数据的真实分布,不需要假设数据服从某种特定分布。

然后通过实现原理我们应该能发现,该算法对实时响应要求不太友好,孤立森林算法通常需要在一定数量的数据上进行训练以构建孤立树。在实时数据监测中,数据持续流入,这就需要算法能够快速适应新数据。虽然可以通过定期重新训练模型来实现这一点,但这可能会导致处理延迟,不适合对实时响应要求很高的应用。

对数据的分布形态有一定的敏感性。特别是在数据分布极不均匀的情况下,算法的性能可能会受到影响。异常数据不是在离群点这种状态下时,孤立森林可能不容易将其正确地识别出来。

计算资源消耗的要求(略)

既然都被你们假设成这样了,那要不再假设一点,我直接走预知未来模式,是不是更能解决问题呢?

我直接预测你下一个时刻的pH就是8,跟8差距太大就是异常,是不是也OK呢。

LSTM神经网络,你给我出来!

算了,CPU罢工了,休息了,下回再说。

image

总结一下

综上所说,我们发现每一个算法都有其优点和不足的地方,在为了保证异常检测结果更准确,在成本接受的情况下,我们可以采用多算法融合的策略。

  • 使用阈值法进行初步筛选,快速检测出明显的异常数据。
  • 通过阈值法筛选的数据,再使用3-σ原则进行二次判断,过滤掉一些正常的波动。
  • 将多个监测指标的数据输入到孤立森林模型中,检测多指标联合异常。
  • 综合多个算法的检测结果,生成最终的异常报告。

当然,找出异常不是我们的终点,找到准确的异常点,对于出现异常的原因进行分析,给我们提供相应的辅助决策,才是让IT技术提升生产力的关键。

以上所有设想都是基于数据准确的基础上,数据清洗不在范围之内。

如有不对,欢迎指证!

如何让水务数据成为生产力