众所周知,在机器学习的问题上,怎样快速并且准确的调参从而使得模型能够达到最好的预测结果是一个有点令人头大的问题,因此有很多人也把调参称为一门玄学。现将常用的调参方法总结一下。
1 手动调参
全靠平时经验,略。
2 网格搜索
网格搜索通过在参数空间内放置所有可能配置的网格来确定性地建议参数配置。要使用此策略进行优化,请在此网格的每个点评估您的功能。由于只有四个参数,这个问题可能变得不切实际,因为由于维数的诅咒,该策略所需的功能评估数量随着每个附加参数呈指数增长。
代码实践:(sklearn._version__: '0.19.1')
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import GridSearchCV,RandomizedSearchCV
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
import numpy as np
# 获取iris数据集
iris = load_iris()
X_data = iris.data
y_data = iris.target
X_data=(X_data-np.min(X_data))/(np.max(X_data)-np.min(X_data))
x_train, x_test, y_train, y_test=train_test_split(X_data,y_data,test_size=0.3)
my_svc = SVC()
parameters = {'kernel':('linear','rbf'), 'C':[1, 2], 'gamma':[0.125,0.25, 0.5]}
gd_sr=GridSearchCV(my_svc, parameters, cv=5, scoring='accuracy', verbose=10)
gd_sr.fit(x_train,y_train)
best_parameters = gd_sr.best_params_
print(best_parameters)
best_model=gd_sr.best_estimator_
accuracy_score(y_test, best_model.predict(x_test))
3 随机搜索
随机搜索建议从参数空间中随机配置。虽然机器学习实践中不太常见于网格搜索,但随机搜索在某些类型的问题的功能评估较少的情况下,可以找到与网格搜索相同或更好的值。要使用随机搜索进行优化,请在参数空间中的一些随机配置中评估您的函数;请注意,可能不清楚如何确定特定问题所需的功能评估数。
代码实践:
因为在sklearn模块中randomsearchcv与gridsearch大部分都是相同的,因此只给出对应部分:
rd_sr=RandomizedSearchCV(my_svc, parameters, cv=5, scoring='accuracy', verbose=10)
rd_sr.fit(x_train,y_train)
4 贝叶斯优化 贝叶斯优化是参数优化的自适应方法,在探索参数空间的新区域之间进行权衡,并利用历史信息来找到快速最大化函数的参数。像随机搜索一样,贝叶斯优化是随机的。
4.1 相对应的理论说明:
贝叶斯优化属于一类称为基于顺序模型的优化(SMBO)算法的优化算法。这些算法使用先前评估的参数和结果来假设未观察到的参数,采集功能使用此信息建议下一组参数。
4.1.1 高斯过程
高斯过程是多元高斯分布的推广。多元高斯分布由均值和协方差阵定义,而高斯过程是由均值函数和协方差函数定义。
为了计算后验期望,我们需要来自f的样本的似然模型和f上的先验概率模型。在贝叶斯搜索中,我们假设具有噪声的似然函数:
在先验分布中,我们可以假设损失函数是一个高斯过程。
4.1.2 Acquisition 函数
为了找到损失函数最佳采样点,我们需要最大化acquisition函数,在文献中acquisition函数有很多种形式,最常用的是expected improvement (EI),它的定义如下:
其中x冒是参数的优化集,最大化这个数量将会最大化改进f的期望。
通过expected improvement 改进的好处是我们可以通过分步积分的形式计算期望
其中
从上面的公式我们可以看出来,
1 当后验期望值
那么该算法大致可概括如下:
1 根据之前的样本点X1,X2……Xn,计算损失函数的期望,
2 在新的样本点X_new对损失函数进行采样,这样可以最大化损失函数的效用,可以知道哪些区域是最佳区域。
4.2 代码实践:
from sklearn.model_selection import cross_val_score
from sklearn.svm import SVC
from bayes_opt import BayesianOptimization
from bayes_opt.util import Colours
def svc_cv(C, gamma, data, targets):
estimator = SVC(C=C, gamma=gamma, random_state=2)
cval = cross_val_score(estimator, data, targets, scoring='accuracy', cv=4)
return cval.mean()
def optimize_svc(data, targets):
def svc_crossval(expC, expGamma):
C = 10 ** expC
gamma = 10 ** expGamma
return svc_cv(C=C, gamma=gamma, data=data, targets=targets)
optimizer = BayesianOptimization(
f=svc_crossval,
pbounds={"expC": (-3, 2), "expGamma": (-4, -1)},
random_state=1234,
verbose=2
)
optimizer.maximize(n_iter=10)
print("Final result:", optimizer.max)
optimize_svc(x_train, y_train)
参考文献:
[1] python - Sklearn,gridsearch:在执行过程中如何打印进度? - 代码日志
[2] Bayesian optimization with scikit-learn