最近在使用学习机器学习算法时,使用下python的调参库 Hyperopt, 发现程序一直出现问题,结果发现不是程序问题,而是在安装 Hyperopt时出现问题。
在安装Hyperopt时 会自动安装依赖库 networkx-2.1, 结果发现其并不支持 Hyperopt-0.1
解决方法:
卸载 networkx : pip uninstall networkx
下载 networkx-1.11 版本
或者直接安装: pip install networkx==1.11
Hyperopt
分布式异步超参数优化,用于在搜索空间上进行串行和并行优化,其中可能包括实值,离散和条件维度。
Hyperopt的工作是通过一组可能的参数找到标量值,可能随机函数的最佳值。虽然许多优化软件包会假设这些输入来自向量空间,但Hyperopt的不同之处在于它鼓励您更详细地描述搜索空间。通过提供有关定义函数的位置以及您认为最佳值在哪里的更多信息,可以让hyperopt中的算法更有效地进行搜索。
使用hyperopt的方式是描述:
- 目标函数最小化
- 搜索的空间
- 在其中存储搜索的所有点评估的数据库
- 要使用的搜索算法
这个(最基本的)教程将介绍如何编写函数和搜索空间,使用默认Trials数据库和伪random搜索算法。
(1)节介绍了目标函数和hyperopt之间通信的不同调用约定。
hyperopt的优化算法与您的目标函数之间进行通信的最简单协议是您的目标函数从搜索空间接收到有效点,并返回与该点关联的浮点损失(又称负效用)。
from hyperopt import fmin, tpe, hp
best = fmin(fn=lambda x: x ** 2,
space=hp.uniform('x', -10, 10),
algo=tpe.suggest,
max_evals=100)
print best
(2)部分是关于描述搜索空间的。
搜索空间由嵌套的函数表达式组成,包括随机表达式。随机表达式是超参数。从这个嵌套的随机程序中抽样定义了随机搜索算法。超参数优化算法的工作原理是将正常的“采样”逻辑替换为 自适应探索策略,它们不会尝试从搜索空间中指定的分布中进行实际采样。from hyperopt import hp
space = hp.choice('a',
[
('case 1', 1 + hp.lognormal('c1', 0, 1)),
('case 2', hp.uniform('c2', -10, 10))
])
实例:
感知器判别鸢尾花数据的代码,使用的学习率是0.1, 迭代50次得到了一个测试集上正确率为82%的结果。使用hyperopt优化参数,将正确率提升到了93%,可见参数优化对于提高模型精度,至关重要。
# -*- coding:utf-8 -*-
# author: charlesyy time:2018/05/14
import numpy
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
iris = datasets.load_iris() # multi-class classification,
# Classes 3
# Samples per class 50
# Samples total 150
# Dimensionality 4
# Features real, positive
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
from sklearn.linear_model import Perceptron
ppn = Perceptron(n_iter=50, eta0=0.1, random_state=0)
ppn.fit(X_train_std, y_train)
y_pred = ppn.predict(X_test_std)
print('未使用参数优化', accuracy_score(y_test, y_pred))
# 使用Hyperopt
def percept(args):
global X_train_std, y_train, y_test
ppn = Perceptron(n_iter=int(args["n_iter"]), eta0=args["eta"]*0.01, random_state=0)
ppn.fit(X_train_std, y_train)
y_pred = ppn.predict(X_test_std)
return -accuracy_score(y_test, y_pred)
from hyperopt import fmin, tpe, hp, partial
space = {"n_iter": hp.choice("n_iter", range(30, 50)),
"eta": hp.uniform("eta", 0.05, 0.5)}
algo = partial(tpe.suggest, n_startup_jobs=10)
best = fmin(fn=percept, space=space, algo=algo, max_evals=100)
print(best)
print('使用参数优化:', percept(best))