OneHotEncoding转换解释

时间:2016-12-27 12:08:12

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

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

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

乔恩

2 个答案:

答案 0 :(得分:0)

一个热门编码的主要目标是分类功能,其中数字之间没有空间关系,它们不是连续的。因此,如果某个要素的值为1,则表示它不接近2而不是3。

为避免这种情况,我们必须为功能可以二进制方式创建的每个值创建一个列。将分类特征转换为可与scikit-learn估算器一起使用的特征的一种可能性是使用K或单热编码。此估算工具将每个分类要素转换为m个可能的值,转换为m个二进制要素,只有一个有效。

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

请记住,转换会使此数组二进制为可能的编码,从而生成数组:[ 1., 0., 0., 1., 0., 0., 1., 0., 0.]

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

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

答案 1 :(得分: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]。

我已经尝试了许多其他数据集,逻辑是一致的。