最近学习到了一个hyperopt 的一个调参工具(相对于gridsearch的暴力调参,这个速度更加快一点)
官网地址:http://hyperopt.github.io/hyperopt-sklearn/
1.安装:
sudo pip install hyperopt
sudo pip install calibration
(安装时遇到了
'generator' object is not subscriptable
说是networkx的版本没有对应上,需要:
pip install networkx==1.11
2.用法:
from sklearn import svm
clf = svm.SVC()
clf.fit(X_train,y_train)
y_2 = clf.predict(X_test)
print ('svm model :')
print(myAcc(y_test, y_2))
print ('Hyperopt done !!! ')
estim = HyperoptEstimator(classifier=clf,
algo=tpe.suggest,
max_evals=100,
trial_timeout=120)
# Search the hyperparameter space based on the data
estim.fit(X_train,y_train,random_state=10)
y_1 = estim.predict(X_test)
print (y_1)
print( estim.score( X_test, y_test ) )
print( estim.best_model() )
可以返回模型最优的参数和内核,很方便
官方用法如下:
from hyperopt import tpe
from hpsklearn import HyperoptEstimator, any_classifier
estim = HyperoptEstimator(classifier=any_classifier('clf'),algo=tpe.suggest)
estim.fit(X_train,y_train)
可以看到这里用的是官方默认的模型,看下源码~
def any_classifier(name):
return hp.choice('%s' % name, [
svc(name + '.svc'),
knn(name + '.knn'),
random_forest(name + '.random_forest'),
extra_trees(name + '.extra_trees'),
ada_boost(name + '.ada_boost'),
gradient_boosting(name + '.grad_boosting', loss='deviance'),
sgd(name + '.sgd'),
])
可以发现目前支持的分类器有: (可以看到其实可以用的模型还是很多的)
(7)sgd(实现基础:sklearn.linear_model.SGDClassifier)
在这个过程中其实已经默认了进行模型融合的过程。
当然,我们也可以自定义自己的模型:
print("LGB test")
clf = lgb.LGBMClassifier(
num_class=4,
max_depth=-1,
n_estimators=5000,
objective='multiclass',
learning_rate=0.01,
num_leaves=65,
n_jobs=-1,
)
from hpsklearn import HyperoptEstimator
estim = HyperoptEstimator(classifier=clf,
algo=tpe.suggest,
max_evals=100,
trial_timeout=120)
# Search the hyperparameter space based on the data
estim.fit(x_train, y_train, random_state=10)
y_pred_te = estim.predict(x_test)
print(estim.best_model())
这个是我用微软的lightgbm 时调参用的
同时,hyperopt 也支持openblas-openmp(多线程版本),可以多线程同时跑