亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在多核上使用 RandomState 和 Sklearn RandomizedSearchCV

如何在多核上使用 RandomState 和 Sklearn RandomizedSearchCV

慕工程0101907 2021-09-14 15:32:58
我百思不得其解有關的權利的方式來使用np.random.RandomState與sklearn.model_selection.RandomizedSearchCV在多個內核上運行時。我RandomState用來生成偽隨機數,以便我的結果是可重復的。我給出RandomizedSearchCV了一個RandomState和 set的實例,n_jobs=-1以便它使用所有六個內核。在多核上運行會引入異步元素。我預計這會導致在不同的運行中以不同的順序發出來自不同內核的偽隨機數請求。因此,不同的運行應該給出不同的結果,而不是顯示可重復性。但事實上,結果是可重復的。對于給定的值n_iter(即從參數空間中抽取的次數),找到的最佳超參數值從一次運行到下一次運行是相同的。如果n_jobs是小于核心數的正數,我也會得到相同的值。具體來說,這里是代碼:import numpy as npimport scipy.stats as statsfrom sklearn.datasets import load_irisfrom sklearn.ensemble import GradientBoostingClassifierfrom 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.targetX_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 分布中隨機均勻采樣?!?這是否意味著它不會影響參數空間中的分布?上面的代碼是否足以確??芍貜托裕蛘呶沂欠裥枰O置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 優化機器使用嗎?
查看完整描述

2 回答

?
達令說

TA貢獻1821條經驗 獲得超6個贊

參數候選是在使用ParameterSampler 對象傳遞給多線程功能之前生成的。因此random_state,對于 RandomizedSearchCV 的可重復性,只有一個就足夠了。

注意我說的"reproducibility of RandomizedSearchCV"。對于其中使用的估算器(base_clf此處),每個估算器都應該random_state像您一樣攜帶自己的估算器。

現在談論a single instance of RandomState,對于順序代碼來說非常好。唯一需要擔心的情況是多處理開始時。因此,讓我們分析一下程序執行期間發生的步驟。

  1. 您設置了一個RandomState帶有種子的對象。它現在有一個狀態。

  2. 在內部train_test_split,使用了 a StratifiedShuffleSplit(因為您使用了stratifyparam),它將使用傳遞的RandomState對象在訓練和測試數據中拆分和生成排列。所以RandomState現在的內部狀態發生了變化。但它的順序并沒有什么可擔心的。

  3. 現在您random_stateskf. 但是fit()RandomizedSearchCV調用in之前不會發生分裂。所以狀態不變。

  4. 之后,當search_clf.fit被調用時,會發生以下情況

    1. _run_search()執行,它將使用random_state一次生成所有參數組合(根據給定n_iters)。所以仍然沒有多線程的任何部分發生,一切都很好。

    2. 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也)。所以RandomStatefromcv.split對象的改變狀態變成了 in 的基本狀態estimator

    • 上述兩個步驟從父線程(沒有異步性)發生多次(拆分次數 x 參數組合次數)。并且每次RandomState克隆原始文件以服務于估算器。所以結果是可重復的。

    • 所以當實際的多線程部分開始時,原先RandomState是沒有使用的,但是每個估計器(線程)都會有自己的副本RandomState

    1. 后面的部分parallel(delayed(_fit_and_score)仍然是由父線程處理的順序。

希望這是有道理的,并回答您的問題。Scikit-learn明確要求用戶設置如下:

import numpy as np
np.random.seed(42)

使整個執行可重現,但你正在做的也將做。

我不完全確定您的最后一個問題,因為我無法在我的系統上重現該問題。我有 4 個內核,當我設置n_jobs=23我只看到那些內核為 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 


查看完整回答
反對 回復 2021-09-14
?
MYYA

TA貢獻1868條經驗 獲得超4個贊

在它不使用所有 cpu 內核的方面:

我有同樣的問題,可以通過做兩件事來解決它。

  • 我已經編寫了自己的分發類,并意識到由于一個問題,它非常慢。加快速度有幫助。

  • 我設置pre_dispatch了一些合理的東西pre_dispatch=10*os.cpu_count()。我認為問題在于它在開始將內容安裝到其他內核之前準備了所有數據。


查看完整回答
反對 回復 2021-09-14
  • 2 回答
  • 0 關注
  • 359 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號