резюме рандомизированного поиска без применения выбранных параметров - PullRequest
0 голосов
/ 16 мая 2019

Я надеюсь, что вы можете помочь

Я пытался настроить мою модель случайного леса, используя функцию рандомизированного поиска в scikit learn.

Как показано ниже, я дал несколько вариантовМаксимальная глубина и несколько образцов листа.

# Create a based model
model = RandomForestClassifier()

# Instantiate the random search model
best = RandomizedSearchCV(model, {
'bootstrap': [True, False],
'max_depth': [80, 90, 100, 110],
'min_samples_leaf': [3, 4, 5]
}, cv=5, return_train_score=True, iid=True, n_iter = 4)

best.fit(train_features, train_labels.ravel())
print(best.best_score_)
print(best)

Но когда я запускаю это, я получаю следующее, где для максимальной глубины и минимального количества образцов для листа установлены значения, не входящие в мой массив.

Что я здесь не так делаю?

RandomizedSearchCV(cv=5, error_score='raise',
          estimator=RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            **max_depth=None**, max_features='auto', max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            **min_samples_leaf=1**, min_samples_split=2,
            min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1,
            oob_score=False, random_state=None, verbose=0,
            warm_start=False),
          fit_params=None, iid=True, n_iter=4, n_jobs=1,
          param_distributions={'bootstrap': [True, False], 'max_depth': [80, 90, 100, 110], 'min_samples_leaf': [3, 4, 5]},
          pre_dispatch='2*n_jobs', random_state=None, refit=True,
          return_train_score=True, scoring=None, verbose=0)

1 Ответ

1 голос
/ 17 мая 2019

Выбранное вами имя для RandomizedSearchCV объекта, best, на самом деле является неправильным: best будет содержать все параметры, а не только лучшие, включая параметры вашего RF модель, некоторые из которых будут переопределены во время рандомизированного поиска Таким образом, print(best), как и ожидалось, дает именно этот результат, то есть все значения параметров, включая значения RF по умолчанию, которые здесь фактически не будут использоваться (они будут переопределены по значениям в parameters).

Вместо этого вы должны спросить:

print(best.best_params_)

для наилучших найденных параметров и

print(best.best_estimator_)

для всей модели RF с лучшими найденными параметрами.

Вот воспроизводимый пример, использующий данные радужной оболочки (и имя clf вместо best):

from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets
from sklearn.model_selection import RandomizedSearchCV

iris = datasets.load_iris()

parameters = {
'bootstrap': [True, False],
'max_depth': [80, 90, 100, 110],
'min_samples_leaf': [3, 4, 5]
}

model = RandomForestClassifier()
clf = RandomizedSearchCV(model, parameters, cv=5, return_train_score=True, iid=True, n_iter = 4)
clf.fit(iris.data, iris.target)

Обратите внимание, что вывод консоли по умолчанию для этой последней команды fit, даже без запроса print, будет:

RandomizedSearchCV(cv=5, error_score='raise-deprecating',
          estimator=RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=None, max_features='auto', max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, n_estimators='warn', n_jobs=None,
            oob_score=False, random_state=None, verbose=0,
            warm_start=False),
          fit_params=None, iid=True, n_iter=4, n_jobs=None,
          param_distributions={'max_depth': [80, 90, 100, 110], 'bootstrap': [True, False], 'min_samples_leaf': [3, 4, 5]},
          pre_dispatch='2*n_jobs', random_state=None, refit=True,
          return_train_score=True, scoring=None, verbose=0)

, что практически совпадает с тем, о котором вы сообщаете (и я объяснил выше): только значения по умолчанию для вашей модели RF (поскольку вы не указали никаких параметров для model), плюс сетка parameters. Чтобы получить определенный набор параметров, вы должны использовать

clf.best_params_
# {'bootstrap': True, 'max_depth': 90, 'min_samples_leaf': 5}

и запрос clf.best_estimator_ действительно подтверждает, что мы получаем RF с этими точными значениями параметров:

RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=90, max_features='auto', max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=5, min_samples_split=2,
            min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=None,
            oob_score=False, random_state=None, verbose=0,
            warm_start=False)
...