2014-12-11 2 views
1

Encog (Java를 통해)를 사용하여 이진 분류자를 작성 중입니다. SVM 또는 신경망을 사용하여 설정 했으므로 부분적으로 ROC 곡선 아래의 영역을 사용하여 다른 모델의 품질을 평가하고 싶습니다.ROC에 대한 Encog 이진 분류 점수

더 구체적으로 말하자면, 모델의 출력을 ROC의 순위 지정에 사용할 수있는 일종의 예측 신뢰도로 변환하는 것이 이상적이지만 설명서에서는 아직 아무것도 찾을 필요가 없습니다. 어떻게 또한 분류의 숫자 신뢰를받을 수 있나요

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

: 코드에서

, 내가 좋아하는 뭔가 모델 결과를 얻을?

+0

특정 질문이 필요합니다. 너는 전혀 묻지 않는 것 같아! –

답변

0

Encog는 ROC 커브를 직접 지원하지 않습니다. ROC 곡선은 주로 Encog의 초점 인 실제 모델 유형보다 시각화에 가깝습니다.

SVM 및 신경망에 대한 ROC 곡선 생성은 다소 다릅니다. 신경 네트워크의 경우 분류 뉴런에 대한 임계 값을 설정해야합니다. 여기에 대한 좋은 논문이 있습니다 : http://www.lcc.uma.es/~jja/recidiva/048.pdf

결국 Encog에 ROC 곡선에 대한 직접 지원이 추가 될 것입니다. 그들은 매우 일반적인 시각화가되고 있습니다.

+0

참조 해 주셔서 감사합니다. 나는 그것을 잠시 동안 씹어야 할 것이다. – Adam

+0

SVM에 관해서는 순진한 SVM 사용자로서 두 가지 다른 값을 통해 표시된 두 가지 분류를 사용하여 분류 문제를 회귀 문제로 다시 채울 수 있습니다. 이 모델에서는 가장 가까운 클래스로 간단히 반올림하여 분류를 추출합니다.이 방법론에서는 예측 신뢰도의 프록시로 결정 임계 값까지 거리를 사용할 수 있다는 이점이 있습니다. 내 데이터 세트에서 이것은 표준 SVM 접근법을 사용하여 비교 가능한 TP/FP 비율을 제공하는 것으로 보이지만 불안정한 이론적 근거에 대해 걱정합니다. 이견있는 사람? – Adam

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; 
} 
}