Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何手动交叉折叠评估weka中的朴素贝叶斯?_Java_Weka - Fatal编程技术网

Java 如何手动交叉折叠评估weka中的朴素贝叶斯?

Java 如何手动交叉折叠评估weka中的朴素贝叶斯?,java,weka,Java,Weka,我使用的是自己的单词包模型,而不是wekas StringToWordVector(结果是一个错误,但因为这只是一个学校项目,我想用我的方法来完成它),所以我不能使用它的交叉折叠,因为我的BoW字典也会包含训练数据的单词 for (int n = 0; n < folds; n++) { List<String> allData = getAllReviews(); // 2000 reviews List<String> trainingData =

我使用的是自己的单词包模型,而不是wekas StringToWordVector(结果是一个错误,但因为这只是一个学校项目,我想用我的方法来完成它),所以我不能使用它的交叉折叠,因为我的BoW字典也会包含训练数据的单词

for (int n = 0; n < folds; n++) {
   List<String> allData = getAllReviews(); // 2000 reviews
   List<String> trainingData = getTrainingReviews(n, folds); // random 1800 reviews
   List<String> testData = getTestReviews(n, folds); // random 200 reviews

   bagOfWordsModel.train(trainingData);  //  builds a vocabulary of 1800 training reviews
   Instances inst = bagOfWordsModel.vectorize(allData); // returns 1800 instances with the class attribute set to positive or negative, and 200 without 

   // todo: evaluate
   Classifier cModel = (Classifier) new NaiveBayes();
   cModel.buildClassifier(inst);

   Evaluation eTest = new Evaluation(inst);
   eTest.evaluateModel(cModel, inst);

   // print results
   String strSummary = eTest.toSummaryString();
   System.out.println(strSummary);
}
for(int n=0;n

我现在如何评估这一点?我认为,weka将自动尝试确定没有class属性值的实例的class属性。但是相反,它告诉我
weka.filters.supervised.attribute.Discretize:无法处理缺少的类值

培训时,仅输入设置类的实例

在这方面:

cModel.buildClassifier(inst);
您正在训练一个朴素的贝叶斯分类器。仅输入培训示例(!)。根据所有数据(带标签!)进行评估。如果我没记错的话,评估将根据实际标签检查预测标签


没有类标签的200个数据点似乎没用,它们是干什么用的?

由于您有一个训练集和一个测试集,您应该在训练数据上训练分类器,这些数据应该被标记,然后使用训练模型对未标记的测试数据进行分类

Classifier cModel = new NaiveBayes();
cModel.buildClassifier(trainingData);
然后,通过使用以下行,您应该能够对未知实例进行分类并获得预测:

double clsLabel = cModel.classifyInstance(testData.instance(0));
或者您可以使用该类对整个测试集进行预测

Evaluation evaluation = new Evaluation();
evaluation.evaluateModel(cModel, testData);
您已经指出,您正试图通过获取数据的随机子集来实现自己的交叉验证—有一种方法可以在评估类()中为您执行k倍交叉验证

注意:交叉验证是在没有测试集的情况下使用的,方法是获取训练数据的子集并将其保留在训练之外,然后使用它来评估性能


K-折叠交叉验证将训练数据拆分为K个子集。它将其中一个子集放在一边,并使用剩余的子集来训练分类器,返回到留出的子集来评估模型。然后重复此过程,直到使用每个子集作为测试集。

是否要训练模型,然后在未知数据上对其进行评估?交叉折叠验证需要一个已知的类标签,因为您不能在未知数据上进行训练。嗯,但是如果我为测试数据指定一个类标签,那么wekas评估如何区分测试数据和训练数据?记住我不能使用wekas内置的交叉折叠评估如果你有一个测试集,你无论如何也不会想使用交叉折叠验证。您是否能够在没有问题的情况下针对所有数据对模型进行训练评估,或者最好仅针对测试数据进行训练。好的,因此我仅使用训练实例构建分类器,然后使用
Evaluation eTest=new Evaluation(inst);测试评估模型(cModel,inst)使用所有2000?@user66875现在我想起来了,可能是200个测试示例,而不是2000整套。假设你也有这些的标签,我会试试的,谢谢。另外,我实际上也没有特定的测试集;我只是使用2000个标签评论中的十分之一作为测试集,所以基本上我正在尝试构建我自己的k-折叠交叉验证。@user66875这将是10%的交叉验证。k-fold交叉验证将分割成k个子集,并使用每个分割的子集作为测试集,同时使用其他k-1集进行评估(我会将其添加到答案中)。关于您的注意事项:不幸的是,我不能让weka对数据进行分区,因为我已经用我自己的审查分区构建了我的BagOfWord模型。这是我最初的问题。如果我用单词引用(BagOfWord)和所有2000篇评论来构建字典,那对我来说似乎是某种欺骗。我认为模型不应该了解200个测试评审的内容。或者我误解了什么。@user66875这很公平。k-fold交叉验证通常会重新应用过滤器,用于为每次迭代生成单词包。我只是注意到了区别,如果传统交叉验证提供的性能是合适的,那么您使用的方法应该是好的。不过,由于这是一个学校项目,我高度怀疑你采用的方法已经太过火了。
Evaluation evaluation = new Evaluation();
evaluation.evaluateModel(cModel, testData);