2025年7月30日水曜日

Oracle Machine LearningのAutoMLで作成したモデルをエクスポートし別環境にインポートする

Oracle Machine LearningではAutoMLとして、2つの異なる方法が提供されています。

1つ目は、Autonomous Databaseで使用できるOML AutoML UIです。


もうひとつは、OML4Pyが提供しているAutomated Machine Learningの機能です。

Oracle Machine Learning for Python
User's Guide, Release 2.1 for Oracle Database 23ai

Oracle Machine Learning for Python
API Reference, Release 2.1(これはPDF文書です)
3 Automatic Machine Learning

本記事ではOML4PyのAutomated Machine Learningの10.6 AutoML Pipeline(およびAPI Referenceの3.5 AutoML Pipeline)の手順に沿って、scikit-learnの乳がんの診断データから良性か悪性かを診断するモデルを作成します。

以下の作業を実施します。
  • Autonomous DatabaseのOMLノートブックでOML4PyのAutoMLを実行して、機械学習モデルを作成します。作成したモデルはシリアライズした形式でエクスポートします。
  • Autonomous DatabaseのAutoML UIで機械学習のモデルを作成します。作成したモデルを一つ選び、シリアライズした形式でエクスポートします。
  • オンプレミスのデータベースでOML4PyのAutoMLを実行して、機械学習モデルを作成します。作成したモデルはシリアライズした形式でエクスポートします。
  • それぞれエクスポートした機械学習モデルを別のデータベースにインポートし、予測を行います。
Autonomous DatabaseはAlways Freeのバージョン23ai、オンプレミスはOracle Database 23ai Freeの環境で作業を行います。また、作業にOracle APEXを使用するため、Oracle APEXのワークスペース・スキーマにOMLを使用する権限を与えます。そのワークスペース・ユーザーでOMLノートブックに接続し、作業を実施します。

Autonomous DatabaseのOMLノートブックでの作業から始めます。

OMLノートブックに接続します。

OMLユーザーをオンにしたAPEXのワークスペース・ユーザーでサインインします。

https://<ホスト識別子>-<データベース名>.adb.<リージョン名>.oraclecloudapps.com/oml/

以下はユーザーWKSP_APEXDEVでサインインしています。


注意:
私の環境依存だと思うのですが、サインインに成功したのち、HTTP 404 Not Foundのエラーが発生することがあります。


URLの.../oml/以降に繋がっている文字列をすべて削除して、URLにアクセスし直すと次のページに正常に遷移します。


ノートブックを開きます。


10.6 AutoML PipelineのExample 10-5 Using the oml.automl.Pipeline Classのコードでは、scikit-learnのデータセットのロードから始まる処理が1本のスクリプトになっています。scikit-learnのデータセットからロードする乳がんの診断データを、AutoML UIからも使用するため、診断データを保存する表を作成するスクリプトとAutoMLを実行するスクリプトは別にします。

OMLノートブックで以下のスクリプトを実行し、表BREAST_CANCERに乳がんの診断データをロードします。元のスクリプトでは表名がBreastCancerとして作成されますが、表名に小文字が入るとSQLで扱いにくいため、表名を大文字にしています。

OMLノートブックのエクスポート
https://github.com/ujnak/apexapps/blob/master/exports/Create%20Table.dsnb

最初の段落:
%sql
drop table if exists BREAST_CANCER
2番目の段落:
%python
import oml
import pandas as pd
import numpy as np
from sklearn import datasets

# Load the breast cancer dataset into the database
bc = datasets.load_breast_cancer()
bc_data = bc.data.astype(float)
X = pd.DataFrame(bc_data, columns = bc.feature_names)
y = pd.DataFrame(bc.target, columns = ['TARGET'])
row_id = pd.DataFrame(np.arange(bc_data.shape[0]), columns = ['CASE_ID'])
df = oml.create(pd.concat([row_id, X, y], axis=1), table = 'BREAST_CANCER')
最後の段落:
%sql
select * from breast_cancer
最後の段落の結果として、表BREAST_CANCERの内容が一覧されることを確認します。


AutoMLを実行するノートブックを作成します。乳がんの診断データは、データベースの表BREAST_CANCERからoml.syncを呼び出して読み込みます。

OMLノートブックのエクスポート
https://github.com/ujnak/apexapps/blob/master/exports/Cancer%20-%20AutoML.dsnb

最初の段落:
%python
import oml
from oml import automl
import pandas as pd
import numpy as np

