Создание разреженной матрицы из большого фрейма данных в Python - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь использовать разреженную матрицу в моей регрессии, поскольку после добавления фиктивных переменных существует более 40 000 переменных. Чтобы сделать это, я считаю, что мне нужно кормить модель разреженной матрицей. Тем не менее, преобразование моего кадра данных pandas в матрицу невозможно с использованием кода, найденного здесь:

Преобразование кадра данных Pandas непосредственно в матрицу разреженных матов

Это потому, что набор данных слишком велик, и я столкнулся с ошибкой памяти. Вот пример того, как я могу воспроизвести проблему, выполнив следующее:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randint(0,40000,size=(1000000, 4)), columns=list('ABCD'))
df = pd.get_dummies(df,columns=['D'],sparse=True,drop_first=True)
df = df.values

В конечном счете, я хотел бы иметь возможность преобразовать фрейм данных (3 миллиона записей с 49 000 столбцами) в матрицу, потому что я подозреваю, что могу создать разреженную матрицу и использовать ее для своей регрессии. Это работает довольно хорошо для меньшего подмножества, но в конечном итоге мне нужно протестировать весь набор данных. Приведенный выше пример сразу возвращает «MemoryError», поэтому я подозреваю, что это некоторое ограничение Python, но я надеюсь, что есть обходной путь.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Вы можете сделать это так:

import numpy as np
import pandas as pd
import scipy.sparse

N = 40000
M = 1000000
df = pd.DataFrame(np.random.randint(0, N, size=(M, 4)), columns=list('ABCD'))
v = df['D'].values
sp = scipy.sparse.coo_matrix((np.ones_like(v), (np.arange(len(v)), v)), shape=[len(v), N])
print(sp.shape)
# (1000000, 40000)
print(sp.getnnz())
# 1000000
0 голосов
/ 05 апреля 2019

Разреженная матрица является дорогостоящей операцией.Используя Spicy, очень трудно создать большую разреженную матрицу, и ваша системная память может не поддерживать.

Я предлагаю использовать библиотеки Spark.Так что ваш набор данных будет работать в разных кластерах (RDD).ниже приведен пример кода,

from pyspark.mllib.linalg import Vectors sparse = Vectors.sparse(3, [0, 2], [1.0, 3.0])

Надеюсь, он вам поможет.Пожалуйста, дайте мне знать, если у вас остались какие-либо вопросы, я был бы очень рад помочь вам.

...