Sklearn GridSearch с оценкой PredefinedSplit не соответствует отдельному классификатору - PullRequest
1 голос
/ 27 марта 2019

Я использую sklearn GridSearch, чтобы найти лучшие параметры для случайной классификации леса, используя предопределенный набор проверки.Баллы от лучшего оценщика, возвращенного GridSearch, не совпадают с баллами, полученными путем обучения отдельного классификатора с теми же параметрами.

Определение разделения данных

X = pd.concat([X_train, X_devel])
y = pd.concat([y_train, y_devel])
test_fold = -X.index.str.contains('train').astype(int)
ps = PredefinedSplit(test_fold)

Определение GridSearch

n_estimators = [10]
max_depth = [4]
grid = {'n_estimators': n_estimators, 'max_depth': max_depth}

rf = RandomForestClassifier(random_state=0)
rf_grid = GridSearchCV(estimator = rf, param_grid = grid, cv = ps, scoring='recall_macro')
rf_grid.fit(X, y)

Определение классификатора

clf = RandomForestClassifier(n_estimators=10, max_depth=4, random_state=0)
clf.fit(X_train, y_train)

Отзыв был вычислен явно с использованием sklearn.metrics.recall_score

y_pred_train = clf.predict(X_train)
y_pred_devel = clf.predict(X_devel)

uar_train = recall_score(y_pred_train, y_train, average='macro')
uar_devel = recall_score(y_pred_devel, y_devel, average='macro')

GridSearch

uar train:  0.32189884516029466
uar devel:  0.3328299259976279

Случайный лес:

uar train:  0.483040291148839
uar devel:  0.40706644557392435

В чем причина такого несоответствия?

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

Здесь есть несколько проблем:

  1. Ваши входные аргументы для recall_score обращены.Фактический правильный заказ:

    recall_score(y_true, y_test)
    

    Но вы делаете:

    recall_score(y_pred_train, y_train, average='macro')
    

    Исправьте это:

    recall_score(y_train, y_pred_train, average='macro')
    
  2. Выrf_grid.fit(X, y) делаем для поиска по сетке.Это означает, что после нахождения наилучших комбинаций параметров GridSearchCV будет соответствовать всем данным (целому X, игнорируя PredefinedSplit, потому что это используется только во время перекрестной проверки в поиске лучших параметров).Таким образом, по сути, оценщик из GridSearchCV будет видеть все данные, поэтому результаты будут отличаться от того, что вы получите при выполнении clf.fit(X_train, y_train)

0 голосов
/ 27 марта 2019

Это потому, что в вашем GridSearchCV вы используете функцию скоринга как recall-macro, которая в основном возвращает recall score, что является macro усредненным. Смотрите эту ссылку .

Однако, когда вы возвращаете счет по умолчанию из вашего RandomForestClassifier, он возвращает mean accuracy. Итак, вот почему оценки разные. Смотрите эту ссылку для получения информации о том же. (Поскольку одно - это отзыв, а другое - точность).

...