如何解释k-means聚类的结果?

我目前正在使用NTSB航空事故数据库进行一些分析。这个数据集中大多数航空事故都有原因陈述,描述了导致此类事件的因素。

我的一个目标是尝试对这些原因进行分组,聚类似乎是解决这类问题的一种可行方法。在开始k-means聚类之前,我执行了以下步骤:

  1. 去除停用词,即去除文本中的一些常见功能词
  2. 词干提取,即去除词的后缀,并在必要时将其转换为最简单的形式
  3. 将文档向量化为TF-IDF向量,以提升不常见但更具信息量的词的权重,并降低常见但信息量少的词的权重
  4. 应用SVD来降低向量的维度

在这些步骤之后,对向量应用了k-means聚类。通过使用1985年1月至1990年12月发生的事件,我得到了以下结果,聚类数量k = 3

(注:我使用Python和sklearn来进行我的分析)

... 部分输出已省略 ... 使用KMeans(copy_x=True, init='k-means++', max_iter=100, n_clusters=3, n_init=1,    n_jobs=1, precompute_distances='auto', random_state=None, tol=0.0001,    verbose=True)对稀疏数据进行聚类初始化完成迭代  0, 惯性 8449.657迭代  1, 惯性 4640.331迭代  2, 惯性 4590.204迭代  3, 惯性 4562.378迭代  4, 惯性 4554.392迭代  5, 惯性 4548.837迭代  6, 惯性 4541.422迭代  7, 惯性 4538.966迭代  8, 惯性 4538.545迭代  9, 惯性 4538.392迭代 10, 惯性 4538.328迭代 11, 惯性 4538.310迭代 12, 惯性 4538.290迭代 13, 惯性 4538.280迭代 14, 惯性 4538.275迭代 15, 惯性 4538.271在第15次迭代时收敛轮廓系数:0.037每个聚类的顶级术语:**聚类0:燃料 引擎 动力 损失 不确定 排气 原因 故障 飞行员 着陆****聚类1:飞行员 故障 因素 着陆 条件 不当 事故 飞行 贡献 不充分****聚类2:控制 维持 飞行员 故障 指导 飞机 空速 失速 着陆 足够**

我还生成了以下数据的图表:

k-means聚类结果图表

结果似乎对我来说不太合理。我想知道为什么所有聚类都包含一些常见术语,如“飞行员”和“故障”。

我能想到的一种可能性(但我不确定在这种情况下是否有效)是,包含这些常见术语的文档实际上位于图表的中心位置,因此无法有效地聚类到正确的聚类中。我认为增加聚类数量并不能解决这个问题,因为我已经尝试过这样做,但问题依然存在。

我只想知道是否有其他因素可能导致我面临的这种情况?或者更广泛地说,我是否使用了正确的聚类算法?

谢谢SO。


回答:

我不想成为坏消息的传递者,但…

  1. 聚类是一种非常糟糕的探索技术——主要是因为在没有明确的、任务导向的目标的情况下,聚类技术实际上专注于优化一些数学标准,而这些标准很少与你想要实现的目标有关。因此,k-means特别会寻找最小化聚类中心到聚类内所有点的欧几里得距离的方法。这与你想要实现的任务有任何关系吗?通常答案是“没有”,或者在最好的情况下是“我不知道”。
  2. 将文档表示为词袋会导致对数据的非常一般的看法,因此这不是区分相似对象的好方法。这种方法可以用来区分关于枪支的文本和关于冰球的文本,但不能区分同一领域的专业文本(这似乎是这里的情况)。
  3. 最后——你无法真正评估聚类,这是最大的问题。因此,没有建立良好的最佳聚类拟合技术。

所以,回答你的最后问题

我只想知道是否有其他因素可能导致我面临的这种情况?

有成千上万这样的因素。从人类的角度找到数据中实际、合理的聚类是极其困难的。找到任何聚类是极其简单的——因为每种聚类技术都会找到一些东西。但为了找到这里重要的东西,人们必须进行全面的数据探索。

或者更广泛地说,我是否使用了正确的聚类算法?

可能没有,因为k-means只是最小化聚类内欧几里得距离和的方法,因此在大多数现实世界场景中它不会起作用。

不幸的是——这不是你可以简单地问“使用哪种算法?”然后有人会提供你确切解决方案的那种问题。

你必须深入研究你的数据,弄清楚:

  • 表示方式——tfidf真的好吗?你是否对词汇进行了预处理?去除了无意义的词?也许值得考虑使用一些现代的词/文档表示学习方法?
  • 数据中的结构——为了找到最佳模型,你应该可视化你的数据,进行调查,运行统计分析,尝试弄清楚底层度量是什么。点是否有合理的分布?这些是高斯分布吗?高斯混合分布吗?你的数据是稀疏的吗?
  • 你能提供一些专家知识吗?也许你可以自己划分数据集的一部分?半监督技术比任何无监督技术定义得更好,因此你可能会更容易获得更好的结果。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注