我一直在使用Sklearn的Kmeans实现
我一直在对标记的数据集进行聚类,并且我一直在使用sklearn的clustering metrics来测试聚类性能。
Sklearn的Kmeans聚类输出就像您知道k_clusters
范围内的数字列表一样。但我的标签是strings
。
到目前为止,我对它们没有任何问题,因为sklearn.metrics.cluster
的指标适用于混合输入(int
和str
标签列表)。
但是现在我想使用classification metrics中的一些内容,而根据我收集的内容,输入k_true
和k_pred
需要属于同一组。 k
范围内的数字,或者我的数据集正在使用的字符串标签。如果我尝试它,它会返回以下错误:
AttributeError: 'bool' object has no attribute 'sum'
那么,我怎样才能将k_means
标签翻译成其他类型的标签?或者甚至相反(字符串标签 - >整数标签)。
我怎么能开始实施呢?由于k_means非常不确定,因此标签可能会从迭代变为迭代。有正确的方法来正确翻译Kmeans标签吗?
编辑:
实施例
表示k = 4
kmeans输出:[0,3,3,2,........0]
班级标签:['CAT','DOG','DOG','BIRD',.......'CHICKEN']
答案 0 :(得分:1)
您可以使用字典创建映射,例如
mapping_dict = { 0: 'cat', 1: 'chicken', 2:'bird', 3:'dog'}
然后您可以使用say list comprehension等简单地应用此映射。
假设您的标签存储在列表kmeans_predictions
mapped_predictions = [ mapping_dict[x] for x in kmeans_predictions]
然后使用mapped_predictions
作为预测
更新:根据您的评论,我相信您必须反过来这样做。我的意思是将您的标签转换为`int'映射。
此外,您不能在此处使用任何分类指标。使用Completeness score,v-measure和homogenity因为这些更适合群集问题。在这里盲目使用任何随机分类指标是不正确的。
答案 1 :(得分:1)
群集不是分类。
这些方法不会预测标签,因此您不得使用分类评估指标。这就像测量每加仑英里的苹果质量一样......
如果你坚持做错事(tm),那么使用匈牙利算法找到最佳映射。但要注意:集群的数量和类的数量通常不一样。如果是这种情况,使用这样的映射将是不公平的负面(不映射额外的集群)或不公平的正面(映射!uktiple集群到同一标签将考虑N个点是N个集群"解决方案"最优)。最好只使用聚类测量。