Есть ли простой способ поиска сетки без перекрестной проверки в python?
есть абсолютно полезный класс GridSearchCV в scikit-научитесь делать поиск сетки и перекрестную проверку, но я не хочу делать перекрестную валидацию. Я хочу сделать поиск сетки без перекрестной проверки и использовать все данные для обучения. Чтобы быть более конкретным, мне нужно оценить мою модель, сделанную RandomForestClassifier с "OOB score" во время поиска сетки. Есть ли простой способ сделать это? или мне самому пойти в класс?
точки
- Я хотел бы сделать grid поиск легкого пути.
- Я не хочу делать перекрестную проверку.
- мне нужно использовать все данные для обучения.(не хочу отделять для обучения данных и тестовых данных)
- мне нужно использовать оценку oob для оценки во время поиска сетки.
3 ответов
Я бы действительно не советовал использовать OOB для оценки модели, но полезно знать, как запустить поиск сетки за пределами GridSearchCV()
(Я часто делаю это, чтобы сохранить прогнозы CV из лучшей сетки для легкой укладки модели). Я думаю, что самый простой способ-создать сетку параметров через ParameterGrid()
а затем просто цикл через каждый набор параметров. Например, если у вас есть сетка dict с именем " grid "и объект RF-модели с именем" rf", то вы можете сделать что-то вроде это:
for g in ParameterGrid(grid):
rf.set_params(**g)
rf.fit(X,y)
# save if best
if rf.oob_score_ > best_score:
best_score = rf.oob_score_
best_grid = g
print "OOB: %0.5f" % best_score
print "Grid:", best_grid
один из методов-использовать ParameterGrid
чтобы сделать итератор параметров, которые вы хотите, и цикл над ним.
еще одна вещь, которую вы могли бы сделать, это настроить GridSearchCV, чтобы делать то, что вы хотите. Я бы не рекомендовал так много, потому что это излишне сложно.
То, что вам нужно сделать, это:
- используйте arg
cv
С docs и дайте ему генератор, который дает кортеж со всеми индексами (так что поезд и тест же) - изменить
scoring
arg для использования oob, выданного из случайного леса.
см. эту ссылку: https://stackoverflow.com/a/44682305/2202107
он употребил cv=[(slice(None), slice(None))]
что не рекомендуется авторами sklearn.