Почему импорт результатов не нужен для поиска параметров в scikit-learn? - PullRequest
0 голосов
/ 30 августа 2018

Если я хочу оптимизировать параметр регуляризации для модели логистической регрессии (например) на основе области под кривой ROC, я могу использовать GridSearchCV для подходящего диапазона параметров и установить scoring='roc_auc'.

Это можно сделать, используя from sklearn.model_selection import GridSearchCV, и не нужно , чтобы включить from sklearn.metrics import roc_auc_score.

Однако, если я хочу вычислить площадь под кривой ROC вручную для определенного установленного набора данных, тогда мне нужно включить from sklearn.metrics import roc_auc_score.

  • Как это работает? Я предполагаю, что, импортируя GridSearchCV, мы каким-то образом импортируем roc_auc_score за кулисы? К сожалению, я не могу выполнить это в исходном коде - я бы очень признателен за объяснение.
  • Если это так, значит ли это, что, импортируя GridSearchCV, мы в конечном итоге импортируем все возможные методы оценки за кулисами?
  • Почему тогда я не могу использовать roc_auc_score "вручную" самостоятельно, если я импортировал только GridSearchCV, а не сам roc_auc_score? Разве это не скрыто "там" за кулисами?

Я понимаю, что это может быть более общий вопрос об импорте Python и не относится только к scikit-learn ...

1 Ответ

0 голосов
/ 30 августа 2018

GridSearchCV расширяет класс BaseSearchCV. Это означает, что он будет использовать функцию fit(), определенную в BaseSearchCV .

Так что теперь, как вы можете видеть в исходном коде здесь :

    ...
    ...
    scorers, self.multimetric_ = _check_multimetric_scoring(
    self.estimator, scoring=self.scoring)
    ...
    ...

Здесь проверяются все параметры, предоставленные при создании GridSearchCV. Для 'scoring' param это вызов метода _check_multimetric_scoring(). Теперь поверх этого файла вы увидите много импортов.

Метод _check_multimetric_scoring указывает на scorer.py файл :

Аналогично отслеживая вызовы методов, мы достигнем здесь :

SCORERS = dict(explained_variance=explained_variance_scorer,
               r2=r2_scorer,
               neg_median_absolute_error=neg_median_absolute_error_scorer,
               neg_mean_absolute_error=neg_mean_absolute_error_scorer,
               neg_mean_squared_error=neg_mean_squared_error_scorer,
               neg_mean_squared_log_error=neg_mean_squared_log_error_scorer,
               accuracy=accuracy_scorer, roc_auc=roc_auc_scorer,
               ...
               ...
 ...
 ...

Глядя на roc_auc, мы достигнем здесь :

roc_auc_scorer = make_scorer(roc_auc_score, greater_is_better=True,
needs_threshold=True)

Теперь посмотрите на параметры здесь, roc_auc_score отправлено на make_scorer. Так откуда он импортируется? Посмотрите на верхнюю часть этого файла, и вы увидите это:

from . import (r2_score, median_absolute_error, mean_absolute_error,
               mean_squared_error, mean_squared_log_error, accuracy_score,
               f1_score, roc_auc_score, average_precision_score,
               precision_score, recall_score, log_loss,
               balanced_accuracy_score, explained_variance_score,
               brier_score_loss)

Итак, фактический объект скоринга возвращается в GridSearchCV.

Теперь библиотека использует относительный и абсолютный импорт, и, как правильно сказал @Denziloe, этот импорт является локальным для этого модуля, а не глобальным импортом.

См. Эти ответы для получения дополнительной информации о области импорта и пространствах имен:

И эта страница документации по питону

...