日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Lesson 10.1Lesson 10.2 开篇:超参数优化与枚举网格搜索的理论极限随机网格搜索

發布時間:2023/12/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lesson 10.1Lesson 10.2 开篇:超参数优化与枚举网格搜索的理论极限随机网格搜索 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

一 超參數優化與枚舉網格的理論極限
二 隨機網格搜索RandomSearchCV
? 1 隨機網格搜索的基本原理
? 2 隨機網格搜索實現
? 3 隨機網格的理論極限
三 Halving網格搜索HalvingSearchCV
? 1 對半網格搜索的基本流程
? 2 對半網格搜索的實現
? 3 對半隨機網格搜索
四 【加餐】AutoML前沿進展
? 1 自動化第三方框架
? 2 AutoML三大成熟研究領域
? 3 AutoML的新興研究

一 超參數優化與枚舉網格的理論極限

  • 超參數優化HPO(HyperParameter Optimization)

每一個機器學習算法都會有超參數,而超參數的設置很大程度上影響了算法實際的使用效果,因此調參是機器學習算法工程師最為基礎和重要的任務。現代機器學習與深度學習算法的超參數量眾多,不僅實現方法異常靈活、算法性能也受到更多的參數的復合影響,因此當人工智能浪潮來臨時,可以自動選擇超參數的超參數優化HPO領域也迎來了新一輪爆發。

在算法的世界中,我們渴望一切流程最終都走向完美自動化,專門研究機器學習自動化的學科被稱為AutoML,而超參數自動優化是AutoML中最成熟、最深入、也是最知名的方向。理論上來說,當算力與數據足夠時,HPO的性能一定是超過人類的。HPO能夠降低人為工作量,并且HPO得出的結果比認為搜索的復現可能性更高,所以HPO可以極大程度提升科學研究的復現性和公平性。當代超參數優化算法主要可以分為:

基于網格的各類搜索(Grid)
基于貝葉斯優化的各類優化算法(Baysian)
基于梯度的各類優化(Gradient-based)
基于種群的各類優化(進化算法,遺傳算法等)

其中,各類網格搜索方法與基于貝葉斯的優化方法是最為盛行的,貝葉斯優化方法甚至可以被稱為是當代超參數優化中的SOTA模型。這些模型對于復雜集成算法的調整有極大的作用與意義。

  • 網格搜索的理論極限與缺點

在所有超參數優化的算法當中,枚舉網格搜索是最為基礎和經典的方法。在搜索開始之前,我們需要人工將每個超參數的備選值一一列出,多個不同超參數的不同取值之間排列組合,最終將組成一個參數空間(parameter space)。枚舉網格搜索算法會將這個參數空間當中所有的參數組合帶入模型進行訓練,最終選出泛化能力最強的組合作為模型的最終超參數。

對網格搜索而言,如果參數空間中的某一個點指向了損失函數真正的最小值,那枚舉網格搜索時一定能夠捕捉到該最小值以及對應的參數(相對的,假如參數空間中沒有任意一點指向損失函數真正的最小值,那網格搜索就一定無法找到最小值對應的參數組合)。

參數空間越大、越密,參數空間中的組合剛好覆蓋損失函數最小值點的可能性就會越大。這是說,極端情況下,當參數空間窮盡了所有可能的取值時,網格搜索一定能夠找到損失函數的最小值所對應的最優參數組合,且該參數組合的泛化能力一定是強于人工調參的。

但是,參數空間越大,網格搜索所需的算力和時間也會越大,當參數維度上升時,網格搜索所需的計算量更是程指數級上升的。以隨機森林為例:

只有1個參數n_estimators,備選范圍是[50,100,150,200,250,300],需要建模6次。
增加參數max_depth,且備選范圍是[2,3,4,5,6],需要建模30次。
增加參數min_sample_split,且備選范圍為[2,3,4,5],需要建模120次。

同時,參數優化的目標是找出令模型泛化能力最強的組合,因此需要交叉驗證來體現模型的泛化能力,假設交叉驗證次數為5,則三個參數就需要建模600次。在面對超參數眾多、且超參數取值可能無限的人工神經網絡、融合模型、集成模型時,伴隨著數據和模型的復雜度提升,網格搜索所需要的時間會急劇增加,完成一次枚舉網格搜索可能需要耗費幾天幾夜。考慮到后續實踐過程中,算法和數據都將更加復雜,而建模過程中超參數調優是模型訓練的必備環節,因此,我們急需尋找到一種更加高效的超參數搜索方法。在本節課中,我們將介紹三種基于網格進行改進的超參數優化方法,并將他們的結果與網格搜索進行時間/空間/效果上的對比。

  • 建立benchmark:隨機森林中枚舉網格搜索的結果
