分类列和密集列有什么区别?

数据挖掘 机器学习 张量流 估计者
2021-10-10 19:05:13

在 Tensorflow 中,有 9 个不同的特征列,分为三组:分类密集混合

通过阅读指南,我了解到分类列用于表示具有数值的离散输入数据。它给出了一个名为categorical identity column的分类列的示例:

ID   Represented using one-hot encoding
0    [1, 0, 0, 0]
1    [0, 1, 0, 0]
2    [0, 0, 1, 0]
3    [0, 0, 0, 1]

但是您也有一个称为指示列的密集列,它“包装”(?)一个分类列以产生看起来几乎相同的东西:

Category (from category column)   Represented as...
0                                 [1, 0, 0, 0]
1                                 [0, 1, 0, 0]
2                                 [0, 0, 1, 0]
3                                 [0, 0, 0, 1]

因此,“分类”和“密集”列似乎都能够表示离散数据,因此这不是区分它们的原因。

我的问题是:原则上,“分类列”和“密集列”有什么区别?


我已经阅读了解释指标列和分类标识列之间区别的答案,但我正在寻找一个更通用的答案来区分分类列和密集列。

1个回答

稀疏与密集

分类列”是稀疏列。稀疏密集列(或矩阵)在某种程度上彼此相反。

稀疏列通常包含很多零。然而,密集列有更多的非零条目。这很重要,因为它们的存储和处理方式可能不同。

如果我们以您的稀疏示例为例:

ID   Represented using one-hot encoding
0    [1, 0, 0, 0]
1    [0, 1, 0, 0]
2    [0, 0, 1, 0]
3    [0, 0, 0, 1]

需要存储哪些信息来重建这个矩阵?所有你需要的是:

  • 列数和行数
  • 每个非零条目的值

因此,通过:

n_columns = 4
n_rows = 4
non_zero_entries = {
    (0, 0): 1,
    (1, 1): 1,
    (2, 2): 1,
    (3, 3): 1
}

你可以重建它。这意味着您不需要存储所有16整数来重建矩阵。

在 Tensorflow 中,“分类列”矩阵具有一种特殊的属性,即它是one-hot 编码,这意味着列中只有一个条目是非零的。但是,稀疏原则不需要是one-hot

例如:

matrix = [
    [0, 0,   0, 0],
    [0, 2,   0, 1],
    [0, 0, 0.5, 0] 
]

可以通过以下方式重建:

n_columns = 4
n_rows = 3
non_zero_entries = {
    (1, 1): 2,
    (1, 3): 1,
    (2, 2): 0.5
}

想象一个大小矩阵100×100. 10,000其中的价值观。现在,假设只1entry 非零(无论出于何种原因)。那么,这个大10,000值矩阵,可以表示为:

n_columns = 100
n_rows = 100
non_zero_entries = {
    (x, y): 1
}

稠密

另一方面,不通过仅定义非零条目来存储密集列。0s 也被存储

虽然内存更密集,但它们的计算成本更低,因为它们不需要重建。此外,通常0s 可能会随着时间而改变,如果已经int存储了一个,则不需要分配新的内存位置。

可用性

并非所有算法都可以处理稀疏矩阵。通常,矩阵运算需要存在整个向量。根据实现,不存在不存在元素为零的假设,因此需要存储并传递显式零。

就像您在问题中提到的那样:

但是您也有一个称为指示列的密集列,它“包装”(?)一个分类列以产生看起来几乎相同的东西

这是真实的。它们所代表的可以完全相同。但是,它们的存储方式和实现的效率不同。