我有一个DataFrame
从 csv 文件(大约 300MB)加载的大文件。
从中,我提取了几十个要在 a 中使用RandomForestClassifier
的特征:一些特征只是从数据中的列派生而来,例如:
feature1 = data["SomeColumn"].apply(len)
feature2 = data["AnotherColumn"]
DataFrame
其他的则使用原始数据帧上的索引从 numpy 数组中创建为 new :
feature3 = pandas.DataFrame(count_array, index=data.index)
然后将所有这些功能合并为一个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]
然后为我的随机森林构建一棵树突然需要很多 GB的内存——即使特征的大小DataFrame
现在是原始大小的 O(10%)。
我可以相信这可能是因为对数据的切片视图不允许有效地完成进一步的切片(尽管我不知道如何将其传播到特征数组中),所以我尝试了:
data = pandas.DataFrame(data_slice, copy=True)
但这无济于事。
- 为什么获取数据子集会大量增加内存使用?
- 是否有其他方法可以压缩/重新排列 a
DataFrame
可能会使事情再次变得更有效率?