Weka分类器新的类属性:arrayOutOfBoundsException

时间:2013-11-07 15:05:49

标签: java matlab weka

我有这样的数据集;

numeric_attr1,numeric_attr2,...,numeric_attrN,string_attr,class_attr

string_attr是一个图像文件名列表,用于创建交叉验证折叠,以便没有障碍物。从测试和训练集中的一个图像。 (然后删除该属性,这不是问题)。

有6个班级:{A,B1,B2,B3,B4,B5}

我正在尝试创建一个新的类属性:{A,B},其中所有B1,B2等都转换为'B'。

(我在Matlab工作,但是通过它调用weka方法,所以下面的符号是伪/ matlab / java的混合---抱歉!)

方法1:重命名属性值

dataset.renameAttributeValue(class_attr, 'B1', 'B') 
dataset.renameAttributeValue(class_attr, 'B', 'B') 
.
.
.

不起作用,因为类值最终:{A,B,B,B,B,B},具有类似的6x6混淆矩阵,会抛弃准确率。 (我可以在分类后手动移动矩阵的行和列,但这很麻烦)。

方法2:创建新属性

% Create new attribute
newAttribute = Attribute('label', FastVector('A', 'B'))
% Insert it at end of dataset
dataset.insertAttributeAt(newAttribute, dataset.numAttributes())

% Rename old attribute values to the new ones 
dataset.renameAttributeValue(class_attr, 'B1', 'B') 
% .. etc

% Loop over each instance and assign the (converted) old attribute value to the new attribute
for i .. dataset.numInstances
    oldValue = dataset.instance(i).classValue; % Which is now replaced with {TIS,CAN}
    D.instance(i).setValue(newClassIndex, oldValue);
end

% Set class to newClassIndex, delete attribute at oldClassIndex
dataset.setClass(dataset.attribute(newClassIndex));
dataset.deleteAttributeAt(oldClassIndex);

不起作用。当我尝试训练分类器时,我得到:

??? Java exception occurred:
java.lang.ArrayIndexOutOfBoundsException: 3
    at weka.classifiers.trees.RandomTree.buildClassifier(RandomTree.java:595)
    at weka.classifiers.meta.Bagging.buildClassifier(Bagging.java:529)
    at weka.classifiers.trees.RandomForest.buildClassifier(RandomForest.java:517)

方法3:手动替换ARFF文件中的值

如果我打开VIM中的arff文件并使用正则表达式将所有B1..B5替换为'B',我会得到一个我可以打开的文件,拆分成折叠并训练/测试分类器。

正则表达式文件具有与原始文件完全相同的属性,包括用于创建折叠的string_attr,然后将其删除。

检查正则表达式文件的class属性和类索引以及attributeAdded文件显示相同的类索引和相同的类属性值:

dataset2.classIndex % The file that had was manually changed
>> 179
dataset2.classAttribute
>> @attribute nlabel {A,B} % Has a different label name, but this happens before test/train splitting

dataset1.classIndex % The original file that had a new attribute added
>> 179
dataset1.classAttribute
>> @attribute label {A,B}

我真的宁愿能够使用set Weka方法,而不是用于解析ARFF文件和替换值的脚本。

-

所以我想我的问题是:任何人都可以提出更好的转换类值的方法,或者有人知道arrayoutofboundsexception发生在何处/如何?

非常感谢。

0 个答案:

没有答案