Оптимальная оценка параметров для классификатора с несколькими параметрами

Единый порог  Несколько пороговых значений

На изображении слева показана стандартная кривая ROC, сформированная путем изменения одного порога и регистрации соответствующей частоты истинных положительных результатов (TPR) и частоты ложных положительных результатов (FPR).

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

Я собираюсь найти здесь 2 вещи:

  • Определите оптимальный параметр (ы) для заданных данных
  • Укажите общую оценку производительности для всех комбинаций параметров.

В случае кривой ROC слева это легко сделать с помощью следующих методов:

  • Оптимальный параметр: максимальная разница между TPR и FPR со стоимостной составляющей (я думаю, это называется J-статистика?)
  • Общие характеристики: площадь под кривой (заштрихованная часть на графике)

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

  • # P7 #
    # P8 #
  • Общая производительность: среднее значение всех «оценок параметров».

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

В итоге, вопрос здесь двоякий: (1) Предоставьте методы для оценки оптимального набора параметров и общей производительности в моем проблемном сценарии, (2) Предоставьте ссылку, в которой утверждается, что предлагаемые методы являются стандартным подходом для данного сценария.

P.S .: Я сначала разместил этот вопрос на форуме "Cross Validated", но не получил никаких ответов, на самом деле получил только 7 просмотров за 15 часов.


person Rahul Murmuria    schedule 06.10.2016    source источник
comment
Можете ли вы описать модель, которую вы используете? мне не ясно, что вы подразумеваете под несколькими порогами. ваша модель выводит несколько вероятностей вместо одной? если это так, возможно, вы хотите объединить их в одну вероятность, а затем вы можете ROC_AUC   -  person maxymoo    schedule 10.10.2016
comment
@maxymoo, дело не в выводе. Речь идет об обучении и проверке, а также выборе наилучшего набора параметров. См. Ответ ncfirth для образца сетки параметров. Я хочу знать, как можно рассчитать roc_auc, если нет кривой для рисования из входных параметров, а есть набор точек. Кроме того, есть ли какие-либо другие предпочтительные показатели оценки (я полагаю, что точность с матрицей затрат может быть независимой от кривой)   -  person Rahul Murmuria    schedule 14.10.2016


Ответы (2)


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

Сначала я создам некоторые данные и разделю их на обучение и тестирование.

import numpy as np
from sklearn import model_selection, ensemble, metrics

np.random.seed(42)

X = np.random.random((5000, 10))
y = np.random.randint(0, 2, 5000)

X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.3)

Это создает проблему классификации, которую, я думаю, вы описываете, хотя то же самое применимо и к проблемам регрессии.

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

clf = ensemble.RandomForestClassifier()    
parameters = {'n_estimators': [10, 20, 30],
              'max_features': [5, 8, 10],
              'max_depth': [None, 10, 20]}

Итак, теперь у меня есть базовая оценка и список параметров, которые я хочу оптимизировать. Теперь мне просто нужно подумать о том, как я хочу оценивать каждую из моделей, которые я собираюсь построить. Из вашего вопроса видно, что вас интересует ROC AUC, поэтому я буду использовать его в этом примере. Хотя вы можете выбрать из множества метрик по умолчанию в scikit или даже определить свои собственные.

gs = model_selection.GridSearchCV(clf, param_grid=parameters,
                                  scoring='roc_auc', cv=5)
gs.fit(X_train, y_train)

Это будет соответствовать модели для всех возможных комбинаций параметров, которые я ей дал, используя 5-кратную перекрестную проверку, чтобы оценить, насколько хорошо эти параметры работают с использованием ROC AUC. Как только это будет выполнено, мы сможем посмотреть на лучшие параметры и выбрать модель с наилучшими характеристиками.

print gs.best_params_
clf = gs.best_estimator_

Выходы:

{'max_features': 5, 'n_estimators': 30, 'max_depth': 20}

Теперь на этом этапе вы можете захотеть переобучить свой классификатор на всех обучающих данных, поскольку в настоящее время он обучен с использованием перекрестной проверки. Некоторые предпочитают не делать этого, но я переучиваюсь!

clf.fit(X_train, y_train)

Итак, теперь мы можем оценить, насколько хорошо модель работает как на нашем обучающем, так и на тестовом наборе.

print metrics.classification_report(y_train, clf.predict(X_train))
print metrics.classification_report(y_test, clf.predict(X_test))

Выходы:

             precision    recall  f1-score   support

          0       1.00      1.00      1.00      1707
          1       1.00      1.00      1.00      1793

avg / total       1.00      1.00      1.00      3500

             precision    recall  f1-score   support

          0       0.51      0.46      0.48       780
          1       0.47      0.52      0.50       720

avg / total       0.49      0.49      0.49      1500

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

ИЗМЕНИТЬ

Это одна из тех ситуаций, когда «все делают это», но нет четких указаний на то, что это лучший способ сделать это. Я бы посоветовал поискать пример, близкий к проблеме классификации, над которой вы работаете. Например, используя Google Scholar для поиска по запросу "поиск по сетке", "SVM" "экспрессия гена"

person piman314    schedule 12.10.2016
comment
Ух ты, я не знала, что есть другие переобучения! Спасибо за это объяснение. Это помогает мне сосредоточиться именно на том, о чем я хотел спросить. Вы сделали print gs.best_params_, который вернул лучшие параметры. Ваш param_grid выглядит точно так же, как мой. Я пытаюсь сделать свою оценку, а это значит, что если я использую что-то похожее на ROCAUC, то мне нужно знать, как это делается. Учитывая ваш param_grid, как рассчитывается best_params_? Используете TPR-FPR для каждого экземпляра сети? - person Rahul Murmuria; 12.10.2016
comment
Да, он просто тренирует модель для каждого экземпляра сетки и вычисляет оценку. best_params_ определяется как лучшие экземпляры сетки с учетом метода оценки и данных. Можно создать своего собственного счетчика и передать его функции GridSearchCV, в документации есть некоторая информация об этом. - person piman314; 13.10.2016
comment
Документация по этому поводу скудна. Вероятно, вы не могли использовать правило трапеции, поскольку при настройке моей или вашей проблемы вы не получите серию пар (TPR, FPR), которые образуют единую кривую. Это всплеск точек, как на моем графике справа. Я понимаю, как можно рассчитать точность с помощью матрицы затрат, если она у вас есть, но расчет AUC в этом случае для меня загадка. - person Rahul Murmuria; 13.10.2016

Мне кажется, что мы говорим о Grid Search в scikit-learn. Он (1) предоставляет методы для оценки оптимальных (гипер) параметров, а (2) реализован в очень популярном и хорошо известном статистическом программном пакете.

person aberger    schedule 11.10.2016