我正在使用Weka的API对某些数据进行分类。我使用BayesNet算法,因此需要对数据集中的数值进行离散化。我已经读过,在离散化测试数据集时,我需要使用训练数据集作为输入格式,以便离散化的训练和测试数据集兼容(https://weka.wikispaces.com/Discretizing+datasets)。我使用了过滤器:
weka.filters.supervised.attribute.Discretize.
这是我的测试数据集离散化代码:
private Instances filterData(Instances testData) {
int[] discIndices = {0,2,5,6}; //indices of numeric attributes
Discretize discFilter = new Discretize();
try {
discFilter.setAttributeIndicesArray(discIndices);
discFilter.setInputFormat(trainingData); // notice that the traning data is used as input format
return Filter.useFilter(testData, discFilter);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
当我使用相同的arff文件进行培训和测试时,一切正常。但是我当然想要使用来自不同(测试)arff文件的测试数据(有时只有一个实例)。问题是当我使用不同的测试arff文件时,dicretization不再起作用。例如,当我离散训练数据时,我有一个数字属性得到6个间隔,当我离开测试数据时,它只得到1个间隔,这当然会使训练和测试数据不兼容。有谁知道为什么会这样?我真的认为当我将离散化滤波器的训练数据作为输入格式进行离散化测试数据时,滤波器会创建与离散训练数据时相同的间隔。
答案 0 :(得分:0)
我发现应该使用此代码对单个测试实例进行离散化:
discFilter.input(instance);
Instance filteredInstance = discFilter.output();