0

我试图通过 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]?

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

乔恩

4

2 回答 2

0

一种热编码的主要目标是用于分类特征,其中数字之间没有空间关系,它们不是连续的。因此,如果一个特征的值为 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。

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

于 2016-12-27T13:00:09.707 回答
0

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

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]。

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

于 2016-12-27T15:01:23.387 回答