机器学习(四)——模型调参利器 gridSearchCV(网格搜索)

gridSearchCV(网格搜索)的参数、方法及示例

1.简介

GridSearchCV的sklearn官方网址:

http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV

GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数。但是这个方法适合于小数据集,一旦数据的量级上去了,很难得出结果。这个时候就是需要动脑筋了。数据量比较大的时候可以使用一个快速调优的方法——坐标下降。它其实是一种贪心算法:拿当前对模型影响最大的参数调优,直到最优化;再拿下一个影响最大的参数调优,如此下去,直到所有的参数调整完毕。这个方法的缺点就是可能会调到局部最优而不是全局最优,但是省时间省力,巨大的优势面前,还是试一试吧,后续可以再拿bagging再优化。

通常算法不够好,需要调试参数时必不可少。比如SVM的惩罚因子C,核函数kernel,gamma参数等,对于不同的数据使用不同的参数,结果效果可能差1-5个点,sklearn为我们提供专门调试参数的函数grid_search。

2.参数说明

class sklearn.model_selection.GridSearchCV(estimator, param_grid, scoring=None, fit_params=None, n_jobs=1, iid=True, refit=True, cv=None, verbose=0, pre_dispatch=‘2*n_jobs’, error_score=’raise’, return_train_score=’warn’)

(1)       estimator

选择使用的分类器,并且传入除需要确定最佳的参数之外的其他参数。每一个分类器都需要一个scoring参数,或者score方法:estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features='sqrt',random_state=10),

(2)       param_grid

需要最优化的参数的取值,值为字典或者列表,例如:param_grid =param_test1,param_test1 = {'n_estimators':range(10,71,10)}。

(3)       scoring=None

模型评价标准,默认None,这时需要使用score函数;或者如scoring='roc_auc',根据所选模型不同,评价准则不同。字符串(函数名),或是可调用对象,需要其函数签名形如:scorer(estimator, X, y);如果是None,则使用estimator的误差估计函数。具体值的选取看本篇第三节内容。

(4)       fit_params=None

(5)       n_jobs=1

n_jobs: 并行数,int:个数,-1:跟CPU核数一致, 1:默认值

(6)       iid=True

iid:默认True,为True时,默认为各个样本fold概率分布一致,误差估计为所有样本之和,而非各个fold的平均。

(7)       refit=True

默认为True,程序将会以交叉验证训练集得到的最佳参数,重新对所有可用的训练集与开发集进行,作为最终用于性能评估的最佳模型参数。即在搜索参数结束后,用最佳参数结果再次fit一遍全部数据集。

(8)        cv=None

交叉验证参数,默认None,使用三折交叉验证。指定fold数量,默认为3,也可以是yield训练/测试数据的生成器。

(9)       verbose=0scoring=None

verbose:日志冗长度,int:冗长度,0:不输出训练过程,1:偶尔输出,>1:对每个子模型都输出。

(10)   pre_dispatch=‘2*n_jobs’

指定总共分发的并行任务数。当n_jobs大于1时,数据将在每个运行点进行复制,这可能导致OOM,而设置pre_dispatch参数,则可以预先划分总共的job数量,使数据最多被复制pre_dispatch次

(11)   error_score=’raise’

(12)   return_train_score=’warn’

如果“False”cv_results_属性将不包括训练分数

回到sklearn里面的GridSearchCV,GridSearchCV用于系统地遍历多种参数组合,通过交叉验证确定最佳效果参数。

3. Scoring parameter:评价标准参数详细说明

 Model-evaluation tools using cross-validation (such as model_selection.cross_val_score andmodel_selection.GridSearchCV) rely on an internal scoring strategy. This is discussed in the section The scoring parameter: defining model evaluation rules.

For the most common use cases, you can designate a scorer object with the scoring parameter; the table below shows all possible values. All scorer objects follow the convention that higher return values are better than lower return values. Thus metrics which measure the distance between the model and the data, like metrics.mean_squared_error, are available as neg_mean_squared_error which return the negated value of the metric.

  

4.属性

1cv_results_ : dict of numpy (masked) ndarrays

