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

skorch中GridSearchCV未使用自定义score方法选取best_score问题

skorch自定义score方法对接GridSearchCV分数不一致问题解决

1、当前GridSearchCV的实际评分逻辑

你看到的训练打印分数和cv结果不符,不是GridSearchCV改了评分规则。GridSearchCV本身只要初始化时不传scoring参数、保持默认None,永远是调用传入estimator的score(X, y)方法,取该方法返回值作为单折测试集分数,再对所有折取平均得到best_score_。
你现在遇到的大量0值、分数偏低,核心是配置冲突:

  • 你加的EpochScoring(scoring=None)回调,会在初始化时覆盖你重写的Trainer实例的score方法,重置回skorch.NeuralNet父类的默认评分逻辑(默认是分类准确率/回归R2,和你的BLEU计算完全不匹配)
  • 训练过程中你看到的0.0262的BLEU分数,是EpochScoring在训练阶段拿训练集数据算出来打印的值,根本不是交叉验证折上的测试集分数,两个分数的计算数据源、计算逻辑都不一样,自然对不上。交叉验证阶段调用被重置后的默认score方法,在序列生成任务上算出来的结果大概率就是0,拉低了整体平均分。

2、正确配置方法

按下面步骤调整即可让GridSearchCV正常调用你写的BLEU score逻辑:

  • 移除初始化Trainer时配置的EpochScoring(scoring=None)回调。如果需要训练过程中打印BLEU做监控,单独实现不修改score方法的日志回调即可:
from skorch.callbacks import Callback

class TrainBLEULogger(Callback):
    def on_epoch_end(self, net, **kwargs):
        # 仅用训练集数据算分打日志,不修改网络本身的score属性
        train_pred = net.predict(net.dataset.X)
        train_bleu = your_corpus_bleu_calc(net.dataset.y, train_pred)
        print(f"\nEpoch train corpus BLEU: {train_bleu:.4f}")
  • 重写Trainer的score方法时严格遵循sklearn接口规范:方法必须接收X、y两个位置参数,基于传入的X实时推理计算,不要依赖训练过程中缓存的中间结果,保证方法在任意切分的子集上都能正常返回BLEU分数:
import skorch

class Trainer(skorch.NeuralNet):
    def score(self, X, y):
        # 不要用self.history里存的训练预测结果,必须基于传入X重新预测
        pred = self.predict(X)
        return your_corpus_bleu_calc(y, pred)
  • 初始化搜索对象时保持GridSearchCV的scoring参数默认即可,不要额外传值:
from sklearn.model_selection import GridSearchCV

trainer = Trainer(
    # 你的网络结构、优化器、训练轮次等基础参数
    callbacks=[TrainBLEULogger()]
)

gs = GridSearchCV(
    estimator=trainer,
    param_grid=your_param_search_space,
    cv=your_cv_split_config
    # 不指定scoring参数,保持默认None
)
gs.fit(X_all, y_all)

排查提示:如果改完仍有零星0值,检查BLEU计算逻辑的输入格式,确认交叉验证折拆分后的标签、预测结果的分词规则、特殊标记过滤逻辑和训练时一致,避免因为格式不匹配导致n-gram匹配率为0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:45:58