从Python中的大型数据框创建稀疏矩阵

问题描述 投票:1回答:2

我试图在回归中使用稀疏矩阵,因为在添加虚拟变量后有超过40,000个变量。为了做到这一点,我认为我需要为模型提供稀疏矩阵。但是,使用此处的代码无法将我的pandas数据帧转换为矩阵:

Convert Pandas dataframe to Sparse Numpy Matrix directly

这是因为数据集太大,我遇到了内存错误。这是一个如何通过运行以下内容来复制问题的示例:

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

我最终希望能够将数据帧(包含49,000列的300万条记录)转换为矩阵,因为我怀疑我可以创建一个稀疏矩阵并将其用于回归。这在较小的子集上工作得很好,但我最终需要测试整个数据集。上面的例子立即产生一个“MemoryError”,所以我怀疑它是一些Python限制,但我希望有一个解决方法。

python out-of-memory linear-regression sparse-matrix
2个回答
0
投票

稀疏矩阵操作成本高。使用Spicy,创建大型稀疏矩阵非常困难,系统内存可能不支持。

我建议使用Spark库。这样您的数据集就可以在不同的集群(RDD)上运行。下面是示例代码,

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

我希望它对你有所帮助。如果您还有任何问题,请告诉我,我很乐意为您提供帮助。


0
投票

你可以这样做:

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
© www.soinside.com 2019 - 2024. All rights reserved.