OneHotEncoding 转换解释
OneHotEncoding transformation interpretation
我试图通过 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]?
非常感谢您对此的任何帮助
乔恩
一个热编码的主要目标是分类特征,其中数字之间没有空间关系,它们不是连续的。因此,如果一个特征的值为 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。
因此,前两个元素解释了第一个特征,接下来的两个元素解释了第二个特征,最后四个元素解释了第三个特征。
所以...在进一步挖掘之后,这是我试图澄清一种理解这个问题并为其他人回答的方法。
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]。
我用其他一些数据集试过了,逻辑是一致的。
我试图通过 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]?
非常感谢您对此的任何帮助
乔恩
一个热编码的主要目标是分类特征,其中数字之间没有空间关系,它们不是连续的。因此,如果一个特征的值为 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。
因此,前两个元素解释了第一个特征,接下来的两个元素解释了第二个特征,最后四个元素解释了第三个特征。
所以...在进一步挖掘之后,这是我试图澄清一种理解这个问题并为其他人回答的方法。
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]。
我用其他一些数据集试过了,逻辑是一致的。