将单热编码目标值映射到正确的标签名称

时间:2017-06-09 18:09:48

标签: python-3.x numpy machine-learning mapping one-hot-encoding

我有一个标签名称列表,我已经提到并创建了一个字典:

my_list = [b'airplane',
 b'automobile',
 b'bird',
 b'cat',
 b'deer',
 b'dog',
 b'frog',
 b'horse',
 b'ship',
 b'truck']

label_dict =dict(enumerate(my_list))


{0: b'airplane',
 1: b'automobile',
 2: b'bird',
 3: b'cat',
 4: b'deer',
 5: b'dog',
 6: b'frog',
 7: b'horse',
 8: b'ship',
 9: b'truck'}

现在,我正在尝试清除map / apply dict值到我的目标,这是一个热门编码的形式。

y_test[0]

array([ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.])


y_test[0].map(label_dict) should return: 
'cat'

我正在玩

(lambda key,value: value for y_test[0] == 1)

但无法提出任何具体的

谢谢。

2 个答案:

答案 0 :(得分:3)

由于我们正在处理one-hot encoded数组,因此可以使用argmax为每行获取一个关闭1的索引。因此,使用列表作为输入 -

[my_list[i] for i in y_test.argmax(1)]

或者np.take有数组输出 -

np.take(my_list,y_test.argmax(1))

要使用dict并假设顺序键为0,1,..,我们可以 -

np.take(label_dict.values(),y_test.argmax(1))

如果按键基本上不按序列排序 -

np.take(label_dict.values(), np.searchsorted(label_dict.keys(),y_test.argmax(1)))

示例运行 -

In [79]: my_list
Out[79]: 
['airplane',
 'automobile',
 'bird',
 'cat',
 'deer',
 'dog',
 'frog',
 'horse',
 'ship',
 'truck']

In [80]: y_test
Out[80]: 
array([[ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.]])

In [81]: [my_list[i] for i in y_test.argmax(1)]
Out[81]: ['cat', 'automobile', 'ship']

In [82]: np.take(my_list,y_test.argmax(1))
Out[82]: 
array(['cat', 'automobile', 'ship'], 
      dtype='|S10')

答案 1 :(得分:3)

我们可以使用点积来反转单热编码,如果它真的是 ONE -hot。

让我们从列表分解

开始
f, u = pd.factorize(my_list)

现在,如果你有一个数组,你想用

取回你的字符串
a = np.array([0, 0, 0, 1, 0, 0, 0, 0, 0, 0])

然后使用dot

a.dot(u)

'cat'

现在假设

y_test = np.array([
        [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
        [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
    ])

然后

y_test.dot(u)

array(['cat', 'automobile', 'ship'], dtype=object)

如果它不是一热的,而是多热的,你可以加入逗号

y_test = np.array([
        [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
        [0, 1, 0, 0, 0, 0, 0, 0, 0, 1],
        [0, 0, 1, 0, 0, 0, 0, 0, 1, 0]
    ])

[', '.join(u[y.astype(bool)]) for y in y_test]


['cat', 'automobile, truck', 'bird, ship']