Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 加速逻辑回归_Python_Logistic Regression_Scikit Learn - Fatal编程技术网

Python 加速逻辑回归

Python 加速逻辑回归,python,logistic-regression,scikit-learn,Python,Logistic Regression,Scikit Learn,我正试图使用sklearn中的LogisticRegression构建一个模型,该模型具有数千个特性和大约60000个样本。我正在试着适应这个模型,它已经运行了大约10分钟了。我运行它的机器有千兆字节的RAM和几个内核可供使用,我想知道是否有任何方法可以加快进程 编辑 这台机器有24个内核,下面是top的输出,给出了内存的概念 Processes: 94 total, 8 running, 3 stuck, 83 sleeping, 583 threads 20:10:19 Load

我正试图使用
sklearn
中的
LogisticRegression
构建一个模型,该模型具有数千个特性和大约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)
序列
的行长约3000行(均为浮点),且
响应
中的每一行都是
0
1
。我有大约50000个观察结果

2017年更新: 在当前版本的scikit learn中,现在有
n_jobs
参数来利用多核

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

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


原始答复: 在我看来,这里的主要问题似乎不是内存,而是您只使用了一个内核。根据top,系统的加载率为4.34%。如果你的逻辑回归过程垄断了24个核心中的1个,那么100/24=4.167%。其余的0.17%大概占机器上运行的任何其他进程的0.17%,并且允许它们额外占用0.17%,因为系统计划它们在第二个不同的内核上并行运行

如果您遵循下面的链接并查看scikit学习API,您将看到一些集成方法,例如or,有一个名为
n_jobs
的输入参数,它直接控制包尝试并行运行的内核数量。您正在使用的类不定义此输入。scikit learn的设计者似乎已经创建了一个在类之间通常相当一致的接口,因此如果没有为给定的类定义特定的输入参数,这可能意味着开发人员根本无法找到一种方法来以有意义的方式为该类实现该选项。可能是逻辑回归算法本身不适合并行化;i、 例如,本可以实现的潜力还不足以证明用并行架构实现它是合理的


假设是这样的话,那么不,没有什么可以让代码运行得更快的了。如果基础库函数的设计不能充分利用它们,那么24核对您没有帮助。

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

值得注意的是,现在接受num\u作业作为输入,默认值为1


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

sklearn中
logisticRegressionin
的默认解算器是
liblinear
,这是一个适用于正常数据集的解算器。对于大型数据集,请尝试随机梯度下降解算器,如
sag

model = LogisticRegression(solver='sag')

尝试更改您的解算器。scikit learn表示您可以使用5种不同的解算器(“liblinear”、“sag”、“saga”、“newton cg”、“lbfgs”)

对于小型数据集,“liblinear”(以前是默认值)是一个不错的选择,而对于大型数据集,“sag”和“saga”则更快

对于多类问题,只有“newton cg”、“sag”、“saga”和“lbfgs”处理多项式损失“liblinear”仅限于一对多方案

import time
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

# Set training and validation sets
X, y = make_classification(n_samples=1000000, n_features=1000, n_classes = 2)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=10000)

# Solvers
solvers = ['liblinear', 'newton-cg', 'sag', 'saga', 'lbfgs']

for sol in solvers: 
    start = time.time()
    logreg = LogisticRegression(solver=sol)
    logreg.fit(X_train, y_train)
    end = time.time()
    print(sol + " Fit Time: ",end-start)
输出(来自16GB 4核MacBook):

为问题选择正确的解算器可以节省大量时间(代码改编自)。要确定哪个解算器适合您的问题,您可以查看中的表以了解更多信息


此外,由于您没有进行多类分类,您的模型可能无法很好地并行化。根据scikit学习文档,
n\u jobs
是在类上并行时使用的CPU核数,如果
multi\u class='ovr'

那么长的时间会让人惊讶。你确定你的模型设置正确吗?你的特征向量的大小是多少?在你的机器上发布一些真实的统计数据?1和8GB内存之间的差异非常大,2和8核之间的差异也非常大。更不用说,在讨论单核小于1GB的进程时,这两个方面都不是很重要。我添加了一些编辑来解决其中的一些问题。我显示了RAM的最高输出,因为我不是唯一一个使用这台机器的人,所以所有的物理内存对我来说并不总是可以访问的,但看起来我应该有足够的内存,我想我希望有一种方法可以并行