在sklearn中使用OneHotEncoding编码32位十六进制数字

1 投票
1 回答
689 浏览
提问于 2025-04-18 18:19

我有一些分类特征,它们被转化成32位的十六进制数字。例如,在一个类别中,三个不同的类别被转化成:

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

独热编码将这些数字映射成一个二进制数组,只有一个位是1,其他的都是0。所以如果我想对上面的特征进行编码,只需要三个位。

001 对应 05db9164, 010 对应 68fd1e64, 100 对应 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 个回答

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)

撰写回答