from sklearn.ensemble import RandomForestRegressor as RFR from sklearn.model_selection import cross_validate, KFold, GridSearchCV data = pd.read_csv(r"D:\Pythonwork\2021ML\PART 2 Ensembles\datasets\House Price\train_encode.csv",index_col=0)X = data.iloc[:,:-1] y = data.iloc[:,-1]X.shape #(1460, 80) X.head()

y.describe() #RMSE #count 1460.000000 #mean 180921.195890 #std 79442.502883 #min 34900.000000 #25% 129975.000000 #50% 163000.000000 #75% 214000.000000 #max 755000.000000 #Name: SalePrice, dtype: float64#參數空間 param_grid_simple = {"criterion": ["squared_error","poisson"], 'n_estimators': [*range(20,100,5)], 'max_depth': [*range(10,25,2)], "max_features": ["log2","sqrt",16,32,64,"auto"], "min_impurity_decrease": [*np.arange(0,5,10)]}#參數空間大小計算 2 * len([*range(20,100,5)]) * len([*range(10,25,2)]) * len(["log2","sqrt",16,32,64,"auto"]) * len([*np.arange(0,5,10)]) #1536#直接使用循環計算 no_option = 1 for i in param_grid_simple:no_option *= len(param_grid_simple[i]) no_option #1536#模型,交叉驗證,網格搜索 reg = RFR(random_state=1412,verbose=True,n_jobs=-1) cv = KFold(n_splits=5,shuffle=True,random_state=1412) search = GridSearchCV(estimator=reg,param_grid=param_grid_simple,scoring = "neg_mean_squared_error",verbose = True,cv = cv,n_jobs=-1)#=====【TIME WARNING: 7mins】=====# start = time.time() search.fit(X,y) print(time.time() - start) #Fitting 5 folds for each of 1536 candidates, totalling 7680 fits #381.6039867401123381.6039/60 #6.3600650000000005search.best_estimator_ #RandomForestRegressor(max_depth=23, max_features=16, min_impurity_decrease=0, # n_estimators=85, n_jobs=-1, random_state=1412, # verbose=True)abs(search.best_score_)**0.5 #29179.698261599166#按最優參數重建模型,查看效果 ad_reg = RFR(n_estimators=85, max_depth=23, max_features=16, random_state=1412) cv = KFold(n_splits=5,shuffle=True,random_state=1412) 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) def RMSE(cvresult,key):return (abs(cvresult[key])**0.5).mean() RMSE(result_post_adjusted,"train_score") #11000.81099038192 RMSE(result_post_adjusted,"test_score") #28572.070208366855

#打包成函數供后續使用 #評估指標RMSE def RMSE(cvresult,key):return (abs(cvresult[key])**0.5).mean()#計算參數空間大小 def count_space(param):no_option = 1for i in param_grid_simple:no_option *= len(param_grid_simple[i])print(no_option)#在最優參數上進行重新建模驗證結果 def rebuild_on_best_param(ad_reg):cv = KFold(n_splits=5,shuffle=True,random_state=1412)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")))

二 隨機網格搜索RandomizedSearchCV

  • 基本原理

在講解網格搜索時我們提到,伴隨著數據和模型的復雜度提升,網格搜索所需要的時間急劇增加。以隨機森林算法為例,如果使用過萬的數據,搜索時間則會立刻上升好幾個小時。因此,我們急需尋找到一種更加高效的超參數搜索方法。

首先,當所使用的算法確定時,決定枚舉網格搜索運算速度的因子一共有兩個:

1 參數空間的大小:參數空間越大,需要建模的次數越多
2 數據量的大小:數據量越大,每次建模時需要的算力和時間越多

因此,sklearn中的網格搜索優化方法主要包括兩類,其一是調整搜索空間,其二是調整每次訓練的數據。其中,調整參數空間的具體方法,是放棄原本的搜索中必須使用的全域超參數空間,改為挑選出部分參數組合,構造超參數子空間,并只在子空間中進行搜索。

