使用CRF++进行模型训练

使用CRF++进行模型训练

本机训练:

使用以下命令:

nohup ./CRF++-0.58/crf_learn -f 10 -H 10 -e 0.0005 -m 300 data/template/template data/output/training_data_new.txt data/model/out_model -t > nohup.out 2>&1 &

  • template : 使用默认的模板,可以在CRF++-0.58/example/seg中找到
  • training_data.txt:即上步生成的训练文件
  • model:生成的模型名称
  • 其他参数:参见 http://taku910.github.io/crfpp/#source
    参数设置:
    -m,最大迭代d次数,默认为10k,int
    -f,使用的feature最少出现次数,默认为1,int
    -c,cost参数,CRFs超参,默认1.0,float。值越大,CRF越可能过拟合,用来平衡过拟合和低拟合情况,
    这个值得选取对模型有显著影响(后续调优可以对这个值给予关注)。
    Note: You can find an optimal value by using held-out data or more general model selection method such as cross validation.
    -t,输出文本模型
    -e,模型迭代训练停止条件,为loss变化率,默认0.0001
    -p,线程数量,默认为自动检测
    注意:模型训练时间很长,且会打满所有CPU,本机训练时注意训练文件不要太大(建议1w条以内)

预测

使用人工标注的数据data.test进行预测
./CRF++-0.58/crf_test -m data/model/model35 data/test_data/data.test.with_features.txt > data/test_data/data.test.out 2>&1
./CRF++-0.58/crf_test -m data/model/out_model data/test_data/data.test.correct.single_char_single_line_with_rulemodel_feature.txt > data/test_data/data.test_new.out 2>&1

内容:该工程源码源于官方CRF++-0.58版本,官方原始的CRF++在训练模型的时候会将第一列为 \0 或 空格 或 \t 的行忽略掉,但我们需要第一列支持空格,所以修改了CRF++两处源码(feature_index.cpp 168行左右、tagger.cpp 368行左右),重新编译了CRF++,这样训练模型的时候支持第一列是空格。

推荐阅读更多精彩内容