Как выполнить GridSearchCV с перекрестной проверкой в ​​python

Я выполняю настройку гиперпараметров 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 и получить наилучший результат в качестве конечного результата?

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

Вы спрашиваете, можете ли вы использовать свой тестовый набор как часть GridSearch, если вы выполняете перекрестную проверку? Это в конечном итоге приведет к необъективной классификации, переоценивая возможности обобщения вашего трианного классификатора. Имо, ваш код в том виде, в каком он у вас есть на данный момент, дает наилучшую оценку способности к обобщению. Так что я бы ничего не менял.

JimmyOnThePage 10.04.2019 07:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
1
1 766
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

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

большое спасибо за отличный ответ. Один быстрый вопрос. какой результат следует сообщать, если мы пишем исследовательскую работу. Это CV_rfc.best_score_ или значение CV_rfc.predict(x_test)? С нетерпением жду Вашего ответа. Спасибо большое :)

EmJ 10.04.2019 08:15

@Emi Эми, я бы сказал, что это зависит от вашего конкретного варианта использования. Обратите внимание, что predict вернет предсказания, а не один балл.

gmds 10.04.2019 08:17

Итак, мы хотим получить единую оценку из предикатов, можем ли мы использовать ее так? pred = CV_rfc.predict(x_test)print(roc_auc_score(y_test, pred)). Пожалуйста, поправьте меня, если я ошибаюсь :) `

EmJ 10.04.2019 08:22

В случае классификации да, я полагаю. Вы также можете изучить другие показатели, такие как f-score и т. д. На самом деле этот вопрос лучше задать на сайте Data Science или Cross Validated SE.

gmds 10.04.2019 08:29

@Emi На самом деле, вы должны использовать predict_proba вместо predict, так как оценка ROC-AUC требует вероятностей.

gmds 10.04.2019 08:55

когда я запускаю его с помощью predict_proba, я получаю сообщение об ошибке ValueError: bad input shape (109, 2). Причина в том, что predict_proba имеет 2 значения в списке (например, array([[0.71859634, 0.28140366], [0.73036337, 0.26963663], [0.57230174, 0.42769826], [0.66975595, 0.33024405], [0.62535185, 0.37464815], [0.33822691, 0.66177309]). Есть ли способ решить эту проблему?

EmJ 10.04.2019 09:15

@Emi Это потому, что predict_proba создает массив форм (len(x), n_classes). Вы можете просто нарезать массив с помощью [:1].

gmds 10.04.2019 09:16

Большое спасибо за ваш ценный отзыв. Я очень ценю это. Большое спасибо еще раз :)

EmJ 10.04.2019 09:29

пожалуйста, дайте мне знать, если вы знаете ответ на этот вопрос: stackoverflow.com/questions/55609339/… с нетерпением жду вашего ответа. Спасибо большое :)

EmJ 10.04.2019 11:38

sinceGridSearchCV uses crossvalidation can we use all X and y and get the best result as the final result?

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

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

Несколько картинок из документации:

не могли бы вы рассказать мне, как сделать final evaluation, используя модель настроенных параметров best.estimator_? :)

EmJ 10.04.2019 08:44

использовать roc_auc_score(y_test, rfc.predict_proba(x_test))

Venkatachalam 10.04.2019 08:52

когда я запускаю его с помощью predict_proba, я получаю сообщение об ошибке ValueError: bad input shape (109, 2). Причина в том, что predict_proba имеет 2 значения в списке (например, array([[0.71859634, 0.28140366], [0.73036337, 0.26963663], [0.57230174, 0.42769826], [0.66975595, 0.33024405], [0.62535185, 0.37464815], [0.33822691, 0.66177309]). Есть ли способ решить эту проблему?

EmJ 10.04.2019 09:16

ооо, извините, что не дал полный ответ. Попробуйте rfc.predict_proba(x_test)[:,1]

Venkatachalam 10.04.2019 09:17

Я предполагаю, что второй класс является положительным классом и тем, для которого вам нужен auc_roc_score

Venkatachalam 10.04.2019 09:18

мои данные помечены как 0 и 1. На самом деле 1 — это класс меньшинства в моем наборе данных о дисбалансе. можно ли проверить какой из них 0 и 1 в predict_proba? Спасибо :)

EmJ 10.04.2019 09:24
rfc.classes_ даст порядок классов внутри модели
Venkatachalam 10.04.2019 09:25

большое спасибо. последний вопрос. Итак, мы побежали rfc.predict_proba(x_test)[:,0], что там написано? :)

EmJ 10.04.2019 09:27

он выбирает вероятность для класса в индексе 1. В вашем случае класс меньшинства.

Venkatachalam 10.04.2019 09:28

когда я бежал rfc.classes_ я получил array([0, 1], dtype=int64). На самом деле 1 мой класс меньшинства. Итак, если я выбираю rfc.predict_proba(x_test)[:,1], я предполагал, что выбираю свой класс меньшинства (класс, который меня интересует). Пожалуйста, дайте мне знать, если я ошибаюсь. С нетерпением жду Вашего ответа :)

EmJ 10.04.2019 09:32

большое спасибо. пожалуйста, дайте мне знать, если вы знаете ответ на этот вопрос: stackoverflow.com/questions/55609339/… с нетерпением жду вашего ответа :)

EmJ 10.04.2019 11:37

Другие вопросы по теме