ValueError hyperopt в поиске параметров RandomForest - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь найти параметры RandomForestClassifier с помощью hyperopt.Вот мой код:

X, y = load_wine(return_X_y=True)

def rf_neg_score(params):
  X, y = params.pop('X'), params.pop('y')
  cv = params.pop('cv')
  scoring = params.pop('scoring')
  rf_clf = RandomForestClassifier(**params)
  score = cross_val_score(rf_clf, X=X, y=y, n_jobs=-1, scoring=scoring,
                          cv=cv).mean()
  return -score

rf_search_space = {
    'n_estimators': hp.choice('n_estimators', np.arange(10, 1000, dtype=int)),
    'max_depth': hp.choice('max_depth', np.arange(2, 8, dtype=int)),
    'max_leaf_nodes': hp.choice('max_leaf_nodes', np.arange(2, 65, dtype=int)),
    'n_jobs': -1,
    'X': X,
    'y': y,
    'cv': StratifiedKFold(n_splits=5),
    'scoring': 'f1_micro'
}

rf_best_params = fmin(fn=rf_neg_score, space=rf_search_space, max_evals=100,
                     algo=tpe.suggest)

После запуска сразу возникает ValueError:

/usr/local/lib/python3.6/dist-packages/hyperopt/utils.py in use_obj_for_literal_in_memo(expr, obj, lit, memo)
    167     for node in pyll.dfs(expr):
    168         try:
--> 169             if node.obj == lit:
    170                 memo[node] = obj
    171         except AttributeError:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Что вы думаете о том, что я делаю неправильно?

1 Ответ

0 голосов
/ 05 июня 2019

Найдено решение.Кажется, что hyperopt проверяет каждый элемент в пространстве поиска, если у него есть функция hyperopt.hp. ​​* И при проверке ValueError вызывается.Таким образом, нет возможности предоставить данные таким способом.Вот правильный код:

def rf_neg_score(params):
  scoring = params.pop('scoring')
  cv = params.pop('cv')
  rf_clf = RandomForestClassifier(**params)
  # X and y are provided out of function
  score = cross_val_score(rf_clf, X=X, y=y, n_jobs=-1, 
                          scoring='f1_micro', cv=5).mean()
  return -score

rf_search_space = {
    'n_estimators': hp.choice('n_estimators', np.arange(10, 1000, dtype=int)),
    'max_depth': hp.choice('max_depth', np.arange(2, 8, dtype=int)),
    'max_leaf_nodes': hp.choice('max_leaf_nodes', np.arange(2, 65, dtype=int)),
    'scoring': 'f1_micro',
    'cv': StratifiedKFold(n_splits=5)
}

rf_best_params = fmin(fn=rf_neg_score, space=rf_search_space, max_evals=100,
                     algo=tpe.suggest)
...