2 回答

TA貢獻1821條經驗 獲得超6個贊
參數候選是在使用ParameterSampler 對象傳遞給多線程功能之前生成的。因此random_state
,對于 RandomizedSearchCV 的可重復性,只有一個就足夠了。
注意我說的"reproducibility of RandomizedSearchCV"
。對于其中使用的估算器(base_clf
此處),每個估算器都應該random_state
像您一樣攜帶自己的估算器。
現在談論a single instance of RandomState
,對于順序代碼來說非常好。唯一需要擔心的情況是多處理開始時。因此,讓我們分析一下程序執行期間發生的步驟。
您設置了一個
RandomState
帶有種子的對象。它現在有一個狀態。在內部
train_test_split
,使用了 aStratifiedShuffleSplit
(因為您使用了stratify
param),它將使用傳遞的RandomState
對象在訓練和測試數據中拆分和生成排列。所以RandomState
現在的內部狀態發生了變化。但它的順序并沒有什么可擔心的。現在您
random_state
在skf
. 但是fit()
在RandomizedSearchCV
調用in之前不會發生分裂。所以狀態不變。之后,當
search_clf.fit
被調用時,會發生以下情況:_run_search()
執行,它將使用random_state
一次生成所有參數組合(根據給定n_iters
)。所以仍然沒有多線程的任何部分發生,一切都很好。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
(改變其狀態)來生成訓練測試分割clone(estimator)
將克隆估計器的所有參數,(random_state
也)。所以RandomState
fromcv.split
對象的改變狀態變成了 in 的基本狀態estimator
上述兩個步驟從父線程(沒有異步性)發生多次(拆分次數 x 參數組合次數)。并且每次
RandomState
克隆原始文件以服務于估算器。所以結果是可重復的。所以當實際的多線程部分開始時,原先
RandomState
是沒有使用的,但是每個估計器(線程)都會有自己的副本RandomState
后面的部分
parallel(delayed(_fit_and_score)
仍然是由父線程處理的順序。
希望這是有道理的,并回答您的問題。Scikit-learn明確要求用戶設置如下:
import numpy as np np.random.seed(42)
使整個執行可重現,但你正在做的也將做。
我不完全確定您的最后一個問題,因為我無法在我的系統上重現該問題。我有 4 個內核,當我設置n_jobs=2
或3
我只看到那些內核為 100% 并保持在 20-30% 左右。我的系統規格:
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條經驗 獲得超4個贊
在它不使用所有 cpu 內核的方面:
我有同樣的問題,可以通過做兩件事來解決它。
我已經編寫了自己的分發類,并意識到由于一個問題,它非常慢。加快速度有幫助。
我設置
pre_dispatch
了一些合理的東西pre_dispatch=10*os.cpu_count()
。我認為問題在于它在開始將內容安裝到其他內核之前準備了所有數據。
添加回答
舉報