随机网格搜索RandomizedSearchCV

本文介绍了随机网格搜索在sklearn中的实现原理,指出其在搜索效率和精度上的优势,以及如何通过调整迭代次数控制子空间大小。通过房价数据集实例演示了如何使用RandomizedSearchCV进行超参数调优。
摘要由CSDN通过智能技术生成

随机网格搜索的原理

在sklearn中,随机抽取参数子空间并在子空间中进行搜索的方法叫做随机网格搜索RandomizedSearchCV。由于搜索空间的缩小,需要枚举和对比的参数组的数量也对应减少,整体搜索耗时也将随之减少,因此:

当设置相同的全域空间时,随机搜索的运算速度比枚举网格搜索很多。

当设置相同的训练次数时,随机搜索可以覆盖的空间比枚举网格搜索很多。

同时,绝妙的是,随机网格搜索得出的最小损失与枚举网格搜索得出的最小损失很接近

可以说,是提升了运算速度,又没有过多地伤害搜索的精度。

不过,需要注意的是,随机网格搜索在实际运行时,并不是先抽样出子空间,再对子空间进行搜索,而是仿佛“循环迭代”一般,在这一次迭代中随机抽取1组参数进行建模,下一次迭代再随机抽取1组参数进行建模,由于这种随机抽样是不放回的,因此不会出现两次抽中同一组参数的问题。我们可以控制随机网格搜索的迭代次数,来控制整体被抽出的参数子空间的大小,这种做法往往被称为“赋予随机网格搜索固定的计算量,当全部计算量被消耗完毕之后,随机网格搜索就停止”。
在这里插入图片描述

随机网格搜索的实现

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)

全部参数解读如下,其中加粗的是随机网格搜索独有的参数:

NameDescription
estimator调参对象,某评估器
param_distributions全域参数空间,可以是字典或者字典构成的列表
n_iter迭代次数,迭代次数越多,抽取的子参数空间越大
scoring评估指标,支持同时输出多个参数
n_jobs设置工作时参与计算的线程数
refit挑选评估指标和最佳参数,在完整数据集上进行训练
cv交叉验证的折数
verbose输出工作日志形式
pre_dispatch多任务并行时任务划分数量
random_state随机数种子
error_score当网格搜索报错时返回结果,选择’raise’时将直接报错并中断训练过程,其他情况会显示警告信息后继续完成训练
return_train_score在交叉验证中是否显示训练集中参数得分

我们仍使用房价数据集进行调参

import numpy as np
import pandas as pd
import sklearn
import matplotlib as mlp
import matplotlib.pyplot as plt
import seaborn as sns
import time
import re, pip, conda
from sklearn.ensemble import RandomForestRegressor as RFR
from sklearn.model_selection import cross_validate, KFold, GridSearchCV, RandomizedSearchCV
# 定义RMSE函数
def RMSE(cvresult,key):
    return (abs(cvresult[key])**0.5).mean()
#导入波士顿房价数据
data = pd.read_csv(r"D:\Pythonwork\datasets\House Price\train_encode.csv",index_col=0)
#查看数据
data.head()
X = data.iloc[:,:-1]
y = data.iloc[:,-1]

在这里插入图片描述
构造相同的参数空间

#创造参数空间 - 使用与网格搜索时完全一致的空间,以便于对比
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=83)
#定义随机搜索
search = RandomizedSearchCV(estimator=reg
                            ,param_distributions=param_grid_simple
                            ,n_iter = 800 #子空间的大小是全域空间的一半左右
                            ,scoring = "neg_mean_squared_error"
                            ,verbose = True
                            ,cv = cv
                            ,random_state=83
                            ,n_jobs=-1
                           )
#训练随机搜索评估器
#=====【TIME WARNING: 5~10min】=====#
start = time.time()
search.fit(X,y)
print(time.time() - start)

与网格搜索进行对比,可见对于时间上已经有了优势

HPO方法默认参数网格搜索随机搜索
搜索空间/全域空间-1536/1536800/1536
运行时间(分钟)-6.362.83(↓)
搜索最优(RMSE)30571.26629179.69829251.284
重建最优(RMSE)-28572.07028639.969(↑)

普通网格搜索见下链接

随机森林超参数的网格优化(机器学习的精华–调参)

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是在XGBoost中使用随机搜索和网格搜索对所有数据进行超参数调整的代码: ```python import xgboost as xgb from sklearn.model_selection import RandomizedSearchCV, GridSearchCV from scipy.stats import uniform # Load data X, y = ... # Define parameter grid for grid search param_grid = { 'max_depth': [3, 5, 7], 'learning_rate': [0.1, 0.01, 0.001], 'n_estimators': [100, 500, 1000], 'gamma': [0, 0.1, 0.01], 'subsample': [0.8, 0.9, 1], 'colsample_bytree': [0.8, 0.9, 1] } # Define parameter distribution for random search param_dist = { 'max_depth': [3, 5, 7], 'learning_rate': uniform(loc=0.001, scale=0.1), 'n_estimators': [100, 500, 1000], 'gamma': uniform(loc=0, scale=0.1), 'subsample': uniform(loc=0.8, scale=0.2), 'colsample_bytree': uniform(loc=0.8, scale=0.2) } # Define XGBoost model xgb_model = xgb.XGBRegressor() # Perform grid search grid_search = GridSearchCV(estimator=xgb_model, param_grid=param_grid, cv=5, n_jobs=-1) grid_search.fit(X, y) # Print best parameters and score print("Best parameters: ", grid_search.best_params_) print("Best score: ", grid_search.best_score_) # Perform random search random_search = RandomizedSearchCV(estimator=xgb_model, param_distributions=param_dist, cv=5, n_jobs=-1) random_search.fit(X, y) # Print best parameters and score print("Best parameters: ", random_search.best_params_) print("Best score: ", random_search.best_score_) ``` 首先,我们加载数据。然后,我们定义了一个参数网格和参数分布,用于网格搜索随机搜索。然后,我们定义了XGBoost模型,并使用GridSearchCVRandomizedSearchCV执行网格搜索随机搜索。最后,我们打印出最佳参数和分数。 在这个示例中,我们使用了几个常见的参数,但可以根据需要进行调整。请注意,这些搜索可能需要一段时间来运行,具体取决于数据集的大小和所选择的参数范围。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值