调参方法
1.网格搜索 (暴力枚举)
测试每一种超参组合,如:
两个超参数 k_value =[2,3,4,5,6,7,8,9,10] & algorithm =[ auto , ball_tree , kd_tree ,brute ],在这个例子中,它总共构建了9*4 = 36不同的模型。
from sklearn.model_selection import GridSearchCV
grid_param = {
'超参数': 调参范围,
...
}
grid = GridSearchCV(model,grid_param,cv = 5)
grid.fit(X_train,y_train)
# 查看结果
grid.cv_results_ # 以字典形式返回网格搜索中每个参数组合的性能指标和计算信息
grid.best_params_ # 以字典的形式返回最好的参数组合,eg: {'C': 1.0, 'kernel': 'linear'}
grid.best_score_ # 返回一个浮点数,表示在网格搜索中找到的最佳超参数组合对应的平均测试集得分(交叉验证)
2. 随机搜索
从超参数空间中随机选择参数组合,迭代次数由n_iter决定
from sklearn.model_selection import RandomizedSearchCV
grid_param = { 'n_neighbors' : list(range(2,11)) ,
'algorithm' : ['auto','ball_tree','kd_tree','brute'] }
rand_ser = RandomizedSearchCV(knn,grid_param,n_iter=10)
rand_ser.fit(X_train,y_train)
# 查看结果
rand_ser.cv_results_ # 以字典形式返回网格搜索中每个参数组合的性能指标和计算信息
rand_ser.best_params_ # 以字典的形式返回最好的参数组合,eg: {'C': 1.0, 'kernel': 'linear'}
rand_ser.best_score_ # 返回一个浮点数,表示在网格搜索中找到的最佳超参数组合对应的平均测试集得分(交叉验证)
3. 贝叶斯搜索(Beysian Optimization)
贝叶斯优化的工作方式是通过对目标函数形状的学习,找到使结果向全局最大值提升的参数。它学习目标函数形状的方法是,根据先验分布,假设一个搜集函数。在每一次使用新的采样点来测试目标函数时,它使用这个信息来更新目标函数的先验分布。然后,算法测试由后验分布给出的,全局最值最可能出现的位置的点。
参考:贝叶斯优化基础方法_Simon Toxic的博客-CSDN博客
相关概念:
概率代理模型(Probability Surrogate model)如 高斯过程:根据有限的观测值对函数的分布进行估计 【目前最普及的优化库中使用的是高斯混合模型】
采集函数:采集函数是用来确定下一个观测点的规则,关注采集函数的最大值点,【大部分优化库中默认使用期望增量】
BO过程: f(使得模型效果最好的超参组合)
1. 使用观测点更新先验模型,也就是概率代理模型,得到估计的f*
2. 基于先验模型计算采集函数(先验模型估计所有的点)
3. 选择最大化采集函数的样本点作为下一个样本
通过迭代使得f*逼近f
from skopt import BayesSearchCV
knn = KNeighborsClassifier()
#defining hyper-parameter grid
grid_param = { 'n_neighbors' : list(range(2,11)) ,
'algorithm' : ['auto','ball_tree','kd_tree','brute'] }
#initializing Bayesian Search
Bayes = BayesSearchCV(model, grid_param , n_iter=30 , random_state=14)
Bayes.fit(X_train,y_train)
#best parameter combination
Bayes.best_params_
#score achieved with best parameter combination
Bayes.best_score_
#all combinations of hyperparameters
Bayes.cv_results_['params']
#average scores of cross-validation
Bayes.cv_results_['mean_test_score']