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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

目錄

一 超參數(shù)優(yōu)化與枚舉網(wǎng)格的理論極限
二 隨機(jī)網(wǎng)格搜索RandomSearchCV
? 1 隨機(jī)網(wǎng)格搜索的基本原理
? 2 隨機(jī)網(wǎng)格搜索實(shí)現(xiàn)
? 3 隨機(jī)網(wǎng)格的理論極限
三 Halving網(wǎng)格搜索HalvingSearchCV
? 1 對(duì)半網(wǎng)格搜索的基本流程
? 2 對(duì)半網(wǎng)格搜索的實(shí)現(xiàn)
? 3 對(duì)半隨機(jī)網(wǎng)格搜索
四 【加餐】AutoML前沿進(jìn)展
? 1 自動(dòng)化第三方框架
? 2 AutoML三大成熟研究領(lǐng)域
? 3 AutoML的新興研究

一 超參數(shù)優(yōu)化與枚舉網(wǎng)格的理論極限

  • 超參數(shù)優(yōu)化HPO(HyperParameter Optimization)

每一個(gè)機(jī)器學(xué)習(xí)算法都會(huì)有超參數(shù),而超參數(shù)的設(shè)置很大程度上影響了算法實(shí)際的使用效果,因此調(diào)參是機(jī)器學(xué)習(xí)算法工程師最為基礎(chǔ)和重要的任務(wù)。現(xiàn)代機(jī)器學(xué)習(xí)與深度學(xué)習(xí)算法的超參數(shù)量眾多,不僅實(shí)現(xiàn)方法異常靈活、算法性能也受到更多的參數(shù)的復(fù)合影響,因此當(dāng)人工智能浪潮來臨時(shí),可以自動(dòng)選擇超參數(shù)的超參數(shù)優(yōu)化HPO領(lǐng)域也迎來了新一輪爆發(fā)。

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

基于網(wǎng)格的各類搜索(Grid)
基于貝葉斯優(yōu)化的各類優(yōu)化算法(Baysian)
基于梯度的各類優(yōu)化(Gradient-based)
基于種群的各類優(yōu)化(進(jìn)化算法,遺傳算法等)

其中,各類網(wǎng)格搜索方法與基于貝葉斯的優(yōu)化方法是最為盛行的,貝葉斯優(yōu)化方法甚至可以被稱為是當(dāng)代超參數(shù)優(yōu)化中的SOTA模型。這些模型對(duì)于復(fù)雜集成算法的調(diào)整有極大的作用與意義。

  • 網(wǎng)格搜索的理論極限與缺點(diǎn)

在所有超參數(shù)優(yōu)化的算法當(dāng)中,枚舉網(wǎng)格搜索是最為基礎(chǔ)和經(jīng)典的方法。在搜索開始之前,我們需要人工將每個(gè)超參數(shù)的備選值一一列出,多個(gè)不同超參數(shù)的不同取值之間排列組合,最終將組成一個(gè)參數(shù)空間(parameter space)。枚舉網(wǎng)格搜索算法會(huì)將這個(gè)參數(shù)空間當(dāng)中所有的參數(shù)組合帶入模型進(jìn)行訓(xùn)練,最終選出泛化能力最強(qiáng)的組合作為模型的最終超參數(shù)。

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

參數(shù)空間越大、越密,參數(shù)空間中的組合剛好覆蓋損失函數(shù)最小值點(diǎn)的可能性就會(huì)越大。這是說,極端情況下,當(dāng)參數(shù)空間窮盡了所有可能的取值時(shí),網(wǎng)格搜索一定能夠找到損失函數(shù)的最小值所對(duì)應(yīng)的最優(yōu)參數(shù)組合,且該參數(shù)組合的泛化能力一定是強(qiáng)于人工調(diào)參的。