df = oml.sync(table='BREAST_CANCER')
2番目の段落:
%python
# Split dataset into train and test
train, test = df.split(ratio=(0.8, 0.2), seed = 1234, hash_cols=['CASE_ID'])
X, y = train.drop('TARGET'), train['TARGET']
X_test, y_test = test.drop('TARGET'), test['TARGET']
3番目の段落:
%python
# Create an automated machine learning pipeline object with f1_macro score_metric
pipeline = automl.Pipeline(mining_function='classification', score_metric='f1_macro', parallel=2)
# Fit the pipeline to perform automated algorithm selection, feature selection, and model tuning on the dataset
pipeline = pipeline.fit(X, y, case_id='CASE_ID')
4番目の段落:
OMLノートブックでは代入されない戻り値は表示されるのでprint文は不要ですが、オンプレミスで実行するコードに合わせてprint文を呼び出して戻り値を表示しています。
%python
# Use the pipeline for prediction
predictions = pipeline.predict(X_test, supplemental_cols=y_test)
print(f"{predictions}")
# For classification tasks, the pipeline can also predict class probabilities
probabilities = pipeline.predict_proba(X_test, supplemental_cols=y_test)
print(f"{probabilities}")
5番目の段落:
モデルのエクスポート先となる表SERMODELをあらかじめ削除します。
%sql
drop table if exists SERMODEL
6番目の段落:
最も結果の良いモデルを、表SERMODELにシリアライズした形式でエクスポートします。
%python
# Inspect the best tuned and fitted model produced by the AutoML pipeline
best_model = pipeline.top_k_tuned_models[0]['fitted_model']
print(f"{best_model}")
export = best_model.export_sermodel('SERMODEL')
ノートブックを実行します。3番目の段落にあるpipeline.fitの処理がAutoMLの本体なので、その部分では時間がかかります。


最後の段落の実行結果として、作成された機械学習モデルの設定が印刷されていることを確認します。この時点で、設定が印刷されているモデルのエクスポートも完了しています。


作成されているモデルのページを開きます。OML4PyのAutoMLで作成されたモデルは、このページには表示されていません。


APEXのSQLワークショップSQLコマンドを開きます。スキーマはOMLノートブックに接続したデータベース・ユーザーを選択します。

以下のSELECT文でユーザー・モデルを検索すると、内部的にはいくつかのモデルが作成されていることが確認できます。

select * from user_mining_models order by creation_date desc


表SERMODELにエクスポートされたモデルを、OML4SQLのモデルとしてインポートします。以下のPL/SQLコードを実行します。
declare
    l_model_data blob;
begin
    select serval into l_model_data from sermodel;
    dbms_data_mining.import_sermodel(
        model_data => l_model_data,
        model_name => 'ADB_OML4PY_AUTOML_MODEL'
    );
end;

インポートされたモデルは、モデルのページに表示されます。


以下のSQLを実行し、予測(prediction)と実際(target)が異なる行を一覧します。
select * from (
select case_id,
  prediction(ADB_OML4PY_AUTOML_MODEL using *) prediction,
  target,
  prediction_probability(ADB_OML4PY_AUTOML_MODEL using *) pred_probability
from breast_cancer
)
where prediction <> target

以上でAutonomous Database上でのOML4PyによるAutoMLの作業は完了です。

次にAutoML実験を作成し、実行します。


作成をクリックします。


AutoMLを実行して機械学習モデルを作成することが目的なので、設定は最低限にします。

名前AutoML Breast Cancerとします。データ・ソースとして表BREAST_CANCER予測TARGET予測タイプ分類ケースIDCASE_IDを選択します。追加設定は行わず、デフォルトのままにします。

以上で開始をクリックし、より速い結果を選択します。


AutoML実験が完了するまで、しばらく待ちます。


AutoML実験が完了すると、(追加設定で指定された)いくつかの機械学習モデルが作成されます。このうちのひとつをエクスポートする対象として選びます。

後続の作業を容易にするため、選んだモデルの名前をRenameをクリックして、ADB_AUTOMLUI_MODELに変更します。


OML4PyのAutoMLで作成したモデルと同様に、予測と実績の差分を確認します。
select * from (
select case_id,
  prediction(ADB_AUTOMLUI_MODEL using *) prediction,
  target,
  prediction_probability(ADB_AUTOMLUI_MODEL using *) pred_probability
from breast_cancer
)
where prediction <> target


