JavaアプリケーションでのWeka活用ガイド

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);

タグ: Weka Java MachineLearning DataMining

6月6日 18:25 投稿