磁盘空间使用的异常值检测

数据挖掘 机器学习 Python r 异常检测 离群值
2022-02-20 10:44:27

我想对磁盘可用空间数据进行异常值或异常检测。示例数据集如下(我没有任何标签数据集):

date                   free_space (GB)
2019-05-15 09:00:00    102.65
2019-05-15 09:05:00    102.69
2019-05-15 09:10:00    103.11
2019-05-15 09:15:00    102.58
2019-05-15 09:20:00    102.55 

我想检测磁盘空间的新值是否是异常值。有几种异常值分析方法(参考链接):

  • 箱线图分析
  • 基于 Z 分数
  • 基于 IQR 的分析(这类似于箱线图分析)

以上方法是检测异常值的更多统计方法。有几种方法使用无监督机器学习算法来检测异常值(参考链接)。例如,

  • K-mean
  • 马尔可夫链
  • 隔离森林等

哪种方法适合上述数据集?我应该实施基于无监督的机器学习算法还是统计方法?

2个回答

鉴于检测可用空间量异常变化的特定上下文,我建议您使用随时间的变化而不是原始数量。例如:

date                   free_space  variation
2019-05-15 09:00:00    102.65      NA
2019-05-15 09:05:00    102.69      0.04
2019-05-15 09:10:00    103.11      0.42
2019-05-15 09:15:00    102.58      -0.53
2019-05-15 09:20:00    102.55      -0.03

无论您使用什么方法,变异都是比原始尺寸更能检测异常变化的相关信息。您也可以使用时间窗口,例如计算过去 30 分钟的变化。

就我个人而言,我会简单地使用启发式方法来处理这样的事情:如果变化的绝对值高于阈值,则将其标记为异常值。该阈值可以是磁盘大小的百分比,例如5%。

如果您使用 R,您可以通过计算库克距离来筛选异常值。

考虑以下示例。一家假设的电信公司拥有有关其客户消耗的数据量(以 mb 为单位)的信息,并希望检测使用率远高于一般人群的客户。

# Compute Cooks Distance
dist <- cooks.distance(lm(usage ~ x1 + x2 + x3, data = trainset))
dist<-data.frame(dist)
s <- stdres(lm(usage ~ x1 + x2 + x3, data = trainset))
a <- cbind(trainset, dist, s)

显示每个用户的距离 (dist) 及其使用情况。在这种情况下,0.42 的 Cook 距离明显高于其他用户的距离 - 表明该用户是异常值。

视频