You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GridSearchCV的自定义T_scorer中调用训练好的模型预测X1?

如何在GridSearchCV的自定义评估器中调用当前训练模型评估外部数据集?

当然可以实现这个需求!你的现有代码没法正常运行,核心问题是make_scorer默认只会把验证集的真实标签和预测结果传给评分函数,不会传递当前训练好的模型实例。下面是修正后的完整方案,帮你实现用外部独立数据集(X1,y1)做评估的目标:

关键修正点

要让评分函数能拿到模型,我们需要告诉make_scorer:我们的函数需要接收模型作为参数。这可以通过设置needs_estimator=True来实现,同时调整评分函数的签名,让它以模型实例作为第一个参数。

完整代码实现

import numpy as np
from sklearn.metrics import confusion_matrix
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV, StratifiedKFold
from sklearn.metrics import make_scorer
from functools import partial

# 假设X1, y1是完全独立于训练集(X,y)的外部数据集
# 推荐用partial绑定外部数据,避免依赖全局变量
def custom_scorer(estimator, _, __, X_ext, y_ext):
    # 用当前训练好的模型预测外部数据集
    y_pred_ext = estimator.predict(X_ext)
    # 计算你的自定义评估指标(修正原代码的标签匹配逻辑)
    correct_zero_predictions = np.sum((y_pred_ext == y_ext) & (y_pred_ext == 0))
    
    # 可选:打印验证集的混淆矩阵(保留你原代码的调试逻辑)
    y_pred_val = estimator.predict(_)
    confmat_val = confusion_matrix(__, y_pred_val)
    print("当前fold验证集混淆矩阵:\n", confmat_val)
    print("外部数据集符合条件的正确预测数:", correct_zero_predictions)
    
    return correct_zero_predictions

# 绑定外部数据集到评分函数
scorer_with_ext_data = partial(custom_scorer, X_ext=X1, y_ext=y1)

# 创建sklearn兼容的scorer,指定needs_estimator=True
_scorer = make_scorer(
    scorer_with_ext_data,
    needs_estimator=True,
    greater_is_better=True  # 根据你的指标调整,值越大模型越好就设为True
)

# 定义模型和参数网格(示例参数,替换为你的实际网格)
clf = RandomForestClassifier()
parameter_grid = {
    "n_estimators": [10, 50],
    "max_depth": [3, None]
}

# 初始化GridSearchCV
grid_searcher = GridSearchCV(
    clf,
    parameter_grid,
    cv=StratifiedKFold(shuffle=True, random_state=42),
    verbose=20,
    scoring=_scorer
)

# 开始训练与网格搜索
grid_searcher.fit(X, y)

# 获取最优模型
clf_best = grid_searcher.best_estimator_
print('Best params = ', clf_best.get_params())

细节解释

  1. 评分函数签名调整:
    当needs_estimator=True时,评分函数的第一个参数会是当前迭代训练好的模型实例,后面两个参数是交叉验证的验证集X和y(我们用_和__占位,因为这里不需要用它们做核心评估)。
  2. 用partial绑定外部数据:
    这样可以避免把X1,y1设为全局变量,让代码更模块化、可复用。如果不想用partial,直接在评分函数里使用全局定义的X1,y1也可以,但不推荐这种写法。
  3. 避免数据泄露:
    一定要确保X1,y1完全没有参与过训练集的划分、交叉验证,否则会导致模型的泛化能力被高估,选出的“最优模型”实际表现会很差。
  4. greater_is_better参数:
    如果你的评估指标值越大代表模型越好(比如正确预测数),就设为True;如果是误差类指标(值越小越好),就设为False,GridSearchCV会根据这个逻辑选择最优参数组合。

内容的提问来源于stack exchange,提问作者user287629

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:10:58