我的数据集由数百万行和几十个特征组成。
其中一个特征是由1000个不同值组成的标签(想象每行是一个用户,而这个特征是用户的firstname):
Firstname,Feature1,Feature2,....Quentin,1,2Marc,0,2Gaby,1,0Quentin,1,0
对于这个特征(用于进行聚类),最佳的表示方式是什么:
-
我可以使用
LabelEncoder
将数据转换为整数,但这在这里没有意义,因为两个不同的标签之间没有逻辑上的“顺序”Firstname,F1,F2,....0,1,21,0,22,1,00,1,0
-
我可以将该特征拆分为1000个特征(每个标签一个),当标签匹配时为1,否则为0。然而,这将导致一个非常大的矩阵(如果我的分类器不能使用稀疏矩阵,这将太大)
Quentin,Marc,Gaby,F1,F2,....1,0,0,1,20,1,0,0,20,0,1,1,01,0,0,1,0
-
我可以将
LabelEncoder
的值表示为N列中的二进制,这将比前一个想法减少最终矩阵的维度,但我对结果不确定:LabelEncoder(Quentin) = 0 = 0,0LabelEncoder(Marc) = 1 = 0,1LabelEncoder(Gaby) = 2 = 1,0A,B,F1,F2,....0,0,1,20,1,0,21,0,1,00,0,1,0
-
… 还有其他想法吗?
你对解决方案3有什么看法?
编辑以提供一些额外的解释
我应该在我的第一篇文章中提到,在真实数据集中,这个特征更像是分类树的最终叶子(示例中的Aa1
、Aa2
等 – 这不是一个二叉树)。
A B C Aa Ab Ba Bb Ca Cb Aa1 Aa2 Ab1 Ab2 Ab3 Ba1 Ba2 Bb1 Bb2 Ca1 Ca2 Cb1 Cb2
因此,在同一级别下的两个术语之间存在相似性(Aa1
、Aa2
和Aa3
相当相似,而Aa1
与Ba1
和Cb2
的不同程度相同)。
最终目标是从较小的数据集中找到相似的实体:我们在较小的数据集上训练一个OneClassSVM
,然后获取整个数据集中每个术语的距离
回答:
这个问题在很大程度上是一个独热编码的问题。我们如何以一种可以使用聚类算法的方式表示多个分类值,并且不搞乱你的算法所需的距离计算(你可能在使用某种概率有限混合模型,但我就不多说了)?就像用户3914041的回答一样,真的没有确定的答案,但我会逐一审视你提出的每个解决方案并给出我的印象:
解决方案1
如果你像你提到的那样将分类列转换为数值列,那么你会面临你提到的一个相当大的问题:你基本上失去了该列的意义。如果Quentin是0,Marc是1,Gaby是2,这到底意味着什么?在那个时候,为什么还要在聚类中包含那个列?就像用户3914041的回答一样,这是将分类值转换为数值的最简单方法,但它们只是没有用处,并且可能会对聚类结果有害。
解决方案2
在我看来,根据你如何实施这一切以及你对聚类的目标,这将是你最好的选择。因为我假设你计划使用sklearn和类似k-Means的东西,你应该可以很好地使用稀疏矩阵。然而,像imaluengo建议的那样,你应该考虑使用不同的距离度量。你可以考虑将所有数值特征缩放到与分类特征相同的范围,然后使用像余弦距离的东西。或者混合使用距离度量,就像我下面提到的。但总的来说,这可能会是你分类数据对聚类算法最有用的表示方式。
解决方案3
我同意用户3914041的观点,这没有用,并且引入了与#1提到的一些相同的问题——当两个(可能)完全不同的名字共享一个列值时,你失去了意义。
解决方案4
另一个解决方案是遵循这里的回答的建议。你可以考虑开发你自己的k-means-like算法版本,该算法采用混合距离度量(对于独热编码的分类数据使用汉明距离,对于其余部分使用欧几里得距离)。似乎在开发针对混合分类和数值数据的k-means-like算法方面有一些工作,比如这里。
我猜考虑你是否需要在这个分类数据上进行聚类也很重要。你希望看到什么?