Weka で CfsSubsetEval クラスを呼び出して機能サブセットの選択を実行する Java プログラムを作成しようとしています。CfsSubsetEval はデータセットを離散化します。データセットは既に離散化されているため、これを回避しようとしています。以下は、離散化を実行する CfsSubsetEval.java の行です。
m_isNumeric = m_trainInstances.attribute(m_classIndex).isNumeric();
if (!m_isNumeric)
{
m_disTransform = new Discretize();
m_disTransform.setUseBetterEncoding(true);
m_disTransform.setInputFormat(m_trainInstances);
m_trainInstances = Filter.useFilter(m_trainInstances, m_disTransform);
}
class 属性は arff ファイルで次のように定義されているため:
@ATTRIBUTE class {true,false}
属性は数値ではないため、離散化が実行されます。
Weka の実装について少し知識がありますが、離散化をスキップするためにこれらの行をコメントアウトしようとしました。ただし、機能せず、次の例外が報告されます。
java.lang.ArrayIndexOutOfBoundsException: 1
at weka.attributeSelection.CfsSubsetEval.symmUncertCorr(CfsSubsetEval.java:515)
at weka.attributeSelection.CfsSubsetEval.correlate(CfsSubsetEval.java:445)
at weka.attributeSelection.CfsSubsetEval.evaluateSubset(CfsSubsetEval.java:392)
at weka.attributeSelection.BestFirst.search(BestFirst.java:806)
at weka.attributeSelection.AttributeSelection.SelectAttributes(AttributeSelection.java:606)
at selecting_features.runFeatureSelection.main(runFeatureSelection.java:39)
問題は、データセットを離散化しないように CfsSubsetEval.java を変更するにはどうすればよいかということです。
よろしくお願いいたします。