为何grid_scores_高于完整训练集的得分?(sklearn, Python, GridSearchCV)
我正在建立一个逻辑回归模型,代码如下:
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来说,决策阈值就很重要。
1 个回答
2
如果你在整个训练集上评估了 best_estimator_
,那么得分和 best_score_
不一样也不奇怪,即使评分的方法是相同的:
best_score_
是你在交叉验证中得到的最佳模型的平均得分(这里的最佳是指:在所有折叠中得分最高的模型)。
而在整个训练集上评分时,你的得分可能会比这个高,也可能会比这个低。特别是当你的数据有时间结构,且你使用了错误的数据划分方式时,整个数据集上的得分可能会更差。