Я обучаю многоклассовой проблеме классификации с использованием ExtraTreesClassifier от sklearn. Я использую StratifiedShuffleSplit в качестве метода перекрестной проверки в RandomizedSearchCV, чтобы найти лучший набор гиперпараметров. Набор поездов составляет 55% данных, набор проверок - 25% за каждый раз, а набор проверенных испытаний - 20%. Я использую собственный метод подсчета очков, но когда я этого не делаю, я получаю ту же проблему.
Цель, которая меня интересует, - это получение результатов для всех, обучения, проверки и набора тестов. Однако, во-первых, я хочу скопировать атрибут best_score_ из RandomizedSearchCVs.
Есть похожий вопрос, но, поскольку я использую случайное состояние, это не решает мою проблему (по крайней мере, я думаю, Это не). Почему Выполнение best_estimator_ из GridSearch с использованием перекрестной проверки дает различный показатель точности?
# imports
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.model_selection import StratifiedShuffleSplit, RandomizedSearchCV
import numpy as np
# data
X = np.random.randint(3, size = [1000, 100])
y = np.random.randint(3, size = 1000)
# set up cv and and randomized grid search
cv_method = StratifiedShuffleSplit(n_splits=10, test_size=0.25, random_state=42)
model = ExtraTreesClassifier(random_state=42, class_weight = 'balanced_subsample')
param_grid = {'max_features': [8,9,10]} # a very simple param grid
model_randomgrid = RandomizedSearchCV(estimator=model,
param_distributions=param_grid ,
n_iter=3,
cv=cv_method,
verbose=2,
random_state=42,
n_jobs=-1)
#scoring = make_scorer(mcc_score, greater_is_better=True))
# fit/ train random model
model_randomgrid.fit(X,y)
best_model = model_randomgrid.best_estimator_
Учитывая атрибут случайного состояния, я могу получить те же составные фрагменты поезда / теста, которые использовались в приведенных выше итерациях (дважды проверяется путем отладки в RandomizedSearchCV и просмотра используемых индексов).
# retrieving train/test scores from each set
scores_test = []
scores_train = []
for train_index, test_index in cv_method.split(X, y):
scores_test.append(best_model.score(X[test_index], y[test_index]))
scores_train.append(best_model.score(X[train_index], y[train_index]))
print(f'test: {np.mean(scores_test)}')
print(f'train: {np.mean(scores_train)}')
print(f'best_score_: {model_randomgrid.best_score_}')
Средние значения отличаются от best_score_. Вместо того, чтобы смотреть на среднее значение и сравнивать с лучшим показателем модели, вы также можете посмотреть на объект model_randomgrid.cv_results_, который содержит все ошибки обучения и тестирования. Но и индивидуально они далеко не одинаковы.
Помимо вопросов о том, как рассчитывается best_score_ и почему он отличается от результатов, которые вы вычисляете, вручную, используя свою собственную функцию оценки (и это также относится к моему случаю, когда я использую пользовательский метод оценки), он приводит меня к самому важному вопросу: КАКОВА ПРИЧИНА / КРИТЕРИЙ, КОТОРЫЙ best_estimator_ ВЫБРАН В ЛУЧШЕЙ МОДЕЛИ? Основано ли это на лучших средних тестовых наборах за все итерации?
Я ценю вашу помощь и предложения по этому вопросу. Спасибо.