Vowpal Wabbit - 精确召回f-measure

时间:2015-05-28 17:16:09

标签: machine-learning vowpalwabbit precision-recall

如何从分类问题的Vowpal Wabbit中创建的模型中获得精确度,召回率和f-measure?

vw的输出是否有常用的脚本或程序?

使用playtennis.txt中的以下数据制作一个最小的例子:

2 | sunny 85 85 false
2 | sunny 80 90 true
1 | overcast 83 78 false
1 | rain 70 96 false
1 | rain 68 80 false
2 | rain 65 70 true
1 | overcast 64 65 true
2 | sunny 72 95 false
1 | sunny 69 70 false
1 | rain 75 80 false
1 | sunny 75 70 true
1 | overcast 72 90 true
1 | overcast 81 75 false
2 | rain 71 80 true

我用:

创建模型
vw playtennis.txt --oaa 2 -f playtennis.model --loss_function logistic

然后,我通过以下方式获得训练数据本身的训练模型的预测和原始预测:

vw -t -i playtennis.model playtennis.txt -p playtennis.predict -r playtennis.rawp

从这里开始,给定训练数据playtennis.txt以及playtennis.predict中训练数据的预测,您通常使用哪些脚本或程序来获得精确度,回忆率和f值?

此外,如果这是一个多标签分类问题(每个实例可以有多个目标标签,哪个vw也可以处理),您建议的脚本或程序是否能够处理这些?

2 个答案:

答案 0 :(得分:4)

鉴于您有一对“预测与实际”对比。每个示例的值,您可以使用Rich Caruana's KDD perf utility来计算这些(以及许多其他)指标。

在多类的情况下,您应该只考虑每个正确分类的案例是否成功,并且每个类别不匹配都无法正确预测。

这是二进制案例的更详细的配方:

# get the labels into *.actual (correct) file
$ cut -d' ' -f1 playtennis.txt > playtennis.actual

# paste the actual vs predicted side-by-side (+ cleanup trailing zeros)
$ paste playtennis.actual playtennis.predict | sed 's/\.0*$//' > playtennis.ap

# convert original (1,2) classes to binary (0,1):
$ perl -pe 's/1/0/g; s/2/1/g;' playtennis.ap > playtennis.ap01

# run perf to determine precision, recall and F-measure:
$ perf -PRE -REC -PRF -file playtennis.ap01
PRE    1.00000   pred_thresh  0.500000
REC    0.80000   pred_thresh  0.500000
PRF    0.88889   pred_thresh  0.500000

请注意,正如Martin所提到的,vw使用{-1,+ 1}约定进行二进制分类,而perf使用{0,1}约定,因此您可能需要转换回来在两者之间切换时。

答案 1 :(得分:3)

对于二进制分类,我建议使用标签+1(打网球)和-1(不打网球)和--loss_function=logistic(尽管--oaa 2和标签1和2 {{3同样)。大众然后报告后勤损失,这可能是比准确性/精确度/召回/ f1更具信息性/有用的评估指标(取决于应用)。如果您想要丢失0/1(即“一减精度”),请添加--binary

对于精确度,召回率,f1-score,auc和其他度量,您可以使用arielf答案中建议的perf工具。

对于标准的多类分类(每个示例一个正确的类),使用--oaa N --loss_function=logistic,VW将报告0/1丢失。<​​/ p>

对于多标签多类别分类(每个示例允许的标签更正确),您可以使用--multilabel_oaa N(或将每个原始示例转换为N个二进制分类示例)。