### grid.score(X_valid, y_valid) 和 grid.best_score_ 之间的区别是什么

在进行 GridSearchCV 时,grid.score(…) 和 grid.best_score_ 获得的分数有什么区别?

请假设模型、特征、目标和参数网格已经就位。以下是我非常好奇的代码片段。

grid = GridSearchCV(X_train, y_train)
grid.fit(X_train, y_train)
scores = grid.score(estimator=my_model, param_grid=params, cv=3,                    return_train_score=True, scoring='neg_mean_squared_error')
best_score_1 = scores
best_score_2 = grid.best_score_

对于 best_score_1best_score_2,有两种不同的输出。我试图了解这两者之间的区别,以及在给定的参数网格中,哪一个应该被认为是最佳分数。


以下是完整的函数。

def apply_grid (df, model, features, target, params, test=False):
    '''
    在重新分割数据集后执行 GridSearchCV,提供
    训练集的 MSE 和测试集的 MSE 之间的比较,以检查
    泛化性能,并可选择在测试集上部署找到的最佳参数。

    Args:
        df: DataFrame
        model: 要使用的模型
        features: 要考虑的特征
        target: 标签
        params: 用于优化的参数网格
        test: 默认值为 False,如果为 True,则在测试集上进行预测

    Returns:
        模型的 MSE 分数和 cv_results_ 的切片,
        以比较模型的泛化性能
    '''
    my_model = model()
    # 将数据集分割成训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(df[features],
                                                        df[target], random_state=0)

    # 重新分割训练数据集为 GridSearchCV 使用的 train2 和 valid,以保持测试集独立
    X_train2, X_valid, y_train2, y_valid = train_test_split(train[features],
                                                           train[target] , random_state=0)

    # 使用网格搜索从参数网格中找到最佳参数
    grid = GridSearchCV(estimator=my_model, param_grid=params, cv=3,
                        return_train_score=True, scoring='neg_mean_squared_error')
    grid.fit(X_train2, y_train2)

    # 在验证集上评估
    scores = grid.score(X_valid, y_valid)
    scores = scores # 混淆
    print('通过 GridSearchCV 获得的最佳 MSE: ', grid.best_score_) # 混淆
    print('通过 GridSearchCV 获得的最佳 MSE: ', scores)
    print('我对以上两个输出的不同感到困惑。为什么它们会不同?')
    print('最佳参数: ',grid.best_params_)
    print('-'*120)
    print('mean_test_score 实际上是 mean_valid_score')
    report = pd.DataFrame(grid.cv_results_)

    # 如果 test 为 True,则在测试集上部署最佳参数
    if test == True:
        my_model = model(**grid.best_params_)
        my_model.fit(X_train, y_train)
        predictions = my_model.predict(X_test)
        mse = mean_squared_error(y_test, predictions)
        print('使用最佳参数的测试 MSE: ', mse)
        print('-'*120)
        return report[['mean_train_score', 'mean_test_score']] 

回答:

更新

scikit-learn 文档 中所解释的,GridSearchCV 会尝试您传递的所有参数列表的所有可能组合,以找到最佳参数。

为了评估哪些是最佳参数,它会为每个参数组合计算 k 折交叉验证。在 k 折交叉验证 中,训练集被分为训练集和验证集(这是一个测试集)。例如,如果您选择 cv=5,数据集将被分割成 5 个不重叠的折,每个折都被用作验证集,而其他所有折都被用作训练集。因此,GridSearchCV 在示例中会为每个参数组合计算 5 个折的平均验证分数(可以是准确率或其他指标)。然后,在 GridSearchCV 结束时,每个参数组合都会有一个平均验证分数,而具有最高平均验证分数的参数组合会被返回。因此,与最佳参数相关的平均验证分数被存储在 grid.best_score_ 变量中。

另一方面,grid.score(X_valid, y_valid) 方法在给定数据上给出分数,如果估计器已被重新拟合 (refit=True)。这意味着它不是 5 个折的平均准确率,而是取具有最佳参数的模型,并使用训练集进行训练。然后,在 X_valid 上计算预测,并与 y_valid 进行比较以获得分数。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注