RecList 2.0 オープンソースによるMLモデルの体系的なテストシステム

RecList 2.0 Systematic Testing of ML Models with Open Source

柔軟性と評価のためのより良いサポートを提供する新しいRecList

Lucas Pezetaによる写真

はじめに

評価は複雑な問題です。評価パイプラインの作成に関与するさまざまなコンポーネントを管理することはしばしば難しいです。モデルはどこかにあり、ロードする必要があり、テストを取得して実行する必要があります。

そしてその後は?結果を保存しなければならず、オンラインで出力をログに記録して追跡する必要があるかもしれません。

これは常に困難な手続きですので、最近ではテストをより構造化された方法で行うようにしようとしました。このブログ記事では、オープンソースの評価パッケージであるRecList betaの使用方法を紹介し、説明します。RecListは、カスタムユースケースに対して簡単に拡張できるインターフェースを備えたスケーラブルなテストの一般的なプラグアンドプレイアプローチです。RecListはGitHubで無料で利用できるオープンソースプロジェクトです。

RecListを使用すると、評価コードの一部を分離し、自動的にストレージやログ出力などの複数の他の処理を処理するクラスにカプセル化することができます。

Reclistは、独自のモデルをトレーニングした後にテストを体系化し、必要な情報をすべて保存する簡単な方法を提供します。

RecListは数年前に取り組み始め、RecListのアルファバージョンは1年以上前にリリースされました。その間、RecListは400以上のGitHubスターを集めました。

私たちはRecListを使用し、CIKMでのRecSysチャレンジを実施し、現在はKDD 2023での次回のチャレンジの準備を進めています。RecListを使用することで、すべての参加者の評価を体系化することができます。アイデアは、すべての人に同じRecListを提供することで、異なる評価を比較しやすくすることです。私たちの経験の要約は、Nature Machine Intelligenceのコメント記事に掲載されています。

RecListは元々学術論文で紹介されましたが、Towards Data Scienceの記事にも一般的な概要が掲載されています。こちらをご覧ください:

NDCGだけでは十分ではありません

RecListを使用したRecSysの行動テスト

towardsdatascience.com

Chia, P. J., Tagliabue, J., Bianchi, F., He, C., & Ko, B. (2022, April). Beyond nDCG: Behavioral Testing of Recommender Systems with RecList. In Companion Proceedings of the Web Conference 2022 (pp. 99–104).

RecListは元々レコメンデーションシステムのテストのために設計されましたが、RecListを他の機械学習モデルのテストに使用することも可能です。では、なぜ新しいブログ記事なのでしょうか?それは、最初のバージョンを開発した後、いくつかの更新が必要であると気付いたからです。

私たちは何を学びましたか:APIの再考

何かを構築した後に改善方法がわかることはよくあります。

RecList 1.0を使用した方々には、RecList APIに重大な更新を行いました。元々、コード構造と入出力ペアに厳しい制約がありました。

実際、Reclistを実装する際には、いくつかの抽象的なインターフェースを作成する必要がありました。これにより、一連の共通の動作をこれらの抽象化によって結びつけることができました。しかし、すぐにこれがフローを複雑にすることが多く、いくつかの人々には追加の作業が必要になることに気付きました。

たとえば、元のRecList 1.0では、ユーザーが独自のモデルとデータセットを事前定義された抽象クラス(RecModelおよびRecDataset)でラップする必要がありました。これにより、これらの抽象化によって接続された共通の一連の動作を実装することができました。しかし、すぐにこれがフローを複雑にすることが多く、いくつかの人々には追加の作業が必要になることに気付きました。

「RecList 2.0」では、これらの制約をオプションにすることにしました:テストをより柔軟にしました。ユーザーは自分自身の評価ユースケースを定義し、便利なデコレーターでそれをラップすることで、メタデータのストレージとログ記録がすでに実装されます。ユーザーはテストインターフェースを他の人と共有し、同じ実験を実行することができます。

「この要約」:他の人が使用するソフトウェアを構築する際に、柔軟性がいかに重要かを認識しました。

RecList 2.0の実行

さて、RecListを使用して評価パイプラインを作成して実行するシンプルなユースケースを探ってみましょう。我々は、機械学習プロジェクトを作成する際に関与する複雑さを減らすために、ランダムに数値を出力する非常にシンプルなモデルを使用する予定です。

シンプルなユースケース

非常にシンプルなデータセットを使用した非常にシンプルなユースケースを作成しましょう。関連するカテゴリを持つ整数のターゲットシーケンスがあると仮定しましょう。単純にいくつかのランダムなデータを生成するだけです。

n = 10000target = [randint(0, 1) for _ in range(n)]metadata = {"categories": [choice(["red", "blue", "yellow"])                           for _ in range(n)]}

非常にシンプルなデータセットは次のようになります:

>>> target[0, 1, 0, 1, 1, 0]>>> metadata{"categories" : ["red", "blue", "yellow", "blue", "yellow", "yellow"]}

シンプルなモデル

今度は、ランダムに整数を出力するDummyModelがあると仮定しましょう。もちろん、これは「良い」モデルではありませんが、評価パイプライン全体を見るために使用できる良い抽象化です。

class DummyModel:  def __init__(self, n):          self.n = n      def predict(self):          from random import randint          return [randint(0, 1) for _ in range(self.n)]simple_model = DummyModel(n)# いくつかの予測を実行しましょうpredictions = simple_model.predict()

では、評価をどのように実行しますか?

シンプルなRecList

RecListは、RecListの抽象クラスから機能を継承したPythonクラスです。RecListはRecTestsを実装し、評価を体系化するためのシンプルな抽象化を提供します。たとえば、これは可能な正確性テストです。