具有键作为列标题和值作为列的dict,可以导入到DataFrame中。注意,“params”键用于存储所有参数候选项的参数设置列表。

2best_estimator_ : estimator

通过搜索选择的估计器,即在左侧数据上给出最高分数(或指定的最小损失)的估计器。 如果refit = False,则不可用。

3best_score_ : float    best_estimator的分数

4best_params_ : dict   在保存数据上给出最佳结果的参数设置

5best_index_ : int      对应于最佳候选参数设置的索引(cv_results_数组)。
search.cv_results _ ['params'] [search.best_index_]中的dict给出了最佳模型的参数设置,给出了最高的平均分数(search.best_score_)。

6scorer_ : function

Scorer function used on the held out data to choose the best parameters for the model.

7n_splits_ : int

The number of cross-validation splits (folds/iterations).

(8)grid_scores_:给出不同参数情况下的评价结果

 

6.网格搜索实例

import pandas as pd # 数据科学计算工具
import numpy as np # 数值计算工具
import matplotlib.pyplot as plt # 可视化
import seaborn as sns # matplotlib的高级API
from sklearn.model_selection import StratifiedKFold #交叉验证
from sklearn.model_selection import GridSearchCV #网格搜索
from sklearn.model_selection import train_test_split #将数据集分开成训练集和测试集
from xgboost import XGBClassifier                     #xgboost


pima = pd.read_csv("pima_indians-diabetes.csv")
print(pima.head())

x = pima.iloc[:,0:8]
y = pima.iloc[:,8]

