我有一个模型,我正在尝试使用LogisticRegression中的sklearn构建,它有几千个特性和大约60000个样本。我正在试着适应这个模型,它已经运行了大约10分钟了。我运行它的机器有千兆字节的RAM和几个内核,我想知道是否有任何方法可以加快进程。
编辑
这台机器有24个内核,这里是Top的输出,以提供内存概念。

Processes: 94 total, 8 running, 3 stuck, 83 sleeping, 583 threads      20:10:19
Load Avg: 1.49, 1.25, 1.19  CPU usage: 4.34% user, 0.68% sys, 94.96% idle
SharedLibs: 1552K resident, 0B data, 0B linkedit.
MemRegions: 51959 total, 53G resident, 46M private, 676M shared.
PhysMem: 3804M wired, 57G active, 1042M inactive, 62G used, 34G free.
VM: 350G vsize, 1092M framework vsize, 52556024(0) pageins, 85585722(0) pageouts
Networks: packets: 172806918/25G in, 27748484/7668M out.
Disks: 14763149/306G read, 26390627/1017G written.

我想用以下方法来训练这个模型
classifier = LogisticRegression(C=1.0, class_weight = 'auto')
classifier.fit(train, response)

train有大约3000长的行(所有浮点),response中的每一行都是01。我有大约50000个观察结果

最佳答案

更新-2017年:
在当前版本的SciKit Learn中,LogisticRegression()现在有n_jobs参数来使用多个内核。
然而,《用户指南》的实际文本表明,在计算的后半部分仍然只使用多个内核。截至本次更新,修订后的用户指南现在指出,LogisticRegression选择“交叉验证循环中使用的CPU核心数”,而原始响应中引用的其他两个项目,njobsRandomForestClassifier()都表示,RandomForestRegressor()指定“为两个匹配并行运行的作业数”并预测”。换言之,本文中措辞的故意对比似乎指出,虽然现在已经实现了,但实际上并不像其他两种情况那样完全或以相同的方式实现了njobs中的参数。
因此,虽然现在可以通过使用多个内核来稍微加快njobs的速度,但我的猜测是,它可能不会与使用的内核数量成很好的线性关系,因为听起来像初始“拟合”步骤(算法的前半部分)可能不适合并行化。
原始答案:
在我看来,这里的主要问题不是记忆,而是你只使用了一个核心。根据Top,您将以4.34%的速度加载系统。如果您的逻辑回归过程是独占24个核心中的1个,则得出100/24=4.167%。大概剩下的0.17%占了您在机器上运行的任何其他进程的0.17%,并且允许它们额外占用0.17%,因为系统正在安排它们在第二个不同的核心上并行运行。
如果您按照下面的链接并查看SciKit学习API,您将看到一些集成方法(如LogisticRegression()LogisticRegression()有一个名为RandomForestClassifier()的输入参数,该参数直接控制包将尝试并行运行的核心数。您使用的类,RandomForestRegressor()没有定义此输入。SciKit Learn的设计者似乎已经创建了一个接口,它通常在类之间非常一致,因此如果没有为给定的类定义特定的输入参数,这可能意味着开发人员无法找到一种方法来实现有意义的选项。去上课吧。可能是逻辑回归算法本身不适合并行化;也就是说,可能实现的潜力speedup不够好,无法用并行架构实现。
假设是这样的话,那么不,没有太多的事情可以让代码运行得更快。如果基础库函数的设计不能充分利用它们,那么24核对您没有帮助。

关于python - 加快sklearn逻辑回归,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20894671/

10-12 16:54