您现在的位置是:首页 >技术交流 >在sklearn中的GridSearchCV和RandomizedSearchCV参数调优的实现和比较网站首页技术交流
在sklearn中的GridSearchCV和RandomizedSearchCV参数调优的实现和比较
网格参数调优:网格参数调优是指在给定的参数范围内,穷举出所有的参数组合,然后分别训练模型,选择最优参数组合的过程。它可以通过GridSearchCV这个函数来实现。
优缺点:
1. 可以保证找到最优的参数。 简单易懂、易于实现。
2. 计算量大,当有多个参数需要调整时,时间复杂度将成指数级别增加,导致模型训练时间较长。当参数空间很大时,很难找到最优解。
随机参数调优:随机参数调优是从所有可能的参数组合中随机选择子集,来进行模型训练的过程。在随机参数调优中,我们也需要指定一组参数,但随机参数调优是从这些参数中采样出一部分进行训练。它可以通过RandomizedSearchCV这个函数来实现。
优缺点:
1. 擅长处理高维、大数据的情况,计算复杂度低,因此速度较快。可以在限定的时间内找到近似的最优解。
2. 可能会错过最优解,因为随机采样的参数可能不够全面,而且这个方法通常需要多次重复,以期找到较为理想的参数组合。随机性较大,因此每次结果可能不一样。
网格参数调优适合于参数空间小、需要保证找到最优解的情况,而随机参数调优适合于参数空间大、时间复杂度高的情况。在实际实验中,可以先使用网格调优快速找到一组参数区间后,再通过随机调优精细调整参数。
参数
GridSearchCV方法的参数:
estimator | 需要搜索的模型 |
param_grid | 需要搜索的参数空间,可以是一个字典或一个列表,每个元素都是一个参数字典 |
cv | 交叉验证的折数 |
scoring | 模型评估指标 |
n_jobs | 并行处理的进程数 |
verbose | 详细程度(0、1、2)默认为0,即不输出如何过程 |
其中scoring的参数除accuracy,其他方法在多分类需要进行调整,它的几种参数如下
1. accuracy(准确率):计算预测值和真实值相同的样本数除以总样本数来衡量分类模型性能。
2. precision(精确度):在所有预测为正例的样本中,实际为正例的样本数量占比。
3. recall(召回率):在所有实际为正例的样本中,预测为正例的样本数量占比。
4. f1:通过计算准确率和召回率的加权平均来衡量分类模型性能。
5. roc_auc(Area Under the Receiver Operating Characteristic curve):通过计算正例样本的真阳性率和负例样本的假阳性率来衡量分类模型性能。
RandomizedSearchCV方法的参数:
estimator | 需要搜索的模型 |
param_distributions | 需要搜索的参数分布,可以是一个字典 |
n_iter | 随机搜索的次数 |
cv | 交叉验证的折数 |
scoring | 模型评估指标 |
n_jobs | 并行处理的进程数 |
verbose | 详细程度(0、1、2)默认为0,即不输出如何过程 |
代码实现
在其他参数相同的情况下比较时间代码如下
from sklearn.datasets import load_wine
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
import time
data = load_wine()
X, y = data.data, data.target
# 网格搜索(GridSearch)
start_time = time.time()
param_grid = {'n_estimators': [10, 50, 100, 500],
'max_depth': [None, 5, 10, 20],
'max_features': [3, 5, 8, 'sqrt', 'log2']}
clf = RandomForestClassifier(random_state=42)
grid = GridSearchCV(clf, param_grid=param_grid)
grid.fit(X, y)
print("Grid Search - Best Score: %0.3f" % grid.best_score_)
print("Grid Search - Best Parameters: ", grid.best_params_)
print("Grid Search - Execution Time: %s seconds" % (time.time() - start_time))
# 随机搜索(RandomizedSearch)
start_time = time.time()
param_dist = {'n_estimators': [10, 50, 100, 500],
'max_depth': [None, 5, 10, 20],
'max_features': [3, 5, 8, 'sqrt', 'log2']}
clf = RandomForestClassifier(random_state=42)
random = RandomizedSearchCV(clf, param_distributions=param_dist, n_iter=10)
random.fit(X, y)
print("Random Search - Best Score: %0.3f" % random.best_score_)
print("Random Search - Best Parameters: ", random.best_params_)
print("Random Search - Execution Time: %s seconds" % (time.time() - start_time))
结果输出如下,从结果可以看出,随机搜索时间明显快于网格搜索时间,在相同的搜索空间下两种方法得到的最优评分相同,但得到的最优参数略有不同。
Grid Search - Best Score: 0.978
Grid Search - Best Parameters: {'max_depth': None, 'max_features': 5, 'n_estimators': 500}
Grid Search - Execution Time: 67.6649899482727 seconds
Random Search - Best Score: 0.978
Random Search - Best Parameters: {'n_estimators': 500, 'max_features': 5, 'max_depth': 10}
Random Search - Execution Time: 18.016382932662964 seconds
设置参数n_jobs = -1并行计算使用时间比较结果如下,可以看到比单进程快了很多。n_jobs默认值为1,表示使用单个CPU核心。如果将其设置为-1,将使用所有可用的CPU核心。 如果使用多个CPU核心进行并行计算,可能会导致内存使用率增加。
Grid Search - Best Score: 0.978
Grid Search - Best Parameters: {'max_depth': None, 'max_features': 5, 'n_estimators': 500}
Grid Search - Execution Time: 28.384050607681274 seconds
Random Search - Best Score: 0.978
Random Search - Best Parameters: {'n_estimators': 500, 'max_features': 5, 'max_depth': 10}
Random Search - Execution Time: 5.21610426902771 seconds
设置参数verbose=1,结果如下,可以很清楚的看到,网格参数调优使用交叉验证技术对80个不同的模型参数组合进行训练和评估,每个模型参数组合都会在数据集上进行5次交叉验证拟合,总共进行了400次的拟合操作。而随机参数调优只使用了10个模型进行了50次拟合操作。时间会短很多。
Fitting 5 folds for each of 80 candidates, totalling 400 fits
Grid Search - Best Score: 0.978
Grid Search - Best Parameters: {'max_depth': None, 'max_features': 5, 'n_estimators': 500}
Grid Search - Execution Time: 35.06308913230896 seconds
Fitting 5 folds for each of 10 candidates, totalling 50 fits
Random Search - Best Score: 0.978
Random Search - Best Parameters: {'n_estimators': 500, 'max_features': 5, 'max_depth': 10}
Random Search - Execution Time: 6.050998210906982 seconds
设置参数verbose=2,输出结果如下(结果太长只展示部分),每一次拟合都有一个输出,比较消耗资源,可以结合自己的情况来决定。
Fitting 5 folds for each of 80 candidates, totalling 400 fits
[CV] END ....max_depth=None, max_features=3, n_estimators=10; total time= 0.0s
[CV] END ....max_depth=None, max_features=3, n_estimators=10; total time= 0.0s
[CV] END ....max_depth=None, max_features=3, n_estimators=10; total time= 0.0s
[CV] END ....max_depth=None, max_features=3, n_estimators=10; total time= 0.0s
[CV] END ....max_depth=None, max_features=3, n_estimators=10; total time= 0.0s
[CV] END ....max_depth=None, max_features=3, n_estimators=50; total time= 0.0s
[CV] END ....max_depth=None, max_features=3, n_estimators=50; total time= 0.0s
[CV] END ....max_depth=None, max_features=3, n_estimators=50; total time= 0.1s