hyperopt自动调参初体验

本文介绍了如何使用Hyperopt进行自动调参,通过设置参数空间、定义训练函数并评估score,实现在有限轮次下找到最优参数k和b。以均方误差为评判标准,通过实例演示了如何应用TPE算法进行10轮搜索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想要使用hyperopt自动调参,首先得设定你参数的取值范围(为了方便下面看,k和b都用int类型):

space = {
    'k': hp.uniformint('k', 0, 10),
    'b': hp.uniformint('b', -10, 10),
}

接着,你要写下一个函数——在这个函数中写你的模型(只要可以预测出数据,什么模型都可以的!),这里就拿最简单的一次函数来说。

def train(params):
    k = int(params['k'])
    b = int(params['b'])

    pred = []
    for x in range(len(dataset)):
        pred.append(k * x + b)

    score = mean_squared_error(dataset, pred)
    print(k, b, score)
    return score

上面代码中的函数形参一定要写以把需要调的参传进来。接下来只需要把参数是如何参与预测的过程写下来就好,在这里是产生了一个pred里面放了kx+b的结果,这些结果就是k和b参与预测的结果(虽然现在的k和b没有实际值,但就相当于给程序写了一个框架,让它按咱们的框架走)。

最重要的一步来了!评定参数好不好的标准就是看返回值score!这里用了均方误差作为评判参数优劣的依据!当然,我只是懒,均方误差你也可以自己写,也就几行的事。不过from sklearn.metrics import 一些指标十分好用!要好好学一学!因为调参的函数fmin只有一个,且函数如其名,最小的就是最好的!所以如果你的指标是越大越好的,记得return一个-score!均方误差越小越好,所以不用动。

接下来就是填写一些固定的东西了:

best_hyperparameters = fmin(
    fn=train,
    space=space,
    algo=tpe.suggest,
    rstate=np.random.default_rng(666),
    verbose=False,
    max_evals=10,
)

train就是咱们自己定义的函数,space就是我们上面设定要调参的字典,max_evals就是生成几组参数对,这里写了10当然就是产生10组了!你也可以多写点。其它都照抄就可以。在这10轮中k,b,score的变化如下:

print(k, b, score)
------------------
10 -8 1660.5
1 -1 4.0
0 3 14.5
8 2 1460.5
6 -8 388.5
10 -3 2000.5
7 7 1386.0
7 -3 826.0
3 3 154.0
2 9 164.5

注意:如果你想看每轮的变化,一定要把print写在函数里!

可以看出,4.0是最小的,所以k=1,b=-1是最好的。没有和y=x+1这条线重合是因为它的参数是通过某些科学的算法生成的。而且,虽然准确度没有梯度下降法高,可是它快啊!

打印出最佳参数的结果如下所示:

print(best_hyperparameters)
------------------
{'b': -1, 'k': 1}

完整代码如下所示:

from sklearn.metrics import mean_squared_error
from hyperopt import fmin, hp, tpe

import numpy as np


def auto_tuning(dataset):
    space = {
        'k': hp.uniformint('k', 0, 10),
        'b': hp.uniformint('b', -10, 10),
    }

    def train(params):
        k = int(params['k'])
        b = int(params['b'])

        pred = []
        for x in range(len(dataset)):
            pred.append(k * x + b)

        score = mean_squared_error(dataset, pred)
        return score

    best_hyperparameters = fmin(
        fn=train,
        space=space,
        algo=tpe.suggest,
        rstate=np.random.default_rng(666),
        verbose=False,
        max_evals=10,
    )

    print(best_hyperparameters)


if __name__ == '__main__':
    auto_tuning(dataset=[1, 2, 3, 4, 5])

还挺好玩的!

贝叶斯优化算法是一种基于贝叶斯定理的优化算法,可以用于自动调参。其中,hyperopt是一个使用贝叶斯优化算法的Python包,可以帮助我们自动调整模型的超参数。 使用hyperopt,我们需要定义一个目标函数,这个函数输入超参数的值,输出模型的评分。然后,我们可以使用hyperopt的fmin函数来最小化这个目标函数,以找到最佳的超参数组合。 下面是一个使用hyperopt调参的示例代码: ```python from hyperopt import fmin, tpe, hp from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import cross_val_score # 定义目标函数 def objective(params): # 超参数 n_estimators = params['n_estimators'] max_depth = params['max_depth'] min_samples_split = params['min_samples_split'] # 定义模型 clf = RandomForestClassifier(n_estimators=n_estimators, max_depth=max_depth, min_samples_split=min_samples_split) # 计算交叉验证得分 iris = load_iris() scores = cross_val_score(clf, iris.data, iris.target, cv=5) # 返回平均得分 return 1 - scores.mean() # 定义超参数搜索空间 space = { 'n_estimators': hp.choice('n_estimators', range(10, 1000)), 'max_depth': hp.choice('max_depth', range(1, 20)), 'min_samples_split': hp.choice('min_samples_split', range(2, 10)) } # 使用Tree-structured Parzen Estimator算法搜索最佳超参数 best = fmin(fn=objective, space=space, algo=tpe.suggest, max_evals=100) # 输出最佳超参数组合 print(best) ``` 在上面的代码中,我们定义了一个目标函数objective,它的输入是超参数的值,输出是模型的评分。然后,我们定义了超参数的搜索空间space,它包括n_estimators、max_depth和min_samples_split三个超参数。最后,我们使用Tree-structured Parzen Estimator算法搜索最佳超参数,最多进行100次迭代。 执行上述代码后,我们可以得到最佳的超参数组合,输出类似于{'max_depth': 4, 'min_samples_split': 8, 'n_estimators': 315}的结果。这个结果可以用于训练一个随机森林模型,并进行预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值