高度な特徴量エンジニアリングを使用して BigQuery ML でデータ前処理を行う方法
Google Cloud Japan Team
※この投稿は米国時間 2023 年 2 月 4 日に、Google Cloud blog に投稿されたものの抄訳です。
元データを前処理し、特徴量に変換する作業は ML プロセスにおいて重要ですが、時間がかかります。データ サイエンティストやデータ エンジニアが MLOps を実施するために異なるプラットフォーム間でデータを移動させなければならない場合、これは特に問題となります。今回のブログ記事では、BigQuery ML に 2 つの特徴量エンジニアリング機能を追加して、このプロセスを合理化する方法をご紹介します。
前回のブログ記事では、BigQuery ML でのデータから AI までの過程を説明しました。特に、MLOps を簡素化する 2 つの優れた機能である、特徴量エンジニアリングのデータ前処理関数と、モデル アーティファクトの一部として BigQuery ML TRANSFORM ステートメントをエクスポートする機能をご紹介しました。今回のブログ記事では、これらの機能を使用して BigQuery ML から Vertex AI へのシームレスなエクスペリエンスを作成する方法を説明します。
データ前処理関数
元データを前処理し、特徴量に変換する作業は、ML を運用化する際の重要な作業ですが、時間がかかります。Google は先頃、BigQuery ML の高度な特徴量エンジニアリング関数の公開プレビュー版を発表しました。これは、データを代入、正規化、エンコードするための関数です。データベース(BigQuery)内でこの処理が行われることで、データ前処理のプロセス全体が簡単かつ迅速に、そして安全になります。
このリリースで導入される新しい関数のリストを以下に示します。すべての前処理関数のリストはこちらをご覧ください。
ML.MAX_ABS_SCALER
最大絶対値での除算によるセンタリングを行わずに、数値列を範囲 [-1, 1] にスケールします。ML.ROBUST_SCALER
中央値(任意)および特定の四分位範囲(デフォルトでは [25, 75])での除算を使用したセンタリングによって、数値列をスケールします。ML.NORMALIZER
入力数値配列を、任意の p-norm(0、1、>1、+inf)の単位ノルム配列に正規化します。デフォルトは 2 で、この場合は平方和が 1 の正規化配列になります。ML.IMPUTER
数値入力またはカテゴリ入力の欠損値を、平均値、中央値、または最頻値に置き換えます。ML.ONE_HOT_ENCODER
カテゴリ入力をワンホット エンコードします。また、必要に応じて最頻値をドロップすることでダミー エンコードを行います。最頻カテゴリの個数を表す k や、カテゴリの頻度の下限しきい値を指定することで、エンコードのサイズを制限することもできます。ML.LABEL_ENCODER
カテゴリ入力を整数値 [0, n カテゴリ] にエンコードします。0 は NULL と除外されたカテゴリを表します。カテゴリを除外するには、k 個の最頻カテゴリを表す k や、カテゴリの頻度の下限しきい値を指定します。
TRANSFORM ステートメントを使用したモデルのエクスポート
特徴量 TRANSFORM ステートメントを含む BigQuery ML モデルをエクスポートできるようになりました。TRANSFORM ステートメントを含められるようになったことで、オンライン予測のためにモデルをエクスポートする際のモデルの移植性が向上します。この機能は、BigQuery ML モデルが Vertex AI Model Registry に登録され、Vertex AI Prediction エンドポイントにデプロイされる場合にも機能します。モデルのエクスポートについての詳細は、BigQuery ML モデルのエクスポートをご覧ください。
これらの新機能は、Google Cloud コンソール、BigQuery API、クライアント ライブラリから利用できます。
2 つの機能を使用する手順ガイド
このチュートリアルでは、bread recipe competition(パンレシピ コンテスト)データセットを使用して、線形回帰モデルとブーストツリー モデルで審査員の評価を予測します。
目標: 新しい関数を使用したデータの前処理方法を理解できるようにするため、モデルを Vertex AI Model Registry に登録し、Vertex AI Prediction エンドポイントを使用したオンライン予測のためにモデルをデプロイします。
データセット: 各行はパンのレシピを表し、材料(小麦粉、塩、水、イースト)の列と手順(こねる時間、こねる速度、調理温度、発酵時間)の列があります。また、各レシピの完成品に対する審査員の評価を含む列もあります。
チュートリアルの概要: ステップ 1 と 2 は、TRANSFORM ステートメントの使用法を説明します。ステップ 3 と 4 は、モデルを手動でエクスポートして登録する方法を説明します。ステップ 5 から 7 は、モデルを Vertex AI Prediction エンドポイントにデプロイする方法を説明します。
学習効果を高めるために、このブログ投稿と併せてチュートリアル ノートブックもご覧ください。
ステップ 1: SQL を使用して BigQuery の列を ML で使用する特徴量に変換する
ML モデルをトレーニングする前に、データの種類、分布、スケール、欠損パターン、極値を特定するために、列内のデータを探索する必要があります。BigQuery ML では、SQL を使用してこの探索的分析を行えます。新しい前処理関数により、反復処理で最適な変換を検出しながら、SQL を使用して BigQuery の列を ML の特徴量に変換する処理がさらに容易になりました。たとえば、入力列に ML.MAX_ABS_SCALER 関数を使用すると、各値が最大絶対値(この例では 10)で除算されます。ML モデルの入力列が特定され、特徴量変換が選択されたら、変換を適用して出力をビューとして保存したくなります。ただし、予測をリクエストする前にこの同じ変換を適用する必要があることから、このようにすると後から予測に影響が及びます。ステップ 2 では、処理とモデル トレーニングの分離を防ぐ方法を説明します。
ステップ 2: インライン TRANSFORM 関数を使用して複数のモデルを反復処理する
ステップ 1 での前処理の探索に基づき、TRANSFORM ステートメントを使用したモデル トレーニングに、選択された変換がインラインで適用されます。これにより、モデルの反復処理と前処理探索が連携され、任意の候補モデルが BigQuery 内外でサービング可能な状態になります。つまり、後から予測に対する特徴量変換の影響が出ることなく、複数のモデルタイプをすぐに試すことができます。このステップでは、線形回帰モデルとブーストツリー モデルという 2 つのモデルを、同じ TRANSFORM ステートメントを使用してトレーニングし、その結果を比較します。
線形回帰モデルによるトレーニング - モデル a
ブーストツリー モデルによるトレーニング - モデル b
同じ前処理が行われた同一の入力列があるため、モデルの精度を容易に比較できます。BigQuery ML 関数 ML.EVALUATE を使用すると、この比較は、UNION ALL 集合演算子を使用してこれらの結果を結合する 1 つの SQL クエリでの単純な比較になります。
評価比較の結果から、ブーストツリー モデルを使用した場合は、平均二乗誤差が大幅に低く、r2 が高い、線形回帰よりもはるかに優れたモデルとなることがわかります。
いずれのモデルも予測をサービングできますが、ブーストツリー リグレッサーの方が明らかに優れています。使用するモデルを決定したら、ML.PREDICT 関数を使用して BigQuery ML 内で直接予測を行えます。チュートリアルの後半では、BigQuery ML 外部にモデルをエクスポートし、Google Cloud Vertex AI を使用して予測する方法を説明します。
BigQuery 外部での推論に BigQuery モデルを使用する
モデルのトレーニングが完了し、オンライン予測用のアプリケーションで応答のレイテンシが低いオンライン推論を行うためには、モデルを BigQuery 外部にデプロイする必要があります。以下の手順では、モデルを Vertex AI Prediction エンドポイントにデプロイする方法を説明します。
これには、次の 2 通りの方法があります。
BigQuery ML からモデルを手動でエクスポートし、Vertex AI Prediction エンドポイントを設定します。これを行うには、最初にステップ 3 と 4 を行う必要があります。
Vertex AI Model Registry へのモデルの登録と Vertex AI Model Registry からのデプロイを自動的に行います。この機能はまだ提供されていませんが、今後のリリースで提供される予定です。この機能の提供後は、ステップ 3 と 4 は省略できます。
ステップ 3. BigQuery からモデルを手動でエクスポートする
BigQuery ML は、モデルを BigQuery 外部へデプロイするために EXPORT MODEL ステートメントをサポートしています。手動でのエクスポートには 2 つのモデル(TRANSFORM ステートメントを反映した前処理モデルと、予測モデル)が含まれます。BigQuery ML で 1 つのエクスポート ステートメントを使用して両方のモデルがエクスポートされます。TRANSFORM ステートメントをキャプチャする前処理モデルが TensorFlow SavedModel ファイルとしてエクスポートされます。この例では、これは ‘gs://statmike-mlops-349915-us-central1-bqml-exports/03/2b/model/transform’ にある GCS バケットにエクスポートされます。
前処理モデルは、BigQuery ML によるモデルのトレーニングに使用されたフレームワークに一致する、移植可能な形式で保存されます。線形回帰モデルは TensorFlow SavedModel としてエクスポートされ、ブーストツリー リグレッサーは Booster ファイル(XGBoost)としてエクスポートされます。この例では、ブーストツリー モデルは ‘gs://statmike-mlops-349915-us-central1-bqml-exports/03/2b/model’ にある GCS バケットにエクスポートされます。
これらのエクスポート ファイルはネイティブ モデルタイプの標準オープン形式であるため、完全に移植可能であり、どこへでもデプロイできます。Vertex AI(以下のステップ 4~7)、独自のインフラストラクチャ、さらにはエッジ アプリケーションにもデプロイできます。
ステップ 4~7 は、モデルを Vertex AI Prediction エンドポイントに登録して、デプロイする方法を説明します。これらのステップは、前処理モデルと予測モデルそれぞれに対して繰り返す必要があります。
ステップ 4. Vertex AI Model Registry にモデルを登録する
モデルを Vertex AI Prediction にデプロイするには、まずモデルを Vertex AI Model Registry に登録する必要があります。このためには 2 つの入力(モデルファイルへのリンクとビルド済みコンテナの URI)が必要です。チュートリアルのステップ 4 に進み、この方法を確認します。
登録は Vertex AI コンソールから行うことも、いずれかのクライアントを使用してプログラマティックに行うこともできます。以下の例では、Vertex AI の Python クライアントを使用してモデルを登録します。ステップ 5. Vertex AI Prediction エンドポイントを作成する
Vertex AI には、オンライン予測のためにモデルをホストするサービスが含まれています。Vertex AI Prediction エンドポイントでモデルをホストするには、まずエンドポイントを作成します。これは、Vertex AI Model Registry コンソールから直接行うことも、いずれかのクライアントでプログラマティックに行うこともできます。以下の例では、Vertex AI の Python クライアントを使用してエンドポイントを作成します。ステップ 6. エンドポイントにモデルをデプロイする
Vertex AI Model Registry(ステップ 4)から Vertex AI Prediction エンドポイント(ステップ 5)へのモデルのデプロイは、1 回のデプロイ アクションで行われます。このアクションでは、モデル定義と使用するマシンのタイプがエンドポイントに提供されます。Vertex AI Prediction エンドポイントは、使用するレプリカの数(デフォルトでは最大値と最小値は 1)を指定することで、予測トラフィックのニーズに対応するために自動的にスケールアップまたはスケールダウンできます。以下の例では、Vertex AI の Python クライアントを使用し、モデル(ステップ 4)を使用したエンドポイント(ステップ 5)に対して deploy メソッドを実行しています。ステップ 7. エンドポイントに予測をリクエストする
モデルが Vertex AI Prediction エンドポイントにデプロイされたら(ステップ 6)、予測をサービングできます。インスタンスと呼ばれるデータ行がエンドポイントに渡され、処理された情報(前処理結果または予測)を含む結果が返されます。Vertex AI Prediction エンドポイントからの予測結果は、Vertex AI API インターフェース(REST、gRPC、gcloud、Python、Java、Node.js)を使用して取得できます。以下の例では、Vertex AI の Python クライアントを使用して、エンドポイント(ステップ 6)の predict メソッドによってリクエストが直接示されています。前処理モデルがデプロイされているエンドポイントの結果は、BigQuery ML から TRANSFORM ステートメントを適用した場合と同じになります。その後、BigQuery ML の ML.PREDICT 関数の結果と一致する予測をサービングするために、予測モデルを使用して結果をエンドポイントにパイプラインで送信できます。モデルの結果が複製されたことを示すため、チュートリアルでは Vertex AI Prediction エンドポイントを使用する方法と、BigQuery ML と ML.PREDICT を使用する方法の両方の結果を並べて表示しています。これで、極めてレイテンシの低いオンライン サービングにこのモデルを使用できます。プライベート エンドポイントを使用してさらにレイテンシを低くすることや、VPC ネットワーク ピアリングで接続の安全性を確保することもできます。
まとめ
新しい前処理関数を利用することで、データ探索と特徴量の前処理を簡素化できます。さらに、TRANSFORM ステートメントを使用してモデルのトレーニングに前処理を組み込めば、準備済みのモデルを使用でき、追加ステップが不要になるため、サービング プロセスが簡素化されます。つまり、BigQuery 内で直接予測を行うこともできますし、オンライン サービングのためにモデルを BigQuery 外部(Vertex AI Prediction など)にエクスポートすることもできます。このチュートリアルでは、BigQuery ML と Vertex AI Model Registry および Vertex AI Prediction の連携によってシームレスなエンドツーエンド ML エクスペリエンスを作成する方法を説明しました。将来的には、BigQuery、BigQuery ML、Vertex AI を連携させる機能がさらに登場する予定です。
ここをクリックすると、チュートリアルにアクセスできます。BigQuery ML の詳細をお知りになりたい場合は、ドキュメントをご覧ください。
BigQuery ML チームの Ian Zhao、Abhinav Khushraj、Yan Sun、Amir Hormati、Mingge Deng、Firat Tekiner に感謝いたします。
- ソフトウェア エンジニア Jiashang Liu