hyperopt自動調參


hyperopt自動調參

在傳統機器學習和深度學習領域經常需要調參,調參有些是通過通過對數據和算法的理解進行的,這當然是上上策,但還有相當一部分屬於"黑盒"

hyperopt可以幫助我們做很多索然無味的調參工作

示例

直接看代碼以及注釋比較直接,下面通過一個隨機森林可以感受一下:

# coding=utf-8

from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.cross_validation import cross_val_score
from sklearn.preprocessing import scale, normalize
from hyperopt import hp, STATUS_OK, Trials, fmin, tpe


iris = datasets.load_iris()
X = iris.data
y = iris.target


def hyperopt_train_test(params):
    X_ = X[:]
    # 這里可以自定義一些操作
    if params['normalize']:
        X_ = normalize(X_)
    if params['scale']:
        X_ = scale(X_)

    del params['normalize']
    del params['scale']

    clf = RandomForestClassifier(**params)
    # 交叉驗證
    return cross_val_score(clf, X, y, cv=10).mean()


space_rf = {
    'max_depth': hp.choice('max_depth', range(1, 20)),
    'max_features': hp.choice('max_features', range(1, 5)),
    'n_estimators': hp.choice('n_estimators', range(1, 20)),
    'criterion': hp.choice('criterion', ["gini", "entropy"]),
    'scale': hp.choice('scale', [True, False]),
    'normalize': hp.choice('normalize', [True, False])
}


# 待優化目標函數
def f(params):
    acc = hyperopt_train_test(params)
    return {'loss': -acc, 'status': STATUS_OK}


trials = Trials()
best = fmin(f,  # 待最小化函數
            space=space_rf,  # 參數所搜索空間
            algo=tpe.suggest,  # 算法選擇,這里選擇了TPE,也可以用rand.suggest等
            max_evals=50,  #  迭代次數
            trials=trials,  # 可以用trials數組記錄中間結果
            )

# best是loss最小的參數組合
# 對於離散值,如criterion,會返回選擇的元素索引
print(best)
loss = []
for trial in trials.results:
    loss.append(trial['loss'])
print(min(loss))

運行輸出

{'normalize': 1, 'scale': 0, 'n_estimators': 14, 'criterion': 1, 'max_features': 1, 'max_depth': 11}
-0.973333333333

小結

hyperopt還有很多高階用法,如借助mongo並行化,但基本的使用架構上面的demo應該已經很好的體現了

超參調優是一個很大的問題,很多啟發式算法會被采用,如數學建模中的一些優化算法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM