解决 scikit-learn OneVsRest RandomForests 的缓慢解酸问题
Posted
技术标签:
【中文标题】解决 scikit-learn OneVsRest RandomForests 的缓慢解酸问题【英文标题】:addressing slow unpickling of scikit-learn OneVsRest RandomForests 【发布时间】:2013-01-06 12:15:35 【问题描述】:我有一个应用程序,我在其中加载非常大的 python 对象——它们是序列化的 scikit-learn 分类器及其相关词汇。
分类器足够大(大约 1-100 MB),将它们加载到内存中并非易事。实际的读取速度很快,但 unpickling 需要很长时间,对于 4MB 的分类器大约需要 10 秒。
有没有比 cPickle.dumps/cPickle.loads 更快的方法来序列化/反序列化对象?
附加信息:
分类器是 10 个元素的一对多随机森林的实例。分类器在大约 1000 个样本、大约 500 个特征和 52 个可能的标签上进行了训练。 min_density
参数设置为0。
cPickle.load 的 cProfile 输出:
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 300.168 300.168 <ipython-input-4-9b8a128f290d>:1(loader)
1 0.899 0.899 301.067 301.067 <string>:1(<module>)
51380 288.151 0.006 288.151 0.006 __init__.py:93(__RandomState_ctor)
51380 0.059 0.000 0.404 0.000 fromnumeric.py:1774(amax)
1 11.613 11.613 300.168 300.168 cPickle.load
1 0.000 0.000 0.000 0.000 method 'disable' of '_lsprof.Profiler' objects
51380 0.344 0.000 0.344 0.000 method 'max' of 'numpy.ndarray' objects
1 0.000 0.000 0.000 0.000 open
我正在 github.com/scikit-learn 上提出问题。
【问题讨论】:
【参考方案1】:您是否尝试过使用 joblib 选择器?它捆绑在 sklearn 包中:
>>> from sklearn.externals import joblib
>>> joblib.dump(model, '/path/to/model.pkl')
>>> model_copy = joblib.load('/path/to/model.pkl')
编辑:实际上对于随机森林,使用 HIGHEST 协议的默认酸洗似乎更快:
>>> from cPickle import dump, load, HIGHEST_PROTOCOL
>>> dump(model, open('/tmp/model_highest.pkl', 'wb'), HIGHEST_PROTOCOL)
>>> load(open('/tmp/model_highest.pkl', 'rb'))
Edit2:根据您的个人资料报告,问题似乎是伪随机数生成器实例的取消处理。您能否提供您用于训练模型的确切 python sn-p 以及数据集的形状,并将其与分析报告一起作为 scikit-learn 项目的 github 问题跟踪器上的错误包含在其中?
【讨论】:
我目前正在使用 cPickle 转储并使用 HIGHEST_PROTOCOL 加载。我没有尝试过joblib,但我想我可以试一试。也许我可以并行反序列化? 感谢分析输出,请参阅我的回答中的第二个编辑。 我在 scikit-learn github 上开了一个issue。那里的帖子回应了 ogrisel 的第二次编辑。以上是关于解决 scikit-learn OneVsRest RandomForests 的缓慢解酸问题的主要内容,如果未能解决你的问题,请参考以下文章
PySpark ML:LinearSVC 的 OnevsRest 策略
有没有一种简单的方法来获得多类分类的混淆矩阵? (OneVsRest)
OneVsRest predict_proba() 和 predict() 不匹配?