对ROC进行Encog二进制分类评分

时间:2014-12-11 21:27:57

标签: encog

我正在使用Encog(通过Java)开发二进制分类器。我使用SVM或神经网络进行设置,我想使用(部分)ROC曲线下的区域来评估不同模型的质量。

更具体地说,我希望将模型的输出转换为某种预测置信度分数,可用于ROC中的排序,但我还没有在文档中找到任何内容。

在代码中,我得到的模型结果如下:

MLData result = ((MLRegression) method).compute( pair.getInput() );
String classification = normHelper.denormalizeOutputVectorToString( result )[0]; 

我如何获得分类的数字置信度?

2 个答案:

答案 0 :(得分:1)

我找到了一种在encog框架内从SVM中哄骗预测概率的方法。此方法依赖于libSVM的-b选项的等效项(请参阅http://www.csie.ntu.edu.tw/~cjlin/libsvm/index.html

要执行此操作,请从encog覆盖SVM类。构造函数将通过smv_parameter对象启用概率估计(见下文)。然后,在进行计算时,调用方法svm_predict_probability,如下所示。

警告:下面只是一个代码片段,为了有用,您可能需要编写其他构造函数并将结果概率传递给下面的方法。该片段基于encog版本3.3.0。

public class MySVMProbability extends SVM {

public MySVMProbability(SVM method) {
    super(method.getInputCount(), method.getSVMType(), method.getKernelType());
    // Enable probability estimates 
    getParams().probability = 1;
}


@Override
public int classify(final MLData input) {
    svm_model model = getModel();
    if (model == null) {
        throw new EncogError(
                "Can't use the SVM yet, it has not been trained, " 
                + "and no model exists.");
    }

    final svm_node[] formattedInput = makeSparse(input);
    final double probs[] = new double[svm.svm_get_nr_class(getModel())];
    final double d = svm.svm_predict_probability(model, formattedInput, probs);

    /* probabilities for each class are in probs[] */

    return (int) d;
}


@Override
public MLData compute(MLData input) {
    svm_model model = getModel();
    if (model == null) {
        throw new EncogError(
                "Can't use the SVM yet, it has not been trained, "
                + "and no model exists.");
    }

    final MLData result = new BasicMLData(1);

    final svm_node[] formattedInput = makeSparse(input);

    final double probs[] = new double[svm.svm_get_nr_class(getModel())];
    final double d = svm.svm_predict_probability(model, formattedInput, probs);
    /* probabilities for each class are in probs[] */
    result.setData(0, d);

    return result;
}
}

答案 1 :(得分:0)

Encog没有直接支持ROC曲线。 ROC曲线更像是一种可视化,而不是实际的模型类型,这主要是Encog的重点。

为SVM和神经网络生成ROC曲线有些不同。对于神经网络,您必须为分类神经元建立阈值。这里有一篇很好的论文:http://www.lcc.uma.es/~jja/recidiva/048.pdf

我最终可能会将ROC曲线的直接支持添加到Encog中。它们正在变得非常普遍。