[机器学习]RandomizedSearchCV(随机搜索+交叉验证)

1,564 阅读5分钟

前言

虽然网格搜索更加细致,但是当超参数比较多的时候,网格搜索是非常耗时的。

如何理解随机搜索中的【随机】

<1>每次从给定的列表中,随机选择一个
<2>那么,随机多少次呢?我们通过n_iter参数确定。
    当n_iter参数很大很大的时候,其实就和网格搜索一样了,就相当于穷尽了。

什么是随机搜索

所谓的模型配置(模型选择),一般统称为模型的超参数(Hyperparameters),比如KNN算法中的K值,SVM中不同的核函数(Kernal)等。

多数情况下,超参数的组合选择是无限的。
在有限的时间内,除了可以验证人工预设几种超参数组合以外,也可以通过启发式的搜索方法对超参数组合进行调优。称这种启发式的超参数搜索方法为网格搜索。 

我们在搜索超参数的时候,如果超参数个数较少(三四个或者更少),
那么我们可以采用网格搜索,一种【穷尽式】的搜索方法。

但是当超参数个数比较多的时候,我们仍然采用网格搜索,那么搜索所需时间将会指数级上升。

所以有人就提出了随机搜索的方法,随机在超参数空间中搜索几十几百个点,其中就有可能有比较小的值。
这种做法比上面稀疏化网格的做法快,而且实验证明,随机搜索法结果比稀疏网格法稍好。

随机搜索比网格搜索的优势

RandomizedSearchCV() 使用方法和类GridSearchCV() 很相似,
二者的一些参数不一样。

但它不是尝试所有可能的组合,而是通过选择每一个超参数的一个随机值的特定数量的随机组合,
这个方法有两个优点:
<1>如果你让随机搜索运行,比如1000次,它会探索每个超参数的1000个不同的值(而不是像网格搜索那样,只搜索每个超参数的几个值)
<2>你可以方便的通过设定搜索次数,控制超参数搜索的计算量。

RandomizedSearchCV随机搜索的参数

RandomizedSearchCV是scikit-learn库中的一个函数,用于通过随机搜索来调整机器学习模型的超参数。
它结合了随机采样和交叉验证的优点,以在限定时间内找到近似最优的超参数组合。
RandomizedSearchCV的主要参数包括:
  • estimator

    • 类型:estimator object
    • 描述:要调优的机器学习模型对象。
  • param_distributions

    • 类型:dict或list of dicts
    • 描述:超参数搜索空间,由参数名称和参数可选值组成的字典或字典列表。这些值可以是固定的值列表,也可以是来自scipy.stats的分布对象,如uniform、randint等,用于随机采样。
  • n_iter

    • 类型:int,默认值为10
    • 描述:随机搜索的迭代次数,即随机采样的样本数。
  • scoring

    • 类型:str, callable, list, tuple或dict,默认值为None
    • 描述:模型评估指标,用于评价模型的性能。如果为None,则使用estimator的默认评分器。注意,对于多分类问题,某些指标(如recall、precision、f1)需要使用微平均(micro-averaged)版本,如recall_micro、precision_micro、f1_micro。
  • n_jobs

    • 类型:int,默认值为None
    • 描述:并行运行的作业数。如果为-1,则使用所有CPU核心。如果为1,则不使用并行计算。
  • refit

    • 类型:bool, str, 或 callable,默认值为True
    • 描述:是否使用最佳参数重新拟合整个数据集。如果为True,则使用最佳参数在原始数据集上重新训练模型。
  • cv(交叉验证)

    • 类型:int, cross-validation generator或iterable,默认值为None
    • 描述:交叉验证的折数或生成器。如果为整数,则为分层K折交叉验证的折数。
  • verbose(输出详细信息)

    • 类型:int
    • 描述:控制日志输出的详细程度。值越大,输出的信息越详细。
  • pre_dispatch

    • 类型:int或str,默认值为'2*n_jobs'
    • 描述:控制并行执行时,预先分发的任务数。这有助于平衡内存使用和计算速度。
  • random_state

    • 类型:int, RandomState instance或None,默认值为None
    • 描述:随机数生成器的种子。设置此参数可以确保结果的可重复性。
  • error_score

    • 类型:'raise'或numeric,默认值为np.nan
    • 描述:当评估指标无法计算(例如,由于数据不足)时返回的值。如果设置为'raise',则会引发错误。
  • return_train_score

    • 类型:bool,默认值为False
    • 描述:是否返回训练集上的分数。如果为True,则返回训练集和验证集上的分数。

这些参数共同定义了RandomizedSearchCV的行为,包括它如何搜索超参数空间、如何评估模型性能以及如何处理并行计算等。通过调整这些参数,用户可以控制随机搜索的精度和效率,以找到最适合其问题的模型超参数组合。

实战

import xgboost as xgb        
from sklearn.grid_search import RandomizedSearchCV

import numpy as np
import pandas as pd


# 导入训练数据
traindata = pd.read_csv("/traindata.txt", sep = ',')
traindata = traindata.set_index('instance_id')
trainlabel = traindata['is_trade']
del traindata['is_trade']
print(traindata.shape,trainlabel.shape)

# 分类器使用 xgboost
clf1 = xgb.XGBClassifier()

#设定搜索的xgboost参数搜索范围,值搜索XGBoost的主要6个参数

param_dist = {
        'n_estimators'``:range(80,200,4),
        'max_depth'``:range(2,15,1),
        'learning_rate'``:np.linspace(0.01,2,20),
        'subsample'``:np.linspace(0.7,0.9,20),
        'colsample_bytree'``:np.linspace(0.5,0.98,10),
        'min_child_weight'``:range(1,9,1)
       }
   
# RandomizedSearchCV参数说明,clf1设置训练的学习器
# param_dist字典类型,放入参数搜索范围
# scoring = 'neg_log_loss',精度评价方式设定为“neg_log_loss“
# n_iter=300,训练300次,数值越大,获得的参数精度越大,但是搜索时间越长
# n_jobs = -1,使用所有的CPU进行训练,默认为1,使用1个CPU

# 模型选择(及,超参数组合的选择)
model = RandomizedSearchCV(estimator=clf1,
                          param_distributions=param_dist,
                          cv=3,
                          scoring='neg_log_loss',
                          n_iter=300,
                          n_jobs=-1)

# 模型训练
# 在训练集上训练
model.fit(traindata.values, 
          np.ravel(trainlabel.values)
          )

# 返回最优的模型
best_estimator = grid.best_estimator_
print(best_estimator)

# 输出最优模型的精度
print(grid.best_score_)