2017-07-02 99 views
0

我使用GridSearchCV找到RandomForestClassifierSklearn:讓使用GridSearchCV

這裏最優參數的所有核心是部分代碼:

clf = RandomForestClassifier(n_jobs=-1) 

param_grid = {"max_depth": [3, None], 
      "max_features": [1, 3, 10], 
      "min_samples_split": [2, 3, 10], 
      "min_samples_leaf": [1, 3, 10], 
      "bootstrap": [True, False], 
      "criterion": ["gini", "entropy"]} 

# run grid search 
grid_search = GridSearchCV(clf, param_grid=param_grid, n_jobs=-1) 
start = time.time() 
grid_search.fit(X_train, y_train) 
print("GridSearchCV took %.2f seconds for %d candidate parameter settings." 
     % (time.time() - start, len(grid_search.cv_results_['params']))) 

我跑32核心服務器上的代碼,但使用htop我看到只有大約8個內核正在使用,所以我的問題是如何啓用所有內核?

+0

將'n_jobs'明確設置爲32? –

+0

@cᴏʟᴅsᴘᴇᴇᴅ與'n_jobs = -1'相同的效果 – mrgloom

回答

2

GridSearchCV忽略,這也應該添加並行化的外層,所述內並行的clf = RandomForestClassifier(n_jobs=-1)僅工作在樹級

含義:它只使用與內部決策樹一樣多的內核! 默認(您正在使用)是!

我敢肯定,即:

clf = RandomForestClassifier(n_jobs=-1, n_estimators=32) 

將使用所有32個內核,即使沒有外部GridSearchCV。

現在你將不得不作出一個決定,如果這是你的用例中的有效步驟(雖然增加n_estimators表現非常強大)。

+0

但是如何讓外層的並行化在32個內核上工作? – mrgloom

+0

@mrgloom外層顯然也受限於你的CV配置,一般來說這個限制甚至可能會受到更多的限制(與增加內部樹相比;很難擴展到32個內核)。如果內部算法使用32個內核,則不需要外部並行化。但我不知道爲什麼在你的基本情況下沒有加速因子2或3,通過外部並行化,sry。 – sascha

+0

我明白你的觀點,使用'n_estimators'> = n_cores使用內部循環很容易,但理想情況下'n_estimators'也應該使用網格搜索進行交叉驗證。在我看來'GridSearchCV'沒有像預期的那樣工作,只要任務的數量是2 * 3 * 3 * 3 * 2 * 2 = 216就是32以上。 – mrgloom