在过去的几天里,我一直在尝试着实现这个问题。KMeans 算法,使用 SciKit学习但我遇到了一个非常困惑的问题。我有一个数据集,有两个类标签 ['ALL', 'AML']
哪儿 ALL has 47
和 AML has 25
样品和 100
属性来训练,现在我想使用这个数据集来进行KMeans聚类,这样我就可以将预测结果与原始类标签进行比较。在提出我的问题之前,让我解释一下某些场景。在所有的场景中,我已经把所有的 100
属性来拟合模型。
场景1。
在第一次运行中,我从一个模型开始,这个模型是用几乎默认的参数创建的,即: model = KMeans(n_clusters=2)
. 为了比较预测的类标签(是指...)。数字)与原标签(是 字符串),我将原来的类标签设置为 ALL = 1
和 AML = 0
. 之后,在使用分类报告进行比较时,我得到了平均准确率为 35%
. 然后我再次运行该算法,得到的精度为 44%
. 第三次尝试,我得到了 33%
诸如此类。
然而,我看了一下,才知道。random_state
参数需要有一个固定的值,以便在所有运行中获得相同的精度。
场景2:
在知道了 random_state
这次我从随机状态0开始,创建模型为 model = KMeans(n_clusters=2, random_state=0)
并保持原来的类标签,即 ALL as 1
和 AML as 0
. 然而,这次的输出在不同的运行中没有变化,我得到了一个准确度为 53%
. 但是,出于好奇,我换了原来的类标签,即我设置了 ALL as 0
和 AML as 1
从而导致 47%
.
场景三。
这次我选择了 random_state
作为 1
即 model = KMeans(n_cluster=2, random_state=1)
并具有 ALL as 0
和 AML as 1
给了 67%
准确性,同时考虑 ALL as 1
和 AML as 0
给了 33%
准确性。
所以,我的问题是我在这里做错了什么?我是不是实现错了什么?如果我是对的,那么为什么结果会根据随机状态和类标签变化这么大?有什么解决办法,如何选择随机状态和类标签的最佳对子?
这里有几件事在起作用。
init
关键字参数,决定如何放置初始簇中心点。默认值是 k-means++
在你的情况下使用。聚集的初始位置取决于你的类顺序。保持随机状态不变,改变班级顺序会改变簇的初始位置,因此,改变结果。要想解决这个问题,我会对数据进行降维,比如用UMAP或T-SNE,并降到两个维度。这将允许你绘制数据,并使其更容易检查出问题所在。