AutoML on OCI:OCI上で信頼性の高い機械学習モデルを迅速かつ容易にデプロイ可能 (2022/03/01)
AutoML on OCI:OCI上で信頼性の高い機械学習モデルを迅速かつ容易にデプロイ可能 (2022/03/01)
投稿者: Chris Carpenter | Staff Cloud Engineer
2021年3月、Oracle Autonomous Databaseの上に載るOracle Machine Learningに新機能が上陸しました。AutoMLです。新しいAutoMLユーザーインターフェースは、Autonomous Database内に存在するデータを使用してモデルを作成およびデプロイできる、ローコードでブラウザベースのソリューションです。このブログでは、データのロード、データのクリーニング、AutoML UIによるモデルの作成、モデルのデプロイ、そして最終的な予測の生成のプロセスを説明します。
AutoML UIは何をするのか?
AutoMLは単にモデルを作成するだけではありません。実験パイプライン全体を実行し、適切な機能を持つ調整済みモデルを生成します。データベース内で選択されたデータを使用して、AutoMLはアルゴリズムを選択し、データをサンプリングし、特徴選択を行い、最後に必要に応じてハイパーパラメータをチューニングします。次の図は、このプロセスを示しています。
AutoMLの機能については、デモをご覧いただく前に、こちらのブログ記事をご覧ください。
データの読み込み
AutoMLはAutonomous Database内のデータに対して直接実行されます。ユーザーがアクセスできるテーブルにデータがある限り、そのデータを使ってモデルをトレーニングし、デプロイすることができます。
このブログでは、いくつかの異なる特徴に基づき、様々な車の燃費を1ガロンあたりのマイル数で測定するデータセットを扱います。このデータセットはKaggleで見つけることができ、元々はUCI Machine Learningのリポジトリから提供されたものです。
CSVファイルを入手したら、Autonomous Databaseインスタンスのサービスコンソール内にあるクラウドネイティブのDatabase Actionsコンソールか、ローカルのSQL Developerアプリケーションから、Autonomous Databaseにロードすることができます。
Oracle Cloud Infrastructure(OCI)のFree TierにAutonomous Databaseをデプロイする手順と詳細については、Using Oracle Autonomous Database on Shared Exadata Infrastructureとドキュメントを参照してください。
データセットの最初の数行を見てみましょう。
最初の列は、応答変数であるmiles per gallonです。シリンダー数、排気量、馬力、重量、加速度、モデル年、生産国、そして最後に「Car Name」という有用なテキストを含むフィールドからなる予測変数の一式があります。これらのフィールドのほとんどは、機械学習の準備が整っているように見えますが、まだデータ変換が残っています。
OML4Pyでデータの前処理
どのツールを選んでも、まずモデルの学習プロセスのためにデータを準備する必要があります。Autonomous Databaseに接続するOracle Machine LearningのNotebooks内で実行できる、シンプルなOML4Pyスクリプトを作成します。OML4Pyでは、Pythonを使用してAutonomous Database内のデータとやり取りすることができます。
OML Notebookの詳細については、「Autonomous DatabaseでOracle Machine Learningを使用」を参照してください。また、スクリプトに飛び込む前に、ドキュメントでOML4Pyに慣れることができます。ドキュメントには、いくつかの役立つLiveLabsへのリンクのセットがあります。
以下のコードスニペットは、データを含む同じAutonomous Databaseインスタンス上で動作するMachine Learning Notebookで実行されました。このコードを実行するには、Notebookを作成するだけです。Autonomous Database のユーザーが Autonomous Database 上で Machine Learning を行うように設定されていない場合は、ドキュメントに従います。
同じように従うには、[Notebooks] をクリックします。
[Create]をクリック
まず、以下のPythonパッケージをインポートして、データを読み込みます。
%python
import oml
import numpy as np
import pandas as pd
query = 'SELECT * FROM USER1.AUTO_MPG_RAW'
data = oml.sync(query=query)
このコードブロックでは、単純なselectクエリを使って、テーブルAUTO_MPG_RAWのプロキシであるPythonオブジェクト "data"を生成しています。
pandasでデータ変換を行うために、このオブジェクトに対して以下のpullメソッドを使用し、メモリ上にpandas DataFrameを作成します。
%python
df = data.pull()
次に、いくつかのクリーニングを行います。
次のコードでは、列名をすべて小文字にし、データ中の疑問符をNaNに置き換え、馬力の種類を調整しています。
というのも、もともと「?」がついている欠損値によって、文字列として読み込まれてしまうからです。
%python
df.columns = [x.lower() for x in df.columns]
df = df.replace('?', np.nan)
df.horsepower = df.horsepower.astype('float')
「Car Name」列には、ブランド名など、私たちのモデルにとって価値のある情報がたくさん入っています。次のブロックは、新しいカラム "brand" に抽出できる情報を示しています。
%python
df['brand'] = df['car_name'].str.extract('(^.*?)\s')
df.loc[df.brand == 'mercedes-benz', 'brand'] = 'mercedes'
df.loc[df.brand == 'vw', 'brand'] = 'volkswagen'
df.loc[df.brand == 'volkswagen', 'brand'] = 'volkswagen'
df.loc[df.brand == 'toyouta', 'brand'] = 'toyota'
df.loc[pd.isnull(df.brand), 'brand'] = 'subaru'
df.loc[df.brand == "maxda", 'brand'] = 'mazda'
df.loc[df.brand == "capri", 'brand'] = 'ford'
df.loc[df.brand == any(['chevy', 'chevrolet', 'brand']), 'brand'] = 'chevrolet'
また、この表の情報を読みやすくするために、「原産地」の特徴を、車の原産地として適切な国に変換しています。
%python
df['Country'] = df.origin.replace([1,2,3],['United States','Europe','Japan'])
カテゴリ変数が提示されると、AutoMLはモデルで必要なダミー変数を生成します。
さて、欠損値を処理しましょう。以下のクエリを実行すると、先ほどNaNに設定した馬力の欠測値が表示されます。
%python
df[df.isna().any(axis=1)]['horsepower']
これらの行は単純に削除することもできますが、代わりにブランド別の馬力の中央値を入力してみましょう。
%python
df['horsepower'] = df['horsepower'].fillna(df.groupby('brand')['horsepower'].transform('median'))
最後に、create メソッドを使用して、変換後のデータを含むテーブルをデータベースに作成しましょう。不要になった機能は、以下のコマンドで削除します。
%python
df.drop(['car_name','origin'], axis=1, inplace=True)
oml.create(df, table = 'MPG')
これで、AutoMLで使用できるクリーンなデータセットができました
モデルのトレーニング
ここで、Autonomous Database上の新しいAutoML UIが輝きます! シンプルでローコードなインターフェースを使って、クレンジングされたデータからいくつかのモデルを構築することができます。
まず、AutoMLのページに移動します。
[Create]をクリック
ここでは、以下の内容を記入します。
- 名前:オートMPG実験
- コメント:クリーンアップされたAuto-MPGデータセットに対するモデルの学習
- データセット:MPG (クレンジングされたデータを含むテーブル)
- 予測タイプ:Regression (連続応答変数)
- 予測:mpg (レスポンス変数)
- ケースID:未選択のまま (オプションのパラメータ)
- 追加設定:すべての値をデフォルトのままにして、メトリックスをR2に設定
追加設定として、学習させるモデル、使用する指標、学習の実行時間などを細かく制御することができます。私たちはR2を選択しました。これは応答の分散のうち、どの程度が特徴によって説明されるかを測定するものです。
特徴量といえば、最後のステップでは、モデルの特徴量を選択します。今回は、OML4Pyスクリプトの最後に不要な素性を削除したため、存在する全ての素性を選択します。
これで、「開始」、「精度を上げる」の順にクリックして、実験を実行することができます。この選択により、トレーニング時間は長くなりますが、より効果的なモデルのセットを生成することができます。
モデルの学習が進むと、グラフィック上にリーダーボードがデプロイされ、実験パイプラインの現在のステージが表示されます。
結果の表示
実験が完了すると、学習されたモデルのセットがAutonomous Data Warehouseで利用可能になります。これらのモデルは、先ほど選択した指標(この場合はR2)に基づき、最終的なリーダーボードにランク付けされて表示されます。以下のスクリーンショットでは、ガウシアンカーネルを用いたサポートベクターマシンモデルが最も良い結果を出していることが分かります。
このモデル名をクリックすると、最もインパクトのあった機能を見ることができます。
この場合、車の重量、馬力、年式が燃費の予測に最も大きな影響を与えることがわかり、納得がいく結果となりました
モデルをデプロイ
これらのモデルの学習が完了したら、Autonomous Database内でSQLを使用して関数として呼び出すか、Oracle Analytics Cloudの接続されたインスタンスでモデル成果物として呼び出すことができるようになります。また、AutoML UIから直接、RESTエンドポイントとして簡単にデプロイすることもできます。
まず、SVM(ガウシアン)モデルをハイライトし、「デプロイ」をクリックします。
必要事項を入力してください。
ここでは、名前とURIに「svm_mpg」、バージョンに「0.1」を使用しました。
さて、このモデルはRESTエンドポイントとしてデプロイされています。Oracle Machine LearningのModelsセクションのDeploymentsタブで見ることができますが、より重要なのは、予測を生成するために呼び出しを発行することです。
cURLを使用して、その通りにしてみましょう。
予測値を生成
基本的な例として、ローカルのBashシェルでいくつかの環境変数を設定し、いくつかのコマンドを発行することで予測を生成することができますね。詳しくはドキュメントを参照してください。
まず、テナントとAutonomous Data Warehouseのデプロイについて、いくつかの環境変数を設定しましょう。
export tenant='<tenancy_ocid>'
export username='<db_username>'
export password='<db_password>'
export database='<db_name>'
export omlserver='https://adb.us-ashburn-1.oraclecloud.com'
このコードブロックでは、テナントOCID、データベースユーザーのユーザー名とパスワード、データベース名、OMLサーバーのURLなど、いくつかの値を設定しています。この例では、Ashburnでのデプロイを使用していますが、URLの'us-ashburn-1'の部分を関連するリージョンに変更することができます。
次に、アクセストークンを取得します。これは REST エンドポイントを呼び出す際の認証に使用します。先ほどの環境変数を使って、次のような呼び出しを行うことができます。
curl -i -k -X POST --header 'Content-Type: application/json'
--header 'Accept: application/json' -d '{"grant_type":"password",
"username":"'${username}'", "password":"'${password}'"}'
"${omlserver}/omlusers/tenants/${tenant}/databases/${database}/api/oauth2/v1/token"
このコマンドは、JSONオブジェクトを出力します。"accesstoken"キーの値は、長い文字列になっています。次のコマンドをコピー&ペーストして、トークンを包むアポストロフィーを含めて、最後の環境変数を作成します。
export token='<accesstoken>'
さて、モデルのエンドポイントに対していくつかのコールを発行することができます。次のコマンドを発行して、モデルのメタデータと入力パラメータを取得します。
curl -X GET "${omlserver}/omlmod/v1/deployment/svm_mpg" \
--header "Authorization: Bearer $token" | jq
このコマンドは次のような結果を生成します。
ここでは、手元のモデリングタスク(回帰)、モデルの学習に使用したアルゴリズム(サポートベクターマシン)、さまざまな入力とその種類を見ることができます。
では、実際に予測を生成してみましょう!
次の呼び出しでは、ガロンあたりのマイル数を予測したい車の詳細を示すJSONオブジェクトを含めています。次のコードブロックは、そのオブジェクトを示しています。
{
"cylinders":4,
"displacement":68,
"horsepower":49,
"weight":1867,
"acceleration":19.5,
"model_year":73,
"brand":"fiat",
"Country":"Europe"
}
次のコマンドは、エンドポイントに呼び出しを発行します。
curl -X POST "${omlserver}/omlmod/v1/deployment/svm_mpg/score" \
--header "Authorization: Bearer ${token}" \
--header 'Content-Type: application/json' \
-d '{"inputRecords":[{
"cylinders":4,
"displacement":68,
"horsepower":49,
"weight":1867,
"acceleration":19.5,
"model_year":73,
"brand":"fiat",
"Country":"Europe"
}]}'| jq
次のスクリーンショットは、その結果を示したものです。
このモデルは、この車の燃費が1ガロンあたり約30マイルであることを予測していることがわかります。
まとめ
Autonomous Databaseの上にOracle Machine Learningが提供する使いやすいフレームワークで、我々は多くの分野をカバーしました。
SQL用のPythonインターフェースを使用してデータを操作し、データベースにクレンジングしたデータを格納し、AutoMLを使用して数クリックで完全なエンドツーエンドのモデル作成パイプラインを完了し、ワンクリックでモデルをデプロイし、最後にそのモデルを使って予測を生成しました。
このプロセスは、Autonomous Database上での機械学習のパワーと使いやすさを示しており、特にAutoML UIを通じてエンドユーザーに提供されるパワーを示しています。
関連リンク
コメント
コメントを投稿