python 调参神器hyperopt

锺离韬
2023-12-01

最近学习到了一个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'),
    ])
可以发现目前支持的分类器有: (可以看到其实可以用的模型还是很多的)
(1)svc(实现基础:sklearn.svm.SVC)
(2)knn(实现基础:sklearn.neighbors.KNeighborsClassifier)
(3)random_forest(实现基础:sklearn.ensemble.RandomForestClassifier)
(4)extra_trees(实现基础:sklearn.ensemble.ExtraTreesClassifier)
(5)ada_boost(实现基础:sklearn.ensemble.AdaBoostClassifier)
(6)gradient_boosting(实现基础:sklearn.ensemble.GradientBoostingClassifier)

(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(多线程版本),可以多线程同时跑

 类似资料: