想要使用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])
还挺好玩的!