模型调优的常见技术:网格搜索、随机搜索和贝叶斯优化
- 网格搜索(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))
- 随机搜索(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))
- 贝叶斯优化(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'])
以上三种技术是常见的模型调优方法,我们可以根据实际情况灵活使用。
相关文章