scikitlearn - 如何建模由多个独立值组成的单个特征

Que*_*tin 5 machine-learning feature-extraction scikit-learn

我的数据集由数百万行和几(10)个特征组成.

一个功能是由1000个不同的值组成的标签(想象每一行是用户,此功能是用户的名字:

Firstname,Feature1,Feature2,....
Quentin,1,2
Marc,0,2
Gaby,1,0
Quentin,1,0
Run Code Online (Sandbox Code Playgroud)

什么是此功能的最佳表示(执行群集):

  1. 我可以使用a将数据转换为整数LabelEncoder,但是这里没有意义,因为两个不同标签之间没有逻辑"顺序"

    Firstname,F1,F2,....
    0,1,2
    1,0,2
    2,1,0
    0,1,0
    
    Run Code Online (Sandbox Code Playgroud)
  2. 当标签匹配时,我可以将1000个要素(每个标签一个)中的要素拆分为1,否则为0.然而,这将导致一个非常大的矩阵(如果我不能在我的分类器中使用稀疏矩阵那么太大)

    Quentin,Marc,Gaby,F1,F2,....
    1,0,0,1,2
    0,1,0,0,2
    0,0,1,1,0
    1,0,0,1,0
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我可以将LabelEncoder值表示为N列中的二进制,与先前的想法相比,这会减少最终矩阵的维度,但我不确定结果:

    LabelEncoder(Quentin) = 0 = 0,0
    LabelEncoder(Marc)    = 1 = 0,1
    LabelEncoder(Gaby)    = 2 = 1,0
    
    A,B,F1,F2,....
    0,0,1,2
    0,1,0,2
    1,0,1,0
    0,0,1,0
    
    Run Code Online (Sandbox Code Playgroud)
  4. ......还有其他想法吗?

您如何看待解决方案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
Run Code Online (Sandbox Code Playgroud)

因此,有相同的水平下2项之间的相似性(Aa1 Aa2Aa3相当类似,并且Aa1是尽可能多的不同Ba1Cb2).

最终目标是从较小的数据集中找到类似的实体:我们OneClassSVM在较小的数据集上训练a ,然后获取entiere数据集的每个项的距离

NBa*_*ley 2

这个问题很大程度上是one-hot编码问题之一。我们如何以一种可以使用聚类算法的方式表示多个分类值,而不搞砸算法需要执行的距离计算(您可以使用某种概率有限混合模型,但我离题了)?就像 user3914041 的答案一样,确实没有明确的答案,但我将仔细研究您提出的每个解决方案并给出我的印象:

解决方案1

如果您将分类列转换为您提到的数字列,那么您将面临您提到的相当大的问题:您基本上失去了该列的含义。如果昆汀在 0、马克 1 和盖比 2 中,这到底意味着什么?那么,为什么还要将该列包含在聚类中呢?就像 user3914041 的答案一样,这是将分类值更改为数值的最简单方法,但它们只是没有,并且可能对聚类结果有害。

解决方案2

在我看来,这将是您最好的选择,具体取决于您如何实现所有这些以及您的集群目标。因为我假设您计划使用 sklearn 和 k-Means 之类的东西,所以您应该能够很好地使用稀疏矩阵。但是,正如imaluengo 建议的那样,您应该考虑使用不同的距离度量。您可以考虑做的是将所有数字特征缩放到与分类特征相同的范围,然后使用余弦距离之类的东西。或者是距离度量的混合,就像我下面提到的那样。但总而言之,这可能是聚类算法中分类数据最有用的表示形式。

解决方案3

我同意 user3914041 的观点,因为这没有用,并且引入了一些与#1 中提到的相同的问题——当两个(可能)完全不同的名称共享一个列值时,您就失去了意义。

解决方案4

另一种解决方案是遵循此处答案的建议。您可以考虑推出您自己的类似 k 均值算法的版本,该算法采用混合距离度量(用于单热编码分类数据的汉明距离,以及用于其余数据的欧几里德距离)。似乎在开发 k 均值(例如混合分类数据和数值数据的算法)方面做了一些工作,如下所示

我想考虑是否需要对这些分类数据进行聚类也很重要。你希望看到什么?