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 в будущем. Они становятся очень распространенной визуализацией.