以下圖的二維空間為例,在這個n_estimators與max_depth共同組成的參數空間中,n_estimators的取值假設為[50,100,150,200,250,300],max_depth的取值假設為[2,3,4,5,6],則枚舉網格搜索必須對30種參數組合都進行搜索。當我們調整搜索空間,我們可以只抽樣出橙色的參數組合作為“子空間”,并只對橙色參數組合進行搜索。如此一來,整體搜索所需的計算量就大大下降了,原本需要30次建模,現在只需要8次建模。

fig, [ax1, ax2] = plt.subplots(1,2,dpi=300) 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_list for max_depth in m_d_list])ax1.scatter(comb.iloc[:,0],comb.iloc[:,1],cmap="Blues") ax1.set_xticks([*range(50,350,50)]) ax1.set_yticks([*range(2,7)]) ax1.set_xlabel("n_estimators") ax1.set_ylabel("max_depth") ax1.set_title("GridSearch")ax2.scatter(comb.iloc[:,0],comb.iloc[:,1],cmap="Blues") ax2.scatter([50,250,200,200,300,100,150,150],[4,2,6,3,2,3,2,5],cmap="red",s=20,linewidths=5) ax2.set_xticks([*range(50,350,50)]) ax2.set_yticks([*range(2,7)]) ax2.set_xlabel("n_estimators") ax2.set_ylabel("max_depth") ax2.set_title("RandomSearch");

在sklearn中,隨機抽取參數子空間并在子空間中進行搜索的方法叫做隨機網格搜索RandomizedSearchCV。由于搜索空間的縮小,需要枚舉和對比的參數組的數量也對應減少,整體搜索耗時也將隨之減少,因此:

當設置相同的全域空間時,隨機搜索的運算速度比枚舉網格搜索很多。

當設置相同的訓練次數時,隨機搜索可以覆蓋的空間比枚舉網格搜索很多。

同時,絕妙的是,隨機網格搜索得出的最小損失與枚舉網格搜索得出的最小損失很接近

可以說,是提升了運算速度,又沒有過多地傷害搜索的精度。

不過,需要注意的是,隨機網格搜索在實際運行時,并不是先抽樣出子空間,再對子空間進行搜索,而是仿佛“循環迭代”一般,在這一次迭代中隨機抽取1組參數進行建模,下一次迭代再隨機抽取1組參數進行建模,由于這種隨機抽樣是不放回的,因此不會出現兩次抽中同一組參數的問題。我們可以控制隨機網格搜索的迭代次數,來控制整體被抽出的參數子空間的大小,這種做法往往被稱為“賦予隨機網格搜索固定的計算量,當全部計算量被消耗完畢之后,隨機網格搜索就停止”。

  • 隨機網格搜索的實現
from sklearn.model_selection import RandomizedSearchCV

class?sklearn.model_selection.RandomizedSearchCV(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, return_train_score=False)

全部參數解讀如下,其中加粗的是隨機網格搜索獨有的參數:

隨機網格搜索可以輸入連續的參數,普通網格搜索不能輸入連續的參數。?

我們依然借用之前在網格搜索上見過的X和y,以及隨機森林回歸器,來實現隨機網格搜索:

X.shape #(1460, 80)X.head()

y.describe() #count 1460.000000 #mean 180921.195890 #std 79442.502883 #min 34900.000000 #25% 129975.000000 #50% 163000.000000 #75% 214000.000000 #max 755000.000000 #Name: SalePrice, dtype: float64
  • 相同的全域參數空間
#創造參數空間 - 使用與網格搜索時完全一致的空間,以便于對比 param_grid_simple = {"criterion": ["squared_error","poisson"], 'n_estimators': [*range(20,100,5)], 'max_depth': [*range(10,25,2)], "max_features": ["log2","sqrt",16,32,64,"auto"], "min_impurity_decrease": [*np.arange(0,5,10)]}#建立回歸器、交叉驗證 reg = RFR(random_state=1412,verbose=True,n_jobs=-1) cv = KFold(n_splits=5,shuffle=True,random_state=1412)#計算全域參數空間大小,這是我們能夠抽樣的最大值 count_space(param_grid_simple) #1536#定義隨機搜索 search = RandomizedSearchCV(estimator=reg,param_distributions=param_grid_simple,n_iter = 800 #子空間的大小是全域空間的一半左右,scoring = "neg_mean_squared_error",verbose = True,cv = cv,random_state=1412,n_jobs=-1)#訓練隨機搜索評估器 #=====【TIME WARNING: 5~10min】=====# start = time.time() search.fit(X,y) print(time.time() - start) #Fitting 5 folds for each of 800 candidates, totalling 4000 fits #170.16785073280334170.1678/60 #2.83613#查看模型結果 search.best_estimator_ #RandomForestRegressor(max_depth=24, max_features=16, min_impurity_decrease=0, # n_estimators=85, n_jobs=-1, random_state=1412, # verbose=True)abs(search.best_score_)**0.5 #29251.284326350575#根據最優參數重建模型 ad_reg = RFR(max_depth=24, max_features=16, min_impurity_decrease=0,n_estimators=85, n_jobs=-1, random_state=1412,verbose=True) rebuild_on_best_param(ad_reg) #訓練RMSE:11031.299 #測試RMSE:28639.969

