1

このようなデータセットがあります。

numeric_attr1、numeric_attr2、...、numeric_attrN、string_attr、class_attr

string_attr は、obs がないようにクロス検証フォールドを作成するために使用される画像ファイル名のリストです。テスト セットとトレーニング セットの両方の 1 つの画像から。(その後、属性は削除されますが、ここでは問題ではありません)。

{A、B1、B2、B3、B4、B5} の 6 つのクラスがあります。

新しいクラス属性 {A, B} を作成しようとしています。ここで、B1、B2 などはすべて「B」に変換されます。

(私はMatlabで作業していますが、それを介してwekaメソッドを呼び出しているため、以下の表記はpseudo / 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 が削除されるなど、元のファイルとまったく同じ属性があります。

正規表現ファイルと 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}

ARFF ファイルを解析して値を置き換えるスクリプトではなく、セットの Weka メソッドを使用してこれを行うことができればと思います。

--

だから私の質問は次のとおりだと思います:誰かがクラス値を変換するより良い方法を提案できますか、または配列アウトオブバウンド例外がどこで/どのように発生するかを誰かが知っていますか?

どうもありがとう。

4

0 に答える 0