2017-12-15 4 views
-1

두 클래스 사이에서 텍스트를 분류하기위한 순진한 베이 분류를 만드는 중입니다. 모든 것이 GUI 탐색기에서 훌륭하게 작동하지만 코드에서 다시 만들려고 할 때 어떤 입력을 분류하려고해도 동일한 출력을 얻습니다.Weka - Classifier가 모든 입력에 대해 동일한 분포를 반환합니다.

코드 내에서 GUI에서 얻은 것과 동일한 평가 메트릭을 얻었지만 (81 % 정확도), 새 인스턴스를 작성하고 분류 할 때마다 어떤 입력에 관계없이 두 클래스 모두 동일한 분배를 얻습니다. 나는 사용한다. 다음은

내 코드입니다 - 그에서의 스칼라하지만, 매우 간단합니다 :

//Building the classifier: 
val instances = new Instances(new DataSource("/my/dataset.arff").getDataSet) 
instances.setClassIndex(3) 

val filter = new StringToWordVector 
filter.setAttributeIndicesArray((0 to 2).toArray) 
val classifier = new FilteredClassifier 
classifier.setFilter(new StringToWordVector(1000000)) 
classifier.setClassifier(new NaiveBayesMultinomial) 
classifier.buildClassifier(trainingSet) 

//Evaluation (this prints about 80% accuracy) 
val eval = new Evaluation(trainingSet) 
eval.evaluateModel(classifier, trainingSet) 

println(eval.toSummaryString) 

//Attempting to use the classifier: 

val atts = new util.ArrayList[Attribute] 
atts.add(new Attribute("sentence", true)) 
atts.add(new Attribute("parts_of_speech", true)) 
atts.add(new Attribute("dependency_graph", true)) 
atts.add(new Attribute("the_shizzle_clazz", SentenceType.values().map(_.name()).toSeq.asJava)) 

val unlabeledInstances = new Instances("unlabeled", atts, 1) 
unlabeledInstances.setClassIndex(3) 

val instance = new DenseInstance(4) 

unlabeledInstances.add(instance) 
instance.setDataset(unlabeledInstances) 

instance.setValue(0, parsed.sentence) 
instance.setValue(1, parsed.posTagsStr) 
instance.setValue(2, parsed.depsGraphStr) 

val distrib = classifier.distributionForInstance(unlabeledInstance.firstInstance()) 

distrib.foreach(println) 

가 아무리 줄 것을 입력 DISTRIB의 출력은 항상 없다 :

0.44556173367704455 
0.5544382663229555 

모든 아이디어를 내가 내가 잘못 했니? 어떤 도움을 주시면 감사하겠습니다. 그것은 마법의 라인처럼 보이는

답변

1

했다 :

instance.setClassMissing() 

그 작동하게 추가. :)

관련 문제