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
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にアクセスし直すと次のページに正常に遷移します。

ノートブックを開きます。
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、予測タイプに分類、ケースIDにCASE_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_USERが
ORDS_PUBLIC_USER、
SESSION_USERと
CURRENT_USERともに
WKSP_APEXDEVと、接続先のスキーマになります。ORDSは以下のようなプロキシ接続を行っています。
connect ords_public_user[wksp_apexdev]@サービス名
APEXのSQLコマンドで同じSELECT文を実行します。
APEXの場合はPROXY_USERがORDS_PUBLIC_USER、SESSION_USERがORDS_PLSQL_GATEWAY、CURRENT_USERがWKSP_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での作業は終了です。
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 workbash-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、外観のテンプレート・オプションのWidthをStretchにします。動作のアクションはデフォルトのページの送信です。
インポートされたモデルを一覧する、
クラシック・レポートのリージョンを作成します。
ソースの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、設定の選択時のページ・アクションは値のリダイレクトと設定とします。LOVのSQL問合せとして以下を記述します。
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 NameとSetting Valueの2列がValue Attribute Pairs - Columnと同じ見かけで表示されます。
レイアウトの行数は30に増やしておきます。
以上でアプリケーションは完成です。
簡単なアプリケーションですがエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/oml-model-import.zip
今回の記事は以上になります。
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完