【问题标题】:numpy.ndarray sparse matrix to densenumpy.ndarray 稀疏矩阵到密集
【发布时间】:2019-09-02 09:14:08
【问题描述】:

我想对一些打包为 numpy.ndarray 的数据运行 sklearnRandomForestClassifier,而这些数据恰好是稀疏的。 调用fit 会得到ValueError: 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'

此外,如前所述,对于这个特定的数据,我需要 TB 的内存来保存数组。是否可以选择使用稀疏数组运行 RandomForestClassifier

编辑 2

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

【问题讨论】:

  • 请提供minimal reproducible example,以便我们查看导致错误的代码。现在,您只显示X_train 的类型,但既不显示它的形状,也不显示您将其输入RandomForestClassifier 的方式。可能是数据形状不正确,请参阅this related question 的答案。

标签: python numpy scikit-learn


【解决方案1】:

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

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

当然,然后您的计算机就会崩溃(除非您有必要的 22 TB 内存?)。

【讨论】:

  • ndarray 不必toarray 方法,否则我不会提出问题。你是对的——数组需要 TB(我认为“只是”2.2),这是不切实际的。
【解决方案2】:
>>> 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

【讨论】:

  • 我得到的对象是ndarray,它没有toarraytodense。我看不到任何可以将其转换为 csr_matrix 的方法
  • 使用X_train[()] 将错误保存的矩阵从数组包装器中取出。然后使用toarray
【解决方案3】:

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

RandomForestClassifier 可以使用这种格式的数据运行。 代码现在已经运行了 1:30,所以希望它会真正完成 :-)

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-06-25
      • 1970-01-01
      • 2014-03-06
      • 2021-02-23
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 2014-10-19
      相关资源
      最近更新 更多