WekaライブラリをJavaプログラムに統合することで、高度な機械学習機能をアプリケーションに組み込めます。主な活用要素は以下の通りです。
- Instances: 学習および予測対象となるデータセット
- Filter: データの前処理(変換や抽出)
- Classifier / Clusterer: モデルの学習と推論
- Evaluation: モデル精度の検証
データセットの読み込み
WekaではDataSourceクラスを使用して、ARFFやCSVなどの形式からデータを取得するのが標準的です。
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;
// データ読み込み
DataSource loader = new DataSource("data.arff");
Instances dataset = loader.getDataSet();
// クラス属性が設定されていない場合のインデックス指定
if (dataset.classIndex() == -1) {
dataset.setClassIndex(dataset.numAttributes() - 1);
}
フィルタリング(前処理)
Filterインタフェースを実装したクラスを使用します。重要な点は、オプション設定後に必ずsetInputFormatを呼び出すことです。
import weka.filters.Filter;
import weka.filters.unsupervised.attribute.Remove;
// 第1属性を削除するフィルタの設定
Remove removeOp = new Remove();
removeOp.setAttributeIndices("1");
removeOp.setInputFormat(dataset);
// フィルタ適用
Instances processedData = Filter.useFilter(dataset, removeOp);
分類モデルの構築と評価
buildClassifierメソッドで学習を実行します。また、Evaluationクラスを使用することで交差検証(Cross-Validation)を容易に実装できます。
import weka.classifiers.trees.J48;
import weka.classifiers.Evaluation;
import java.util.Random;
// モデルの初期化と学習
J48 treeModel = new J48();
treeModel.buildClassifier(processedData);
// 10分割交差検証
Evaluation evaluator = new Evaluation(processedData);
evaluator.crossValidateModel(treeModel, processedData, 10, new Random(42));
System.out.println(evaluator.toSummaryString());
オンザフライでのフィルタリング
FilteredClassifierを使用すると、個別にフィルタを適用する手間を省き、分類器の一部として前処理をカプセル化できます。
import weka.classifiers.meta.FilteredClassifier;
import weka.filters.unsupervised.attribute.Remove;
FilteredClassifier meta = new FilteredClassifier();
meta.setFilter(new Remove()); // 適切なオプションを設定
meta.setClassifier(new J48());
meta.buildClassifier(trainingSet);
推論(予測)の実行
学習済みモデルを使用して、未知のデータに対してラベルを予測します。
double predictionIndex = model.classifyInstance(unlabeledInstance);
String label = dataset.classAttribute().value((int) predictionIndex);
System.out.println("予測ラベル: " + label);