Encog бинарной классификации для ROC

Я работаю над двоичным классификатором, используя Encog (через Java). Я настроил его с помощью SVM или нейронной сети, и я хочу оценить качество различных моделей, используя (частично) область под кривой ROC.

Более конкретно, в идеале я хотел бы преобразовать выходные данные модели в некую оценку достоверности прогноза, которую можно использовать для упорядочения рангов в ROC, но я еще ничего не нашел в документации.

В коде я получаю результаты модели с чем-то вроде:

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

Как мне также получить числовую достоверность классификации?

2 ответа

Я нашел способ вывести вероятности предсказания из SVM внутри структуры Encog. Этот метод основан на эквиваленте опции -b для libSVM (см. http://www.csie.ntu.edu.tw/~cjlin/libsvm/index.html).

Для этого переопределите класс SVM из Encog. Конструктор включит оценки вероятности через объект smv_parameter (см. Ниже). Затем при выполнении расчета вызовите метод svm_predict_probability, как показано ниже.

Предостережение: ниже приведен только фрагмент кода, и для того, чтобы быть полезным, вам, вероятно, потребуется написать другие конструкторы и передать полученные вероятности из методов, приведенных ниже. Этот фрагмент основан на версии 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;
}
}

Encog не имеет прямой поддержки кривых ROC. Кривая ROC - это скорее визуализация, чем фактический тип модели, который в основном находится в центре внимания Encog.

Генерация кривой ROC для SVM и нейронных сетей несколько отличается. Для нейронной сети необходимо установить пороговые значения для классификации нейронов. Здесь есть хорошая статья об этом: http://www.lcc.uma.es/~jja/recidiva/048.pdf

Я могу со временем добавить прямую поддержку кривых ROC в Encog в будущем. Они становятся очень распространенной визуализацией.

Другие вопросы по тегам