但是,參數(shù)空間越大,網(wǎng)格搜索所需的算力和時(shí)間也會(huì)越大,當(dāng)參數(shù)維度上升時(shí),網(wǎng)格搜索所需的計(jì)算量更是程指數(shù)級(jí)上升的。以隨機(jī)森林為例:

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

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

  • 建立benchmark:隨機(jī)森林中枚舉網(wǎng)格搜索的結(jié)果
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#參數(shù)空間 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)]}#參數(shù)空間大小計(jì)算 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#直接使用循環(huán)計(jì)算 no_option = 1 for i in param_grid_simple:no_option *= len(param_grid_simple[i]) no_option #1536#模型,交叉驗(yàn)證,網(wǎng)格搜索 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#按最優(yōu)參數(shù)重建模型,查看效果 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

#打包成函數(shù)供后續(xù)使用 #評(píng)估指標(biāo)RMSE def RMSE(cvresult,key):return (abs(cvresult[key])**0.5).mean()#計(jì)算參數(shù)空間大小 def count_space(param):no_option = 1for i in param_grid_simple:no_option *= len(param_grid_simple[i])print(no_option)#在最優(yōu)參數(shù)上進(jìn)行重新建模驗(yàn)證結(jié)果 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("訓(xùn)練RMSE:{:.3f}".format(RMSE(result_post_adjusted,"train_score")))print("測(cè)試RMSE:{:.3f}".format(RMSE(result_post_adjusted,"test_score")))

二 隨機(jī)網(wǎng)格搜索RandomizedSearchCV

  • 基本原理

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

首先,當(dāng)所使用的算法確定時(shí),決定枚舉網(wǎng)格搜索運(yùn)算速度的因子一共有兩個(gè):

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

因此,sklearn中的網(wǎng)格搜索優(yōu)化方法主要包括兩類,其一是調(diào)整搜索空間,其二是調(diào)整每次訓(xùn)練的數(shù)據(jù)。其中,調(diào)整參數(shù)空間的具體方法,是放棄原本的搜索中必須使用的全域超參數(shù)空間,改為挑選出部分參數(shù)組合,構(gòu)造超參數(shù)子空間,并只在子空間中進(jìn)行搜索。

以下圖的二維空間為例,在這個(gè)n_estimators與max_depth共同組成的參數(shù)空間中,n_estimators的取值假設(shè)為[50,100,150,200,250,300],max_depth的取值假設(shè)為[2,3,4,5,6],則枚舉網(wǎng)格搜索必須對(duì)30種參數(shù)組合都進(jìn)行搜索。當(dāng)我們調(diào)整搜索空間,我們可以只抽樣出橙色的參數(shù)組合作為“子空間”,并只對(duì)橙色參數(shù)組合進(jìn)行搜索。如此一來,整體搜索所需的計(jì)算量就大大下降了,原本需要30次建模,現(xiàn)在只需要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中,隨機(jī)抽取參數(shù)子空間并在子空間中進(jìn)行搜索的方法叫做隨機(jī)網(wǎng)格搜索RandomizedSearchCV。由于搜索空間的縮小,需要枚舉和對(duì)比的參數(shù)組的數(shù)量也對(duì)應(yīng)減少,整體搜索耗時(shí)也將隨之減少,因此:

當(dāng)設(shè)置相同的全域空間時(shí),隨機(jī)搜索的運(yùn)算速度比枚舉網(wǎng)格搜索很多。

當(dāng)設(shè)置相同的訓(xùn)練次數(shù)時(shí),隨機(jī)搜索可以覆蓋的空間比枚舉網(wǎng)格搜索很多。

同時(shí),絕妙的是,隨機(jī)網(wǎng)格搜索得出的最小損失與枚舉網(wǎng)格搜索得出的最小損失很接近

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

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

  • 隨機(jī)網(wǎng)格搜索的實(shí)現(xiàn)
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)

全部參數(shù)解讀如下,其中加粗的是隨機(jī)網(wǎng)格搜索獨(dú)有的參數(shù):

隨機(jī)網(wǎng)格搜索可以輸入連續(xù)的參數(shù),普通網(wǎng)格搜索不能輸入連續(xù)的參數(shù)。?

我們依然借用之前在網(wǎng)格搜索上見過的X和y,以及隨機(jī)森林回歸器,來實(shí)現(xiàn)隨機(jī)網(wǎng)格搜索:

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
  • 相同的全域參數(shù)空間
