如何为具有两个特征的 k-means 创建混淆矩阵?

数据挖掘 k-均值 混淆矩阵
2021-09-17 12:35:56

我需要为通过具有两个特征的 k-means 运行的数据做一个混淆矩阵。我知道这是一种聚类算法而不是分类算法,但我已经看到一些文章和问题已经完成了。我只是粗暴地分解答案并将其应用于我的情况。

我有看起来像这样的数据:

总数据包 总 TCP
2 0
0 0
0 0
4 0
1 1
4 2
0 0
0 0
0 0
1 1
0 0
93 85
1234 1232
699 695
4 4
2 2
0 0
0 0
0 0
0 0
0 0
4 0
0 0
4 0
6 4
3 3
0 0
0 0
0 0

这是数据文件的顶部,异常/异常值在 TCP 总列中超过 200。混乱开始的地方是理解这个链接k-means question中答案的含义,其中响应者在他关于如何做混淆矩阵的回答中提到了 k-means 标签和真值标签。我提供了上下文的报价:

“假设您有一些将标题分类为 k 组的黄金标准(事实),您可以将其与 KMeans 聚类(预测)进行比较。

唯一的问题是 KMeans 聚类与您的真实情况无关,这意味着它产生的聚类标签将与黄金标准组的标签不匹配。然而,对此有一种解决方法,即根据可能的最佳匹配将 kmeans 标签与真值标签匹配。”

有人知道我的例子中的标签是什么吗?我已经按照另一个链接Outlier Detection with K-means中的教程进行了操作,并且 K 为 1 似乎可以拾取异常值,如下图所示:

异常值周围的红色圆圈

红色圆圈围绕异常值。就我所在的位置而言,我的程序达到了可以得到异常值的程度,但我想在此之上做一个混淆矩阵。我认为这与前面提到的 K-means 标签和真值标签有关,但我对如何进行有点迷茫。任何帮助将不胜感激,我希望帖子中有足够的信息。

1个回答

这个问题没有清楚地提到它,但显然目标是检测异常值,在这种情况下定义为“总 TCP 列中任何超过 200 的实例”。所以每个实例都可以被标记为异常值:

  • 如果总 TCP <200,则为 0 类(负数)
  • 如果总数 >= 200,则为 1 级(正)

如果添加is_outlier代表真正异常值状态的第三列,您将获得可用于二进制分类的注释数据集。

现在让我们假设你想用 k-means 聚类并获得一个混淆矩阵。在这种情况下,您使用 k-means 在没有监督的情况下进行分类(没有使用标记实例进行训练)。比方说ķ=2因为您实际上是在进行二进制分类,所以 k-means 预测两个没有特定含义或顺序的集群。在根据真实标签进行评估之前,您需要一种方法来将预测的集群与真实的类进行匹配。在这种特殊情况下,将最大的预测簇对应于类 0(不是异常值)和最小的作为类 1(异常值)是有意义的。完成此操作后,您可以计算每对的实例数(预测异常值状态、真实异常值状态)。

虽然这是完全可行的,但这种方法非常值得怀疑:您有一种确定性方法可以通过对值进行简单测试来找到异常total TCP值,那么为什么首先使用 ML 呢?直接测试值效率更高,并且可以达到 100% 的性能。同样在这里,如果目标实际上是分类,为什么要以这种方式使用聚类也不清楚。