Имеет ли смысл использовать sklearn GridSearchCV вместе с CalibratedClassifierCV? - PullRequest
2 голосов
/ 17 февраля 2020

То, что я хочу сделать, - это получить классификатор, который является оптимальным по своим параметрам по отношению к данному метрику c (например, оценка отзыва), но также откалиброван (в том смысле, что выходные данные метода предиката_проба могут быть непосредственно интерпретированным как уровень достоверности, см. https://scikit-learn.org/stable/modules/calibration.html). Имеет ли смысл использовать sklearn GridSearchCV вместе с CalibratedClassifierCV, то есть подогнать классификатор через GridSearchCV, а затем передать выходные данные GridSearchCV в объект CalibratedClassifierCV? Если я прав, объект CalibratedClassifierCV соответствовал бы заданному времени оценки cv, и вероятности для каждого из сгибов тогда усредняются для предсказания. Тем не менее, результаты GridSearchCV могут быть разными для каждой из складок.

1 Ответ

1 голос
/ 17 февраля 2020

Да, вы можете сделать это, и это будет работать. Я не знаю, имеет ли смысл делать это, но самое меньшее, что я могу сделать, - это объяснить, что, по моему мнению, произойдет.

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

  1. Просто получение наилучшей оценки и подача ее на калибровкуcv
from sklearn.model_selection import GridSearchCV
from sklearn import svm, datasets
from sklearn.calibration import CalibratedClassifierCV

iris = datasets.load_iris()
parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
svc = svm.SVC()
clf = GridSearchCV(svc, parameters)
clf.fit(iris.data, iris.target)
calibration_clf = CalibratedClassifierCV(clf.best_estimator_)
calibration_clf.fit(iris.data, iris.target)
calibration_clf.predict_proba(iris.data[0:10])

array([[0.91887427, 0.07441489, 0.00671085],
       [0.91907451, 0.07417992, 0.00674558],
       [0.91914982, 0.07412815, 0.00672202],
       [0.91939591, 0.0738401 , 0.00676399],
       [0.91894279, 0.07434967, 0.00670754],
       [0.91910347, 0.07414268, 0.00675385],
       [0.91944594, 0.07381277, 0.0067413 ],
       [0.91903299, 0.0742324 , 0.00673461],
       [0.91951618, 0.07371877, 0.00676505],
       [0.91899007, 0.07426733, 0.00674259]])

Поиск в сетке подачи в Calibration cv

from sklearn.model_selection import GridSearchCV
from sklearn import svm, datasets
from sklearn.calibration import CalibratedClassifierCV

iris = datasets.load_iris()
parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
svc = svm.SVC()
clf = GridSearchCV(svc, parameters)
cal_clf = CalibratedClassifierCV(clf)
cal_clf.fit(iris.data, iris.target)
cal_clf.predict_proba(iris.data[0:10])

array([[0.900434  , 0.0906832 , 0.0088828 ],
       [0.90021418, 0.09086583, 0.00891999],
       [0.90206035, 0.08900572, 0.00893393],
       [0.9009212 , 0.09012478, 0.00895402],
       [0.90101953, 0.0900889 , 0.00889158],
       [0.89868497, 0.09242412, 0.00889091],
       [0.90214948, 0.08889812, 0.0089524 ],
       [0.8999936 , 0.09110965, 0.00889675],
       [0.90204193, 0.08896843, 0.00898964],
       [0.89985101, 0.09124147, 0.00890752]])

Обратите внимание, что выходные данные вероятностей немного различаются между двумя.

Разница между каждым методом:

  1. Использование наилучшей оценки - это калибровка только через 5 сплитов (стандартное резюме). Он использует один и тот же оценщик во всех 5 разделениях.

  2. Используя поиск по сетке, выполняет поиск по сетке для каждого из 5 разделений CV из калибровки 5 раз. По сути, вы выполняете перекрестную проверку 4/5 данных каждый раз, выбирая лучший оценщик для 4/5 данных, а затем проводите калибровку с этим наилучшим оценщиком за последние 5-е число. У вас может быть несколько разных моделей, работающих на каждом наборе тестовых данных, в зависимости от того, что выбирает поиск по сетке.

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

Однако я не знаю ваших конкретных c целей, поэтому Я не могу сказать, что второй способ, описанный здесь, является НЕПРАВИЛЬНЫМ. Вы всегда можете попробовать оба способа и посмотреть, что дает вам лучшую производительность и go с тем, который работает лучше всего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...