#創(chuàng)造參數(shù)空間 - 使用與網(wǎng)格搜索時(shí)完全一致的空間,以便于對(duì)比 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)]}#建立回歸器、交叉驗(yàn)證 reg = RFR(random_state=1412,verbose=True,n_jobs=-1) cv = KFold(n_splits=5,shuffle=True,random_state=1412)#計(jì)算全域參數(shù)空間大小,這是我們能夠抽樣的最大值 count_space(param_grid_simple) #1536#定義隨機(jī)搜索 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)#訓(xùn)練隨機(jī)搜索評(píng)估器 #=====【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#查看模型結(jié)果 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#根據(jù)最優(yōu)參數(shù)重建模型 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) #訓(xùn)練RMSE:11031.299 #測(cè)試RMSE:28639.969

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

  • 隨機(jī)網(wǎng)格搜索的理論極限

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

理論上來說,枚舉網(wǎng)格搜索的上限和隨機(jī)網(wǎng)格搜索的上限哪個(gè)高?

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

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

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

from mpl_toolkits.mplot3d import axes3d p1, p2, MSE = axes3d.get_test_data(0.05) #自動(dòng)獲取數(shù)據(jù)的功能get_test_data,可以自動(dòng)生成復(fù)合某一分布的數(shù)據(jù) #我們現(xiàn)在假設(shè)這一組數(shù)據(jù)中有兩個(gè)參數(shù),p1與p2,兩個(gè)參數(shù)組成的參數(shù)組合對(duì)應(yīng)著損失函數(shù)值MSE #參數(shù)0.05是指參數(shù)空間中,點(diǎn)與點(diǎn)之間的距離 #因此該數(shù)字越小,取出來的樣本越多l(xiāng)en(p1) #參數(shù)1的取值有120個(gè) #120 len(p2) #參數(shù)2的取值也有120個(gè) #120

請(qǐng)問現(xiàn)在參數(shù)空間當(dāng)中一共有多少個(gè)參數(shù)組合?120*120=14400種組合,所以參數(shù)空間中一共有14400個(gè)點(diǎn)。

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

#參數(shù)與損失共同構(gòu)建的函數(shù) 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) #整個(gè)參數(shù)空間中,可獲得的MSE最小值是-73.39 #-73.39620971601681#現(xiàn)在,我們從該空間上抽取子空間 import numpy as np MSE.shape #(120, 120) #我們從空間中抽取n個(gè)組合,n越大子空間越大 #現(xiàn)在總共有14400個(gè)組合 #對(duì)被抽中的點(diǎn)來說,損失函數(shù)的值就是MSE,對(duì)沒有抽中的點(diǎn)來說,損失函數(shù)值是空值 #因此,我們只需要找出沒有抽中的點(diǎn),并讓它的損失函數(shù)值MSE為空就可以了n = 100 #從0~14400中生成(14400-n)個(gè)隨機(jī)數(shù),形成沒有被抽到子空間中的點(diǎn)的索引 unsampled = np.random.randint(0,14400,14400-n)p1, p2, MSE = axes3d.get_test_data(0.05)#拉平MSE,并將所有沒抽中的點(diǎn)的損失函數(shù)變?yōu)榭罩?MSE = MSE.ravel() MSE[unsampled] = np.nan MSE = MSE.reshape((120,120)) #設(shè)置完畢空值后,記得把MSE恢復(fù)成原來的結(jié)構(gòu),否則繪圖報(bào)錯(cuò)#參數(shù)與損失共同構(gòu)建的函數(shù) 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);#求出當(dāng)前損失函數(shù)上的最小值 #注意此時(shí)因?yàn)镸SE中含有了空值,因此要先排除空值影響,否則min函數(shù)會(huì)返回空值 MSE = MSE.ravel().tolist() MSE = [x for x in MSE if str(x) != 'nan'] print(np.min(MSE)) #-73.24243733589367

我們可以在圖像上驗(yàn)證如下事實(shí):

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

