В 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_