15

我有一个正在尝试构建的模型LogisticRegressionsklearn其中包含数千个功能和大约 60,000 个样本。我正在尝试拟合模型,它现在已经运行了大约 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。我有大约 50,000 个观察值

4

5 回答 5

17

更新 - 2017 年:

在当前版本的 scikit-learn 中,LogisticRegression()现在具有n_jobs使用多个内核的参数。

但是,用户指南的实际文本表明,多核仍仅在计算的后半部分使用。截至本次更新,修订后的用户指南LogisticRegression现在说njobs选择“在交叉验证循环期间使用的 CPU 内核数”,而原始响应中引用的其他两项RandomForestClassifier()RandomForestRegressor(),两者都njobs指定“作业数”并行运行以进行拟合和预测”。换句话说,这里措辞的有意对比似乎是在指出 中的njobs参数LogisticRegression(),虽然现在已经实现,但并没有像其他两种情况那样完全或以相同的方式真正实现。

因此,虽然现在可以LogisticRegression()通过使用多个内核来加快速度,但我的猜测是,它可能不会与使用的内核数量成比例,因为这听起来像是最初的“适合”步骤(算法的前半部分)可能不适合并行化。


原答案:

在我看来,这里的主要问题似乎不是内存,而是您只使用一个内核。根据顶部,您正在以 4.34% 的速度加载系统。如果您的逻辑回归过程垄断了 24 个核心中的 1 个,那么结果为 100/24 = 4.167%。大概剩下的 0.17% 占您也在机器上运行的任何其他进程,并且它们被允许占用额外的 0.17%,因为它们被系统安排在第二个不同的核心上并行运行。

如果您点击下面的链接并查看 scikit-learn API,您会看到一些集成方法,例如RandomForestClassifier()RandomForestRegressor()有一个调用的输入参数n_jobs,它直接控制包将尝试在其上并行运行的内核数量. 您正在使用的类LogisticRegression()未定义此输入。scikit-learn 的设计者似乎已经创建了一个在类之间通常非常一致的接口,所以如果没有为给定的类定义特定的输入参数,这可能意味着开发人员根本无法找到实现以对该类有意义的方式选择。逻辑回归算法可能根本不适合并行化。即,潜在的加速本来可以实现的,但还不足以证明使用并行架构实现它是合理的。

假设是这种情况,那么不,您无能为力让您的代码运行得更快。如果底层库函数根本没有设计为能够利用它们,那么 24 核对您没有帮助。

于 2014-01-03T06:08:54.920 回答
12

尝试减小数据集大小并更改容差参数。例如,您可以尝试classifier = LogisticRegression(tol = 0.1)

于 2014-08-06T15:49:25.957 回答
9

值得注意的是,现在LogisticRegression()接受 num_jobs 作为输入并默认为 1。

会对已接受的答案发表评论,但分数不够。

于 2017-03-30T20:04:19.763 回答
9

LogisticRegressinsklearn 中的默认求解器liblinear是适用于普通数据集的求解器。对于大型数据集,请尝试随机梯度下降求解器,例如sag

model = LogisticRegression(solver='sag')
于 2017-12-06T13:31:56.543 回答
2
于 2021-02-04T07:15:55.617 回答