【问题标题】:Scikit learn GaussianProcessClassifier memory error when using fit() functionScikit在使用fit()函数时学习GaussianProcessClassifier内存错误
【发布时间】:2018-09-06 13:31:29
【问题描述】:

我将 X_train 和 y_train 分别设置为 2 个大小为 (32561, 108) 和 (32561,) 的 numpy.ndarray。

每次调用适合我的 GaussianProcessClassifier 时都会收到内存错误。

>>> import pandas as pd
>>> import numpy as np
>>> from sklearn.gaussian_process import GaussianProcessClassifier
>>> from sklearn.gaussian_process.kernels import RBF
>>> X_train.shape
(32561, 108)
>>> y_train.shape
(32561,)
 >>> gp_opt = GaussianProcessClassifier(kernel=1.0 * RBF(length_scale=1.0))
>>> gp_opt.fit(X_train,y_train)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/retsim/.local/lib/python2.7/site-packages/sklearn/gaussian_process/gpc.py", line 613, in fit
    self.base_estimator_.fit(X, y)
  File "/home/retsim/.local/lib/python2.7/site-packages/sklearn/gaussian_process/gpc.py", line 209, in fit
    self.kernel_.bounds)]
  File "/home/retsim/.local/lib/python2.7/site-packages/sklearn/gaussian_process/gpc.py", line 427, in _constrained_optimization
    fmin_l_bfgs_b(obj_func, initial_theta, bounds=bounds)
  File "/home/retsim/anaconda2/lib/python2.7/site-packages/scipy/optimize/lbfgsb.py", line 199, in fmin_l_bfgs_b
    **opts)
  File "/home/retsim/anaconda2/lib/python2.7/site-packages/scipy/optimize/lbfgsb.py", line 335, in _minimize_lbfgsb
    f, g = func_and_grad(x)
  File "/home/retsim/anaconda2/lib/python2.7/site-packages/scipy/optimize/lbfgsb.py", line 285, in func_and_grad
    f = fun(x, *args)
  File "/home/retsim/anaconda2/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 292, in function_wrapper
    return function(*(wrapper_args + args))
  File "/home/retsim/anaconda2/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 63, in __call__
    fg = self.fun(x, *args)
  File "/home/retsim/.local/lib/python2.7/site-packages/sklearn/gaussian_process/gpc.py", line 201, in obj_func
    theta, eval_gradient=True)
  File "/home/retsim/.local/lib/python2.7/site-packages/sklearn/gaussian_process/gpc.py", line 338, in log_marginal_likelihood
    K, K_gradient = kernel(self.X_train_, eval_gradient=True)
  File "/home/retsim/.local/lib/python2.7/site-packages/sklearn/gaussian_process/kernels.py", line 753, in __call__
    K1, K1_gradient = self.k1(X, Y, eval_gradient=True)
  File "/home/retsim/.local/lib/python2.7/site-packages/sklearn/gaussian_process/kernels.py", line 1002, in __call__
    K = self.constant_value * np.ones((X.shape[0], Y.shape[0]))
  File "/home/retsim/.local/lib/python2.7/site-packages/numpy/core/numeric.py", line 188, in ones
    a = empty(shape, dtype, order)
MemoryError
>>> 

为什么会出现此错误,我该如何解决?

【问题讨论】:

    标签: python pandas scikit-learn classification sklearn-pandas


    【解决方案1】:

    根据 Scikit-Learn documentation,估计器 GaussianProcessClassifier(以及 GaussianProcessRegressor)有一个参数 copy_X_train,即默认设置为 True

    类 sklearn.gaussian_process.GaussianProcessClassifier(kernel=None, 优化器='fmin_l_bfgs_b',n_restarts_optimizer=0, max_iter_predict=100,warm_start=False,copy_X_train=True, random_state=None, multi_class='one_vs_rest', n_jobs=1)

    参数copy_X_train的描述说明:

    如果为 True,则将训练数据的持久副本存储在 目的。否则,只存储对训练数据的引用, 如果数据被修改,这可能会导致预测发生变化 外部。

    我曾尝试在具有 32 GB RAM 的 PC 上使用 OP 提到的类似大小的训练数据集(观察和特征)来拟合估计器。 copy_X_train 设置为 True“训练数据的持久副本” 可能会占用我的 RAM,从而导致 MemoryError。将此参数设置为 False 解决了该问题。

    Scikit-Learn 的描述指出,基于此设置'仅存储对训练数据的引用,如果数据被外部修改,这可能会导致预测发生变化'。我对这句话的解释是:

    而不是存储整个训练数据集(以矩阵的形式 nxn 的大小基于 n 个观测值)在拟合估计器中,仅 存储了对该数据集的引用 - 因此避免了高 RAM 用法。只要数据集在外部保持完整(即不在内部 拟合的估计器),它可以在预测时可靠地获取 必须制作。数据集的修改会影响预测。

    可能会有更好的解释和理论解释。

    【讨论】:

      【解决方案2】:

      在线400 of gpc.py(您正在使用的分类器的实现)创建了一个大小为(N, N) 的矩阵,其中N 是观察数。所以代码试图创建一个形状为(32561, 32561) 的矩阵。这显然会导致一些问题,因为该矩阵有超过十亿个元素。

      至于为什么这样做,我真的不知道 scikit-learn 的实现,但一般来说,高斯过程需要在整个输入空间上估计协方差矩阵,这就是为什么如果你有高维数据。 (文档说“高维”大于几十。)

      我对如何修复它的唯一建议是分批工作。 Scikit-learn 可能有一些实用程序可以为您生成批处理,或者您可以手动完成。

      【讨论】:

      • +1。如果您已经知道这一点并且拥有大量 RAM,因此您希望它能够正常工作,那么请仔细检查您是否正在运行 64 位 Python。 64 位操作系统上的 32 位 Python 可能只能访问 2GB 的 RAM。
      • 链接失效了。 gpc.py 已移至 _gpc.py
      猜你喜欢
      • 2019-11-12
      • 2014-02-02
      • 2017-07-16
      • 2014-03-15
      • 2021-10-12
      • 2016-02-14
      • 2015-06-11
      • 2019-02-28
      • 1970-01-01
      相关资源
      最近更新 更多