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
相关产品推荐
相关产品推荐

