使用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++,這樣訓練模型的時候支持第一列是空格。