2017-12-04 21 views
3

은 내가 분류 모델 훈련을 위해 다음 코드를 사용하고 있습니다 :OpenNLP 분류 출력

Indexing events with TwoPass using cutoff of 0 

    Computing event counts... done. 1474 events 
    Indexing... done. 
Collecting events... Done indexing in 0,03 s. 
Incorporating indexed data for training... 
done. 
    Number of Event Tokens: 1474 
     Number of Outcomes: 2 
     Number of Predicates: 4149 
Computing model parameters... 
Stats: (998/1474) 0.6770691994572592 
...done. 

수 : 잘

final String iterations = "1000"; 
    final String cutoff = "0"; 
    InputStreamFactory dataIn = new MarkableFileInputStreamFactory(new File("src/main/resources/trainingSets/classifierA.txt")); 
    ObjectStream<String> lineStream = new PlainTextByLineStream(dataIn, "UTF-8"); 
    ObjectStream<DocumentSample> sampleStream = new DocumentSampleStream(lineStream); 

    TrainingParameters params = new TrainingParameters(); 
    params.put(TrainingParameters.ITERATIONS_PARAM, iterations); 
    params.put(TrainingParameters.CUTOFF_PARAM, cutoff); 
    params.put(AbstractTrainer.ALGORITHM_PARAM, NaiveBayesTrainer.NAIVE_BAYES_VALUE); 

    DoccatModel model = DocumentCategorizerME.train("NL", sampleStream, params, new DoccatFactory()); 

    OutputStream modelOut = new BufferedOutputStream(new FileOutputStream("src/main/resources/models/model.bin")); 
    model.serialize(modelOut); 

    return model; 

이 간다를 나는 다음과 같은 출력을 얻을 때마다 실행 한 후 누군가이 출력이 의미하는 것을 설명합니까? 그리고 그것이 정확성에 관해 뭔가를 말해 준다면? 당신이 findParameters() 코드를 살펴 경우

public AbstractModel trainModel(DataIndexer di) { 
    // ... 
    display("done.\n"); 
    display("\tNumber of Event Tokens: " + numUniqueEvents + "\n"); 
    display("\t Number of Outcomes: " + numOutcomes + "\n"); 
    display("\t Number of Predicates: " + numPreds + "\n"); 
    display("Computing model parameters...\n"); 
    MutableContext[] finalParameters = findParameters(); 
    display("...done.\n"); 
    // ... 
} 

, 당신이 그것을이 들어있는 trainingStats() 방법, 호출하는 것을 알 수 있습니다 다음 source 보면

답변

1

, 우리는이 출력 NaiveBayesTrainer::trainModel 방법으로 이루어집니다 알 수 있습니다 정확도를 계산 코드 :

private double trainingStats(EvalParameters evalParams) { 
    // ... 
    double trainingAccuracy = (double) numCorrect/numEvents; 
    display("Stats: (" + numCorrect + "/" + numEvents + ") " + trainingAccuracy + "\n"); 
    return trainingAccuracy; 
} 

TL; DR 출력의 Stats: (998/1474) 0.6770691994572592 부분은 당신이 찾고있는 정도입니다.

+0

좋은 답변 주셔서 감사합니다. 'numCorrect'는 어디에 기반합니까? 이 훈련에서'998' 번호는'2'이고 나머지는'4' 번호입니다. 숫자가'numCorrect' 인 이유는 무엇입니까? – Patrick

+1

@Patrick'numCorrect'도'trainingStats()'에서 계산됩니다. [GitHub의 소스] (https://github.com/apache/opennlp/blob/master/opennlp-tools/src/main/java/opennlp/tools/ml/naivebayes/NaiveBayesTrainer.java#L179)를 살펴보십시오.). –

+0

@ 패트릭이 답변이 유용하다고 생각되면 위/아래 화살표 바로 아래에있는 Nike 로고를 클릭하여 "수락"하는 것을 잊지 마십시오. :-) –