首页 > 解决方案 > 使用 sklearn 从数据集中删除冗余

问题描述

我有一个如下所示的数据集:

  0.03658  -0.02192  -0.01772   0.00612   0.01160   0.88852 type1
  0.03658  -0.02192  -0.01772   0.00612   0.01160   0.88859 type1
  0.03813  -0.01910  -0.02290   0.00906   0.01384   1.78929 type1
  0.04076  -0.02248  -0.02368   0.00903   0.01465   1.51693 type1
  0.04076  -0.02248  -0.02368   0.00903   0.01465   1.51720 type1
  0.04997  -0.04319  -0.02970   0.00945   0.02025   1.78306 type1
  0.05763   0.10729  -0.06824   0.04753   0.02071   1.72909 type1
  0.07291   0.13532  -0.08940   0.06161   0.02778   0.49674 type1
  0.04086  -0.03733  -0.02057   0.00562   0.01495   1.39900 type1
  0.05659  -0.01917  -0.04730   0.02125   0.02605   0.71228 type1
  ...

每行包含各种类型系统的 6 个属性(前 6 列)的测量值(最后一列包含类型编号)。目前,我需要描述 78 个不同的系统,但有一个问题,正如您在前两行中看到的那样:除了属性 6 的值之外,它们是相同的,无论如何它们几乎相同。因此,如果它们几乎相同,我想删除数据行——但仅限于每个类(即类型编号)和我将指定的某个阈值内。我是 sklearn 的新手,通过搜索文档没有找到任何合适的东西,但是有一个简单的 sklearn 函数可以做到这一点,还是我必须编写自己的线性代数代码来做到这一点?

标签: pythonscikit-learnredundancy

解决方案


这真的不是sklearn一种东西。只需对您的数据进行分类(根据相似度阈值),并在每个类中获取唯一的数据点。
这看起来很简单,对吧?好吧,将其变成答案而不是评论的唯一原因是指出以下微妙但令人讨厌的点:
达到阈值差异的相似性不是传递性的。这意味着您要么心中有一个定义不明确(并且可能是不可能的)的目标,要么您将对数据集中的点顺序产生痛苦的依赖;真是一枚硬币的两面。
举例来说,假设我们正在查看单个列的值,并且我们认为小于 2 的差异可以忽略不计,因此这些点被认为是“相同的”。那么你如何处理前十个数据点的以下值?

0、1、2、3、4、5、6、7、8、9

可以说,每对连续的对都是“相同的”,但您显然不想将它们全部组合在一起!
我希望这对你有意义,我希望这对你有帮助。
祝你好运!


推荐阅读