第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

慕工程0101907 2021-09-14 15:32:58
我百思不得其解有關(guān)的權(quán)利的方式來使用np.random.RandomState與sklearn.model_selection.RandomizedSearchCV在多個內(nèi)核上運行時。我RandomState用來生成偽隨機數(shù),以便我的結(jié)果是可重復的。我給出RandomizedSearchCV了一個RandomState和 set的實例,n_jobs=-1以便它使用所有六個內(nèi)核。在多核上運行會引入異步元素。我預計這會導致在不同的運行中以不同的順序發(fā)出來自不同內(nèi)核的偽隨機數(shù)請求。因此,不同的運行應該給出不同的結(jié)果,而不是顯示可重復性。但事實上,結(jié)果是可重復的。對于給定的值n_iter(即從參數(shù)空間中抽取的次數(shù)),找到的最佳超參數(shù)值從一次運行到下一次運行是相同的。如果n_jobs是小于核心數(shù)的正數(shù),我也會得到相同的值。具體來說,這里是代碼: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)我有幾個問題。盡管存在異步方面,為什么我仍能獲得可重現(xiàn)的結(jié)果?的文檔RandomizedSearchCV說明了該random_state參數(shù):“偽隨機數(shù)生成器狀態(tài)用于從可能值列表而不是 scipy.stats 分布中隨機均勻采樣?!?這是否意味著它不會影響參數(shù)空間中的分布?上面的代碼是否足以確保可重復性,或者我是否需要設(shè)置np.random.seed(),或者編寫如下內(nèi)容: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}  總的來說,這是設(shè)置RandomizedSearchCV再現(xiàn)性的正確方法嗎?使用的單個實例RandomState確定,或者我應該使用單獨的實例為train_test_split,GradientBoostingClassifier,StratifiedKFold,和RandomizedSearchCV?此外,文檔np.random.seed說種子是在RandomState初始化時設(shè)置的。這如何與RandomizedSearchCV設(shè)置種子相互作用?當n_jobs設(shè)置為使用少于所有內(nèi)核時,我仍然看到所有內(nèi)核上的活動,盡管每個內(nèi)核的使用水平會隨著內(nèi)核數(shù)量的增加而增加并且經(jīng)過的時間會減少。這只是 sklearn 和/或 macOS 優(yōu)化機器使用嗎?
查看完整描述

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ā)生的步驟。

  1. 您設(shè)置了一個RandomState帶有種子的對象。它現(xiàn)在有一個狀態(tài)。

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

  3. 現(xiàn)在您random_stateskf. 但是fit()RandomizedSearchCV調(diào)用in之前不會發(fā)生分裂。所以狀態(tài)不變。

  4. 之后,當search_clf.fit被調(diào)用時,會發(fā)生以下情況

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

    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(改變其狀態(tài))來生成訓練測試分割

    • clone(estimator)將克隆估計器的所有參數(shù),(random_state也)。所以RandomStatefromcv.split對象的改變狀態(tài)變成了 in 的基本狀態(tài)estimator

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

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

    1. 后面的部分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=23我只看到那些內(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 


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

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ù)。


查看完整回答
反對 回復 2021-09-14
  • 2 回答
  • 0 關(guān)注
  • 357 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號