Извлечение отдельных баллов за поезд / тест из объекта RandomizedSearchCV Python best_estimator_, которые эквивалентны его best_score_ - PullRequest
0 голосов
/ 17 марта 2020

Я обучаю многоклассовой проблеме классификации с использованием 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_ ВЫБРАН В ЛУЧШЕЙ МОДЕЛИ? Основано ли это на лучших средних тестовых наборах за все итерации?

Я ценю вашу помощь и предложения по этому вопросу. Спасибо.

...