Tribuo ML ライブラリを JUnit 拡張として埋め込む (2022/02/01)

Tribuo ML ライブラリを JUnit 拡張として埋め込む (2022/02/01)

https://medium.com/oracledevs/embedding-tribuo-ml-library-as-a-junit-extension-7541f843d1ea

投稿者:Uday Tatiraju

Alina Constantin / Better Images of AI / Handmade A.I / CC-BY 4.0


この思考実験では、TribuoをカスタムJUnit拡張機能で活用し、機械学習(ML)を使って特定のサービスや製品の品質保証(QA)に役立つ洞察を得られる可能性があるかどうかを確認します。


JUnit は、JVM 上で最も人気のあるテストフレームワークで、モジュール式で拡張可能なテストフレームワークです。JUnitは、そのライフサイクルにフックし、カスタム機能を追加するための拡張ポイントを提供します。


Tribuo は、分類、回帰、クラスタリングなどのためのツールを提供するオープンソースの機械学習 Java ライブラリです。


この記事では、読者がJUnitの拡張モデルについてよく知っていると仮定して説明します。JUnitの拡張モデルやカスタム拡張の作成方法についてもっと知りたい方は、InfoQの私の記事を参照してください。さらに、読者がMLの概念に精通していることも前提に話を進めます。


例えば、base64でエンコードされた文字列を返すハッシュ関数を検証するユニットテストがあるとします。それは典型的には次のようなものでしょう。


public class HashUtilsTest {  @Test
public void validHashTest() {
var valueToHash = "JUnit with Tribuo is fun";
var actualHash = HashUtils.hash(valueToHash);
...
assertEquals(expectedHash, actualHash);
}
}


ここで、基礎となるハッシュ関数が変更され、実行は可能だが時間がかかるようになったとします。この関数はまだ正しいハッシュを生成しているので、ユニットテストは引き続きパスします。しかし、実行時間が長くなっていることに気づかないかもしれません。


テストクラスの実行にかかる総時間を計算するカスタム JUnit 拡張を作り、Tribuo の異常検出 ML モデルを実行して、テストの実行中に異常を見つけることができます。そのために、この拡張機能ではタイミングデータを CSV ファイルに記録し続けます。簡単のために、記録されるデータはすべて期待される観測値として素朴に解釈されます。Javaに内蔵されたファイルメソッドで実現できます。


var csvPath = ...
var time = ...
Files.writeString(
csvPath,
time + ",EXPECTED\n",
StandardCharsets.UTF_8,
StandardOpenOption.APPEND
);


十分なデータが記録されると、拡張モジュールは ML モデルを構築し、テストを実行したときに異常な観測結果を見つけるためにそれを使用します。Tribuo の強い型付けされたクラスは、次のサンプルコードに示すようにこれを実現するために使うことができます。


var oneClass = new SVMAnomalyType(SVMAnomalyType.SVMMode.ONE_CLASS); 
var params = new SVMParameters<>(oneClass, KernelType.RBF);
params.setGamma(MODEL_GAMMA);
params.setNu(MODEL_NU);
var trainer = new LibSVMAnomalyTrainer(params);
var model = trainer.train(trainingDataset);
var newRow = Map.of(
"name", clazz.getName(),
"duration", String.valueOf(durationInSec)
);
var headers = java.util.List.copyOf(newRow.keySet());
var row = new ColumnarIterator.Row(trainingDataset.size(), headers, newRow);
var example = sRowProcessor.generateExample(row,false).get();
prediction = model.predict(example);// This is where you would generate an actual report.
System.out.println(example);
System.out.println(prediction);


あとは、この新しい拡張機能を以下のようにテストクラスで使用するだけです。


@AnomalyDetector
public class HashUtilsTest {
@Test
public void validHashTest() {
...
assertEquals(expectedHash, actualHash);
}
}


上記の例では、通常、テストの実行に0.5~1秒程度かかるとします。しかし、ハッシュ関数を変更した後、テストを正常に実行するのに3秒かかるようになりました。これは、性能低下の可能性を示しています(もちろん、単純化しすぎですが)。もし学習済みモデルが正しく動作しているのであれば、この異常な動作は問題としてマークされるはずです。


テストクラスの実行タイミングが予想通りであった場合、モデルの予測は次のように表示されます。


Prediction(maxLabel=(EXPECTED,...


モデルが異常を検知すると、次のように表示されます。


Prediction(maxLabel=(ANOMALOUS,...


これはほんの手始めです。テストフレームワークの中でMLを活用することで、テストを自動解析し、より良いQAを提供するために、もっと有用なアプリケーションがあるかもしれません。JUnit や Tribuo のような優れたオープンソースライブラリのおかげで、そのようなユースケースを簡単に探索することができるのです。


実験的なコードはGitHubでチェックアウトできます。


会話に参加しよう


オラクルの開発者たちの様子を知りたい方は、私たちの公開Slackチャンネルにご参加ください。私たちはあなたの魚鉢になることを気にしません🐠。


コメント

このブログの人気の投稿

Oracle RACによるメンテナンスのためのドレインとアプリケーション・コンティニュイティの仕組み (2023/11/01)

Oracle Cloud Infrastructure Secure Desktopsを発表: デスクトップ仮想化のためのOracleのクラウドネイティブ・サービス (2023/06/28)

Oracle Cloudのデータベースをオブジェクト・ストレージにバックアップする3つの方法 (2021/12/13)