使用sklearn中的One Hot Encoding对32位十六进制数进行编码

时间:2014-08-24 04:08:18

标签: python machine-learning scikit-learn data-mining one-hot-encoding

我有一些明确的特征被分成32位十六进制数,例如,在一个类别中,三个不同的类被分为:

'05db9164'  '68fd1e64' '8cf07265'

One Hot Encoding将这些映射到二进制数组中,只有一位是1,另一位是0.所以如果我想编码上面的功能。只需要三位。

001 correspond to 05db9164, 010 correspond to 68fd1e64, 100 correspond to 8cf07265

但是当我在sklearn中使用OneHotEncoder时,它告诉我这个数字太大了。这困惑了我。因为我们不关心这个数字的数字属性。我们只关心他们是否相同。

另一方面,如果我编码0,1,2:

enc = OneHotEncoder()
enc.fit([[0],[1],[2]])

print enc.transform([[0]]).toarray()
print enc.transform([[1]]).toarray()
print enc.transform([[2]]).toarray()

我得到了预期的答案。我认为这些32位十六进制数用于表示类别中的类。所以它和0,1,2相同。并且[0,0,1],[0,1,0],[1,0,0]足以对其进行编码。你能帮帮我吗。非常感谢。

1 个答案:

答案 0 :(得分:1)

如果您的阵列不是很长,您可以使用np.unique重命名这些功能。这样,您还可以确定不同功能的最大数量,作为回报,您可以将其提供给OneHotEncoder,以便知道要分配的列数。请注意,重命名本身并不是必需的,但它具有生成使用较少空间的整数的良好副作用(如果使用np.int32)。

import numpy as np
rng = np.random.RandomState(42)
# generate some data
data = np.array(['05db9164', '68fd1e64', '8cf07265'])[rng.randint(0, 3, 100)]

uniques, new_labels = np.unique(data, return_inverse=True)
n_values = len(uniques)

from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder(n_values=n_values)
encoded = encoder.fit_transform(new_labels[:, np.newaxis])

print repr(encoded)