Использование Ray-Tune с RandomForestClassifier sklearn - PullRequest
0 голосов
/ 12 июля 2020

Собирая вместе различные примеры базы и документации, мне удалось придумать следующее:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

def objective(config, reporter):
  for i in range(config['iterations']):
    model = RandomForestClassifier(random_state=0, n_jobs=-1, max_depth=None, n_estimators= int(config['n_estimators']), min_samples_split=int(config['min_samples_split']), min_samples_leaf=int(config['min_samples_leaf']))
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    # Feed the score back to tune?
    reporter(precision=precision_score(y_test, y_pred, average='macro'))

space = {'n_estimators': (100,200),
        'min_samples_split': (2, 10),
        'min_samples_leaf': (1, 5)}

algo = BayesOptSearch(
    space,
    metric="precision",
    mode="max",
    utility_kwargs={
        "kind": "ucb",
        "kappa": 2.5,
        "xi": 0.0
    },
    verbose=3
    )

scheduler = AsyncHyperBandScheduler(metric="precision", mode="max")
config = {
    "num_samples": 1000,
    "config": {
        "iterations": 10,
    }
}
results = run(objective,
    name="my_exp",
    search_alg=algo,
    scheduler=scheduler,
    stop={"training_iteration": 400, "precision": 0.80},
    resources_per_trial={"cpu":2, "gpu":0.5},
    **config)

print(results.dataframe())
print("Best config: ", results.get_best_config(metric="precision"))

Он работает, и я могу получить лучшую конфигурацию в конце всего. Однако мои сомнения в основном заключаются в функции objective. Это правильно написано? Нет примеров, которые я мог бы найти.

Дополнительный вопрос:

  1. Что такое num_samples в объекте конфигурации? Это количество выборок, которые он будет извлекать из общих данных обучения для каждого испытания?

1 Ответ

1 голос
/ 12 июля 2020

Tune теперь имеет собственные привязки sklearn: https://github.com/ray-project/tune-sklearn

Можете ли вы попробовать это вместо этого?

Чтобы ответить на ваш исходный вопрос, целевая функция выглядит хорошо; и num_samples - общее количество конфигураций гиперпараметров, которые вы хотите попробовать.

Кроме того, вы захотите удалить forl oop из своей обучающей функции:

def objective(config, reporter):
    model = RandomForestClassifier(random_state=0, n_jobs=-1, max_depth=None, n_estimators= int(config['n_estimators']), min_samples_split=int(config['min_samples_split']), min_samples_leaf=int(config['min_samples_leaf']))
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    # Feed the score back to tune
    reporter(precision=precision_score(y_test, y_pred, average='macro'))
...