2

我有一个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)

但这无济于事。

  • 为什么获取数据子集会大量增加内存使用?
  • 是否有其他方法可以压缩/重新排列 aDataFrame可能会使事情再次变得更有效率?
4

1 回答 1

4

RandomForestClassifier是在内存中多次复制数据集,特别是当n_jobs它很大时。我们知道这些问题,并优先解决这些问题:

  • 我目前正在研究标准库类的子类,当实例传递给子进程工作者multiprocessing.Pool时,它不会进行内存复制。numpy.memmap这将使工作人员之间共享源数据集的内存+一些预先计算的数据结构成为可能。解决此问题后,我将在 github tracker 上关闭此问题。

  • 正在进行的重构将进一步减少RandomForestClassifier2 的内存使用量。然而,重构的当前状态是主节点的两倍慢,因此仍需要进一步的工作。

然而,这些修复都不会使其成为计划于下周发布的 0.12 版本。很可能它们将在 0.13 版本中完成(计划在 3 到 4 个月内发布),但是 master 分支中的 offcourse 将很快可用。

于 2012-09-01T13:05:59.777 回答