四种Python机器学习超参数搜索方法总结

 更新时间:2022年11月07日 10:09:15   作者:Python数据挖掘  
在建模时模型的超参数对精度有一定的影响,而设置和调整超参数的取值,往往称为调参。本文将演示在sklearn中支持的四种基础超参数搜索方法,需要的可以参考一下

在建模时模型的超参数对精度有一定的影响,而设置和调整超参数的取值,往往称为调参。

在实践中调参往往依赖人工来进行设置调整范围,然后使用机器在超参数范围内进行搜素。本文将演示在sklearn中支持的四种基础超参数搜索方法:

  • GridSearch
  • RandomizedSearch
  • HalvingGridSearch
  • HalvingRandomSearch

原始模型

作为精度对比,我们最开始使用随机森林来训练初始化模型,并在测试集计算精度:

# 数据读取
df = pd.read_csv('https://mirror.coggle.club/dataset/heart.csv')
X = df.drop(columns=['output'])
y = df['output']

# 数据划分
x_train, x_test, y_train, y_test = train_test_split(X, y, stratify=y)

# 模型训练与计算准确率
clf = RandomForestClassifier(random_state=0)
clf.fit(x_train, y_train)
clf.score(x_test, y_test)

模型最终在测试集精度为:0.802。

GridSearch

GridSearch是比较基础的超参数搜索方法,中文名字网格搜索。其原理是在计算的过程中遍历所有的超参数组合,然后搜索到最优的结果。

如下代码所示,我们对4个超参数进行搜索,搜索空间为 5 * 3 * 2 * 3 = 90组超参数。对于每组超参数还需要计算5折交叉验证,则需要训练450次。

parameters = {
    'max_depth': [2,4,5,6,7],
    'min_samples_leaf': [1,2,3],
    'min_weight_fraction_leaf': [0, 0.1],
    'min_impurity_decrease': [0, 0.1, 0.2]
}

# Fitting 5 folds for each of 90 candidates, totalling 450 fits
clf = GridSearchCV(
    RandomForestClassifier(random_state=0),
    parameters, refit=True, verbose=1,
)
clf.fit(x_train, y_train)
clf.best_estimator_.score(x_test, y_test)

模型最终在测试集精度为:0.815。

RandomizedSearch

RandomizedSearch是在一定范围内进行搜索,且需要设置搜索的次数,其默认不会对所有的组合进行搜索。

n_iter代表超参数组合的个数,默认会设置比所有组合次数少的取值,如下面设置的为10,则只进行50次训练。

parameters = {
    'max_depth': [2,4,5,6,7],
    'min_samples_leaf': [1,2,3],
    'min_weight_fraction_leaf': [0, 0.1],
    'min_impurity_decrease': [0, 0.1, 0.2]
}

clf = RandomizedSearchCV(
    RandomForestClassifier(random_state=0),
    parameters, refit=True, verbose=1, n_iter=10,
)

clf.fit(x_train, y_train)
clf.best_estimator_.score(x_test, y_test)

模型最终在测试集精度为:0.815。

HalvingGridSearch

HalvingGridSearch和GridSearch非常相似,但在迭代的过程中是有参数组合减半的操作。

最开始使用所有的超参数组合,但使用最少的数据,筛选其中最优的超参数,增加数据再进行筛选。

HalvingGridSearch的思路和hyperband的思路非常相似,但是最朴素的实现。先使用少量数据筛选超参数组合,然后使用更多的数据验证精度。

n_iterations: 3
n_required_iterations: 5
n_possible_iterations: 3
min_resources_: 20
max_resources_: 227
aggressive_elimination: False
factor: 3
----------

iter: 0
n_candidates: 90
n_resources: 20
Fitting 5 folds for each of 90 candidates, totalling 450 fits
----------

iter: 1
n_candidates: 30
n_resources: 60
Fitting 5 folds for each of 30 candidates, totalling 150 fits
----------

iter: 2
n_candidates: 10
n_resources: 180
Fitting 5 folds for each of 10 candidates, totalling 50 fits
----------

模型最终在测试集精度为:0.855。

HalvingRandomSearch

HalvingRandomSearch和HalvingGridSearch类似,都是逐步增加样本,减少超参数组合。但每次生成超参数组合,都是随机筛选的。

n_iterations: 3
n_required_iterations: 3
n_possible_iterations: 3
min_resources_: 20
max_resources_: 227
aggressive_elimination: False
factor: 3
----------

iter: 0
n_candidates: 11
n_resources: 20
Fitting 5 folds for each of 11 candidates, totalling 55 fits
----------

iter: 1
n_candidates: 4
n_resources: 60
Fitting 5 folds for each of 4 candidates, totalling 20 fits
----------

iter: 2
n_candidates: 2
n_resources: 180
Fitting 5 folds for each of 2 candidates, totalling 10 fits

模型最终在测试集精度为:0.828。

总结与对比

HalvingGridSearch和HalvingRandomSearch比较适合在数据量比较大的情况使用,可以提高训练速度。如果计算资源充足,GridSearch和HalvingGridSearch会得到更好的结果。

后续我们将分享其他的一些高阶调参库的实现,其中也会有数据量改变的思路。如在Optuna中,核心是参数组合的生成和剪枝、训练的样本增加等细节。

到此这篇关于四种Python机器学习超参数搜索方法总结的文章就介绍到这了,更多相关Python超参数搜索内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • pycharm中选中一个单词替换所有重复单词的实现方法

    pycharm中选中一个单词替换所有重复单词的实现方法

    这篇文章主要介绍了pycharm中选中一个单词替换所有重复单词的实现方法,类似于sublime 里的ctrl+D功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-11-11
  • python实现列表中最大最小值输出的示例

    python实现列表中最大最小值输出的示例

    今天小编就为大家分享一篇python实现列表中最大最小值输出的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • pytorch实现模型剪枝的操作方法

    pytorch实现模型剪枝的操作方法

    PyTorch 提供了内置剪枝 API ,也支持了一些非结构化和结构化剪枝方法,但是 API 比较混乱,对应文档描述也不清晰,所以后面我还会结合微软的开源 nni 工具来实现模型剪枝功能,这篇文章主要介绍了pytorch实现模型剪枝, 需要的朋友可以参考下
    2023-02-02
  • Python中转换角度为弧度的radians()方法

    Python中转换角度为弧度的radians()方法

    这篇文章主要介绍了Python中转换角度为弧度的radians()方法,是Python入门中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Python中docx2txt库的使用说明

    Python中docx2txt库的使用说明

    这篇文章主要介绍了Python中docx2txt库的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python 使用os.remove删除文件夹时报错的解决方法

    Python 使用os.remove删除文件夹时报错的解决方法

    下面小编就为大家带来一篇Python 使用os.remove删除文件夹时报错的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 如何利用AJAX获取Django后端数据详解

    如何利用AJAX获取Django后端数据详解

    ajax一个前后台配合的技术,它可以让javascript发送http请求,与后台通信,获取数据和信息。下面这篇文章主要介绍了如何利用AJAX获取Django后端数据的相关资料,需要的朋友可以参考下
    2021-06-06
  • Python中selenium获取token的方法

    Python中selenium获取token的方法

    本文主要介绍了Python中selenium获取token的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • python ftfy库处理金融方面文件编码错误实例详解

    python ftfy库处理金融方面文件编码错误实例详解

    这篇文章主要为大家介绍了使用python ftfy库处理金融方面文件编码错误实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • django admin后管定制-显示字段的实例

    django admin后管定制-显示字段的实例

    这篇文章主要介绍了django admin后管定制-显示字段的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03

最新评论