我有一个100,000行的数据集和125个功能和连续输出。我在2013 macbook pro上运行numpy,pandas和sklearn,16gb内存。仅使用10,000行和5个特征进行训练时,当我尝试使用sklearn RandomForestClassifier在测试集中仅预测1,000行时,ipython内核就会死亡。我应该达到这个限制,只需要10,000 x 5来训练和1,000 x 5来预测吗?
import pandas as pd
import numpy as np
import sklearn as sk
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectKBest
df = pd.read_csv('train.csv')
df2 = pd.read_csv('test.csv')
cat = df.iloc[:,:117]
cont = df.iloc[:,117:df.shape[1]-1]
y = df.iloc[:,df.shape[1]-1]
cat2 = df2.iloc[:,:117]
cont2 = df2.iloc[:,117:df2.shape[1]]
cont_new = SelectKBest(k=5).fit_transform(cont,y)
test = cont2.iloc[:,[6,7,10,12,13]]
rf = RandomForestClassifier(n_jobs=-1,n_estimators=100,max_depth=20)
y = np.asarray(y,dtype="|S6")
rf.fit(cont_new[:10000], y[:10000])
predictions = rf.predict(test[:5000])
print(predictions)
答案 0 :(得分:0)
正如Robert Kern’s line_profiler package衡量CPU使用率一样,memory_profiler module by Fabian Pedregosa and Philippe Gervais逐行测量内存使用情况。了解代码的内存使用特性可以让自己问两个问题:
memory_profiler
的运作方式与line_profiler,
非常相似,但运行速度要慢得多。如果您安装了psutil
软件包(可选但建议使用),memory_profiler
将运行得更快。内存分析可能会使您的代码运行速度慢10到100倍。实际上,您可能会更频繁地使用memory_profiler
和line_profiler(用于CPU分析)。
使用memory_profiler
命令(以及pip install memory_profiler
pip install psutil).
如上所述,memory_profiler
的实施不如line_profiler
的实施那样高效。因此,对于在有用的时间内完成的较小问题运行测试可能是有意义的。
隔夜运行对于验证可能是明智的,但是您需要快速合理的迭代来诊断问题并假设解决方案。
修改源代码的要求是一个小麻烦。与line_profiler,
一样,装饰器(@profile)
用于标记所选功能。
在处理内存分配时,您必须意识到情况并不像CPU使用情况那样明确。通常,将内存分配到可以在闲暇时使用的本地池中的进程更有效,因为内存分配操作相对昂贵。此外,垃圾收集不是即时的,因此对象可能不可用但仍在垃圾收集池中一段时间。
这样做的结果是很难真正理解Python程序中内存使用和释放的情况,因为一行代码可能无法分配从进程外部观察到的确定数量的内存。观察一组线上的总趋势可能会比观察一条线的行为更有洞察力。
以上摘自Micha Gorelick和Ian Ozsvald的High performance Python(第42-50页)。