消除或显示数据集中异常值的算法

机器算法验证 数据可视化 图论
2022-03-21 18:15:17

我正在尝试可视化一个大型多维数据集。每个维度都有不同的范围。一列中的值可能在 0-100 之间,而另一列中的值可能在几十万到几亿之间。因此,很难以合理的比例显示图表。我想使用平行坐标图或一系列点图来可视化它们。

我提出了三种不同的方法;标准偏差之外的任何异常值都将被删除,标准偏差之外的任何异常值都将显示在标准偏差的边缘,或者我将调整每个维度的比例,以便立即缩放所有维度。

有人对哪种方法可以保持数据的完整性有任何建议吗?另外,有没有人有很好的异常值去除算法的例子?

2个回答

异常值通常会被删除以进行分析(拟合模型),而不是用于可视化,您可以在其中更改焦点以使异常值不可见。

你提到的图,平行坐标图和散点图矩阵,应该没问题,因为每个变量都有自己的比例。如果您的软件强制所有比例相同,通常的技巧是通过减去平均值并除以标准偏差来“标准化”这些值。

但是,使用标准偏差做任何事情都算作分析(因此您可能需要毕竟删除异常值)并假设正态分布。因此,首先对每个变量进行分布分析——至少查看直方图,最好对正态曲线进行某种拟合优度检验。如果分布更像是对数正态或其他,您可以对数据应用转换以使其成为正态以获得更好的可视化(或在可视化中使用对数刻度)。

去除异常值是一门艺术,需要了解数据(因为通常异常值是有趣的部分)。箱线图异常值的最常见定义是点超出箱四分位数的四分位间距的 1.5 倍,通常比两个标准差更远。

另一种技术通常称为“稳健”拟合。您将正态曲线拟合到数据并从尾部删除拟合曲线值非常小的点。重复这两个步骤,直到它稳定下来(通常 1 到 3 次)。

下面是我将如何在 SQL Server 中执行此操作。

下面的查询将从一个虚构的 Scale 表中获取平均体重,该表为每个人提供一次称重,同时不允许那些过胖或过瘦的人放弃更现实的平均值:

select w.Gender, Avg(w.Weight) as AvgWeight
    from ScaleData w
    join ( select d.Gender, Avg(d.Weight) as AvgWeight, 
                  2*STDDEVP(d.Weight) StdDeviation
             from ScaleData d
            group by d.Gender
         ) d
      on w.Gender = d.Gender
     and w.Weight between d.AvgWeight-d.StdDeviation 
                      and d.AvgWeight+d.StdDeviation
   group by w.Gender  

可能有更好的方法来解决这个问题,但它工作得很好。如果您遇到另一个更有效的解决方案,我很想听听。

注意:以上内容从图片中删除了顶部和底部 5% 的异常值,以达到平均值的目的。您可以通过调整 2*STDDEVP 中的 2* 来调整移除的异常值数量:http ://en.wikipedia.org/wiki/Standard_deviation