2025年7月2日水曜日

OML4SQLのサンプルスクリプトのCREATE_MODELの呼び出しをCREATE_MODEL2に置き換える

OML4SQLでは機械学習モデルを作成するプロシージャとして、以下の2つを提供しています。

DBMS_DATA_MINING.CREATE_MODEL
DBMS_DATA_MINING.CREATE_MODEL2

Oracle Machine Learning for SQL
User's Guide 23ai

パッケージDBMS_DATA_MININGのリファレンスは以下です。機械学習モデルに与えるパラメータの説明も含みます。

PL/SQL Packages and Types Reference
23ai

プロシージャCREATE_MODEL2はCREATE_MODELを完全に置き換えます。

CREATE_MODELの引数は以下になります。
PROCEDURE CREATE_MODEL(
                  model_name            IN VARCHAR2,
                  mining_function       IN VARCHAR2,
                  data_table_name       IN VARCHAR2,
                  case_id_column_name   IN VARCHAR2,
                  target_column_name    IN VARCHAR2 DEFAULT NULL,
                  settings_table_name   IN VARCHAR2 DEFAULT NULL,
                  data_schema_name      IN VARCHAR2 DEFAULT NULL,
                  settings_schema_name  IN VARCHAR2 DEFAULT NULL,
                  xform_list            IN TRANSFORM_LIST DEFAULT NULL);
機械学習モデルに与えるデータは、引数data_table_nameおよび引数data_schema_nameで指定します。引数data_table_nameには、モデルが扱うデータを持つ表またはビューを指定します。通常は既存のスキーマにあるデータを元に機械学習モデル向けに準備する必要があるため、新たに表またはビューを作成します。

機械学習モデルに与えるパラメータは、引数settings_table_nameおよび引数settings_schema_nameで指定します。モデルにパラメータを渡すには、まず表を作成して、その表にパラメータ名と値のペアを保存する必要があります。

つまり、機械学習モデルを作成するたびにデータ表(またはビュー)とパラメータ表を作成する必要があります。機械学習モデルを削除するときは、それらの表も一緒に削除する必要があります。結果として、機械学習モデルの管理が煩雑になります。

プロシージャCREATE_MODEL2では、データ表がSELECT文(引数data_query)に置き換えられています。また、パラメータ表はDBMS_DATA_MINING.SETTING_LIST(キーがVARCHAR2(30)、バリューがCLOBの連想配列)(引数set_list)に置き換えられています。機械学習モデルに紐づくデータベース・オブジェクトが無くなっているため、機械学習モデルの管理が容易になっています。
DBMS_DATA_MINING.CREATE_MODEL2 (     
                  model_name            IN VARCHAR2,     
                  mining_function       IN VARCHAR2,     
                  data_query            IN CLOB,     
                  set_list              IN SETTING_LIST,     
                  case_id_column_name   IN VARCHAR2 DEFAULT NULL,     
                  target_column_name    IN VARCHAR2 DEFAULT NULL,     
                  xform_list            IN TRANSFORM_LIST DEFAULT NULL);
アルゴリズムやパラメータを変えて評価を繰り返す作業をやりやすくするために、プロシージャCREATE_MODEL2を作成したのではないかと思います。

しかし、OML4SQLのサンプル・スクリプトの多くは機械学習モデルの作成に、DBMS_DATA_MINING.CREATE_MODELを呼び出してしています。


サンプル・スクリプトを元に機械学習モデルを作成する際に、毎回CREATE_MODELの呼び出しをCREATE_MODEL2に置き換えるのは大変なので、あらかじめ全てのサンプル・スクリプトのCREATE_MODELの呼び出しをCREATE_MODEL2に置き換えました。


最初はClaude Sonnet 4に以下のプロンプトを与えて、アタッチしたSQLファイルを変換させてみました。
添付のファイルはOracle DatabaseのOracle Machine Learning for SQLのサンプル・コードです。

このファイルに書かれているPL/SQLコードで使用しているDBMS_DATA_MINING.CREATE_MODELの代わりにDBMS_DATA_MINING.CREATE_MODEL2を使って書き直してください。

DBMS_DATA_MINING.CREATE_MODELについては、以下のリンクで説明されています。
https://docs.oracle.com/en/database/oracle/machine-learning/oml4sql/23/dmprg/CREATE_MODEL-procedure.html

DBMS_DATA_MINING.CREATE_MODEL2については、以下のリンクで説明されています。
https://docs.oracle.com/en/database/oracle/machine-learning/oml4sql/23/dmprg/CREATE_MODEL2-procedure.html

DBMS_DATA_MINING.CREATE_MODEL2の呼び出し例です。settings_table_nameではなくSET_LISTを使い、DBMS_DATA_MINING.SETTING_LISTで宣言した変数を渡してください。

v_setlistの設定値は文字列として設定してください。設定値は以下のリンクで説明されています。
https://docs.oracle.com/en/database/oracle/oracle-database/23/arpls/DBMS_DATA_MINING.html

```
DECLARE
    v_setlst DBMS_DATA_MINING.SETTING_LIST;
BEGIN
    v_setlst('ALGO_NAME')               := 'ALGO_APRIORI_ASSOCIATION_RULES';
    v_setlst('PREP_AUTO')               := 'ON';
    v_setlst('ASSO_MIN_SUPPORT')        := '0.04';
    v_setlst('ASSO_MIN_CONFIDENCE')     := '0.1';
    v_setlst('ASSO_MAX_RULE_LENGTH')    := '2';
    v_setlst('ASSO_CONS_EX_RULES')      := '''a'',''b''';
    v_setlst('ODMS_ITEM_ID_COLUMN_NAME'):= 'PROD_NAME';
    v_setlst('ASSO_AGGREGATES')         := 'AMOUNT_SOLD';


    DBMS_DATA_MINING.CREATE_MODEL2(
        MODEL_NAME        => 'AR_SH_SAMPLE',
        MINING_FUNCTION   => 'ASSOCIATION',
        DATA_QUERY        => 'select * from SALES_TRANS_CUST',
        SET_LIST          => v_setlst,
        CASE_ID_COLUMN_NAME => 'CUST_ID');
END;
```

DBMS_DATA_MINING.CREATE_MODEL以外、ビジネスケースのコードなどは一切変更しないでください。
Claude Sonnet 4からは以下の回答が返され、サンプル・スクリプトも更新されます。


変更すべきポイントは正しく認識されていて、変更されたサンプル・スクリプトがそのまま動作するケースもありました。

今回の作業ではAIが生成したコードを参考にしましたが、書き換えは手作業で行なっています。もしすでにDBMS_DATA_MINING.CREATE_MODELを呼び出して機械学習モデルを作成しているコードがあれば、AIで書き換えても良いかもしれません。

これからOML4SQLを使ってみようという方のお役に立てば幸いです。