@rec_test(test_type="Accuracy", display_type=CHART_TYPE.SCALAR)def accuracy(self):    """    正確性を計算する    """    from sklearn.metrics import accuracy_score    return accuracy_score(self.target, self.predictions)

sklearnの正確性メトリックを取り、別のメソッドでラップしています。これは、単純な正確性関数とは何が異なるのでしょうか? まあ、デコレーターによっていくつかの追加の機能を持ち込むことができます。たとえば、rectestは自動的にローカルフォルダに情報を保存することができます。また、チャートのタイプを定義することで、これらの結果のいくつかの視覚化が可能になります。

もしもっと洗練されたテストが必要な場合はどうでしょうか? たとえば、異なるカテゴリ(たとえば、赤いオブジェクトの正確性は黄色いオブジェクトよりも高いですか?)での正確性の安定性を見たい場合はどうでしょうか。

@rec_test(test_type="SlicedAccuracy", display_type=CHART_TYPE.SCALAR)def sliced_accuracy_deviation(self):    """    スライスごとの正確性を計算する    """    from reclist.metrics.standard_metrics import accuracy_per_slice        return accuracy_per_slice(        self.target, self.predictions, self.metadata["categories"])

さあ、完全なRecListの例を見てみましょう!

class BasicRecList(RecList):    def __init__(self, target, metadata, predictions, model_name, **kwargs):        super().__init__(model_name, **kwargs)        self.target = target        self.metadata = metadata        self.predictions = predictions    @rec_test(test_type="SlicedAccuracy", display_type=CHART_TYPE.SCALAR)    def sliced_accuracy_deviation(self):        """        スライスごとの正確性を計算する        """        from reclist.metrics.standard_metrics import accuracy_per_slice        return accuracy_per_slice(            self.target, self.predictions, self.metadata["categories"]        )    @rec_test(test_type="Accuracy", display_type=CHART_TYPE.SCALAR)    def accuracy(self):        """        正確性を計算する        """        from sklearn.metrics import accuracy_score        return accuracy_score(self.target, self.predictions)    @rec_test(test_type="AccuracyByCountry", display_type=CHART_TYPE.BARS)    def accuracy_by_country(self):        """        国ごとの正確性を計算する        """        # TODO: これは静的なテストであることに注意してください。バンの表示をショーケースするために使用されます        from random import randint        return {"US": randint(0, 100),                 "CA": randint(0, 100),                 "FR": randint(0, 100)}

1つの場所に必要なすべてを配置するためには、わずかな行のコードが必要です。このコードの一部を新しいモデルに再利用したり、テストを追加して過去のモデルを再実行したりすることができます。

メトリクスが値を返す限り、好きな方法で実装することができます。たとえば、このBasicRecListは特定のコンテキストで特定のモデルを評価します。ただし、GPT-RecListなどのモデル固有の推薦リストや、IMDB-Reclistなどのデータセット固有の推薦リストを生成することもできます。RecList上のディープモデルの例を見たい場合は、このcolabをチェックしてください。

実行と出力の取得

RecListを実行しましょう。ターゲットデータ、メタデータ、予測が必要です。ロガーとメタデータストアも指定できます。

rlist = BasicRecList(    target=target,    metadata=metadata,    predictions=predictions,    model_name="myRandomModel",)# run reclistrlist(verbose=True)

この手順の出力は何ですか?コマンドラインで次の結果セットが表示されます:各テストに対して実際のスコアがあります。

メトリクスは自動的にプロットされます。たとえば、AccuracyByCountryは次のように表示されるはずです:

Example of plot generated by a RecTest.

さらに、RecListは実行した実験のすべての情報を含むJSONファイルを保存します:

{  "metadata": {    "model_name": "myRandomModel",    "reclist": "BasicRecList",    "tests": [      "sliced_accuracy",      "accuracy",      "accuracy_by_country"    ]  },  "data": [    {      "name": "SlicedAccuracy",      "description": "スライスごとの正確さを計算します",      "result": 0.00107123176804103,      "display_type": "CHART_TYPE.SCALAR"    },...}

素晴らしいことは、わずかな追加のコード行で、ほとんどのロギングが自動的に処理されることです!

オンラインロガーやメタデータストレージの使用

デフォルトでは、RecListランナーは次のロガーとメタデータの設定を使用します。

logger=LOGGER.LOCAL,metadata_store= METADATA_STORE.LOCAL,

ただし、オンラインやクラウドソリューションを使用することもできます。たとえば、CometMLとNeptuneのAPIを使用して評価パイプラインで直接使用できるようにラップしています。S3データストレージにも対応しています。

たとえば、BasicReclistにいくつかのパラメータを追加すると、Neptuneに情報をログすることができます(Comet.mlにも同様のサポートを提供しています)!

rlist = BasicRecList(    target=target,    model_name="myRandomModel",    predictions=predictions,    metadata=metadata,    logger=LOGGER.NEPTUNE,    metadata_store= METADATA_STORE.LOCAL,    NEPTUNE_KEY=os.environ["NEPTUNE_KEY"],    NEPTUNE_PROJECT_NAME=os.environ["NEPTUNE_PROJECT_NAME"],)# run reclistrlist(verbose=True)

非常に似た方法で、次を追加すると:

bucket=os.environ["S3_BUCKET"]

S3バケットを使用してメタデータを保存することができます(もちろん、環境キーを設定する必要があります)。

結論

以上です!RecListは、推薦システムの評価をより体系的かつ整理されたものにするために作成されました。この大規模なAPIのリファクタリングが、信頼性の高い評価パイプラインの構築を支援することを願っています!

謝辞

2022年6月から12月までの間、私たちのベータ版の開発は、Comet、Neptune、Gantryの素晴らしい人々によってサポートされ、Unnati Patelの助けを借りて開発されました。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Related articles

Discover more