AutoML実験で作成されたモデルは、モデルのページからすべて参照できます。


エクスポートした機械学習モデルをファイルとしてダウンロードする、Oracle APEXのアプリケーションを作成します。

エクスポートしたモデルを保存する表OML_SERIALIZED_MODELSを作成します。
create table oml_serialized_models (
    id            number generated by default on null as identity
                  constraint oml_serialized_models_id_pk primary key,
    model_name    varchar2(128 char) not null,
    model_data    blob
);

OML4Pyで作成したモデルは、モデル・データが表SERMODELに保存されています。以下のスクリプトを実行し、モデル・データを表OML_SERIALIZED_MODELSにコピーします。
declare
    l_model_data blob;
begin
    select serval into l_model_data from sermodel;
    insert into oml_serialized_models(model_name, model_data) values('ADB_OML4PY_AUTOML_MODEL', l_model_data);
    commit;
end;

AutoML実験で作成した機械学習モデルADB_AUTOMLUI_MODELは、最初にエクスポートする必要があります。モデルADB_AUTOMLUI_MODELをシリアライズした形式でBLOBに取り出し、表OML_SERIALIZED_MODELSに保存するために、以下のコードを実行します。
declare
    l_blob blob;
    l_model_name user_mining_models.model_name%type;
begin
    dbms_lob.createTemporary(l_blob, false);
    l_model_name := 'ADB_AUTOMLUI_MODEL';
    dbms_data_mining.export_sermodel(
        model_data => l_blob,
        model_name => l_model_name
    );
    insert into oml_serialized_models(model_name, model_data) values('ADB_AUTOMLUI_MODEL', l_blob);
    dbms_lob.freeTemporary(l_blob);
end;
しかし、このコードを実行するとORA-40284: モデルが存在しませんというエラーが発生します。機械学習モデルは間違いなく存在するため、何か問題があるようです。


APEXのSQLコマンドの代わりに、データベース・アクションSQLワークシートで実行します。

データベース・アクションを利用するために、APEXのワークスペース・スキーマのREST有効オンにします。


APEXのSQLワークショップSQL Developer Webから、データベース・アクションを開くことができます。


うまく開かない場合は、データベース・アクションを直接開きます。

https://<ホスト識別子>-<データベース名>.adb.<リージョン名>.oraclecloudapps.com/ords/sql-developer

パスORDS別名を設定します。これは通常、英子文字で表記したAPEXワークスペース名です。ユーザー名およびパスワードAPEXのワークスペースに登録されているユーザー名とパスワードを入力します。APEXの開発ツールにサインインする場合は、同名のデータベース・ユーザーのパスワードを指定しますが、データベース・アクションではAPEXのワークスペース・ユーザーとして設定されているパスワードを入力します。


先ほどのスクリプトをSQLワークシートから実行します。


これでAutoML実験で作成された機械学習モデルADB_AUTOMLUI_MODELのエクスポートが、表OML_SERIALIZED_MODELSに保存されました。

余談:

以下のSELECT文をデータベース・アクションSQLワークシートで実行してみます。
select
sys_context('userenv','proxy_user')   as proxy_user,
sys_context('userenv','session_user') as session_user,
sys_context('userenv','current_user') as current_user
from dual

データベース・アクションのSQLワークシートでの実行結果は、PROXY_USERORDS_PUBLIC_USERSESSION_USERCURRENT_USERともにWKSP_APEXDEVと、接続先のスキーマになります。ORDSは以下のようなプロキシ接続を行っています。

connect ords_public_user[wksp_apexdev]@サービス名

APEXのSQLコマンドで同じSELECT文を実行します。


APEXの場合はPROXY_USERORDS_PUBLIC_USERSESSION_USERORDS_PLSQL_GATEWAYCURRENT_USERWKSP_APEXDEVになります。

ORDSは接続先がAPEXの場合、ORDS_PLSQL_GATEWAYを接続先としてプロキシ接続を行います。ORDS_PLSQL_GATEWAYから実際のワークスペース・スキーマへの切り替えは、APEXがSQLの実行時に行っています。

余談終わり

APEXのSQLコマンドに戻って確認します。

select * from oml_serialized_models


OML_SERIALIZED_MODELSの列MODEL_DATAにBLOBとして保存されているモデルを、ファイルにダウンロードするAPEXアプリケーションを作成します。

アプリケーション作成ウィザードを開きます。

