2 回答

TA貢獻1821條經(jīng)驗 獲得超6個贊
參數(shù)候選是在使用ParameterSampler 對象傳遞給多線程功能之前生成的。因此random_state
,對于 RandomizedSearchCV 的可重復性,只有一個就足夠了。
注意我說的"reproducibility of RandomizedSearchCV"
。對于其中使用的估算器(base_clf
此處),每個估算器都應該random_state
像您一樣攜帶自己的估算器。
現(xiàn)在談論a single instance of RandomState
,對于順序代碼來說非常好。唯一需要擔心的情況是多處理開始時。因此,讓我們分析一下程序執(zhí)行期間發(fā)生的步驟。
您設(shè)置了一個
RandomState
帶有種子的對象。它現(xiàn)在有一個狀態(tài)。在內(nèi)部
train_test_split
,使用了 aStratifiedShuffleSplit
(因為您使用了stratify
param),它將使用傳遞的RandomState
對象在訓練和測試數(shù)據(jù)中拆分和生成排列。所以RandomState
現(xiàn)在的內(nèi)部狀態(tài)發(fā)生了變化。但它的順序并沒有什么可擔心的。現(xiàn)在您
random_state
在skf
. 但是fit()
在RandomizedSearchCV
調(diào)用in之前不會發(fā)生分裂。所以狀態(tài)不變。之后,當
search_clf.fit
被調(diào)用時,會發(fā)生以下情況:_run_search()
執(zhí)行,它將使用random_state
一次生成所有參數(shù)組合(根據(jù)給定n_iters
)。所以仍然沒有多線程的任何部分發(fā)生,一切都很好。evaluate_candidates()
叫做。有趣的部分是這樣的:
out = parallel(delayed(_fit_and_score)(clone(base_estimator),
X, y,
train=train, test=test,
parameters=parameters,
**fit_and_score_kwargs)
for parameters, (train, test)
in product(candidate_params,
cv.split(X, y, groups)))
cv.split()
將使用random_state
(改變其狀態(tài))來生成訓練測試分割clone(estimator)
將克隆估計器的所有參數(shù),(random_state
也)。所以RandomState
fromcv.split
對象的改變狀態(tài)變成了 in 的基本狀態(tài)estimator
上述兩個步驟從父線程(沒有異步性)發(fā)生多次(拆分次數(shù) x 參數(shù)組合次數(shù))。并且每次
RandomState
克隆原始文件以服務于估算器。所以結(jié)果是可重復的。所以當實際的多線程部分開始時,原先
RandomState
是沒有使用的,但是每個估計器(線程)都會有自己的副本RandomState
后面的部分
parallel(delayed(_fit_and_score)
仍然是由父線程處理的順序。
希望這是有道理的,并回答您的問題。Scikit-learn明確要求用戶設(shè)置如下:
import numpy as np np.random.seed(42)
使整個執(zhí)行可重現(xiàn),但你正在做的也將做。
我不完全確定您的最后一個問題,因為我無法在我的系統(tǒng)上重現(xiàn)該問題。我有 4 個內(nèi)核,當我設(shè)置n_jobs=2
或3
我只看到那些內(nèi)核為 100% 并保持在 20-30% 左右。我的系統(tǒng)規(guī)格:
System:
python: 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 17:14:51) [GCC 7.2.0]
machine: Linux-4.15.0-20-generic-x86_64-with-debian-buster-sid
Python deps:
pip: 18.1
setuptools: 40.2.0
sklearn: 0.20.1
numpy: 1.15.4
scipy: 1.1.0
Cython: 0.29
pandas: 0.23.4

TA貢獻1868條經(jīng)驗 獲得超4個贊
在它不使用所有 cpu 內(nèi)核的方面:
我有同樣的問題,可以通過做兩件事來解決它。
我已經(jīng)編寫了自己的分發(fā)類,并意識到由于一個問題,它非常慢。加快速度有幫助。
我設(shè)置
pre_dispatch
了一些合理的東西pre_dispatch=10*os.cpu_count()
。我認為問題在于它在開始將內(nèi)容安裝到其他內(nèi)核之前準備了所有數(shù)據(jù)。
添加回答
舉報