2

DataFramecsv ファイル (約 300MB) からロードされた大きな があります。

ここから、 で使用する数十の機能を抽出していますRandomForestClassifier。一部の機能は、データ内の列から単純に派生したものです。次に例を示します。

 feature1 = data["SomeColumn"].apply(len)
 feature2 = data["AnotherColumn"]

DataFrameまた、元のデータフレームのインデックスを使用して、numpy 配列から新しい s として作成されるものもあります。

feature3 = pandas.DataFrame(count_array, index=data.index)

これらの機能はすべて 1 つに結合されますDataFrame

features = feature1.join(feature2) # etc...

そして、ランダム フォレスト分類器をトレーニングします。

classifier = RandomForestClassifier(
    n_estimators=100,
    max_features=None,
    verbose=2,
    compute_importances=True,
    n_jobs=n_jobs,
    random_state=0,
)
classifier.fit(features, data["TargetColumn"])

はこれらのRandomForestClassifier機能で問題なく動作し、ツリーの構築には O (数百メガバイトのメモリ) が必要です。ただし、データをロードした後、その小さなサブセットを取得した場合:

data_slice = data[data['somecolumn'] > value]

次に、ランダム フォレストのツリーを構築すると、フィーチャのサイズが元の O(10%) になっているにもかかわらず、突然何ギガバイトものメモリが必要になります。DataFrame

これは、データのスライスされたビューでは、それ以上のスライスを効率的に実行できないためであると考えられます (ただし、これがどのように features 配列に伝播するかはわかりません)。

data = pandas.DataFrame(data_slice, copy=True)

しかし、これは役に立ちません。

  • データのサブセットを取得すると、メモリ使用量が大幅に増加するのはなぜですか?
  • DataFrame物事を再び効率的にする可能性のある a を圧縮/再配置する他の方法はありますか?
4

1 に答える 1

4

RandomForestClassifier、特にn_jobsが大きい場合に、メモリ内でデータセットを数回コピーしています。私たちはこれらの問題を認識しており、それらを修正することを優先しています:

  • 私は現在、インスタンスがサブプロセス ワーカーに渡されるmultiprocessing.Poolときにメモリ コピーを行わない標準ライブラリのクラスのサブクラスに取り組んでいます。numpy.memmapこれにより、ソース データセットのメモリ + いくつかの事前計算されたデータ構造をワーカー間で共有できるようになります。これが修正されたら、github tracker でこの問題をクローズします。

  • のメモリ使用量をさらに 2 に減らす進行中のリファクタリングがありRandomForestClassifierます。ただし、リファクタリングの現在の状態はマスターの 2 倍遅いため、さらに作業が必要です。

ただし、これらの修正はいずれも、来週リリース予定の 0.12 リリースには反映されません。ほとんどの場合、それらは 0.13 (3 ~ 4 か月以内にリリースされる予定) で行われますが、オフコースはより早く master ブランチで利用できるようになります。

于 2012-09-01T13:05:59.777 に答える