作成するアプリケーションの名前OML Serialized Modelsとします。ページの追加をクリックし、表OML_SERIALIZED_MODELSソースとした対話モード・レポートのページを追加します。


対話モード・レポートを選択します。


ページ名OML_SERIALIZED_MODELSとし、表またはビューOML_SERIALIZED_MODELSを選択します。

ページの追加をクリックします。


以上でアプリケーションの作成を実行します。


アプリケーションが作成されたら、対話モード・レポートのページを開いて編集します。


対話モード・レポートの列MODEL_DATAのタイプがBLOBのダウンロードになっています。ファイル名がモデル名になるように、BLOB属性ファイル名列MODEL_NAMEを設定します。


アプリケーションの改変は以上です。変更の保存とページの実行を行います。


対話モード・レポートのページを開き、列Model Dataダウンロード・リンクをクリックします。それぞれのモデルがADB_AUTOMLUI_MODELおよびADB_OLM4PY_AUTOML_MODELというファイル名でダウンロードされます。


以上でAutonomous DatabaseのAutoMLで作成した機械学習モデルを、ファイルとしてダウンロードすることができました。

モデルのインポート先でOML4Pyが使える場合は、scikit-learnからデータセットをロードできるので不要なのですが、そうでない場合は表BREAST_CANCERとしてデータセットを準備する必要があります。

そのため、表BREAST_CANCERのDDLを記録しておきます。

SQLワークショップオブジェクト・ブラウザより表BREAST_CANCERを選択し、DDLを表示します。このDDLをコピーしておきます。


SQLワークショップユーティリティデータ・ワークショップを開きます。


データのアンロードを開きます。


テキスト形式を選択します。


としてBREAST_CANCERを選択し、すべての列を出力対象として選択します。

へ進みます。


列名を含めるチェックを入れます。その他はデフォルトから変更は不要です。

以上でデータのアンロードを実行すると、breast_cancer.txtとしてCSVファイルがダウンロードされます。


以上でAutonomous Databaseでの作業は終了です。

オンプレミスでのOML4PyでAutoMLを実行します。作業環境の作成手順については、以前の記事「OML4Py ServerとOML4Py ClientをOracle Database Freeのコンテナにインストールする」で紹介しています。

Oracle Database 23ai Freeを実行しているコンテナに接続します。OML4Py 2.1のクライアントが構成済みで、かつスキーマWKSP_APEXDEVにOML4Pyの実行に必要な権限が割り当て済みとします。

podman exec -it apex-db bash

apex-podman-setup % podman exec -it apex-db bash

bash-4.4$ 


OML4PyのAutoMLを実行可能にするため、DRCP(Database Resident Connection Pool ing)を有効にします。ユーザSYSでCDBに接続し、DRCPを開始します。

execute dbms_connection_pool.start_pool();

bash-4.4$ sqlplus / as sysdba


SQL*Plus: Release 23.0.0.0.0 - Production on Tue Jul 29 08:56:40 2025

Version 23.8.0.25.04


Copyright (c) 1982, 2025, Oracle.  All rights reserved.



Connected to:

Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.8.0.25.04


SQL> execute dbms_connection_pool.start_pool();


PL/SQL procedure successfully completed.


SQL> exit

Disconnected from Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.8.0.25.04

bash-4.4$ 


OML4Pyのクライアントを指すように、環境変数を設定します。

export PYTHONHOME=$HOME/python
export PATH=$PYTHONHOME/bin:$PATH
export LD_LIBRARY_PATH=$PYTHONHOME/lib:$LD_LIBRARY_PATH
unset PYTHONPATH

bash-4.4$ export PYTHONHOME=$HOME/python

bash-4.4$ export PATH=$PYTHONHOME/bin:$PATH

bash-4.4$ export LD_LIBRARY_PATH=$PYTHONHOME/lib:$LD_LIBRARY_PATH

bash-4.4$ unset PYTHONPATH

bash-4.4$ 


scikit-learnの乳がんの診断データより表BREAST_CANCERを作成するスクリプトをcreate.pyとして作成し、実行します。oml.connectの引数のuserやpasswordは、使用するデータベース・ユーザーに合わせて変更します。また引数にautoml=Trueを含めます。
import oml 
from oml import automl
import pandas as pd
import numpy as np
from sklearn import datasets

oml.connect(user="wksp_apexdev",password="パスワード",port=1521,host="localhost",service_name="freepdb1",automl=True)

