numpy.ndarray稀疏矩阵密集

时间:2019-04-11 16:45:18

标签: python numpy scikit-learn

我想对sklearn的{​​{1}}的某些数据打包为RandomForestClassifier,而这些数据恰好是稀疏的。 调用numpy.ndarray会得到fit。从其他帖子中,我了解到随机森林无法处理稀疏数据。

我希望该对象具有ValueError: setting an array element with a sequence.方法,但没有。

todense

我尝试用SciPy >>> 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'> 将其包装起来,但这也会产生错误。

有什么方法可以使随机森林接受此数据? (不确定密集存储是否会真正适合内存,但这是另一回事...)

编辑1

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

csr_matrix

关于使用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) 的建议,ndarray没有这种方法。 toarray()

此外,如上所述,对于此特定数据,我将需要TB级的内存来保存该数组。是否可以使用稀疏数组运行AttributeError: 'numpy.ndarray' object has no attribute 'toarray'

编辑2

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

4 个答案:

答案 0 :(得分:1)

我相信您正在寻找documentation中所示的toarray方法。

因此,您可以这样做,例如X_dense = X_train.toarray()

当然,然后您的计算机将崩溃(除非您具有必需的22 TB的RAM?)。

答案 1 :(得分: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),其中Mcsr稀疏矩阵。它只是将该矩阵包装在对象dtype数组中。

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

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

但是考虑到非零元素的尺寸和数量,这种转换很可能会产生memory error

答案 2 :(得分:0)

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

nonce可以使用这种格式的数据运行。 该代码现在已经运行了1:30h,所以希望它实际上可以完成:-)

答案 3 :(得分:0)

由于您使用 np.load 加载了 csr 矩阵,因此您需要将其从 np 数组转换回 csr 矩阵。你说你尝试用 csr_matrix 包装它,但这不是数组的内容,你需要所有的 .all()

temp = csr_matrix(X_train.all())
X_train = temp.toarray()