模型调优(Model Tuning)是通过系统化调整机器学习模型的超参数和结构参数,使模型在特定数据集上达到最佳性能的过程。其核心目标是在以下两者间找到平衡:
泛化能力 ∝ 1 过拟合风险 \text{泛化能力} \propto \frac{1}{\text{过拟合风险}} 泛化能力∝过拟合风险1
{ 树模型 需要调节深度参数 神经网络 需调整层数和学习率 SVM 需优化核函数和惩罚系数 \begin{cases} \text{树模型} & \text{需要调节深度参数} \\ \text{神经网络} & \text{需调整层数和学习率} \\ \text{SVM} & \text{需优化核函数和惩罚系数} \end{cases} ⎩ ⎨ ⎧树模型神经网络SVM需要调节深度参数需调整层数和学习率需优化核函数和惩罚系数
根据任务类型选择:
准确率 = T P + T N T P + T N + F P + F N ( 分类 ) MSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 ( 回归 ) \text{准确率} = \frac{TP + TN}{TP + TN + FP + FN} \quad (\text{分类}) \\ \text{MSE} = \frac{1}{n}\sum_{i=1}^n(y_i - \hat{y}_i)^2 \quad (\text{回归}) 准确率=TP+TN+FP+FNTP+TN(分类)MSE=n1i=1∑n(yi−y^i)2(回归)
创建N维参数网格:
param_grid = {
'C': [0.1, 1, 10], # 正则化系数
'kernel': ['linear', 'rbf'], # 核函数类型
'gamma': [0.01, 0.1] # 核函数系数
}
此时参数组合总数: 3 × 2 × 2 = 12 3 \times 2 \times 2 = 12 3×2×2=12 种
交叉验证机制
采用k-fold交叉验证评估每个参数组合:
CV Score = 1 k ∑ i = 1 k P ( M θ , D v a l i d ( i ) ) \text{CV Score} = \frac{1}{k}\sum_{i=1}^k \mathcal{P}(M_\theta, D_{valid}^{(i)}) CV Score=k1i=1∑kP(Mθ,Dvalid(i))
搜索过程
遍历所有参数组合:
[0.1, linear, 0.01] → 评估
[0.1, linear, 0.1] → 评估
…
[10, rbf, 0.1] → 评估
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
数据准备
iris = load_iris()
X, y = iris.data, iris.target
X_scaled = StandardScaler().fit_transform(X) # 标准化处理
参数网格
param_grid = {
'C': [0.1, 1, 10, 100],
'kernel': ['linear', 'rbf', 'poly'],
'gamma': ['scale', 'auto', 0.1, 1]
}
创建搜索器
grid_search = GridSearchCV(
estimator=SVC(random_state=42),
param_grid=param_grid,
scoring='accuracy',
cv=5, # 5折交叉验证
n_jobs=-1, # 使用全部CPU核心
verbose=2 # 显示详细日志
)
执行搜索
grid_search.fit(X_scaled, y)
结果分析
print("最优参数组合:", grid_search.best_params_)
print("最高交叉验证准确率:", grid_search.best_score_)
参数 | 作用 | 推荐设置 |
---|---|---|
cv |
交叉验证折数 | 5-10折 |
scoring |
评估指标 | 根据任务选择(f1, roc_auc等) |
n_jobs |
并行计算 | -1(使用所有核心) |
refit |
自动重训练 | True(最终用全数据训练最佳模型) |
1.核心定义
贝叶斯优化是一种基于概率模型的序贯优化方法,特别适用于高维、计算成本高昂的黑箱函数优化问题。其数学表达为:
x ∗ = arg max x ∈ X f ( x ) x^* = \arg\max_{x \in \mathcal{X}} f(x) x∗=argx∈Xmaxf(x)
其中:
代理模型(Surrogate Model)
采用**高斯过程(Gaussian Process)**构建目标函数的概率分布:
f ( x ) ∼ G P ( m ( x ) , k ( x , x ′ ) ) f(x) \sim \mathcal{GP}(m(x), k(x, x')) f(x)∼GP(m(x),k(x,x′))
m ( x ) m(x) m(x):均值函数(通常取0)
k ( x , x ′ ) k(x, x') k(x,x′):协方差函数(常用RBF核)
采集函数(Acquisition Function)
平衡探索与开发的关键机制,常用期望改进(Expected Improvement, EI):
EI ( x ) = E [ max ( f ( x ) − f ( x + ) , 0 ) ] \text{EI}(x) = \mathbb{E}[\max(f(x) - f(x^+), 0)] EI(x)=E[max(f(x)−f(x+),0)]
其中 x + x^+ x+是当前最优解
算法流程
初始化:随机采样3-5个初始点
循环迭代:
终止条件:达到最大迭代次数或精度阈值
数学原理
高斯过程预测
给定观测数据 D = { ( x i , y i ) } i = 1 t \mathcal{D}=\{(x_i,y_i)\}_{i=1}^t D={(xi,yi)}i=1t,新点 x t + 1 x_{t+1} xt+1的预测分布:
p ( y t + 1 ∣ D , x t + 1 ) = N ( μ t ( x t + 1 ) , σ t 2 ( x t + 1 ) ) p(y_{t+1}|\mathcal{D},x_{t+1}) = \mathcal{N}(\mu_t(x_{t+1}), \sigma_t^2(x_{t+1})) p(yt+1∣D,xt+1)=N(μt(xt+1),σt2(xt+1))
概率提升计算
EI函数可解析表达为:
EI ( x ) = ( μ ( x ) − f ( x + ) − ξ ) Φ ( Z ) + σ ( x ) ϕ ( Z ) \text{EI}(x) = (\mu(x) - f(x^+) - \xi)\Phi(Z) + \sigma(x)\phi(Z) EI(x)=(μ(x)−f(x+)−ξ)Φ(Z)+σ(x)ϕ(Z)
其中:
Z = μ ( x ) − f ( x + ) − ξ σ ( x ) Z = \frac{\mu(x) - f(x^+) - \xi}{\sigma(x)} Z=σ(x)μ(x)−f(x+)−ξ
Φ \Phi Φ为标准正态分布CDF
ϕ \phi ϕ为标准正态分布PDF
from skopt import BayesSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_digits
加载数据
X, y = load_digits(return_X_y=True)
定义搜索空间
search_space = {
‘n_estimators’: (100, 500), # 整数型参数
‘max_depth’: (3, 10), # 连续型参数
‘max_features’: (0.1, 0.999, ‘log-uniform’) # 对数均匀分布
}
创建贝叶斯优化器
opt = BayesSearchCV(
estimator=RandomForestClassifier(),
search_spaces=search_space,
n_iter=30, # 迭代次数
cv=5, # 交叉验证
n_jobs=-1, # 并行计算
scoring=‘accuracy’
)
执行优化
opt.fit(X, y)
输出结果
print(“最佳参数:”, opt.best_params_)
print(“最高准确率:”, opt.best_score_)
智能采样策略
相比网格搜索减少约70%评估次数(在10维空间下)
通过EI函数有效平衡:
处理复杂参数空间
常见问题 | 解决方案 |
---|---|
过拟合验证集 | 使用嵌套交叉验证 |
参数组合爆炸 | 采用分层调优策略 |
指标误导 | 定义业务相关评估指标 |
计算时间过长 | 使用提前停止(Early Stopping) |
from sklearn.model_selection import learning_curve
train_sizes, train_scores, test_scores = learning_curve(
estimator=model,
X=X_train,
y=y_train,
cv=5
)
模型调优是系统工程,需结合:
最终目标是使模型满足:
max 泛化性能 s.t. 资源消耗 ≤ 预算上限 \max \text{泛化性能} \\ \text{s.t.} \quad \text{资源消耗} \leq \text{预算上限} max泛化性能s.t.资源消耗≤预算上限