Hyperopt调参神器学习

现在又出了一个调参神器了:Hyperopt,还有Sklearn-Hyperoprt,现在做了一个Demo,仅供大家参考,但是有两点需要注意,我看网上没人说明,个人测试下来说明一下:请大家小心:

1、以下测试代码,需要Python2.7跑,Python3.5会报错,已经找到报错的原因了:TypeError: 'generator' object is not subscriptable;报这个错之后,你需要做下面两步操作

1.1、pip uninstall networkx #卸载

1.2、pip install networkx==1.11 #换版本

2、大多数智能优化算法、网格搜索算法,都是在局部最优解收敛的,结果不太稳定。在一定精确度的基础上,有的收敛快一点,有的收敛慢一点;有的局部找的好一点,有的差一点;所以,参数搜索也是需要多次试验,或者说在结果的基础上进行迭代验证,相当吃资源。并且,也需要一定实践经验在里面的,如果没有经验因素,可以增加搜索范围,随意而来的也就是计算代价增加了,希望大家有所体会。

3、下面是个感知机的试验,其他算法也可以切换,只是算法的参数、范围需要进行相应调整,我已经注明了,我目前在尝试在lightgbm上试验,如果有好的想法和结果,会和大家分享的。

##Python2.7## 看print没打括号的语法糖,大家应该也能明白吧。

# -*- coding: utf-8 -*-
"""
Created on Tue May 22 10:30:02 2018

@author: authour_sx
"""
from sklearn import datasets
import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn.metrics import accuracy_score
iris = datasets.load_iris()
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=40, 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)

def percept(args):
    global X_train_std,y_train,y_test
    ppn = Perceptron(n_iter=int(args["n_iter"]),eta0=args["eta"]*0.05,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(percept,space,algo = algo,max_evals=100)
print best
print abs(percept(best))  #输出绝对值,不然是个负数

猜你喜欢

转载自blog.csdn.net/zehui6202/article/details/80403221