Python scikit学习网格交叉验证返回不正确的平均值

Python scikit学习网格交叉验证返回不正确的平均值,python,scikit-learn,grid-search,Python,Scikit Learn,Grid Search,我使用GridCV跨k个折叠进行交叉验证,以调整我的超参数。在我的结果属性“cv_results_”中,应该是单个折叠的平均结果是错误的。以下是我的代码: gscv = GridSearchCV(n_jobs=n_jobs,cv=train_test_iterable, estimator=pipeline, param_grid=param_grid, verbose=10, scoring=['accuracy', 'precision','recall',

我使用GridCV跨k个折叠进行交叉验证,以调整我的超参数。在我的结果属性“cv_results_”中,应该是单个折叠的平均结果是错误的。以下是我的代码:

gscv = GridSearchCV(n_jobs=n_jobs,cv=train_test_iterable, estimator=pipeline, param_grid=param_grid, 
                verbose=10, scoring=['accuracy', 'precision','recall','f1'], refit='f1', 
                    return_train_score=return_train_score, error_score=error_score,
                   )
gscv.fit(X,Y)
gscv.cv_results_
cv_结果包含以下json(显示为表格)

您可以在上面看到:“平均值测试”f1不是两倍“拆分0测试”f1、“拆分1测试”f1的平均值。实际平均值是最后一列

注:F1指F1成绩


有人遇到过类似的问题吗?

我认为你看到的是一个加权平均值,而不是直接平均值。

尝试在
GridSearchCV(…)
中设置
iid=False
,然后进行比较

根据文件:

因此,当
iid
为真时(默认情况下),测试分数的平均值包括指定的权重:

请注意,培训分数不受其影响,因此还要交叉检查培训分数的平均值

    mean_test_f1    split0_test_f1  split1_test_f1  Actual Mean
    0.934310796     0.935603198     0.933665455     0.934634326
    0.931279716     0.908430118     0.942689316     0.925559717
    0.927683609     0.912005672     0.935512149     0.923758911
    0.680908006     0.741198823     0.650802701     0.696000762
    0.680908006     0.741198823     0.650802701     0.696000762
    0.646005028     0.684483208     0.626791532     0.65563737
    0.840273248     0.847484083     0.836672627     0.842078355
    0.837160828     0.847484083     0.832006068     0.839745075
    0.833637        0.842109375     0.829406448     0.835757911
iid : boolean, default=True

    If True, the data is assumed to be identically distributed across 
    the folds, and the loss minimized is the total loss per sample,
    and not the mean loss across the folds.
    _store('test_%s' % scorer_name, test_scores[scorer_name],
                   splits=True, rank=True,
                   weights=test_sample_counts if iid else None)