我有这样的数据集;
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发生在何处/如何?
非常感谢。