使用 Scikit-learn 进行拟合时出现 Python MemoryError

标签 python python-2.7 numpy scipy scikit-learn

我在具有 24GB 内存的 Windows 8 64 位系统上运行 Python 2.7(64 位)。在对通常的 Sklearn.linear_models.Ridge 进行拟合时,代码运行良好。

问题:但是,当使用 Sklearn.linear_models.RidgeCV(alphas=alphas) 进行拟合时,我遇到了显示的 MemoryError 错误在执行拟合过程的 rr.fit(X_train, y_train) 行下方。

我怎样才能避免这个错误?

代码片段

def fit(X_train, y_train):
    alphas = [1e-3, 1e-2, 1e-1, 1e0, 1e1]

    rr = RidgeCV(alphas=alphas)
    rr.fit(X_train, y_train)

    return rr


rr = fit(X_train, y_train)

错误

MemoryError                               Traceback (most recent call last)
<ipython-input-41-a433716e7179> in <module>()
      1 # Fit Training set
----> 2 rr = fit(X_train, y_train)

<ipython-input-35-9650bd58e76c> in fit(X_train, y_train)
      3 
      4     rr = RidgeCV(alphas=alphas)
----> 5     rr.fit(X_train, y_train)
      6 
      7     return rr

C:\Python27\lib\site-packages\sklearn\linear_model\ridge.pyc in fit(self, X, y, sample_weight)
    696                                   gcv_mode=self.gcv_mode,
    697                                   store_cv_values=self.store_cv_values)
--> 698             estimator.fit(X, y, sample_weight=sample_weight)
    699             self.alpha_ = estimator.alpha_
    700             if self.store_cv_values:

C:\Python27\lib\site-packages\sklearn\linear_model\ridge.pyc in fit(self, X, y, sample_weight)
    608             raise ValueError('bad gcv_mode "%s"' % gcv_mode)
    609 
--> 610         v, Q, QT_y = _pre_compute(X, y)
    611         n_y = 1 if len(y.shape) == 1 else y.shape[1]
    612         cv_values = np.zeros((n_samples * n_y, len(self.alphas)))

C:\Python27\lib\site-packages\sklearn\linear_model\ridge.pyc in _pre_compute_svd(self, X, y)
    531     def _pre_compute_svd(self, X, y):
    532         if sparse.issparse(X) and hasattr(X, 'toarray'):
--> 533             X = X.toarray()
    534         U, s, _ = np.linalg.svd(X, full_matrices=0)
    535         v = s ** 2

C:\Python27\lib\site-packages\scipy\sparse\compressed.pyc in toarray(self, order, out)
    559     def toarray(self, order=None, out=None):
    560         """See the docstring for `spmatrix.toarray`."""
--> 561         return self.tocoo(copy=False).toarray(order=order, out=out)
    562 
    563     ##############################################################

C:\Python27\lib\site-packages\scipy\sparse\coo.pyc in toarray(self, order, out)
    236     def toarray(self, order=None, out=None):
    237         """See the docstring for `spmatrix.toarray`."""
--> 238         B = self._process_toarray_args(order, out)
    239         fortran = int(B.flags.f_contiguous)
    240         if not fortran and not B.flags.c_contiguous:

C:\Python27\lib\site-packages\scipy\sparse\base.pyc in _process_toarray_args(self, order, out)
    633             return out
    634         else:
--> 635             return np.zeros(self.shape, dtype=self.dtype, order=order)
    636 
    637 

MemoryError: 

代码

print type(X_train)
print X_train.shape

结果

<class 'scipy.sparse.csr.csr_matrix'>
(183576, 101507)

最佳答案

查看堆栈跟踪的这一部分:

    531     def _pre_compute_svd(self, X, y):
    532         if sparse.issparse(X) and hasattr(X, 'toarray'):
--> 533             X = X.toarray()
    534         U, s, _ = np.linalg.svd(X, full_matrices=0)
    535         v = s ** 2

您使用的算法依赖于 numpy 的线性代数例程来执行 SVD。但是那些不能处理稀疏矩阵,所以作者只是将它们转换为常规的非稀疏数组。为此,首先要做的是分配一个全零数组,然后用稀疏矩阵中稀疏存储的值填充适当的位置。听起来很简单,但让我们算一下。一个 float64(默认 dtype,如果您不知道自己在使用什么,您可能正在使用它)元素占用 8 个字节。因此,根据您提供的数组形状,新的零填充数组将是:

183576 * 101507 * 8 = 149,073,992,256 ~= 150 gigabytes

您系统的内存管理器可能只看了一眼那个分配请求就自杀了。但是你能做些什么呢?

首先,这些功能的数量看起来相当可笑。我对你的问题域或你的特征一无所知,但我的直觉 react 是你需要在这里做一些降维。

其次,您可以尝试修复算法对稀疏矩阵的错误处理。它在 numpy.linalg.svd 上令人窒息,所以你可以使用 scipy.sparse.linalg.svds反而。我不知道所讨论的算法,但它可能不适用于稀疏矩阵。即使您使用适当的稀疏线性代数例程,它也可能会生成(或在内部使用)一些大小与您的数据相似的非稀疏矩阵。使用稀疏矩阵表示来表示非稀疏数据只会导致使用比原来更多的空间,因此这种方法可能行不通。谨慎行事。

关于使用 Scikit-learn 进行拟合时出现 Python MemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16332083/

相关文章:

python - 将 numpy 数组绘制到 QWidget 中时出现问题

python - 如何在处理过程中删除 "simulate"numpy.delete

python - 使用变量的向量语法使用 PULP 进行二进制整数编程?

python - 使用 python 2.7(通过 np.array.astype 函数)将 txt 列数据(字符串)转换为 int

python - 如何从 <br/> 标签后的单元格中获取文本?

python-2.7 - 根据类型或类别列出 Microsoft Azure 计算中的 VM 大小

python - 在 Pandas DataFrame 上使用 float_format 调用 to_string 时出现问题

python - 为什么我不能连接这些?

python-2.7 - 在python中删除列表中的相邻元素

python - pyinstaller numpy "Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll"