2017-12-15 5 views
-1

私は2つのクラス間でテキストを分類するための素朴なベイベイ分類子を構築しようとしています。すべてがGUIエクスプローラでうまく動作しますが、コードで再作成しようとすると、どの入力を分類しようとも、同じ出力が得られます。Weka - クラシファイアはすべての入力に対して同じ分布を返します

コード内では、GUI内で得られるのと同じ評価基準(81%の精度)が得られますが、新しいインスタンスを作成して分類するたびに、入力に関係なく両方のクラスに対して同じ分布が得られます私が使う。

以下

は私のコードです - そのScalaではなく、非常に簡単です:どんなに私が与えるものを入力、DISTRIBの出力は、常にではありません

//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) 

0.44556173367704455 
0.5544382663229555 

任意のアイデア何I間違ってる?どんな助けにも大いに感謝します。それは魔法のラインのように見える

答えて

1

されました:

instance.setClassMissing() 

はそれが働かせたと付け加えました。 :)

関連する問題