我百思不得其解有关的权利的方式来使用np.random.RandomState与sklearn.model_selection.RandomizedSearchCV在多个内核上运行时。
我RandomState用来生成伪随机数,以便我的结果是可重复的。我给出RandomizedSearchCV了一个RandomState和 set的实例,n_jobs=-1以便它使用所有六个内核。
在多核上运行会引入异步元素。我预计这会导致在不同的运行中以不同的顺序发出来自不同内核的伪随机数请求。因此,不同的运行应该给出不同的结果,而不是显示可重复性。
但事实上,结果是可重复的。对于给定的值n_iter(即从参数空间中抽取的次数),找到的最佳超参数值从一次运行到下一次运行是相同的。如果n_jobs是小于核心数的正数,我也会得到相同的值。
具体来说,这里是代码:
import numpy as np
import scipy.stats as stats
from sklearn.datasets import load_iris
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import RandomizedSearchCV, StratifiedKFold, train_test_split
# Use RandomState for reproducibility.
random_state = np.random.RandomState(42)
# Get data. Split it into training and test sets.
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.4, random_state=random_state, stratify=y)
我有几个问题。
尽管存在异步方面,为什么我仍能获得可重现的结果?
的文档RandomizedSearchCV说明了该random_state参数:“伪随机数生成器状态用于从可能值列表而不是 scipy.stats 分布中随机均匀采样。” 这是否意味着它不会影响参数空间中的分布?上面的代码是否足以确保可重复性,或者我是否需要设置np.random.seed(),或者编写如下内容:
distn_learning_rate = stats.uniform(0.05, 0.2)
distn_learning_rate.random_state = random_state
distn_subsample = stats.uniform(0.8, 0.2)
distn_subsample.random_state = random_state
param_space = {'learning_rate': distn_learning_rate,
'n_estimators': [50, 100, 200],
'subsample': distn_subsample}
总的来说,这是设置RandomizedSearchCV再现性的正确方法吗?
使用的单个实例RandomState确定,或者我应该使用单独的实例为train_test_split,GradientBoostingClassifier,StratifiedKFold,和RandomizedSearchCV?此外,文档np.random.seed说种子是在RandomState初始化时设置的。这如何与RandomizedSearchCV设置种子相互作用?
当n_jobs设置为使用少于所有内核时,我仍然看到所有内核上的活动,尽管每个内核的使用水平会随着内核数量的增加而增加并且经过的时间会减少。这只是 sklearn 和/或 macOS 优化机器使用吗?
达令说
MYYA
相关分类