现在又出了一个调参神器了: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 #换版本
1.3、如果上述方法解决不了问题,那么安装一个python2.7的虚拟环境,避免与本地环境产生冲突(virtualenv安装包),具体可以参考网上的安装方案,很简便;
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)) #输出绝对值,不然是个负数