【问题标题】:Why are the grid_scores_ higher than the score for full training set? (sklearn, Python, GridSearchCV)为什么 grid_scores_ 高于完整训练集的分数? (sklearn、Python、GridSearchCV)
【发布时间】:2014-10-03 00:47:15
【问题描述】:

我正在建立一个逻辑回归模型如下:

cross_validation_object = cross_validation.StratifiedKFold(Y, n_folds = 10)
scaler = MinMaxScaler(feature_range = [0,1])
logistic_fit = LogisticRegression()

pipeline_object = Pipeline([('scaler', scaler),('model', logistic_fit)])

tuned_parameters = [{'model__C': [0.01,0.1,1,10],
                    'model__penalty': ['l1','l2']}]

grid_search_object = GridSearchCV(pipeline_object, tuned_parameters, cv = cross_validation_object, scoring = 'roc_auc')

我查看了最佳估计器的 roc_auc 分数:

grid_search_object.best_score_
Out[195]: 0.94505225726738229

但是,当我使用最佳估计器对整个训练集进行评分时,我得到的分数更差:

grid_search_object.best_estimator_.score(X,Y)
Out[196]: 0.89636762322433028

这怎么可能?我做错了什么?

编辑:没关系。我是个白痴。 grid_search_object.best_estimator_.score 计算准确性,而不是 auc_roc。正确的?

但如果是这样的话,GridSearchCV 是如何计算 grid_scores_ 的呢?它是为每个参数选择最佳决策阈值,还是决策阈值始终为 0.5?对于 ROC 曲线下的面积,决策阈值无关紧要,但对于 f1_score 而言,它确实如此。

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    如果您在完整的训练集上评估best_estimator_,即使评分方法相同,分数与best_score_ 的不同也不足为奇:

    best_score_ 是最佳模型的交叉验证折叠分数的平均值(正是在这个意义上最好:折叠的平均得分最高)。

    在对整个训练集进行评分时,您的分数可能会高于或低于此值。特别是如果您的数据中有某种时间结构并且您使用了错误的数据拆分,那么整个数据集的得分可能会更差。

    【讨论】:

    • 感谢您的回复,但我认为这里的问题是 best_estimator_ 是通过最大化 roc_auc 来计算的。因此,grid_scores_都反映了ROC曲线下的面积。后来,当我应用 best_estimator_ 时,sklearn 给了我准确率。
    • 啊,我明白了——我没有向右滚动足够远,无法在您的代码中看到它,因此想知道您的编辑来自哪里。好的——如果你没有设置评分,或者没有明确地将其设置为准确度,会发生什么? (或者由于您的数据中存在严重的类别不平衡,这是不明智的做法?)我认为结果应该仍然不同。
    • 至于决策阈值:它是固定的,因为优化应该找到合适的截距使其适合。
    • 好的,所以基本上如果我使用f1_score,优化会为每组参数使用最佳决策阈值?
    • roc_auc 等记分器利用predict_proba 方法获得连续值,这些值在不同点设置阈值以形成 roc 曲线。估计器本身不会明确移动此阈值以进行决策。通过拟合正确的截距来隐式设置它。
    猜你喜欢
    • 2019-09-02
    • 2020-03-27
    • 2016-10-14
    • 1970-01-01
    • 2019-07-15
    • 2019-02-16
    • 2017-12-12
    • 2012-06-29
    • 2020-05-28
    相关资源
    最近更新 更多