yal*_*man 1 python classification pandas scikit-learn sklearn-pandas
我有X_train和y_train作为2 numpy.ndarrays的大小分别为(32561,108)和(32561,)。
每次我调用适合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
>>>
Run Code Online (Sandbox Code Playgroud)
为什么会出现此错误,该如何解决?
根据 Scikit-Learn文档,估计器GaussianProcessClassifier(以及GaussianProcessRegressor)有一个参数copy_X_train,默认设置为True:
class sklearn.gaussian_process.GaussianProcessClassifier(kernel=None, optimizer='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'1)
参数copy_X_train 的说明指出:
如果为 True,则将训练数据的持久副本存储在对象中。否则,只会存储对训练数据的引用,如果从外部修改数据,这可能会导致预测发生变化。
我曾尝试在具有 32 GB RAM 的 PC 上使用 OP 提到的类似大小的训练数据集(观察和特征)拟合估计器。将copy_X_train设置为True,“训练数据的持久副本”可能会占用我的 RAM,从而导致MemoryError. 将此参数设置为False修复了该问题。
Scikit-Learn 的描述指出,基于此设置,“仅存储对训练数据的引用,如果外部修改数据,可能会导致预测发生变化”。我对这个声明的解释是:
不是在拟合估计器中存储整个训练数据集(以基于n 个观测值的大小为nxn的矩阵的形式),而是只存储对该数据集的引用 - 从而避免了高 RAM 使用。只要数据集在外部保持完整(即不在拟合估计器内),就可以在必须进行预测时可靠地获取它。数据集的修改会影响预测。
可能会有更好的解释和理论解释。