Как выполнить GridSearchCV с перекрестной проверкой в ​​python - PullRequest
4 голосов
/ 10 апреля 2019

Я выполняю настройку гиперпараметра RandomForest следующим образом, используя GridSearchCV.

X = np.array(df[features]) #all features
y = np.array(df['gold_standard']) #labels

x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

param_grid = { 
    'n_estimators': [200, 500],
    'max_features': ['auto', 'sqrt', 'log2'],
    'max_depth' : [4,5,6,7,8],
    'criterion' :['gini', 'entropy']
}
CV_rfc = GridSearchCV(estimator=rfc, param_grid=param_grid, cv= 5)
CV_rfc.fit(x_train, y_train)
print(CV_rfc.best_params_)

Полученный результат выглядит следующим образом.

{'criterion': 'gini', 'max_depth': 6, 'max_features': 'auto', 'n_estimators': 200}

После этого я повторно применяюНастроил параметры на x_test следующим образом.

rfc=RandomForestClassifier(random_state=42, criterion ='gini', max_depth= 6, max_features = 'auto', n_estimators = 200, class_weight = 'balanced')
rfc.fit(x_train, y_train)
pred=rfc.predict(x_test)
print(precision_recall_fscore_support(y_test,pred))
print(roc_auc_score(y_test,pred))

Однако мне все еще не ясно, как использовать GridSearchCV с 10-fold cross validation (то есть не просто применить настроенные параметры к x_test).то есть что-то вроде ниже.

kf = StratifiedKFold(n_splits=10)
for fold, (train_index, test_index) in enumerate(kf.split(X, y), 1):
    X_train = X[train_index]
    y_train = y[train_index]
    X_test = X[test_index]
    y_test = y[test_index]

ИЛИ

, поскольку GridSearchCV использует crossvalidation мы можем использовать все X и y и получить лучшеерезультат как конечный результат?

Я с удовольствием предоставлю более подробную информацию, если это необходимо.

Ответы [ 2 ]

3 голосов
/ 10 апреля 2019

Вы не должны выполнять поиск по сетке в этом сценарии.

Внутренне, GridSearchCV разбивает данный набор данных на различные обучение и проверка подмножеств,и, используя предоставленную ему сетку гиперпараметров, находит единственный набор гиперпараметров , которые дают лучший результат по проверочным подмножествам.

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

Если вы выполните поиск по сетке в пределах перекрестной проверки, тогда у вас будет множественный наборов гиперпараметров, каждый из которых проявил себя наилучшим образом в своем подмножестве проверки поиска по сетке разделения перекрестной проверки.Вы не можете объединить эти наборы в единую спецификацию согласованного гиперпараметра, и, следовательно, вы не можете развернуть свою модель.

2 голосов
/ 10 апреля 2019

, поскольку GridSearchCV использует перекрестную проверку, можем ли мы использовать все X и y и получить наилучший результат в качестве конечного результата?

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

Посмотрите документацию для лучшего понимания настройки гиперпараметров и перекрестной проверки.

Некоторые фотографии из документации:

enter image description here

...