numpy.ndarray稀疏矩阵到密集

问题描述 投票:0回答:3

我想在一些数据上运行sklearnRandomForestClassifier,这些数据被打包为恰好稀疏的numpy.ndarray。调用fitValueError: setting an array element with a sequence.。从其他帖子我了解随机森林无法处理稀疏数据。

我希望对象有一个todense方法,但事实并非如此。

>>> X_train
array(<1443899x1936774 sparse matrix of type '<class 'numpy.float64'>'
    with 141256894 stored elements in Compressed Sparse Row format>,
      dtype=object)
>>> type(X_train)
<class 'numpy.ndarray'>

我尝试用SciPy csr_matrix包装它,但也会出错。

有没有办法让随机森林接受这些数据? (不确定密集会真正适合记忆,但那是另一回事......)

编辑1

生成错误的代码就是这样:

X_train = np.load('train.npy') # this returns a ndarray
train_gt = pd.read_csv('train_gt.csv')

model = RandomForestClassifier()
model.fit(X_train, train_gt.target)

至于使用toarray()的建议,ndarray没有这样的方法。 AttributeError: 'numpy.ndarray' object has no attribute 'toarray'

而且,如上所述,对于这个特定的数据,我需要太字节的内存来保存数组。有没有选择用稀疏数组运行RandomForestClassifier

编辑2

似乎应该使用SciPy的稀疏数据保存数据,如Save / load scipy sparse csr_matrix in portable data format所述。使用NumPy的保存/加载时,应该保存更多数据。

python numpy scikit-learn
3个回答
1
投票

我相信你正在寻找toarray方法,如documentation所示。

所以你可以做,例如,X_dense = X_train.toarray()

当然,那么你的计算机崩溃了(除非你有必要的22TB内存?)。


1
投票
>>> X_train
array(<1443899x1936774 sparse matrix of type '<class 'numpy.float64'>'
    with 141256894 stored elements in Compressed Sparse Row format>,
      dtype=object)

意味着你的代码或它所调用的东西已经完成了np.array(M),其中M是一个csr稀疏矩阵。它只是将该矩阵包装在一个对象dtype数组中。

要在不采用稀疏矩阵的代码中使用稀疏矩阵,必须先将它们转换为密集:

 arr = M.toarray()    # or M.A same thing
 mat = M.todense()    # to make a np.matrix

但考虑到非零元素的维数和数量,这种转换可能会产生一个memory error


0
投票

似乎应该使用SciPy的稀疏数据保存数据,如Save / load scipy sparse csr_matrix in portable data format所述。使用NumPy的保存/加载时,应该保存更多数据。

RandomForestClassifier可以使用此格式的数据运行。代码现在运行1:30h,所以希望它实际上会完成:-)

© www.soinside.com 2019 - 2024. All rights reserved.