基本原理
相较于枚举网格搜索,随机网格搜索的计算量更低。随机网格搜索放弃原本的搜索中的全域超参数空间,改为挑选出部分参数组合,构造超参数子空间,并只在子空间中搜索。
以下图的二维空间为例,假设n_estimator的取值为[50,100,150,200,250,300],max_depth的取值为[2,3,4,5,6],则枚举网格搜索必须对30种参数组合都进行搜索;而随机网格搜索只需要抽样橙色的点作为参数组合进行搜索。这样,整体搜索的计算量就大大下降了。枚举网络搜索需要30次,而随机网格搜索仅需要8次。
随机网格搜索相较于枚举网格搜索来讲,其优势有如下三点:
(1)当设置相同的全域空间时,随机搜索的运算速度比枚举搜索快很多。
(2)当设置相同的训练次数时,随即搜索可以覆盖的空间比枚举网格搜索大很多。
(3)随机网格搜索的最小损失与枚举网格搜索得出的最小损失很接近。
代码实现
随机网格搜索的参数如下图所示
from sklearn.model_selection import RandomizedSearchCV
import numpy as np
#1.创建参数空间,字典格式
param_grid_simple = {"criterion":["squared_error","poisson"]
, 'n_estimator':[*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.建立回归器,交叉验证
reg = RFR(random_state=1412,verbose=True,n_jobs=-1)
cv = KFold(n_splits=5,shuffle=True,random_state=1412) #5折
#3.计算全域参数空间大小,这是抽样(n_iter)的最大值
count_space(param_grid_simple)
#4.定义随机搜索
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
)
#注意:不要忘记random_state,并且需要自行定义n_iter
#5.查看模型结果
search.best_estimator_