# Load the breast cancer dataset into the database
bc = datasets.load_breast_cancer()
bc_data = bc.data.astype(float)
X = pd.DataFrame(bc_data, columns = bc.feature_names)
y = pd.DataFrame(bc.target, columns = ['TARGET'])
row_id = pd.DataFrame(np.arange(bc_data.shape[0]), columns = ['CASE_ID'])
df = oml.create(pd.concat([row_id, X, y], axis=1), table = 'BREAST_CANCER')
上記のスクリプトを実行します。

python3 create.py

bash-4.4$ python3 create.py

bash-4.4$ 


PDBにSQL*Plusで接続し、表BREAST_CANCERの行数を確認します。

select count(*) from breast_cancer;

bash-4.4$ sqlplus wksp_apexdev/********@localhost/freepdb1


SQL*Plus: Release 23.0.0.0.0 - Production on Tue Jul 29 09:03:04 2025

Version 23.8.0.25.04


Copyright (c) 1982, 2025, Oracle.  All rights reserved.


Last Successful login time: Tue Jul 29 2025 09:02:28 +00:00


Connected to:

Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.8.0.25.04


SQL> select count(*) from breast_cancer;


  COUNT(*)

----------

       569


SQL> exit

Disconnected from Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.8.0.25.04

bash-4.4$ 


AutoMLを実行する前に、モデルのエクスポート先となる表SERMODELを削除します。

drop table if exists SERMODEL;

bash-4.4$ sqlplus wksp_apexdev/*********@localhost/freepdb1


SQL*Plus: Release 23.0.0.0.0 - Production on Wed Jul 30 02:25:43 2025

Version 23.8.0.25.04


Copyright (c) 1982, 2025, Oracle.  All rights reserved.


Last Successful login time: Wed Jul 30 2025 02:24:48 +00:00


Connected to:

Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.8.0.25.04


SQL> drop table if exists SERMODEL;


Table dropped.


SQL> exit

Disconnected from Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.8.0.25.04

bash-4.4$ 


AutoMLを実行するスクリプトをautoml.pyとして作成し、実行します。スクリプト自体はAutonomous DatabaseのOMLノートブックで実行した内容と同じですが、最後にファイルLOCAL_OML4PY_AUTOML_MODELにエクスポートしたモデルを出力しています。
import oml 
from oml import automl
import pandas as pd
import numpy as np

oml.connect(user="wksp_apexdev",password="パスワード",port=1521,host="localhost",service_name="freepdb1",automl=True)

df = oml.sync(table = 'BREAST_CANCER')

# Split dataset into train and test
train, test = df.split(ratio=(0.8, 0.2), seed = 1234, hash_cols=['CASE_ID'])
X, y = train.drop('TARGET'), train['TARGET']
X_test, y_test = test.drop('TARGET'), test['TARGET']

# Create an automated machine learning pipeline object with f1_macro score_metric
pipeline = automl.Pipeline(mining_function='classification', 
score_metric='f1_macro', parallel=4)

# Fit the pipeline to perform automated algorithm selection, feature selection, and model tuning on the dataset
pipeline = pipeline.fit(X, y, case_id='CASE_ID')

# Use the pipeline for prediction
predictions = pipeline.predict(X_test, supplemental_cols=y_test)
print(f"{predictions}")

# For classification tasks, the pipeline can also predict class probabilities
probabilities = pipeline.predict_proba(X_test, supplemental_cols=y_test)
print(f"{probabilities}")


# Inspect the best tuned and fitted model produced by the AutoML pipeline
best_model = pipeline.top_k_tuned_models[0]['fitted_model']
print(f"{best_model}")
export = best_model.export_sermodel(table='SERMODEL')
with open('LOCAL_OML4PY_AUTOML_MODEL', 'wb') as f:
    for item in export.pull():
        f.write(item)
上記のスクリプトを実行します。

python3 automl.py

bash-4.4$ python3 automl.py 

     TARGET  PREDICTION

0         0           0

1         0           0

2         1           1

3         0           0

4         1           0

..      ...         ...

109       1           1

110       0           0

111       1           1

112       0           0

113       1           1


[114 rows x 2 columns]

     TARGET  PROBABILITY_OF_0  PROBABILITY_OF_1

0         0          0.999860          0.000140

1         0          0.997039          0.002961

2         1          0.001444          0.998556

3         0          0.984740          0.015260

4         1          0.762688          0.237312

..      ...               ...               ...

109       1          0.003550          0.996450

110       0          0.992593          0.007407

111       1          0.001383          0.998617

112       0          0.986737          0.013263

113       1          0.003410          0.996590


[114 rows x 3 columns]


Algorithm Name: Support Vector Machine


Mining Function: CLASSIFICATION


Target: TARGET


Settings: 

                    setting name                 setting value

0                      ALGO_NAME  ALGO_SUPPORT_VECTOR_MACHINES

1          CLAS_WEIGHTS_BALANCED                           OFF

2                   ODMS_DETAILS                   ODMS_ENABLE

3   ODMS_MISSING_VALUE_TREATMENT       ODMS_MISSING_VALUE_AUTO

4                  ODMS_SAMPLING         ODMS_SAMPLING_DISABLE

5                      PREP_AUTO                            ON

6         SVMS_COMPLEXITY_FACTOR                            10

7            SVMS_CONV_TOLERANCE                         .0001

8           SVMS_KERNEL_FUNCTION                 SVMS_GAUSSIAN

9                SVMS_NUM_PIVOTS                           200

10                  SVMS_STD_DEV            3.6742346141747673


Computed Settings: 

          setting name    setting value

0  SVMS_NUM_ITERATIONS               30

1          SVMS_SOLVER  SVMS_SOLVER_IPM


Global Statistics: 

  attribute name attribute value

0      CONVERGED             YES

1     ITERATIONS              13

2       NUM_ROWS             455


Attributes: 

area error

compactness error

concave points error

concavity error

fractal dimension error

mean area

mean compactness

mean concave points

mean concavity

mean fractal dimension

mean perimeter

mean radius

mean smoothness

mean symmetry

mean texture

perimeter error

radius error

worst area

worst compactness

worst concave points

worst concavity

worst fractal dimension

worst perimeter

worst radius

worst smoothness

worst symmetry

worst texture


Partition: NO



bash-4.4$ 


作成された機械学習モデルの、シリアライズされたエクスポートがファイルLOCAL_OML4PY_AUTOML_MODELとして出力されています。

ls -l LOCAL_OML4PY_AUTOML_MODEL

bash-4.4$ ls -l LOCAL_OML4PY_AUTOML_MODEL

-rw-r--r--. 1 oracle oinstall 233783 Jul 30 02:20 LOCAL_OML4PY_AUTOML_MODEL

bash-4.4$ 


作成されたモデルによる予測を確認します。 表SERMODELにエクスポートされたモデルを、OML4SQLのモデルとしてインポートします。
declare
    l_model_data blob;
begin
    select serval into l_model_data 
    from sermodel;
    dbms_data_mining.import_sermodel(
        model_data => l_model_data,
        model_name => 'LOCAL_OML4PY_AUTOML_MODEL'
    );
end;
/
select * from user_mining_models;

bash-4.4$ sqlplus wksp_apexdev/*******@localhost/freepdb1


SQL*Plus: Release 23.0.0.0.0 - Production on Wed Jul 30 02:30:28 2025

Version 23.8.0.25.04


Copyright (c) 1982, 2025, Oracle.  All rights reserved.


Last Successful login time: Wed Jul 30 2025 02:27:49 +00:00


Connected to:

Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.8.0.25.04


SQL> declare

  2  l_model_data blob;

  3  begin

  4      select serval into l_model_data 

  5      from sermodel;

  6      dbms_data_mining.import_sermodel(

  7          model_data => l_model_data,

  8          model_name => 'LOCAL_OML4PY_AUTOML_MODEL'

  9      );

 10  end;

 11  /


PL/SQL procedure successfully completed.


SQL> select * from user_mining_models;


MODEL_NAME

--------------------------------------------------------------------------------

MINING_FUNCTION        ALGORITHM       ALGORITHM_

------------------------------ ------------------------------ ----------

CREATION_ BUILD_DURATION MODEL_SIZE PAR

--------- -------------- ---------- ---

BUILD_SOURCE

--------------------------------------------------------------------------------

COMMENTS

--------------------------------------------------------------------------------

LOCAL_OML4PY_AUTOML_MODEL

CLASSIFICATION       SUPPORT_VECTOR_MACHINES       NATIVE

30-JUL-25       1     230971 NO


MODEL_NAME

--------------------------------------------------------------------------------

MINING_FUNCTION        ALGORITHM       ALGORITHM_

------------------------------ ------------------------------ ----------

CREATION_ BUILD_DURATION MODEL_SIZE PAR

--------- -------------- ---------- ---

BUILD_SOURCE

--------------------------------------------------------------------------------

COMMENTS

--------------------------------------------------------------------------------

select * from "WKSP_APEXDEV"."OPE$55_7110_01167"




SQL> 


以下のSELECT文を実行し、予測と実績の差分を確認します。
select * from (
select case_id,
  prediction(LOCAL_OML4PY_AUTOML_MODEL using *) prediction,
  target,
  prediction_probability(LOCAL_OML4PY_AUTOML_MODEL using *) pred_probability
from breast_cancer
)
where prediction <> target;

SQL> select * from (

select case_id,

  prediction(LOCAL_OML4PY_AUTOML_MODEL using *) prediction,

  target,

  prediction_probability(LOCAL_OML4PY_AUTOML_MODEL using *) pred_probability

from breast_cancer

)

where prediction <> target;  2    3    4    5    6    7    8  


   CASE_ID PREDICTION   TARGET PRED_PROBABILITY

---------- ---------- ---------- ----------------

68     0       1       7.627E-001

73     1       0       8.335E-001

       135     1       0       8.036E-001

       215     1       0       8.967E-001

       152     0       1       8.058E-001

40     1       0       9.518E-001

       363     0       1       6.287E-001

       504     0       1       5.761E-001

       255     1       0       5.357E-001

       263     1       0       8.017E-001

       290     0       1       5.091E-001


   CASE_ID PREDICTION   TARGET PRED_PROBABILITY

---------- ---------- ---------- ----------------

       297     1       0       9.423E-001


12 rows selected.


SQL> exit

Disconnected from Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.8.0.25.04

bash-4.4$ 


以前の記事の手順に沿ってOML4Pyのコンテナが作成されている場合は、ディレクトリworkにホストのカレント・ディレクトリがマウントされています。そのため、ファイルLOCAL_OML4PY_AUTOML_MODELをディレクトリworkの下に移動させると、コンテナの外にファイルを移動できます。

mv LOCAL_OML4PY_AUTOML_MODEL work

bash-4.4$ mv LOCAL_OML4PY_AUTOML_MODEL work

bash-4.4$ 


オンプレミスのOracle Database 23ai FreeでのAutoMLの作業は以上で完了です。

これまでの作業で、シリアライズされたモデルのエクスポート・ファイルが3つ作成されました。
  • Autonomous DatabaseのOML4Pyで作成したADB_OML4PY_AUTOML_MODEL
  • Autonomous DatabaseのAutoML UIで作成したADB_AUTOMLUI_MODEL
  • オンプレミスのOML4Pyで作成したLOCAL_OML4PY_AUTOML_MODEL
これらの機械学習モデルを異なるデータベースにインポートして、OML4SQLで利用できるようにします。

Oracle APEXは構成済みで、かつ、APEXのワークスペース・スキーマはOML4SQLが使えるように権限を割り当て済みとします。

表BREAST_CANCERの準備から始めます。

SQLワークショップSQLコマンドで、Autonomous Database上で取得した表BREAST_CANCERのDDLを実行します。


SQLワークショップユーティリティデータ・ワークショップを開きます。


データのロードを開きます。


ファイルのアップロードを選び、先ほどAutonomous Databaseよりダウンロードしたbreast_cancer.txtファイルの選択をクリックして選択します。


ロード先既存の表を選び、として先ほど作成したBREAST_CANCERを選択します。列見出し最初の行にヘッダーが含まれるチェックしますが、表BREAST_CANCERの列名が英子文字であるため、インポート先の列が自動でマッピングされません。

構成を開き、列のマッピングを設定します。


自動的にマッピングされている列は列名が大文字のCASE_IDとTARGETに限られます。それ以外の英子文字の列名とCSVの列名(CSVの列名は小文字ですが、データ・ワークショップがOracle Databaseが英大文字小文字の区別をしないため、英大文字に正規化しています)は一致していないため、手動で列のマッピングを設定します。

面倒な作業ですが、コードを書くほどではないでしょう。



すべてのマッピングを設定し、変更の保存をクリックします。

手作業でマッピングしたのだけれど32列すべてがBREAST_CANCER表に自動的にマップされました。という表示を確認して、データのロードをクリックします。


表BREAST_CANCERに569行がロードされます。表BREAST_CANCERの準備は以上で完了です。

取消をクリックします。


これから機械学習モデルをインポートするAPEXアプリケーションを作成します。

空のAPEXアプリケーションを作成します。名前OML Model Importとします。


アプリケーションが作成されます。

機械学習モデルをインポートする機能はホーム・ページに実装します。

ページ・デザイナホーム・ページを開きます。


インポートするモデルのファイルを選択するページ・アイテムをP1_MODEL_FILEとして作成します。識別タイプファイルのアップロードを選択します。

ラベルModel Fileとします。ストレージファイルをパージするタイミングリクエストの終わりセッション・ステートストレージリクエストごと(メモリーのみ)を選択します。


モデルのインポートを実行するボタンをIMPORTとして作成します。

識別ラベルImport外観テンプレート・オプションWidthStretchにします。動作アクションはデフォルトのページの送信です。


インポートされたモデルを一覧する、クラシック・レポートのリージョンを作成します。

ソースSQL問合せに以下を記述します。

select * from user_mining_models


ボタンIMPORTをクリックしたときに実行するプロセスImportを作成します。ソースPL/SQLコードとして、以下を記述します。インポートして作成されるモデル名は、アップロードしたファイル名にします。
declare
    l_model_data blob;
    l_model_name varchar2(128);
begin
    select filename, blob_content into l_model_name, l_model_data
    from apex_application_temp_files where name = :P1_MODEL_FILE;
    dbms_data_mining.import_sermodel(
        model_data => l_model_data,
        model_name => l_model_name
    );
end;
成功メッセージとして「モデルがインポートされました。」と記述します。サーバー側の条件ボタン押下時IMPORTを指定します。


以上でモデルをインポートする機能が実装できました。

APEXアプリケーションを実行して、これまでに作成した3つのモデルのエクスポート・ファイルをインポートします。

Model FileとしてADB_OML4PY_AUTOML_MODELを選択し、ボタンImportをクリックします。

モデルがインポートされ、レポートにモデルADB_OML4PY_AUTOML_MODELとして表示されます。


同様にファイルADB_AUTOMLUI_MODELおよびLOCAL_OML4PY_AUTOML_MODELをインポートします。

結果として3つのモデルが作成されます。

インポートしたモデルによる予測と、実績を比較します。

モデルADB_OML4PY_AUTOML_MODELに対して実施します。比較に使用するSELECT文は既出です。


モデルADB_AUTOMLUI_MODELに対して実施します。


最後にモデルLOCAL_OML4PY_AUTOML_MODELに対して実施します。


以上で、移行した機械学習モデルを呼び出せることが確認できました。

インポートしたモデルの設定を確認する、以下のページをアプリケーションに追加します。


空白のページを作成します。

設定を表示するモデルを選択するページ・アイテムとしてP1_MODELを作成します。
識別タイプ選択リストラベルModel設定選択時のページ・アクション値のリダイレクトと設定とします。LOVSQL問合せとして以下を記述します。

select model_name d, model_name r from user_mining_models

セッション・ステートストレージセッションごと(永続)を選択します。

ページ・アクションに値のリダイレクトと設定を選んでいる場合、値を切り替えると必ず警告が表示されるため、詳細保存されていない変更の警告無視を設定します。


ビューUSER_MINING_MODELSの内容を表示するクラシック・レポートを作成し、ソースSQL問合せに以下を記述します。

select * from user_mining_models where model_name = :P2_MODEL


属性外観テンプレートとして、Value Attribute Pairs - Columnを選択します。このテンプレートを選択することにより、列名と値が縦方向に並びます。

レイアウト行数30に増やしておきます。


ビューUSER_MINING_MODEL_SETTINGSの内容を表示するクラシック・レポートを作成し、ソースSQL問合せに以下を記述します。

select setting_name, setting_value from user_mining_model_settings where model_name = :P2_MODEL order by setting_name asc


属性外観テンプレートとして、Value Attribute Pairs - Rowを選択します。こちらのテンプレートはValue Attribute Pairs - Columnのように列と行がピボットすることはありませんが、Setting NameSetting Valueの2列がValue Attribute Pairs - Columnと同じ見かけで表示されます。

レイアウト行数30に増やしておきます。


以上でアプリケーションは完成です。

簡単なアプリケーションですがエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/oml-model-import.zip

今回の記事は以上になります。

Oracle APEXのアプリケーション作成の参考になれば幸いです。