为什么在scikit-learn中进行参数搜索时不需要导入计分器?

时间:2018-08-30 13:17:13

标签: python scikit-learn python-import

如果要基于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?不幸的是,我似乎无法在source code中继续进行此操作-非常感谢您的解释。
  • 如果是这种情况,是否还意味着通过导入GridSearchCV我们最终将所有可能的计分方法导入幕后?
  • 如果我仅导入了roc_auc_score而不是GridSearchCV本身,为什么为什么我不能“手动”使用roc_auc_score?是不是在幕后隐式地“有”?

我很欣赏这可能是关于python导入的更普遍的问题,而不是特定于scikit-learn ...

1 个答案:

答案 0 :(得分:3)

GridSearchCV扩展了BaseSearchCV类。这意味着它将使用fit() function defined in BaseSearchCV

现在,如您在source code here中所见:

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

在此处检查GridSearchCV构建期间提供的所有参数。 对于'scoring'参数,其调用方法_check_multimetric_scoring()。现在,在此文件的顶部,您将看到许多导入。

方法_check_multimetric_scoring指向scorer.py file

类似地跟踪方法调用,我们will reach here

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,我们将reach here

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正确说的那样,这些导入在该模块中是本地的,而不是全局导入。

有关导入范围和名称空间的更多信息,请参见以下答案:

还有this python documentation page