我有一个大的DataFrame
,从csv文件(约300MB)加载。Pandas&Scikit:切片时的内存使用情况DataFrame
从此,我提取几十功能于一身RandomForestClassifier
使用方法:一些功能被简单地列在数据导出,例如:
feature1 = data["SomeColumn"].apply(len)
feature2 = data["AnotherColumn"]
而另外一些是作为新创建从numpy的阵列DataFrame
S,使用在原始数据帧的索引:然后
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)
但这没有帮助。
- 为什么会取数据的子集大量增加内存使用?
- 是否有其他方式来压缩/重新排列
DataFrame
,这可能会使事情再次变得更有效率?
这个问题看起来像是为kaggle比赛(预测stackoverflow封闭的问题)? – ronalchn
@ronalrect correct;) – James