【问题标题】:Does GridSearchCV return the best_estimator_ after fitting?GridSearchCV 拟合后是否返回 best_estimator_?
【发布时间】:2020-04-18 11:11:08
【问题描述】:

假设我们使用 GridSearch 调整 SVM,如下所示:

algorithm = SVM()
parameters = {'kernel': ['rbf', 'sigmoid'], 'C': [0.1, 1, 10]}

grid= GridSearchCV(algorithm, parameters)
grid.fit(X, y)

然后您希望在cross_val_score 中使用最佳拟合参数/估计器。我的问题是,此时grid 是哪个型号?它是表现最好的吗?换句话说,我们可以这样做吗

cross_val_scores = cross_val_score(grid, X=X, y=y)

或者我们应该使用

cross_val_scores = cross_val_score(grid.best_estimator_, X=X, y=y)

当我同时运行两者时,我发现它们返回的分数不同,所以我很好奇这里的正确方法是什么。 (我假设使用best_estimator_。)不过,这引发了另一个问题,即:那么仅使用grid 作为模型有什么用?第一个?

【问题讨论】:

    标签: python scikit-learn cross-validation k-fold


    【解决方案1】:

    安装GridSearchCV 后,您不需要cross_val_score。它已经具有允许您访问交叉验证分数的属性。 cv_results_ 为您提供一切。如果您只想查看特定估算器的结果,可以使用 best_index 属性对其进行索引。

    cv_results = pd.DataFrame(grid.cv_results_)
    cv_results.iloc[grid.best_index_]
    mean_fit_time                        0.00046916
    std_fit_time                         1.3785e-05
    mean_score_time                     0.000251055
    std_score_time                      1.19038e-05
    param_C                                      10
    param_kernel                                rbf
    params               {'C': 10, 'kernel': 'rbf'}
    split0_test_score                      0.966667
    split1_test_score                             1
    split2_test_score                      0.966667
    split3_test_score                      0.966667
    split4_test_score                             1
    mean_test_score                            0.98
    std_test_score                        0.0163299
    rank_test_score                               1
    Name: 5, dtype: object
    

    您在拟合的GridSearchCV 上调用的大多数方法都使用最佳模型(例如,grid.predict(...) 为您提供最佳模型的预测)。 estimator 并非如此。您看到的差异可能来自于此。 cross_val_score 再次适合它,但这次得分是针对 grid.estimator 而不是 grid.best_estimator_

    【讨论】:

    • 所以,为了确保我做对了:GridSearch 将测试所有拆分的所有参数?那么假设有四个参数组合,并且 k = 5,那么对于每个拆分,所有四个组合都被测试?比较所有 5 个拆分的平均结果,并返回最好的一个。所以在你的例子中,split0, ... split4 只是最佳模型的分割结果?
    • 这是否也意味着超参数可以在拆分之间有所不同?对于所有这些问题,我很抱歉,但文档的细节非常简短。
    • @BramVanroy 对于您的第一个问题,是的。对于每个参数组合 (kernel = rbf, C = 0.1; kernel = rbf, C = 1, ..., kernel = sigmoid, C = 10),默认情况下,它会进行 5 折交叉验证。在我的示例中,对于 6 个参数组合之一(最好的一个),您会看到 5 个拆分的结果。它特定于找到的最佳参数组合(C = 10,内核 = rbf)。此处 5 个拆分的超参数是相同的。
    • 感谢您的澄清。最后一点:它们总是相同的吗?我在问,因为属性 best_params_ 会让我怀疑对于所有拆分,总是使用相同的超参数。
    • 具体用在什么地方?过程如下: 对于 kernel: rbf, C: 0.1 做一个 5-fold cross validation,保存结果(这个特定参数组合在所有 5 splits 上的分数)。接下来,对 kernel: rbf, C: 1 进行 5 折交叉验证并保存结果。对所有人重复并决定最好的一个。其他人的结果仍然可用(5 个其他参数组合 * 5 折),但如果您调用 grid.predict(),它将使用给出最佳平均分的那个。
    猜你喜欢
    • 2020-09-18
    • 2018-04-16
    • 2016-03-15
    • 2019-04-27
    • 2014-11-14
    • 2019-04-26
    • 2020-04-11
    • 2020-06-25
    • 2020-11-18
    相关资源
    最近更新 更多