RandomForest, как выбрать оптимальный параметр n_estimator - PullRequest
0 голосов
/ 26 сентября 2018

Я хочу тренировать свою модель и выбирать оптимальное количество деревьев.коды здесь

from sklearn.ensemble import RandomForestClassifier

tree_dep = [3,5,6]
tree_n = [2,5,7]

avg_rf_f1 = []
search = []

for x in tree_dep:
  for y in tree_n:
    search.append((a,b))
    rf_model = RandomForestClassifier(n_estimators=tree_n, max_depth=tree_dep, random_state=42)
    rf_scores = cross_val_score(rf_model, X_train, y_train, cv=10, scoring='f1_macro')

    avg_rf_f1.append(np.mean(rf_scores))

best_tree_dep, best_n = search[np.argmax(avg_rf_f1)]

ошибка в этой строке

rf_scores = cross_val_score(rf_model, X_train, y_train, cv=10, scoring='f1_macro')

с высказыванием

ValueError: n_estimators must be an integer, got <class 'list'>.

интересно, как это исправить.Спасибо !!!

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

В scikit-learn есть вспомогательная функция GridSearchCV , которая делает именно это.Он берет список значений параметров, которые вы хотите протестировать, и обучает классификатор со всеми возможными наборами этих параметров, чтобы он возвращал лучший набор параметров.
Я бы предположил, что он намного чище и быстрее, чем метод вложенного цикла, которым вы являетесьреализации.Он легко расширяется на другие параметры (просто добавьте нужные параметры в вашу сетку) и может быть распараллелен.

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV

params_to_test = {
    'n_estimators':[2,5,7],
    'max_depth':[3,5,6]
}

#here you can put any parameter you want at every run, like random_state or verbosity
rf_model = RandomForestClassifier(random_state=42)
#here you specify the CV parameters, number of folds, numberof cores to use...
grid_search = GridSearchCV(rf_model, param_grid=params_to_test, cv=10, scoring='f1_macro', n_jobs=4)

grid_search.fit(X_train, y_train)

best_params = grid_search.best_params_ 

#best_params is a dict you can pass directly to train a model with optimal settings 
best_model = RandomForestClassifier(**best_params)

Как указано в комментариях, лучшая модель хранится в объекте grid_search, поэтому вместо создания новой модели с:

best_model = RandomForestClassifier(**best_params)

Мы можем просто использоватьодин в grid_search:

best_model = grid_search.best_estimator_
0 голосов
/ 26 сентября 2018

Вы перебираете элементы списков в своих циклах, но не используете их внутри цикла.Вместо предоставления элемента из списка как n_estimators или max_depth, вы предоставляете весь список.Это должно исправить это, теперь в каждой итерации вы берете разные комбинации элементов из двух списков:

from sklearn.ensemble import RandomForestClassifier

tree_dep = [3,5,6]
tree_n = [2,5,7]

avg_rf_f1 = []
search = []

for x in tree_dep:
  for y in tree_n:
    search.append((a,b))
    rf_model = RandomForestClassifier(n_estimators=y, max_depth=x, random_state=42)
    rf_scores = cross_val_score(rf_model, X_train, y_train, cv=10, scoring='f1_macro')

    avg_rf_f1.append(np.mean(rf_scores))

best_tree_dep, best_n = search[np.argmax(avg_rf_f1)]
...