很明顯,在相同參數空間、相同模型的情況下,隨機網格搜索的運算速度是普通網格搜索的一半,當然,這與子空間是全域空間的一半有很大的聯系。由于隨機搜索只是降低搜索的次數,并非影響搜索過程本身,因此其運行時間基本就等于n_iter/全域空間組合數 * 網格搜索的運行時間。

  • 隨機網格搜索的理論極限

雖然通過縮小子空間可以提升搜索的速度,但是隨機網格搜索的精度看起來并沒有削減太多,隨機網格搜索可以得到和網格搜索一樣好的結果嗎?它也像網格搜索一樣,可以得到最優的參數組合嗎?為什么縮小參數空間之后,隨機網格搜索的結果還與網格搜索一致?

理論上來說,枚舉網格搜索的上限和隨機網格搜索的上限哪個高?

從直覺上來說,我們很難回答這些問題,但我們可以從數學的隨機過程的角度來理解這個問題。在機器學習算法當中,有非常多通過隨機來提升運算速度(比如Kmeans,隨機挑選樣本構建簇心,小批量隨機梯度下降,通過隨機來減少每次迭代需要的樣本)、或通過隨機來提升模型效果的操作(比如隨機森林,比如極度隨機樹)。兩種隨機背后的原理完全不同,而隨機網格搜索屬于前者,這一類機器學習方法總是伴隨著“從某個全數據集/全域中進行抽樣”的操作,而這種操作能夠有效的根本原因在于:

  • 抽樣出的子空間可以一定程度上反饋出全域空間的分布,且子空間相對越大(含有的參數組合數越多),子空間的分布越接近全域空間的分布
    ?
  • 當全域空間本身足夠密集時,很小的子空間也能獲得與全域空間相似的分布
    ?
  • 如果全域空間包括了理論上的損失函數最小值,那一個與全域空間分布高度相似的子空間很可能也包括損失函數的最小值,或包括非常接近最小值的一系列次小值

上述數學事實聽起來比較抽象,但其實我們可以通過繪制圖像來直觀地呈現這些事實。許多在數學上比較抽象的概念都可以被可視化。在這里,我們借助matplotlib工具庫mplot3d中的一組默認數據。

from mpl_toolkits.mplot3d import axes3d p1, p2, MSE = axes3d.get_test_data(0.05) #自動獲取數據的功能get_test_data,可以自動生成復合某一分布的數據 #我們現在假設這一組數據中有兩個參數,p1與p2,兩個參數組成的參數組合對應著損失函數值MSE #參數0.05是指參數空間中,點與點之間的距離 #因此該數字越小,取出來的樣本越多len(p1) #參數1的取值有120個 #120 len(p2) #參數2的取值也有120個 #120

請問現在參數空間當中一共有多少個參數組合?120*120=14400種組合,所以參數空間中一共有14400個點。

MSE.shape #損失函數值,總共14400個點 #(120, 120)#繪制P1與P2的參數空間 - 這是一個呈現出14400個點的密集空間 plt.figure(dpi=300) plt.scatter(p1,p2,s=0.2) plt.xticks(fontsize=9) plt.yticks(fontsize=9);

#參數與損失共同構建的函數 p1, p2, MSE = axes3d.get_test_data(0.05) plt.figure(dpi=300) ax = plt.axes(projection="3d") ax.plot_wireframe(p1,p2,MSE,rstride=2,cstride=2,linewidth=0.5) ax.view_init(2, -15) ax.zaxis.set_tick_params(labelsize=7) ax.xaxis.set_tick_params(labelsize=7) ax.yaxis.set_tick_params(labelsize=7);

