【机器学习】如何使用随机网格搜索,以缩短网格搜索速度?
隨機網格搜索RandomSearchCV學習筆記,內容包括:
-
索引
🔣 函數及參數
🔑 公式
🗣 案例
📌 名詞解釋
📖 摘抄
1 隨機網格搜索的基本原理
📖 影響枚舉網格搜索運算速度的因素
1 參數空間的大小:參數空間越大,需要建模的次數越多
2 數據量的大小:數據量越大,每次建模時需要的算力和時間越多
🗣 案例:全域參數空間VS部分參數空間(示意圖)```python n_e_list=range(50,350,50) m_d_list=range(2,7)comb=pd.DataFrame([(n_estimators, max_depth)for n_estimators in n_e_listfor max_depth in m_d_list]) # 創建n_e_list和m_d_list的笛卡爾乘積fig,[ax1,ax2]=plt.subplots(1,2,dpi=100) ax1.scatter(comb.iloc[:,0],comb.iloc[:,1]) ax1.set_title('GridSearch')ax2.scatter(comb.iloc[:,0],comb.iloc[:,1]) ax2.scatter([50,250,200,200,300,100,150,150],[4,2,6,3,2,3,2,5],cmap='red',s=50) ax2.set_title('RandomSearch') plt.show() ```
📌 隨機網格搜索
隨機抽取參數子空間,并在自空間中進行搜索的方法。
對比枚舉網格搜索的優勢:
- 運算速度快
- 覆蓋空間大
- 最小損失與枚舉網絡的最小損失很接近
📖 隨機網格搜索的抽樣特點
隨機網格搜索采用“循環迭代”。
在這一次迭代中隨機抽取1組參數進行建模,下一次迭代再隨機抽取1組參數進行建模。由于這種隨機抽樣是不放回的,因此不會出現兩次抽中同一組參數的問題。
可以控制隨機網格搜索的迭代次數,來控制整體被抽出的參數子空間的大小,這種做法往往被稱為“賦予隨機網格搜索固定的計算量,當全部計算量被消耗完畢之后,隨機網格搜索就停止”。
隨機網格搜索在實際運行時,并不是先抽樣出子空間,再對子空間進行搜索。
2 隨機網格搜索實現
🔣 skelarn中隨機網格搜索 from sklearn.model_selection import RandomizedSearchCVRandomizedSearchCV(estimator, # 評估器param_distributions, # 全域參數空間*,n_iter=10, # 迭代次數scoring=None, # 評估指標n_jobs=None, refit=True, # 是否挑選評估和最佳參數,在完整數據集上進行訓練cv=None, # 交叉驗證模式verbose=0,pre_dispatch='2*n_jobs', # 多任務并行時的任務劃分數量random_state=None,error_score=nan, # 當網格搜索報錯時返回結果,選擇'raise'時將直接報錯并中斷訓練過程,其他情況會顯示警告信息后繼續完成訓練return_train_score=False, # 是否顯示訓練集中參數得分 )| estimator | 調參對象,某評估器 |
| param_distributions | 全域參數空間,可以是字典或者字典構成的列表 |
| n_iter | 迭代次數,迭代次數越多,抽取的子參數空間越大 |
| scoring | 評估指標,支持同時輸出多個參數 |
| n_jobs | 設置工作時參與計算的線程數 |
| refit | 挑選評估指標和最佳參數,在完整數據集上進行訓練 |
| cv | 交叉驗證的折數 |
| verbose | 輸出工作日志形式 |
| pre_dispatch | 多任務并行時任務劃分數量 |
| random_state | 隨機數種子 |
| error_score | 當網格搜索報錯時返回結果,選擇’raise’時將直接報錯并中斷訓練過程,其他情況會顯示警告信息后繼續完成訓練 |
| return_train_score | 在交叉驗證中是否顯示訓練集中參數得分 |
🔣 案例:隨機網格在隨機森林上的應用_房價數據集
📖 在相同的參數空間、模型下,隨機網格搜索速度比普通網格搜索速度更快。 運行時間≈n_iter/全域空間組合數*網格搜索 from sklearn.ensemble import RandomForestRegressor as RFR from sklearn.model_selection import KFoldparam_grid_simple = {'n_estimators': range(50,150,10), 'max_depth': range(10,25,2), "max_features": ["sqrt",16,32,64,"auto"], "min_impurity_decrease": np.arange(0,5,2)}#計算參數空間大小def count_space(param):no_option = 1for i in param_grid_simple:no_option *= len(param_grid_simple[i])print(no_option)count_space(param_grid_simple)# 訓練模型model = RFR(random_state=7,verbose=True,n_jobs=4)cv = KFold(n_splits=5,shuffle=True,random_state=7)search = RandomizedSearchCV(estimator=model,param_distributions=param_grid_simple,n_iter = 600 #子空間的大小是全域空間的一半左右,scoring = "neg_mean_squared_error",verbose = True,cv = cv,random_state=1412,n_jobs=-1)search.fit(X,y)search.best_estimator_ # 查看模型參數結果# RandomForestRegressor(max_depth=18, max_features=16, min_impurity_decrease=0,# n_jobs=4, random_state=7, verbose=True)abs(search.best_score_)**0.5 # 查看模型RMSE分數# 29160.978459432965# 查看最優參數的模型效果from sklearn.model_selection import cross_validatead_reg=RFR(max_depth=18, max_features=16, min_impurity_decrease=0, random_state=7, n_jobs=-1)def RMSE(cvresult,key):return (abs(cvresult[key])**0.5).mean()def rebuild_on_best_param(ad_reg):cv = KFold(n_splits=5,shuffle=True,random_state=7)result_post_adjusted = cross_validate(ad_reg,X,y,cv=cv,scoring="neg_mean_squared_error",return_train_score=True,verbose=True,n_jobs=-1)print("訓練RMSE:{:.3f}".format(RMSE(result_post_adjusted,"train_score")))print("測試RMSE:{:.3f}".format(RMSE(result_post_adjusted,"test_score")))rebuild_on_best_param(ad_reg)# 訓練RMSE:10760.565# 測試RMSE:28265.8083 連續型參數空間
📖 連續型可能來帶更好的取值
網格搜索:只能使用組合好的參數組合點;
隨機搜索:接受“分布”作為輸入
對于網格搜索,如果損失函數的最低點位于兩組參數之間,在這種情況下,枚舉網格搜索是不可能找到最小值的;
對于隨機網格搜索,由于是一段分布上隨機選擇參數點,因此在同樣的參數空間中,取到更好的值的可能性更大。
📖 當參數空間中包含某個分布的時候,無法估計全域參數空間的大小。
📖 隨機搜索中使用連續型分布的效果
對比網格搜索,同樣搜索空間下,運行速度更快,搜索與重建交叉驗證結果RMSE略優;
對比小空間網格搜索,運行時間較長,RMSE略優;
對比大空間網格搜索,運行時間較長,RMSE略劣(模型效果不一定)。
效果:連續型隨機網格>大空間隨機網格>隨機網格>網格搜索
運算速度:網格搜索>連續型隨機網格>大空間隨機網格>隨機網格
當枚舉網格搜索所使用的全域參數空間足夠大/足夠密集時,枚舉網格搜索的最優解是隨機網格搜索的上限,因此理論上隨機網格搜索不會得到比枚舉網格搜索更好的結果。
🗣 案例:對min_impurity_decrease進行連續分布搜索
param_grid_simple={'n_estimators':range(50,150,10),'max_depth':range(10,25,2),'max_features':range(10,20,2),'min_impurity_decrease':scipy.stats.uniform(0,50)}model=RFR(random_state=7) cv=KFold(n_splits=5,shuffle=True,random_state=7)search=RandomizedSearchCV(estimator=model,param_distributions=param_grid_simple,n_iter=600,scoring='neg_mean_squared_error',cv=cv,random_state=7,n_jobs=4)search.fit(X,y)search.best_estimator_ # RandomForestRegressor(max_depth=18, max_features=16, # min_impurity_decrease=34.80143424780533, random_state=7)abs(search.best_score_)**0.5 # 29155.5402993104rebuild_on_best_param(search.best_estimator_) # 訓練RMSE:10733.842 # 測試RMSE:28285.986總結
以上是生活随笔為你收集整理的【机器学习】如何使用随机网格搜索,以缩短网格搜索速度?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汉王ocr sdk android,汉王
- 下一篇: PTA 7-6 2048游戏模拟(1)-