24 GBメモリのWindows 8 64ビットシステムでPython 2.7(64ビット)を実行しています。通常の_Sklearn.linear_models.Ridge
_のフィッティングを行うと、コードは正常に実行されます。
問題:ただし、フィッティングにSklearn.linear_models.RidgeCV(alphas=alphas)
を使用すると、フィッティングを実行するrr.fit(X_train, y_train)
の行でMemoryError
エラーに遭遇します手順。
このエラーを防ぐにはどうすればよいですか?
コードスニペット
_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
システムのメモリマネージャは、おそらくその割り当て要求を一目見て自殺しました。しかし、それについて何ができますか?
まず、かなりばかげている機能のように見えます。問題のドメインや機能については何も知りませんが、私の直感は、ここでいくつかの次元削減を行う必要があるということです。
第二に、疎行列のアルゴリズムの誤った処理を修正しようとすることができます。それはnumpy.linalg.svd
ここで、あなたは scipy.sparse.linalg.svds
代わりに。問題のアルゴリズムはわかりませんが、スパース行列に対応できない可能性があります。適切なスパース線形代数ルーチンを使用しても、データに似たサイズの非スパース行列が生成される(または内部で使用される)可能性があります。スパース行列表現を使用して非スパースデータを表すと、本来よりも多くのスペースしか使用されないため、このアプローチは機能しない可能性があります。注意して続行してください。
ここでの関連オプションはgcv_modeです。 「auto」、「svd」、「eigen」の3つの値を取ることができます。デフォルトでは "auto"に設定されており、n_samples> n_featuresの場合はsvdモードを使用し、それ以外の場合は固有モードを使用します。
あなたのケースではn_samples> n_featuresなので、svdモードが選択されます。ただし、svdモードは現在、スパースデータを適切に処理しません。密なSVDの代わりに適切な疎なSVDを使用するようにscikit-learnを修正する必要があります。
回避策として、gcv_mode = "eigen"によって固有モードを強制します。このモードはスパースデータを適切に処理する必要があるためです。ただし、あなたの場合、n_samplesはかなり大きいです。固有モードはカーネルマトリックスを構築するため(したがって、n_samples ** 2のメモリの複雑さ)、カーネルマトリックスはメモリに収まらない可能性があります。その場合は、サンプルの数を減らすだけです(ただし、固有モードは非常に多数の機能を問題なく処理できます)。
いずれの場合でも、n_samplesとn_featuresはどちらも非常に大きいため、この実装を限界まで押し上げています(適切なスパースSVDでも)。
https://github.com/scikit-learn/scikit-learn/issues/1921 も参照してください