одна разреженная матрица с горячим кодированием в python - PullRequest
0 голосов
/ 07 августа 2020

Я хочу создать один объект с горячим кодированием в виде разреженной матрицы. Я пытаюсь использовать pd.get_dummies с флагом разреженности, установленным на True, как указано ниже.

X = df.iloc[:, :2]
y = df.iloc[:, -1]
X = pd.get_dummies(X, columns = ['id', 'video_id'], sparse=True)

Но, похоже, это не дает ожидаемых результатов. Все, что я получаю, - это одна матрица с горячим кодированием, но не матрица CSR. как правильно создать разреженную матрицу с горячим кодированием?

Заранее спасибо

1 Ответ

1 голос
/ 07 августа 2020

Чтобы получить разреженную матрицу, вы можете использовать scipy.sparse.csr_matrix, как описано здесь: Преобразовать Pandas фрейм данных в разреженный Numpy Матрица напрямую

import pandas as pd
import scipy

test_df = pd.DataFrame(np.arange(10), columns = ['category'])

scipy.sparse.csr_matrix(pd.get_dummies(test_df).values
                       )

Вывод

<10x1 sparse matrix of type '<class 'numpy.longlong'>'
    with 9 stored elements in Compressed Sparse Row format>

Параметр sparse = True имеет отношение к типам объектов (np.array vs SparseArray), используемых внутри для создания вывода (https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.get_dummies.html):

sparse : должны ли столбцы с фиктивной кодировкой поддерживаться SparseArray (True) или обычным массивом NumPy (False).

Если вы установите sparse = True это ускоряет ваш код в несколько раз:

  • Получение манекенов с помощью sparse = True
%timeit pd.get_dummies(test_df.category, sparse=True)

Вывод

2.21 ms ± 117 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
  • Получение манекенов с sparse = False
%timeit pd.get_dummies(test_df.category, sparse=False)

Выход

454 µs ± 18.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...