我想在一些数据上运行sklearn
的RandomForestClassifier
,这些数据被打包为恰好稀疏的numpy.ndarray
。调用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'
而且,如上所述,对于这个特定的数据,我需要太字节的内存来保存数组。有没有选择用稀疏数组运行RandomForestClassifier
?
编辑2
似乎应该使用SciPy的稀疏数据保存数据,如Save / load scipy sparse csr_matrix in portable data format所述。使用NumPy的保存/加载时,应该保存更多数据。
我相信你正在寻找toarray
方法,如documentation所示。
所以你可以做,例如,X_dense = X_train.toarray()
。
当然,那么你的计算机崩溃了(除非你有必要的22TB内存?)。
>>> 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
。
似乎应该使用SciPy的稀疏数据保存数据,如Save / load scipy sparse csr_matrix in portable data format所述。使用NumPy的保存/加载时,应该保存更多数据。
RandomForestClassifier
可以使用此格式的数据运行。代码现在运行1:30h,所以希望它实际上会完成:-)