このようなデータセットがあります。
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 メソッドを使用してこれを行うことができればと思います。
--
だから私の質問は次のとおりだと思います:誰かがクラス値を変換するより良い方法を提案できますか、または配列アウトオブバウンド例外がどこで/どのように発生するかを誰かが知っていますか?
どうもありがとう。