14

scikit-learn を使用して、メモリの問題を発生させずに大きな csv データ (~75MB) でモデルをトレーニングするにはどうすればよいですか?

プログラミング環境として IPython ノートブックを使用し、pandas+sklearn パッケージを使用して、kaggle の数字認識チュートリアルからのデータを分析しています。

データはウェブページ、私のコードへのリンクで利用できます。エラーメッセージは次のとおりです。

KNeighborsClassifier予測に使用されます。

問題:

read_csv 関数を使用して大規模なデータセットをロードすると、「MemoryError」が発生します。この問題を一時的に回避するには、カーネルを再起動する必要があります。その後、read_csv 関数はファイルを正常にロードしますが、同じセルを再度実行すると同じエラーが発生します。

read_csv関数がファイルを正常にロードしたら、に変更を加えた後dataframe、機能とラベルを KNeighborsClassifier の fit() 関数に渡すことができます。この時点で、同様のメモリ エラーが発生します。

私は次のことを試しました:

CSV ファイルをチャンク単位で反復処理し、それに応じてデータを適合させますが、問題は、予測モデルがデータのチャンクに対して毎回上書きされることです。

メモリの問題に遭遇することなく、モデルを正常にトレーニングするにはどうすればよいと思いますか?

4

1 に答える 1

12

注: pandas を使用してデータをロードするとDataFrame、各列がすべての行に対して同種のデータ型を持つオブジェクトが作成されますが、2 つの列は異なるデータ型 (整数、日付、文字列など) を持つことができます。

インスタンスを scikit-learn モデルに渡すDataFrameと、最初に dtype np.float32 または np.float64 (モデルの実装に応じて) を持つ同種の 2D numpy 配列が割り当てられます。この時点で、メモリ内にデータセットの 2 つのコピーが作成されます。

これを回避するには、scikit-learn モデルで期待される内部形式 / dtype でデータを直接割り当てる CSV パーサーを作成 / 再利用できます。numpy.loadtxtたとえば、試すことができます(パラメーターのdocstringを見てください)。

また、データが非常にまばらな場合 (多くのゼロ値) は、scipy.sparse データ構造と、そのような入力形式を処理できる scikit-learn モデルを使用することをお勧めします (docstring を確認してください)。ただし、CSV 形式自体はまばらなデータにはあまり適しておらず、CSV からscipy.sparseパーサーへの直接的な方法が存在するかどうかはわかりません。

編集:参照用に KNearestNeighborsClassifer は一時的な距離配列を shape で割り当てますが、代わりに必要(n_samples_predict, n_samples_train)な場合にのみ非常に無駄です。(n_samples_predict, n_neighbors)この問題は、次の場所で追跡できます。

https://github.com/scikit-learn/scikit-learn/issues/325

于 2012-07-29T10:47:08.103 に答える