我准备了来自两个不同数据集的两个不同的.arff文件,一个用于测试,另一个用于培训。它们中的每一个都具有相同的实例,但是不同的特征改变了每个文件的特征向量的维度。当我对每个文件进行交叉验证时,它们运行得很好。这表明.arff文件已正确准备,没有任何错误。
现在,如果我使用维度较少的训练文件与测试文件进行评估。我收到了以下错误。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5986
at weka.classifiers.bayes.NaiveBayesMultinomial.probOfDocGivenClass(NaiveBayesMultinomial.java:295)
at weka.classifiers.bayes.NaiveBayesMultinomial.distributionForInstance(NaiveBayesMultinomial.java:254)
at weka.classifiers.Evaluation.evaluationForSingleInstance(Evaluation.java:1657)
at weka.classifiers.Evaluation.evaluateModelOnceAndRecordPrediction(Evaluation.java:1694)
at weka.classifiers.Evaluation.evaluateModel(Evaluation.java:1574)
at TrainCrossValidateARFF.main(TrainCrossValidateARFF.java:44)
weka中的测试文件是否需要与火车相同或更少的功能? 评估准则
public class TrainCrossValidateARFF{
private static DecimalFormat df = new DecimalFormat("#.##");
public static void main(String args[]) throws Exception
{
if (args.length != 1 && args.length != 2) {
System.out.println("USAGE: CrossValidateARFF <arff_file> [<stop_words_file>]");
System.exit(-1);
}
String TrainarffFilePath = args[0];
DataSource ds = new DataSource(TrainarffFilePath);
Instances Train = ds.getDataSet();
Train.setClassIndex(Train.numAttributes() - 1);
String TestarffFilePath = args[1];
DataSource ds1 = new DataSource(TestarffFilePath);
Instances Test = ds1.getDataSet();
// setting class attribute
Test.setClassIndex(Test.numAttributes() - 1);
System.out.println("-----------"+TrainarffFilePath+"--------------");
System.out.println("-----------"+TestarffFilePath+"--------------");
NaiveBayesMultinomial naiveBayes = new NaiveBayesMultinomial();
naiveBayes.buildClassifier(Train);
Evaluation eval = new Evaluation(Train);
eval.evaluateModel(naiveBayes,Test);
System.out.println(eval.toSummaryString("\nResults\n======\n", false));
}
}
答案 0 :(得分:5)
weka中的测试文件是否需要与火车相同或更少的功能?评估准则
需要相同数量的功能。你可能需要插入?对于类属性也是。
为了兼容,两组实例的头信息需要相同 - 相同 属性数,具有相同顺序的相同名称。此外,任何名义属性都必须 具有在两组实例中以相同顺序声明的相同值。 对于测试集中未知的类值,只需将每个值设置为缺失 - 即“?”。
答案 1 :(得分:1)
根据Weka的wiki,训练和测试集的特征数量需要相同。这些特征的类型(例如,名义,数字等)也需要相同。
另外,我假设您没有对任何数据集应用任何Weka过滤器。如果您在每个数据集上单独应用过滤器(即使它是相同的过滤器),数据集通常会变为incompatible。
答案 2 :(得分:0)
如何将数据集划分为训练和测试集?
您可以使用RemovePercentage过滤器(包weka.filters.unsupervised.instance)。
在资源管理器中,只需执行以下操作:
训练集:
- 载入完整数据集
- 在预处理面板中选择RemovePercentage过滤器
- 设置拆分的正确百分比
- 应用过滤器
- 将生成的数据保存为新文件
测试集:
- 载入完整数据集(或只使用撤消将更改还原为数据集)
- 如果尚未选择,则选择RemovePercentage过滤器
- 将invertSelection属性设置为true
- 应用过滤器
- 将生成的数据保存为新文件