1

我有一个这样的数据集;

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

string_attr 是用于创建交叉验证折叠的图像文件名列表,因此没有 obs。来自测试集和训练集中的一张图像。(该属性随后被删除,这不是这里的问题)。

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

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

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

方法一:重命名属性值

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

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

方法二:新建属性

% 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,然后将其删除。

检查正则表达式文件和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 发生在哪里/如何发生?

非常感谢。

4

0 回答 0