【问题标题】:Encoding 32bit hex numbers using OneHotEncoding in sklearn在 sklearn 中使用 One Hot Encoding 编码 32 位十六进制数
【发布时间】:2014-10-17 13:45:13
【问题描述】:

我有一些分类特征散列成 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()

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

【问题讨论】:

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


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 2021-04-12
      • 2021-11-06
      • 2019-08-09
      • 2013-06-10
      • 2017-02-16
      • 2023-03-11
      • 2020-08-01
      • 1970-01-01
      相关资源
      最近更新 更多