7

sklearn 0.11 の LogisticRegression オブジェクトを使用して、約 80,000 の特徴を持つ 200,000 の観測にモデルを適合させようとしています。目標は、短いテキストの説明を 800 クラスのうちの 1 つに分類することです。

分類子 pythonw.exe に適合させようとすると、次のようになります。

アプリケーション エラー「... の命令は 0x00000000 のメモリを参照しました」。メモリに書き込めませんでした。」

特徴は非常にまばらで、観測ごとに約 10 個であり、バイナリ (1 または 0) であるため、エンベロープ計算の裏で、4 GB の RAM でメモリ要件を処理できるはずですが、そうではないようです。場合があります。モデルは、使用する観測数や機能が少ない場合にのみ適合します。

どちらかといえば、もっと観察や機能を使いたいです。私の素朴な理解は、舞台裏で物事を実行しているliblinearライブラリがそれをサポートできるということです。さらにいくつかの観測を絞り込む方法についてのアイデアはありますか?

私のコードは次のようになります。

y_vectorizer = LabelVectorizer(y) # my custom vectorizer for labels
y = y_vectorizer.fit_transform(y)

x_vectorizer = CountVectorizer(binary = True, analyzer = features)
x = x_vectorizer.fit_transform(x)

clf = LogisticRegression()
clf.fit(x, y)

アナライザーに渡す features() 関数は、各観測で検出された機能を示す文字列のリストを返すだけです。

私は Python 2.7、sklearn 0.11、4 GB の RAM を搭載した Windows XP を使用しています。

4

1 に答える 1

23

liblinear ( のバッキング実装) は、データの独自のコピーをホストします。これは、またはsklearn.linear_model.LogisticRegressionなどの scipy で事前に割り当てられたスパース行列に内部メモリ レイアウトを直接マップできない C++ ライブラリであるためです。scipy.sparse.csr_matrixscipy.sparse.csc_matrix

あなたの場合、データを としてロードし、scipy.sparse.csr_matrixそれを にフィードすることをお勧めしますsklearn.linear_model.SGDClassifier(loss='log'ロジスティック回帰モデルとメソッドを呼び出す機能が必要なpredict_proba場合)。既にメモリ レイアウトSGDClassifierを使用している場合、入力データはコピーされません。scipy.sparse.csr_matrix

(入力データセットのサイズに加えて) 800 * (80000 + 1) * 8 / (1024 ** 2) = 488MB の高密度モデルがメモリに割り当てられることを期待してください。

編集:データセットのメモリ アクセスを最適化する方法

データセットの抽出後にメモリを解放するには、次のことができます。

x_vectorizer = CountVectorizer(binary = True, analyzer = features)
x = x_vectorizer.fit_transform(x)
from sklearn.externals import joblib
joblib.dump(x.tocsr(), 'dataset.joblib')

次に、この python プロセスを終了し (完全なメモリ割り当て解除を強制するため)、新しいプロセスで:

x_csr = joblib.load('dataset.joblib')

Linux / OSX では、次の方法でさらに効率的にメモリ マップを作成できます。

x_csr = joblib.load('dataset.joblib', mmap_mode='c')
于 2012-06-26T08:53:03.313 に答える