【问题标题】:OneHotEncoding transformation interpretationOneHotEncoding 转换解读
【发布时间】:2016-12-27 12:08:12
【问题描述】:

我正在尝试通过 python 和 scikit-learn 了解 onehotencoding 过程的输出。我相信我得到了一种热编码的想法。即,将离散值转换为值为“on”的扩展特征向量,以识别分类的成员资格。也许我弄错了,这让我很困惑,但这是我的理解。

所以,从这里的文档:http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html

我看到下面的例子:

>>> from sklearn.preprocessing import OneHotEncoder
>>> enc = OneHotEncoder()
>>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])  
OneHotEncoder(categorical_features='all', dtype=<... 'numpy.float64'>,
       handle_unknown='error', n_values='auto', sparse=True)
>>> enc.n_values_
array([2, 3, 4])
>>> enc.feature_indices_
array([0, 2, 5, 9])
>>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.]])

有人可以解释一下数据 [[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]] 是如何最终转换为 [[ 1., 0., 0., 1., 0., 0., 1., 0., 0.]]?

如何使用转换参数 [0, 1, 1]?

非常感谢您对此的任何帮助

乔恩

【问题讨论】:

    标签: python scikit-learn one-hot-encoding


    【解决方案1】:

    一种热编码的主要目标是分类特征,其中数字之间没有空间关系,它们不是连续的。因此,如果一个特征的值为 1,并不意味着它比 3 更接近 2。

    为了避免这种情况,我们必须为特征可以以二进制方式具有的每个值创建一个列。将分类特征转换为可与scikit-learn 估计器一起使用的特征的一种可能性是使用 one-of-K 或 one-hot 编码。此估计器将具有m 可能值的每个分类特征转换为m 二元特征,只有一个处于活动状态。

    因此,在您的示例中,请注意您要转换的是数组:[0, 1, 1]

    请记住,转换会使这个数组二进制化为可能的编码,从而得到数组:[ 1., 0., 0., 1., 0., 0., 1., 0., 0.]

    第一个和第二个可以有 2 个值,而第三个可以有 4 个值(请注意,为了适应我们只传递 3 (0, 2, 3) 并且在变换中我们也传递 1。

    所以,前两个元素解释第一个特征,接下来的两个解释第二个特征,最后四个解释第三个特征。

    【讨论】:

    • 感谢西尔维奥的回复。您的前 2 段让我相信,我对热编码确实有正确的想法。我仍然不明白的是结果数组是如何到达的。我看不到 [0, 1, 1] 和转换之间的关系。转换是否分成 3 个一组?你能解释一下它是如何得到这个结果的吗?我不知道。
    • 是的。它分为3组。第一个和第二个可以有 2 个值,而第三个可以有 4 个值(请注意,为了适合我们只传递 3 个(023)并且在转换中我们也传递了1 . 所以,前两个元素解释了第一个特征,接下来的两个解释了第二个特征,最后四个解释了第三个特征。
    • 再次感谢您添加更多信息,但恐怕它会进一步混淆。我看不到 (0, 2, 3) 在您的答案(或我的原始问题)中来自哪里,也不清楚为什么第一个和第二个有 2 个值,而第三个有 4 个值。
    【解决方案2】:

    所以...在进一步挖掘之后,这是我试图澄清一种理解这一点并为其他人回答的方式。

    1) 原始数据集为[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]

    2) 然后您需要将这些(按位置)减少为唯一有序值的列表:

    所以...

    For position 1 (0, 1, 0, 1) --> [0, 1]
    For position 2 (0, 1, 2, 0) --> [0, 1, 2]
    For position 3 (3, 0, 1, 2) --> [0, 1, 2, 3]
    

    现在,在转换它时,您只需将转换后数组中的每个位置项与唯一有序项列表中的位置进行比较

    对于转换后的数组 [0, 1, 1]

    The first '0' generates a [1, 0] ('0' matches value in position one, not position two)
    The next '1' generates a [0, 1, 0] ('1' only matches value in position two)
    the last '1' generates a [0, 1, 0, 0] ('1' only matches value in position two)
    

    放在一起,这等于 [1, 0, 0, 1, 0, 0, 1, 0, 0]。

    我已经用其他一些数据集尝试过这个,逻辑是一致的。

    【讨论】:

      猜你喜欢
      • 2017-02-07
      • 2016-12-23
      • 2020-06-30
      • 1970-01-01
      • 2021-11-24
      • 2020-12-27
      • 2020-04-11
      • 2021-09-14
      • 1970-01-01
      相关资源
      最近更新 更多