Я выполняю настройку гиперпараметров 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
и получить наилучший результат в качестве конечного результата?
Я рад предоставить более подробную информацию, если это необходимо.
В этом сценарии не следует выполнять поиск по сетке.
Внутри GridSearchCV
разбивает предоставленный ему набор данных на различные подмножества повышение квалификации и Проверка и, используя предоставленную ему сетку гиперпараметров, находит единый набор гиперпараметров, которые дают лучший результат в подмножествах проверки.
Затем, после завершения этого процесса, точка разделения поезд-тест состоит в том, чтобы выполнить окончательную оценку один для тестовых данных, которые до сих пор были неизвестны модели, чтобы увидеть, были ли ваши гиперпараметры переоснащены подмножествам проверки. Если все пойдет хорошо, то следующим шагом будет запуск модели в производство/развертывание.
Если вы выполняете перекрестную проверку в пределах поиска по сетке, то у вас будут наборы гиперпараметров несколько, каждый из которых показал лучшие результаты в своем подмножестве проверки поиска по сетке разделения перекрестной проверки. Вы не можете объединить эти наборы в единую согласованную спецификацию гиперпараметров, и поэтому вы не можете развернуть свою модель.
большое спасибо за отличный ответ. Один быстрый вопрос. какой результат следует сообщать, если мы пишем исследовательскую работу. Это CV_rfc.best_score_
или значение CV_rfc.predict(x_test)
? С нетерпением жду Вашего ответа. Спасибо большое :)
@Emi Эми, я бы сказал, что это зависит от вашего конкретного варианта использования. Обратите внимание, что predict
вернет предсказания, а не один балл.
Итак, мы хотим получить единую оценку из предикатов, можем ли мы использовать ее так? pred = CV_rfc.predict(x_test)
print(roc_auc_score(y_test, pred))
. Пожалуйста, поправьте меня, если я ошибаюсь :) `
В случае классификации да, я полагаю. Вы также можете изучить другие показатели, такие как f-score и т. д. На самом деле этот вопрос лучше задать на сайте Data Science или Cross Validated SE.
@Emi На самом деле, вы должны использовать predict_proba
вместо predict
, так как оценка ROC-AUC требует вероятностей.
когда я запускаю его с помощью 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]
). Есть ли способ решить эту проблему?
@Emi Это потому, что predict_proba
создает массив форм (len(x), n_classes)
. Вы можете просто нарезать массив с помощью [:1]
.
Большое спасибо за ваш ценный отзыв. Я очень ценю это. Большое спасибо еще раз :)
пожалуйста, дайте мне знать, если вы знаете ответ на этот вопрос: stackoverflow.com/questions/55609339/… с нетерпением жду вашего ответа. Спасибо большое :)
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_
? :)
использовать roc_auc_score(y_test, rfc.predict_proba(x_test))
когда я запускаю его с помощью 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]
). Есть ли способ решить эту проблему?
ооо, извините, что не дал полный ответ. Попробуйте rfc.predict_proba(x_test)[:,1]
Я предполагаю, что второй класс является положительным классом и тем, для которого вам нужен auc_roc_score
мои данные помечены как 0
и 1
. На самом деле 1
— это класс меньшинства в моем наборе данных о дисбалансе. можно ли проверить какой из них 0
и 1
в predict_proba
? Спасибо :)
rfc.classes_
даст порядок классов внутри модели
большое спасибо. последний вопрос. Итак, мы побежали rfc.predict_proba(x_test)[:,0]
, что там написано? :)
он выбирает вероятность для класса в индексе 1
. В вашем случае класс меньшинства.
когда я бежал rfc.classes_
я получил array([0, 1], dtype=int64)
. На самом деле 1
мой класс меньшинства. Итак, если я выбираю rfc.predict_proba(x_test)[:,1]
, я предполагал, что выбираю свой класс меньшинства (класс, который меня интересует). Пожалуйста, дайте мне знать, если я ошибаюсь. С нетерпением жду Вашего ответа :)
большое спасибо. пожалуйста, дайте мне знать, если вы знаете ответ на этот вопрос: stackoverflow.com/questions/55609339/… с нетерпением жду вашего ответа :)
Вы спрашиваете, можете ли вы использовать свой тестовый набор как часть GridSearch, если вы выполняете перекрестную проверку? Это в конечном итоге приведет к необъективной классификации, переоценивая возможности обобщения вашего трианного классификатора. Имо, ваш код в том виде, в каком он у вас есть на данный момент, дает наилучшую оценку способности к обобщению. Так что я бы ничего не менял.