因此,只要子空間足夠大,隨機(jī)網(wǎng)格搜索的效果一定是高度逼近枚舉網(wǎng)格搜索的。在全域參數(shù)空間固定時(shí),隨機(jī)網(wǎng)格搜索可以在效率與精度之間做權(quán)衡。子空間越大,精度越高,子空間越小,效率越高。

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

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

#創(chuàng)造參數(shù)空間 - 讓整體參數(shù)空間變得更密 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)]} #計(jì)算全域參數(shù)空間大小,這是我們能夠抽樣的最大值 count_space(param_grid_simple) #3000#建立回歸器、交叉驗(yàn)證 reg = RFR(random_state=1412,verbose=True,n_jobs=-1) cv = KFold(n_splits=5,shuffle=True,random_state=1412)#定義隨機(jī)搜索 search = RandomizedSearchCV(estimator=reg,param_distributions=param_grid_simple,n_iter = 1536 #使用與枚舉網(wǎng)格搜索類似的擬合次數(shù),scoring = "neg_mean_squared_error",verbose = True,cv = cv,random_state=1412,n_jobs=-1) #訓(xùn)練隨機(jī)搜索評(píng)估器 #=====【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#查看最佳評(píng)估器 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)#查看最終評(píng)估指標(biāo) abs(search.best_score_)**0.5 #29012.90569846546rebuild_on_best_param(search.best_estimator_) #訓(xùn)練RMSE:11208.818 #測(cè)試RMSE:28346.673

可以發(fā)現(xiàn),當(dāng)全域參數(shù)空間增大之后,隨即網(wǎng)格搜索可以使用與小空間上的網(wǎng)格搜索相似或更少的時(shí)間,來探索更密集/更大的空間,從而獲得更好的結(jié)果。除了可以容忍更大的參數(shù)空間之外,隨機(jī)網(wǎng)格搜索還可以接受連續(xù)性變量作為參數(shù)空間的輸入。

  • 連續(xù)型的參數(shù)空間

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

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

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

在之前調(diào)整隨機(jī)森林的時(shí)候,我們給出的所有參數(shù)都是只能接納正整數(shù)的參數(shù),因此在這里我們可以使用scipy.stats.randint,不過randint并不是嚴(yán)格意義上的連續(xù)分布。

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

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)}#建立回歸器、交叉驗(yàn)證 reg = RFR(random_state=1412,verbose=True,n_jobs=12) cv = KFold(n_splits=5,shuffle=True,random_state=1412)#定義隨機(jī)搜索 search = RandomizedSearchCV(estimator=reg,param_distributions=param_grid_simple,n_iter = 1536 #還是使用1536這個(gè)搜索次數(shù),scoring = "neg_mean_squared_error",verbose = True,cv = cv,random_state=1412,n_jobs=12)#訓(xùn)練隨機(jī)搜索評(píng)估器 #=====【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#查看最佳評(píng)估器 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)#查看最終評(píng)估指標(biāo) abs(search.best_score_)**0.5 #29148.381610182565rebuild_on_best_param(search.best_estimator_) #訓(xùn)練RMSE:11184.428 #測(cè)試RMSE:28495.682

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

理論上來說,當(dāng)枚舉網(wǎng)格搜索所使用的全域參數(shù)空間足夠大/足夠密集時(shí),枚舉網(wǎng)格搜索的最優(yōu)解是隨機(jī)網(wǎng)格搜索的上限,因此理論上隨機(jī)網(wǎng)格搜索不會(huì)得到比枚舉網(wǎng)格搜索更好的結(jié)果

但現(xiàn)實(shí)中的問題是,由于枚舉網(wǎng)格搜索的速度太慢,因此枚舉網(wǎng)格搜索的全域參數(shù)空間往往無法設(shè)置得很大,也無法設(shè)置得很密集,因此網(wǎng)格搜索的結(jié)果很難接近理論上的最優(yōu)值。當(dāng)隨機(jī)網(wǎng)格搜索將空間設(shè)置更大、更密集時(shí),就可以捕獲更廣空間的分布,也自然就可能捕獲到理論上的最優(yōu)值了。

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。