【发布时间】:2021-07-18 01:53:30
【问题描述】:
有没有办法在 scikit-learn 中并行化多个模型构建过程?我知道我可以在GridSearchCV 和cross_validate 中使用n_jobs 参数来实现某种并行化在一个模型构建过程中。但是,我在具有不同输入参数的 for 循环中运行多个模型构建过程,并将结果保存在列表中。举个例子,假设我有 15 个空闲 CPU,我在 cross_validate 中使用 n_jobs=5。如果我没记错的话,这意味着一个模型构建过程使用 5 个 CPU。现在有没有办法在我的 for 循环中开始接下来的 2 个模型构建过程,所以我正在使用所有 15 个 CPU?这是一个虚拟示例:
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import KFold, GridSearchCV, cross_validate
# load breast cancer data set
X,y = load_breast_cancer(return_X_y=True)
# define different types of penalty strategies
# let's make a toy example and pretend we would be interested in
# running different penalty strategies (I use three times 'l2' here,
# but imagine these would be different)
penalty_types = ['l2','l2','l2']
# define output list where we add the results using different penalty strategies
nested_cv_scores_list = []
for penalty_type in penalty_types:
# create a random number generator
rng = np.random.RandomState(42)
# z-standardize features
scaler = StandardScaler()
# use linear L2-regularized Logistic Regression as classifier
lr = LogisticRegression(random_state=rng,penalty=penalty_type)
# define parameter grid to optimize over (optimize C)
lr_c = np.linspace(start=1,stop=16,num=11,endpoint=True)
p_grid = {'lr__C':lr_c}
# create pipeline
lr_pipe = Pipeline([
('scaler',scaler),
('lr',lr)
])
# define cross validation strategy
cv = KFold(shuffle=True,random_state=rng)
# implement GridSearch (inner cross validation)
grid = GridSearchCV(lr_pipe,param_grid=p_grid,cv=cv)
# implement cross_validate (outer cross validation)
nested_cv_scores = cross_validate(grid,X,y,cv=cv,n_jobs=5)
# append result to list
nested_cv_scores_list.append(nested_cv_scores)
有没有办法并行化这个 for 循环?
【问题讨论】:
-
如果设置
n_jobs = -1,它将使用所有可用的CPU。 -
我知道,但这只会影响我的 for 循环中的一个模型构建过程的并行化(因此在我的示例中:使用 5 个 CPU 用于 'l1' 然后 5 个 CPU 用于 'l2 ' 最后是 5 个 CPU 用于 'elastic')。但我想并行化模型构建过程。如果您想这样称呼它,则为“元”并行化。
-
我认为
GridSearchCV能够并行执行所有这些计算,而无需创建for-loop。你只需要像往常一样通过它们。除非你真的有for-loop的具体原因(我没看到),否则你可以创建自己的GridSearchCV并在for-loop中使用多处理(即池)方法。 -
当然,上面的脚本只是一个简化的例子。我的模型构建程序之间存在系统/固定的差异(例如,在我的示例中,我假装使用三种不同的惩罚策略),我想进行比较。这就是 for 循环的用途。我不想将它们优化为超参数,因为我想确保某些参数在我的模型构建过程中保持不变(“使用固定参数 a、b、c 运行三个嵌套交叉验证”)。我不知道
GridSearchCV怎么解决这个问题?
标签: python multithreading scikit-learn parallel-processing