如何正确传入并使用Stanford NER CRF的训练/验证/测试集
Stanford NER CRF 三类数据集训练与评估操作指南
Stanford NER的CRF实现本身没有内置训练流程自动加载验证集、实时评估早停的逻辑,不用在配置项里找专门的验证集路径参数,官方没做这个功能。三个数据集的正确使用流程如下:
数据集分工原则
先把边界划清楚,避免数据泄露:
- 训练集:唯一参与模型权重更新的数据集,用来拟合CRF特征权重
- 验证集:不参与训练,仅用来筛选最优模型、调整超参、判断训练停止时机
- 测试集:所有调参、选模工作全部完成后,仅用来做一次最终效果评估,全程不能用来指导模型调整
训练阶段接入验证集的操作
- 先配置基础训练properties文件,这里只填训练集路径、特征模板、模型保存路径,不要提前填测试集路径,核心配置参考:
trainFile = /your/path/train.tsv serializeTo = /your/path/final-ner-model.ser.gz map = word=0,answer=1 # 以下特征参数按自身任务调整即可 useClassFeature=true useWord=true useNGrams=true maxNGramLeng=6 usePrev=true useNext=true useSequences=true usePrevSequences=true maxLeft=1
- 启动训练时开启checkpoint保存,不要一次性训完固定轮次。执行如下训练命令,配置每N轮保存一个中间模型:
java -cp stanford-ner.jar edu.stanford.nlp.ie.crf.CRFClassifier -prop train.prop -checkpointDir ./model_checkpoints -checkpointEveryN 10
上面的命令代表每训练10轮,就会在./model_checkpoints目录下存一个对应轮次的中间模型文件。
3. 每生成一个checkpoint模型,就手动调用命令在验证集上跑一次评估,记录对应模型的精确率、召回率、F1值:
java -cp stanford-ner.jar edu.stanford.nlp.ie.crf.CRFClassifier -loadClassifier ./model_checkpoints/ner-model-10.ser.gz -testFile /your/path/dev.tsv
- 当连续3-5个checkpoint在验证集上的F1值不再上涨、甚至开始下降时,直接停止训练,选取验证集上F1表现最好的那个checkpoint作为最终最优模型。这一步就是验证集的核心作用:筛掉过拟合训练集的权重,选泛化能力最好的模型。
测试集最终评估
等你完成所有超参调整、最优模型选定之后,再用最优模型在测试集上跑唯一一次评估,得到的结果就是模型的真实泛化效果。不要反复根据测试集的评估结果调整模型、重选checkpoint,否则会造成数据泄露,测试集结果完全失去参考意义。
测试集评估命令:
java -cp stanford-ner.jar edu.stanford.nlp.ie.crf.CRFClassifier -loadClassifier /your/path/best-ner-model.ser.gz -testFile /your/path/test.tsv
踩坑提示:properties里的
testFile参数是训练全部结束后程序自动跑评估用的,如果你嫌手动跑验证集评估麻烦,可以在训到对应轮次的时候临时把这个参数改成验证集路径看结果,但绝对不要在调参阶段把这个参数设为测试集路径,避免无意识的测试集泄露。
内容的提问来源于stack exchange,提问作者yllwpr
相关产品推荐
相关产品推荐

