我有一个100000行、125个特征和连续输出的数据集。我在2013年16gb内存的macbook pro上运行numpy, pandas和sklearn。仅使用10,000行和5个特征进行训练,当我尝试使用sklearn RandomForestClassifier在测试集中仅预测1,000行时,python内核就会死亡。我应该在只有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)
使用memory_profiler诊断内存使用
就像Robert Kern的line_profiler包测量CPU使用情况一样,Fabian Pedregosa和Philippe Gervais的memory_profiler模块逐行测量内存使用情况。理解代码的内存使用特征可以让您问自己两个问题:
- 我们可以使用更少的RAM重写这个函数更有效地工作吗?
- 我们可以使用更多的RAM和节省CPU周期缓存?
memory_profiler
的操作方式与line_profiler,
非常相似,但运行速度要慢得多。如果安装psutil
包(可选,但推荐),memory_profiler
运行速度会更快。内存分析很容易使您的代码运行速度慢10到100倍。在实践中,您可能会偶尔使用memory_profiler
,而更频繁地使用line_profiler(用于CPU分析)。
使用命令pip install memory_profiler
安装memory_profiler
(可选pip install psutil).
)
如前所述,memory_profiler
的实现不如line_profiler
的实现性能好。因此,在较小的问题上运行测试可能是有意义的,这些问题可以在有效的时间内完成。
隔夜运行对于验证可能是明智的,但是您需要快速而合理的迭代来诊断问题并假设解决方案。
修改源代码的要求是一个小麻烦。与line_profiler,
一样,装饰器(@profile)
用于标记所选的函数。
在处理内存分配时,您必须意识到情况并不像CPU使用情况那样明确。一般来说,将内存过度分配给进程到空闲时可以使用的本地池会更有效,因为内存分配操作的成本相对较高。此外,垃圾收集不是即时的,因此对象可能不可用,但仍在垃圾收集池中一段时间。
这样做的结果是很难真正理解Python程序内部的内存使用和释放发生了什么,因为从进程外部观察到,一行代码可能不会分配确定数量的内存。观察一组线的总体趋势可能比只观察一条线的行为更有可能获得更好的洞察力。
以上摘自Micha Gorelick和Ian Ozsvald的《高性能Python》(第42-50页)。