np.min(MSE) #整個參數空間中,可獲得的MSE最小值是-73.39 #-73.39620971601681#現在,我們從該空間上抽取子空間 import numpy as np MSE.shape #(120, 120) #我們從空間中抽取n個組合,n越大子空間越大 #現在總共有14400個組合 #對被抽中的點來說,損失函數的值就是MSE,對沒有抽中的點來說,損失函數值是空值 #因此,我們只需要找出沒有抽中的點,并讓它的損失函數值MSE為空就可以了n = 100 #從0~14400中生成(14400-n)個隨機數,形成沒有被抽到子空間中的點的索引 unsampled = np.random.randint(0,14400,14400-n)p1, p2, MSE = axes3d.get_test_data(0.05)#拉平MSE,并將所有沒抽中的點的損失函數變為空值 MSE = MSE.ravel() MSE[unsampled] = np.nan MSE = MSE.reshape((120,120)) #設置完畢空值后,記得把MSE恢復成原來的結構,否則繪圖報錯#參數與損失共同構建的函數 plt.figure(dpi=300) ax = plt.axes(projection="3d") ax.view_init(2, -15) ax.plot_wireframe(p1,p2,MSE,rstride=2,cstride=2,linewidth=0.5) ax.zaxis.set_tick_params(labelsize=7) ax.xaxis.set_tick_params(labelsize=7) ax.yaxis.set_tick_params(labelsize=7);#求出當前損失函數上的最小值 #注意此時因為MSE中含有了空值,因此要先排除空值影響,否則min函數會返回空值 MSE = MSE.ravel().tolist() MSE = [x for x in MSE if str(x) != 'nan'] print(np.min(MSE)) #-73.24243733589367

我們可以在圖像上驗證如下事實:

  • 抽樣出的子空間可以一定程度上反饋出全域空間的分布,且子空間相對越大(含有的參數組合數越多),子空間的分布越接近全域空間的分布
    ?
  • 當全域空間本身足夠密集時,很小的子空間也能獲得與全域空間相似的分布
    ?
  • 如果全域空間包括了理論上的損失函數最小值,那一個與全域空間分布高度相似的子空間很可能也包括損失函數的最小值,或包括非常接近最小值的一系列次小值

因此,只要子空間足夠大,隨機網格搜索的效果一定是高度逼近枚舉網格搜索的。在全域參數空間固定時,隨機網格搜索可以在效率與精度之間做權衡。子空間越大,精度越高,子空間越小,效率越高。

  • 更大/更密集的全域空間

不過,由于隨機網格搜索計算更快,所以在相同計算資源的前提下,我們可以對隨機網格搜索使用更大的全域空間,因此隨機搜索可能得到比網格搜索更好的效果:

#創造參數空間 - 讓整體參數空間變得更密 param_grid_simple = {'n_estimators': [*range(80,100,1)], 'max_depth': [*range(10,25,1)], "max_features": [*range(10,20,1)], "min_impurity_decrease": [*np.arange(0,5,10)]} #計算全域參數空間大小,這是我們能夠抽樣的最大值 count_space(param_grid_simple) #3000#建立回歸器、交叉驗證 reg = RFR(random_state=1412,verbose=True,n_jobs=-1) cv = KFold(n_splits=5,shuffle=True,random_state=1412)#定義隨機搜索 search = RandomizedSearchCV(estimator=reg,param_distributions=param_grid_simple,n_iter = 1536 #使用與枚舉網格搜索類似的擬合次數,scoring = "neg_mean_squared_error",verbose = True,cv = cv,random_state=1412,n_jobs=-1) #訓練隨機搜索評估器 #=====【TIME WARNING: 5~10min】=====# start = time.time() search.fit(X,y) end = time.time() - start print(end/60) #Fitting 5 folds for each of 1536 candidates, totalling 7680 fits #3.8464645385742187#查看最佳評估器 search.best_estimator_ #RandomForestRegressor(max_depth=22, max_features=14, min_impurity_decrease=0, # n_estimators=89, n_jobs=-1, random_state=1412, # verbose=True)#查看最終評估指標 abs(search.best_score_)**0.5 #29012.90569846546rebuild_on_best_param(search.best_estimator_) #訓練RMSE:11208.818 #測試RMSE:28346.673

可以發現,當全域參數空間增大之后,隨即網格搜索可以使用與小空間上的網格搜索相似或更少的時間,來探索更密集/更大的空間,從而獲得更好的結果。除了可以容忍更大的參數空間之外,隨機網格搜索還可以接受連續性變量作為參數空間的輸入。

  • 連續型的參數空間

