超参数搜索之网格搜索与并行搜索

通过Python多线程并行技术进行网格搜索,相同36项任务耗时仅1.2分钟,保持82.27%最高分类准确率,运算速度提升近3倍。后续将介绍Pipeline相关内容。
超参数搜索
所谓的模型配置,一般统称为模型的超参数(Hyperparameters),比如KNN算法中的K值,SVM中不同的核函数(Kernal)等。多数情况下,超参数等选择是无限的。在有限的时间内,除了可以验证人工预设几种超参数组合以外,也可以通过启发式的搜索方法对超参数组合进行调优。称这种启发式的超参数搜索方法为网格搜索。
网格搜索
由于超参数的空间是无尽的,因此超参数的组合配置只能是“更优”解,没有最优解。通常,依靠网格搜索(Grid Search)对各种超参数组合的空间进行暴力搜索。每一套超参数组合被代入到学习函数中作为新的模型,并且为了比较新模型之间的性能,每个模型都会采用交叉验证的方法在多组相同的训练和开发数据集下进行评估。

Python源码:

#coding=utf-8
from sklearn.datasets import fetch_20newsgroups
import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn.svm import SVC
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipel
<think>我们讲解超参数优化中的网格搜索(Grid Search)。网格搜索是一种通过遍历给定的参数组合来优化模型超参数的方法。 步骤: 1. 定义要调整的超参数以及候选值范围。 2. 将超参数组合成多个参数组(网格)。 3. 对每一组超参数,使用交叉验证(如k折交叉验证)来评估模型性能。 4. 选择性能最好的超参数组合作为最佳参数。 优点:简单直观,可以并行计算。 缺点:计算成本高,尤其是参数多且范围大时;只能对离散值进行搜索。 下面以使用Scikit-learn库中的GridSearchCV为例进行说明。我们用一个简单的SVM分类器在鸢尾花数据集上做网格搜索。 注意:在运行以下代码之前,请确保已经安装了scikit-learn库(可以使用pip install scikit-learn)。 我们将调整SVM的两个超参数:C(惩罚系数)gamma(核函数系数),使用网格搜索找到最佳组合。 </think>### 超参数优化:网格搜索(Grid Search)详解 网格搜索是一种系统化的超参数优化方法,通过遍历所有预定义的参数组合,寻找模型最优配置。以下是使用Scikit-learn实现网格搜索的完整示例: ```python from sklearn import datasets from sklearn.model_selection import GridSearchCV, train_test_split from sklearn.svm import SVC from sklearn.metrics import accuracy_score # 加载数据集 iris = datasets.load_iris() X, y = iris.data, iris.target # 划分训练集测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 定义参数网格 param_grid = { 'C': [0.1, 1, 10, 100], # 正则化强度 'gamma': ['scale', 'auto', 0.01, 0.1, 1], # 核函数系数 'kernel': ['linear', 'rbf'] # 核函数类型 } # 创建SVM分类器 svm = SVC(random_state=42) # 实例化网格搜索对象 grid_search = GridSearchCV( estimator=svm, param_grid=param_grid, scoring='accuracy', # 评估指标 cv=5, # 5折交叉验证 n_jobs=-1, # 使用所有CPU核心 verbose=1 # 打印进度 ) # 执行网格搜索 grid_search.fit(X_train, y_train) # 输出最佳参数得分 print(f"最佳参数: {grid_search.best_params_}") print(f"最佳交叉验证分数: {grid_search.best_score_:.4f}") # 在测试集上评估最佳模型 best_model = grid_search.best_estimator_ y_pred = best_model.predict(X_test) test_acc = accuracy_score(y_test, y_pred) print(f"测试集准确率: {test_acc:.4f}") ``` #### 代码解析: 1. **参数网格定义**: - `param_grid` 是字典结构,键为超参数名,值为候选值列表 - 示例组合数:4(C) × 5(gamma) × 2(kernel) = 40种组合 2. **GridSearchCV核心参数**: - `estimator`:基础模型(此处为SVM) - `scoring`:评估标准(准确率/F1等) - `cv`:交叉验证折数 - `n_jobs=-1`:启用并行计算加速搜索 3. **执行流程**: 1. 创建所有参数组合(此处40组) 2. 对每组参数执行5折交叉验证(共40×5=200次训练) 3. 计算每组参数的平均交叉验证得分 4. 选择最高得分对应的参数组合 4. **结果获取**: - `best_params_`:最优参数组合 - `best_score_`:最优交叉验证得分 - `best_estimator_`:最优模型实例 #### 网格搜索特点: - **优点**:简单直观,保证找到参数空间内的最优解 - **缺点**: - 计算成本随参数数量指数级增长(维度诅咒) - 只能探索预定义离散值,可能错过最优解 - **适用场景**:参数量少(≤4)且取值范围明确的情况 #### 优化建议: 1. 先粗调(大范围稀疏取值)后精调(小范围密集取值) 2. 结合特征工程减少无关参数 3. 对连续参数进行对数尺度采样(如`np.logspace(-3, 3, 7)`)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值