python - 在sklearn中使用One Hot Encoding对32位十六进制数字进行编码

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

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

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

One Hot Encoding将它们映射到一个二进制数组中,并且只有一位是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] 足以对其进行编码。你能帮我一下吗。非常感谢。

最佳答案

如果您的数组不是很长,您可以使用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)

关于python - 在sklearn中使用One Hot Encoding对32位十六进制数字进行编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25468452/

相关文章:

python-3.x - 使用自定义数据集进行微调后,如何检查混淆矩阵?

python - RandomForest评分方法ValueError

scikit-learn - Google Cloud ML Engine 的 scikit-learn 框架中的自定义依赖项

python - sklearn 线性回归中的 n_jobs

python - 如何为 Heroku 上部署的电报机器人编写定期重复的函数

python - 具有看门狗支持的 Python 中的 Systemd 守护进程

python - Azure DevOps Pipeline 上没有日志记录

tensorflow - 将 keras 应用程序模型与 tf.functions 结合使用时出现 "Unknown graph"错误

python - 用 np.NaN 替换 pandas 数据框中的缺失值(以字符串形式给出)

python - 在管道中使用 Imputer 不会删除 NaN,给出 '' 输入包含 NaN、无穷大或对于 dtype 来说太大的值 ('float64' )''