Scikit: конвертировать одноразовое кодирование в целое число
Мне нужно преобразовать горячее кодирование в категории, представленные уникальными целыми числами. Итак, горячая кодировка создана с помощью следующего кода:
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder()
labels = [[1],[2],[3]]
enc.fit(labels)
for x in [1,2,3]:
print(enc.transform([[x]]).toarray())
Out:
[[ 1. 0. 0.]]
[[ 0. 1. 0.]]
[[ 0. 0. 1.]]
Может быть преобразован обратно в набор уникальных целых чисел, например:
[1,2,3] или [11,37, 45] или любой другой, где каждое целое число однозначно представляет один класс.
Возможно ли это сделать с помощью scikit-learn или любой другой библиотеки Python?
* Обновить *
Пытался:
labels = [[1],[2],[3], [4], [5],[6],[7]]
enc.fit(labels)
lst = []
for x in [1,2,3,4,5,6,7]:
lst.append(enc.transform([[x]]).toarray())
lst
Out:
[array([[ 1., 0., 0., 0., 0., 0., 0.]]),
array([[ 0., 1., 0., 0., 0., 0., 0.]]),
array([[ 0., 0., 1., 0., 0., 0., 0.]]),
array([[ 0., 0., 0., 1., 0., 0., 0.]]),
array([[ 0., 0., 0., 0., 1., 0., 0.]]),
array([[ 0., 0., 0., 0., 0., 1., 0.]]),
array([[ 0., 0., 0., 0., 0., 0., 1.]])]
a = np.array(lst)
np.where(a==1)[1]
Out:
array([0, 0, 0, 0, 0, 0, 0], dtype=int64)
Не то что мне нужно
3 ответа
Вы можете сделать это с помощью np.where
следующее:
import numpy as np
a=np.array([[ 0., 1., 0.],
[ 1., 0., 0.],
[ 0., 0., 1.]])
np.where(a==1)[1]
Это печатает array([1, 0, 2], dtype=int64)
, Это работает с np.where(a==1)[1]
возвращает индексы столбца 1
с, которые являются именно этикетки.
Кроме того, так как a
это 0,1
Матрица, вы также можете заменить np.where(a==1)[1]
просто np.where(a)[1]
,
Обновление: следующее решение должно работать с вашим форматом:
l=[np.array([[ 1., 0., 0., 0., 0., 0., 0.]]),
np.array([[ 0., 0., 1., 0., 0., 0., 0.]]),
np.array([[ 0., 1., 0., 0., 0., 0., 0.]]),
np.array([[ 0., 0., 0., 0., 1., 0., 0.]]),
np.array([[ 0., 0., 0., 0., 1., 0., 0.]]),
np.array([[ 0., 0., 0., 0., 0., 1., 0.]]),
np.array([[ 0., 0., 0., 0., 0., 0., 1.]])]
a=np.array(l)
np.where(a)[2]
Это печатает
array([0, 2, 1, 4, 4, 5, 6], dtype=int64)
Альтернативно, вы можете использовать оригинальное решение вместе с комментарием @ml4294.
Ты можешь использовать np.argmax()
:
from sklearn.preprocessing import OneHotEncoder
import numpy as np
enc = OneHotEncoder()
labels = [[1],[2],[3]]
enc.fit(labels)
x = enc.transform(labels).toarray()
# x = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
xr = (np.argmax(x, axis=1)+1).reshape(-1, 1)
print(xr)
Это должно вернуться array([[1], [2], [3]])
, Если вы хотите вместо array([[0], [1], [2]])
Просто удалите +1
в определении xr
,
Так как вы используете sklearn.preprocessing.OneHotEncoder
чтобы "кодировать" данные, вы можете использовать его .inverse_transform()
метод "декодирования" данных (я думаю, что это требует .__version__ = 0.20.1
или новее):
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder()
labels = [[1],[2],[3]]
encoder = enc.fit(labels)
encoded_labels = encoder.transform(labels)
decoded_labels = encoder.inverse_transform(encoded_labels)
decoded_labels # array([[1],
[2],
[3]])
nb decoded_labels - это пустой массив, а не список.
Источник: https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html