模型调优的常见技术:网格搜索、随机搜索和贝叶斯优化

2023-04-13 00:00:00 模型 随机 网格
  1. 网格搜索(Grid Search)
    网格搜索是通过在给定的范围内对模型超参数进行排列组合,生成所有可能的参数组合来完成模型调优的过程。网格搜索的好处是易于使用和解释,坏处是时间复杂度高,可能会消耗大量计算资源。
    以下是一个网格搜索的示例代码:
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVR
# 定义超参网格
param_grid = {
    'C': [0.1, 1, 10],
    'kernel': ['linear', 'rbf', 'poly'],
    'gamma': ['scale', 'auto']
}
# 实例化SVR算法类
svr = SVR()
# 实例化GridSearchCV类
grid_search = GridSearchCV(estimator=svr, param_grid=param_grid)
# 使用数据对模型进行拟合
grid_search.fit(X_train,y_train)
# 输出最佳超参组合和测试得分
print('最佳超参组合为:', grid_search.best_params_) 
print('测试得分为:', grid_search.score(X_test, y_test))
  1. 随机搜索(Random Search)
    随机搜索是通过在给定的范围内随机选择超参数,生成一定数量的参数组合进行模型调优的过程,相比于网格搜索,随机搜索的时间复杂度更低,在超参数数量较多时表现更为优越。
    以下是一个随机搜索的示例代码:
from sklearn.model_selection import RandomizedSearchCV
from sklearn.svm import SVR
import numpy as np
# 定义超参分布
param_dist = {
    'C': np.random.uniform(0.1, 10, 100),
    'kernel': ['linear', 'rbf', 'poly'],
    'gamma': ['scale', 'auto'] + list(np.random.uniform(0, 1, 8))
}
# 实例化SVR算法类
svr = SVR()
# 实例化RandomizedSearchCV类
random_search = RandomizedSearchCV(estimator=svr, param_distributions=param_dist, n_iter=50)
# 使用数据对模型进行拟合
random_search.fit(X_train,y_train)
# 输出最佳超参组合和测试得分
print('最佳超参组合为:', random_search.best_params_) 
print('测试得分为:', random_search.score(X_test, y_test))
  1. 贝叶斯优化(Bayesian Optimization)
    贝叶斯优化是一种基于贝叶斯统计的机器学习方法,它通过不断优化超参数的条件概率分布来找到最优超参数组合。它通过前几次试验的结果进行预测,然后利用试验结果来更新分布的参数,从而使得后续的测试尽可能地接近真实的结果。贝叶斯优化在超参数调优上表现很好,在大部分情况下效果都能超过网格搜索和随机搜索。
    以下是一个贝叶斯优化的示例代码:
!pip install hyperopt
from sklearn.svm import SVR
from hyperopt import fmin, tpe, hp, STATUS_OK, Trials
# 定义超参空间
space = {
    'C': hp.loguniform('C', -2, 2),
    'kernel': hp.choice('kernel', ['linear', 'rbf', 'poly']),
    'gamma': hp.uniform('gamma', 0, 1)
}
# 定义优化目标函数
def target(params):
    svr = SVR(**params)
    svr.fit(X_train, y_train)
    score = svr.score(X_test, y_test)
    return {'loss': -score, 'status': STATUS_OK}
# 实例化Trials类
trials = Trials()
# 使用TPE算法对目标函数进行优化
best = fmin(fn=target,
            space=space,
            algo=tpe.suggest,
            max_evals=100,
            trials=trials)
# 输出最佳超参组合和测试得分
print('最佳超参组合为:', best)
print('测试得分为:', -trials.best_trial['result']['loss'])

以上三种技术是常见的模型调优方法,我们可以根据实际情况灵活使用。

相关文章