對于網格搜索來說,參數空間中的點是分布均勻、間隔一致的,因為網格搜索無法從某種“分布”中提取數據,只能使用組合好的參數組合點,而隨機搜索卻可以接受“分布”作為輸入。如上圖所示,對于網格搜索來說,損失函數的最低點很不幸的、位于兩組參數之間,在這種情況下,枚舉網格搜索是100%不可能找到最小值的。但對于隨機網格搜索來說,由于是一段分布上隨機選擇參數點,因此在同樣的參數空間中,取到更好的值的可能性更大。

import scipy #使用scipy來幫助我們建立分布 scipy.stats.uniform(loc=1,scale=100) #<scipy.stats._distn_infrastructure.rv_frozen at 0x137a147d7c0>

uniform是均勻分布,默認生成[0,1]之間的數字,可以使用loc來調整起點,scale來調整終點。我們還可以選擇其他的分布,比如指數分布expon, gamma分布, 或者是randint。注意scipy這里并不是像np.linspace()一樣生成一段離散的數字,而是直接生成一個分布對象。并且,我們并沒有在分布對象中指定尺寸,也就是說,在這段分布上究竟要取幾個隨機的參數備選值,是由隨機搜索自己決定的。理論上來說,我們給出的n_iter越大,任意參數的分布上可能被取到的點就越多。因此,當參數空間中包含某個分布的時候,我們無法估計全域參數空間的大小。

在之前調整隨機森林的時候,我們給出的所有參數都是只能接納正整數的參數,因此在這里我們可以使用scipy.stats.randint,不過randint并不是嚴格意義上的連續分布。

嚴格來說,連續型搜索更適用于學習率,C,alpha這樣的參數(無上限,以浮點數為主),隨機森林的參數中最接近這個定義的是min_impurity_decrease,表示決策樹在分枝是可以容忍的最小的不純度下降量。我們借著這個參數,使用均勻分布來進行搜索試試看。

param_grid_simple = {'n_estimators': [*range(80,100,1)], 'max_depth': [*range(10,25,1)], "max_features": [*range(10,20,1)], "min_impurity_decrease": scipy.stats.uniform(0,50)}#建立回歸器、交叉驗證 reg = RFR(random_state=1412,verbose=True,n_jobs=12) cv = KFold(n_splits=5,shuffle=True,random_state=1412)#定義隨機搜索 search = RandomizedSearchCV(estimator=reg,param_distributions=param_grid_simple,n_iter = 1536 #還是使用1536這個搜索次數,scoring = "neg_mean_squared_error",verbose = True,cv = cv,random_state=1412,n_jobs=12)#訓練隨機搜索評估器 #=====【TIME WARNING: 5~10min】=====# start = time.time() search.fit(X,y) end = time.time() - start print(end/60) #Fitting 5 folds for each of 1536 candidates, totalling 7680 fits #3.921058924992879#查看最佳評估器 search.best_estimator_ #RandomForestRegressor(max_depth=22, max_features=14, # min_impurity_decrease=20.070367229896224, n_estimators=98, # n_jobs=12, random_state=1412, verbose=True)#查看最終評估指標 abs(search.best_score_)**0.5 #29148.381610182565rebuild_on_best_param(search.best_estimator_) #訓練RMSE:11184.428 #測試RMSE:28495.682

在本次搜索當中,由于我們之前已經知道最好的可能的min_impurity_decrease的值為0,因此強行向更大的數拓展搜索空間可能會導致模型效果下降。不過在隨機森林當中,min_impurity_decrease是唯一可以使用分布進行搜索的參數,因此在這里我們就容忍了這部分表現上升。

理論上來說,當枚舉網格搜索所使用的全域參數空間足夠大/足夠密集時,枚舉網格搜索的最優解是隨機網格搜索的上限,因此理論上隨機網格搜索不會得到比枚舉網格搜索更好的結果

但現實中的問題是,由于枚舉網格搜索的速度太慢,因此枚舉網格搜索的全域參數空間往往無法設置得很大,也無法設置得很密集,因此網格搜索的結果很難接近理論上的最優值。當隨機網格搜索將空間設置更大、更密集時,就可以捕獲更廣空間的分布,也自然就可能捕獲到理論上的最優值了。

總結

以上是生活随笔為你收集整理的Lesson 10.1Lesson 10.2 开篇:超参数优化与枚举网格搜索的理论极限随机网格搜索的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。