DataFrame
csv ファイル (約 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 を圧縮/再配置する他の方法はありますか?