【问题标题】:Sklearn or my computer can't handle data setSklearn 或我的电脑无法处理数据集
【发布时间】:2016-10-23 21:12:27
【问题描述】:

我有一个包含 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 进行预测来达到这个限制?

data

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)

【问题讨论】:

  • 死前会报错吗?分享错误。还要仔细检查采样数据是否有问题。
  • 在您的 Mac 上打开活动监视器 - 运行时是否使用过多的 RAM?
  • 我会尝试在 ipython 内核之外运行它并了解是否存在故障。
  • 错误信息是“内核似乎已经死机。它将自动重启。”它在控制台的脚本中运行,但仍然需要永远只有 10,000 x 5 个预测。
  • 显示代码或其他一切都在猜测。

标签: python scikit-learn


【解决方案1】:

使用 memory_profiler 诊断内存使用情况

就像Robert Kern’s line_profiler package 测量CPU 使用率一样,memory_profiler module by Fabian Pedregosa and Philippe Gervais 逐行测量内存使用情况。了解代码的内存使用特性可以让您问自己两个问题:

  • 我们是否可以通过重写此函数来使用更少的 RAM 以提高工作效率?
  • 我们能否使用更多 RAM 并通过缓存节省 CPU 周期?

memory_profiler 的运行方式与line_profiler, 非常相似,但运行速度要慢得多。如果您安装psutil 软件包(可选但推荐),memory_profiler 将运行得更快。内存分析可能很容易使您的代码运行速度慢 10 到 100 倍。在实践中,您可能会偶尔使用memory_profiler,而更频繁地使用line_profiler(用于CPU 分析)。

使用命令pip install memory_profiler(以及可选的pip install psutil).)安装memory_profiler

如前所述,memory_profiler 的实现不如line_profiler 的实现性能好。因此,对在有用的时间内完成的较小问题运行测试可能是有意义的。

通宵运行对于验证可能是明智的,但您需要快速合理的迭代来诊断问题并假设解决方案。

修改源代码的要求是一个小麻烦。与line_profiler, 一样,装饰器(@profile) 用于标记所选功能。

在处理内存分配时,您必须意识到情况并不像 CPU 使用情况那样明确。通常,将内存过度分配给可以在闲暇时使用的本地池中的进程会更有效,因为内存分配操作相对昂贵。此外,垃圾收集不是即时的,因此对象可能在一段时间内不可用但仍在垃圾收集池中。

这样做的结果是,很难真正理解 Python 程序内部的内存使用和释放情况,因为从进程外部观察到,一行代码可能无法分配确定的内存量。观察一组线的总体趋势可能比只观察一条线的行为更能深入了解。

以上内容取自 Micha Gorelick 和 Ian Ozsvald 的 High performance Python(第 42-50 页)。

【讨论】:

    猜你喜欢
    • 2020-07-19
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多