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應該已經很好的體現了
超參調優是一個很大的問題,很多啟發式算法會被采用,如數學建模中的一些優化算法