seed = 7 #重现随机生成的训练
test_size = 0.33 #33%测试,67%训练
X_train, X_test, Y_train, Y_test = train_test_split(x, y, test_size=test_size, random_state=seed
model = XGBClassifier()               
learning_rate = [0.0001,0.001,0.01,0.1,0.2,0.3] #学习率
gamma = [1, 0.1, 0.01, 0.001]

param_grid = dict(learning_rate = learning_rate,gamma = gamma)#转化为字典格式,网络搜索要求

kflod = StratifiedKFold(n_splits=10, shuffle = True,random_state=7)#将训练/测试数据集划分10个互斥子集,

grid_search = GridSearchCV(model,param_grid,scoring = 'neg_log_loss',n_jobs = -1,cv = kflod)
#scoring指定损失函数类型,n_jobs指定全部cpu跑,cv指定交叉验证
grid_result = grid_search.fit(X_train, Y_train) #运行网格搜索
print("Best: %f using %s" % (grid_result.best_score_,grid_search.best_params_))
#grid_scores_:给出不同参数情况下的评价结果。best_params_:描述了已取得最佳结果的参数的组合
#best_score_:成员提供优化过程期间观察到的最好的评分
#具有键作为列标题和值作为列的dict,可以导入到DataFrame中。
#注意,“params”键用于存储所有参数候选项的参数设置列表。
means = grid_result.cv_results_['mean_test_score']
params = grid_result.cv_results_['params']
for mean,param in zip(means,params):
    print("%f  with:   %r" % (mean,param))

 结果如下:

<think>好的,我现在需要处理用户关于机器学习回归模型调参的问题。首先,我得回顾一下用户提供的引用内容,看看哪些信息可以直接应用。用户提到了引用1到4,其中引用1和2讨论了调参的目的和重要性,引用3和4提到了网格搜索和交叉验证的方法。用户的问题是如何对回归模型进行参数调整,所以需要结合这些引用来构建回答。 首先,我应该明确调参的基本概念,区分超参数和模型参数。根据引用3,超参数是学习算法需要手动设置的参数,而模型参数是通过训练数据自动学习的。这一点很重要,因为调参主要调整的是超参数。 接下来,用户需要具体的调参方法。引用4提到了GridSearchCV,也就是网格搜索和交叉验证的结合。我需要详细解释网格搜索的步骤,以及如何结合交叉验证来评估不同参数组合的性能。同时,除了网格搜索,还有随机搜索和贝叶斯优化,这些也是常用的方法,需要补充进去。 然后,考虑到用户关注的是回归模型,我需要强调回归任务中的评估指标,如MSE、RMSE、MAE、R²。这些指标在调参过程中用于衡量模型性能,引用1指出对于回归算法,目标是降低模型在未知数据上的误差,所以需要明确这些指标的作用。 另外,引用2提到Python中的工具和库,比如Scikit-learn,这里可以具体举例,如使用GridSearchCV和RandomizedSearchCV的代码示例。用户可能希望看到实际的代码操作,所以提供示例代码会很有帮助,同时要确保代码符合之前的系统级指令,使用正确的格式。 还需要注意步骤化的结构,用户希望回答结构清晰,逐步解决问题。因此,我应该将调参过程分解为几个步骤,比如确定参数范围、选择优化方法、交叉验证、评估指标、自动化工具和迭代优化。每个步骤详细说明,并引用相关的内容支持。 同时,用户要求生成相关问题,我需要根据回答内容提出相关问题,比如网格搜索和随机搜索的区别,评估指标的选择,自动化调参工具等。这些问题需要与主题紧密相关,帮助用户进一步探索。 在写作过程中,要确保使用中文,数学公式用$...$或$$...$$格式,例如MSE公式:$\text{MSE} = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2$。同时检查LaTeX语法是否正确,避免格式错误。 最后,需要确认所有引用都正确标注,例如引用4关于GridSearchCV的解释,在相应的位置添加引用标识。同时确保回答真实可靠,基于提供的引用内容,不添加未提及的信息。</think>### 机器学习回归模型调参方法分步指南 #### 1. **调参目标与关键概念** 调参的核心目标是提升回归模型在未知数据上的泛化能力,即最小化预测误差[^1]。 需区分两类参数: - **模型参数**:通过训练数据自动学习(如线性回归的系数) - **超参数**:需手动设置的算法控制参数(如正则化强度$\lambda$、树模型的深度等)[^3] #### 2. **调参方法详解** ##### 2.1 网格搜索 (Grid Search) 通过遍历预设参数组合寻找最优解,常与交叉验证结合(GridSearchCV)[^4] **实现步骤**: ```python from sklearn.model_selection import GridSearchCV param_grid = { 'alpha': [0.1, 1, 10], # 正则化强度 'max_iter': [1000, 2000] # 最大迭代次数 } grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=5) grid_search.fit(X_train, y_train) ``` ##### 2.2 随机搜索 (Random Search) 在参数空间中随机采样组合,适合高维参数空间: ```python from sklearn.model_selection import RandomizedSearchCV param_dist = { 'alpha': loguniform(1e-3, 100), # 对数均匀分布 'learning_rate': [0.01, 0.1, 0.5] } random_search = RandomizedSearchCV(model, param_dist, n_iter=50, cv=5) ``` ##### 2.3 贝叶斯优化 基于高斯过程建模参数-性能关系,逐步逼近最优解: $$P(score|params) \sim \mathcal{N}(\mu(params), \sigma^2(params))$$ #### 3. **回归评估指标选择** 调参需配合适当的评估指标: - 均方误差:$\text{MSE} = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2$ - 决定系数:$R^2 = 1 - \frac{\sum(y_i - \hat{y}_i)^2}{\sum(y_i - \bar{y})^2}$ #### 4. **关键调参流程** 1. **确定参数空间**:基于模型类型选择核心参数(如岭回归的$\alpha$,GBDT的树深度) 2. **选择优化方法**:低维用网格搜索,高维用随机搜索或贝叶斯优化 3. **交叉验证**:使用5-10折交叉验证防止过拟合 4. **早停机制**:监控验证集误差,设置提前终止条件 #### 5. **自动化调参工具** | 工具 | 特点 | 示例库 | |----------------|-------------------------------|-----------------------| | Hyperopt | 支持贝叶斯优化 | `hyperopt` | | Optuna | 动态参数采样 | `optuna` | | TPOT | 自动化机器学习(AutoML) | `tpot` | #### 6. **实践建议** - 优先调整对模型影响大的参数(如正则化系数、树模型复杂度参数) - 使用学习曲线分析模型状态(欠拟合/过拟合) - 最终评估必须在独立测试集上进行
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值