我正在尝试构建一个朴素的贝叶斯分类器,用于在两个类之间对文本进行分类。 GUI浏览器中的一切都很好用,但是当我尝试在代码中重新创建它时,无论我尝试分类的输入是什么,我都会获得相同的输出。
在代码中,我获得了与GUI中相同的评估指标(81%准确度),但每当我尝试创建一个新实例并对其进行分类时,无论输入什么输入,我都会获得相同的两个类的分布使用
下面是我的代码 - 它在scala中,但非常简单:
//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
任何想法我做错了什么?非常感谢任何帮助。
答案 0 :(得分:1)
看起来神奇的线条是:
instance.setClassMissing()
添加它使它工作。 :)