Python sklearn OneHotEncoder: как пропустить значения, которых нет в списке - PullRequest
0 голосов
/ 10 февраля 2020

Я бы хотел горячо закодировать этот список:

[0 0 1 1 1 2 2 2 4]

Когда я это сделаю, энкодер с горячей записью преобразует мои 4 в a 3. То есть я получаю это:

(0, 0) 1.0
(1, 0) 1.0
(2, 0) 1.0
(3, 1) 1.0
(4, 1) 1.0
(5, 1) 1.0
(6, 2) 1.0
(7, 2) 1.0
(8, 2) 1.0
(9, 3) 1.0

Мне бы хотелось (обратите внимание, что последний ряд изменился):

(0, 0) 1.0
(1, 0) 1.0
(2, 0) 1.0
(3, 1) 1.0
(4, 1) 1.0
(5, 1) 1.0
(6, 2) 1.0
(7, 2) 1.0
(8, 2) 1.0
(9, 4) 1.0

Завершить MWE:

import numpy as np
from sklearn.preprocessing import OneHotEncoder
idvals = [0, 0, 0, 1, 1, 1, 2, 2, 2, 4]
hot = OneHotEncoder()
h1 = hot.fit_transform(np.asarray(idvals).reshape(10, 1))
print(np.asarray(h1))

Работа с Python 2.7.14 | Anaconda custom (64-bit) | (по умолчанию, De c 7 2017, 17:05:42)

Как получить последнюю строку (9, 4) вместо (9, 3)?

1 Ответ

2 голосов
/ 10 февраля 2020

Вы можете сгенерировать ndarray интереса, сравнивая vals против arange до значения max и используя broadcasting, чтобы получить матрицу из результата:

vals = np.asarray(idvals)
u = np.unique(vals)
vals_b = vals[:,None]
a = (np.arange(max(u)+1) == vals_b).view('i1')

print(a)

array([[1, 0, 0, 0, 0],
       [1, 0, 0, 0, 0],
       [1, 0, 0, 0, 0],
       [0, 1, 0, 0, 0],
       [0, 1, 0, 0, 0],
       [0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 0, 0, 1]], dtype=int8)

Если мы построим разреженную матрицу из массива, мы действительно получим, как указано:

from scipy import sparse

print(sparse.csr_matrix(a))

(0, 0)  1
(1, 0)  1
(2, 0)  1
(3, 1)  1
(4, 1)  1
(5, 1)  1
(6, 2)  1
(7, 2)  1
(8, 2)  1
(9, 4)  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...