AnalyticDB for PostgreSQL V7.0 には、データベース内 AI/ML 機能が統合されており、AI タスク向けに Hugging Face モデルを、機械学習向けに XGBoost、LightGBM、CatBoost、Linfa、およびすべての scikit-learn アルゴリズムをサポートしています。これにより、テーブルまたはビュー内のデータに対して、直接トレーニング、ファインチューニング、デプロイメント、および推論を実行できます。
トレーニング
pgml.train 関数を使用してモデルをトレーニングします。この関数はコーディネーター・ノードでのみ実行されます。
構文
CREATE FUNCTION pgml.train(
"project_name" TEXT,
"task" TEXT DEFAULT NULL,
"relation_name" TEXT DEFAULT NULL,
"y_column_name" TEXT DEFAULT NULL,
"algorithm" pgml.Algorithm DEFAULT 'linear',
"hyperparams" jsonb DEFAULT '{}',
"search" pgml.Search DEFAULT NULL,
"search_params" jsonb DEFAULT '{}',
"search_args" jsonb DEFAULT '{}',
"test_size" real DEFAULT 0.25,
"test_sampling" pgml.Sampling DEFAULT 'stratified',
"runtime" pgml.Runtime DEFAULT NULL,
"automatic_deploy" bool DEFAULT true,
"materialize_snapshot" bool DEFAULT false,
"preprocess" jsonb DEFAULT '{}'
) RETURNS TABLE (
"project" TEXT,
"task" TEXT,
"algorithm" TEXT,
"deployed" bool
)
EXECUTE ON COORDINATOR
LANGUAGE c /* Rust */
AS 'MODULE_PATHNAME', 'train_wrapper';パラメーター
| パラメーター | 説明 | 例 |
|---|---|---|
project_name | プロジェクト名です。 | '乳癌検出' |
task | タスクの種類です。 | 'classification' |
relation_name | トレーニング用のテーブルまたはビューです。SCHEMA.TABLE 形式で、現在のスキーマ外のテーブルを参照できます。 | 'pgml.breast_cancer' |
y_column_name | 予測対象のターゲット列です。 | 'malignant' |
algorithm | 使用するアルゴリズムです。「サポートされるアルゴリズム」をご参照ください。 | 'xgboost' |
hyperparams | アルゴリズムに渡すハイパーパラメーター(JSON 形式)です。 | {"n_estimators": 25, "nthread": 4} |
search | ハイパーパラメーター探索手法です。「ハイパーパラメーター探索」をご参照ください。 | 'grid' |
search_params | 探索対象のハイパーパラメーター範囲です。有効なパラメーターについては、scikit-learn または XGBoost のドキュメントをご参照ください。 | {"max_depth": [1, 2, 3, 4]} |
search_args | 探索手法の補足パラメーターです。詳細については、scikit-learn または XGBoost のドキュメントをご参照ください。 | {"n_iter": 10} |
test_size | テストセットとして保持するデータの割合です。デフォルト値:0.25。 | 0.25 |
test_sampling | テストセットのサンプリング手法です。デフォルト値:stratified。 | 'random' |
runtime | 実行環境です。有効な値:python、rust。 | 'python' |
automatic_deploy | トレーニング後に最適なモデルを自動的にデプロイするかどうかを指定します。デフォルト値:true。 | true |
materialize_snapshot | トレーニングデータのスナップショットをマテリアライズするかどうかを指定します。デフォルト値:false。 | true |
preprocess | トレーニング前に各列に適用される前処理ステップです。「前処理」をご参照ください。 | {"col_name": {"impute": "mean", "scale": "standard"}} |
トレーニングはデフォルトでシングルコアで実行されます。複数コアを利用する場合は、使用するアルゴリズムに対応するハイパーパラメーター(例:XGBoost の場合 nthread)を指定してください。トレーニング後にトレーニング済みモデルとその評価指標を確認するには、pgml.trained_models をクエリします。
サポートされるアルゴリズム
以下の表では、pgml.algorithm、pgml.sampling、および pgml.runtime 列挙型で利用可能なアルゴリズムを一覧表示します。
pgml.algorithm
| アルゴリズム | 説明 |
|---|---|
linear | 回帰用の線形モデルです。 |
xgboost | 最適化された分散勾配ブースティングです。 |
xgboost_random_forest | ランダムフォレストアルゴリズム向けにチューニングされた XGBoost です。 |
svm | 分類および回帰用のサポートベクターマシン (SVM) です。 |
lasso | Lasso 回帰です。 |
elastic_net | Elastic net 回帰(L1 および L2 正則化を組み合わせたもの)です。 |
ridge | Ridge 回帰(L2 正則化)です。 |
kmeans | k 平均法クラスタリングです。 |
dbscan | さまざまな形状のクラスターを検出する密度ベースのクラスタリングです。 |
knn | 回帰用の k 近傍法 (KNN) です。 |
random_forest | 分類および回帰用のアンサンブル学習です。 |
least_angle | 最小角回帰 (LARS) で、lasso と互換性があります。 |
lasso_least_angle | Lasso 最小角回帰(LARS と lasso を組み合わせたもの)です。 |
orthogonal_matching_pursuit | 疎信号復元のための貪欲アルゴリズムです。 |
bayesian_ridge | ベイジアンリッジ回帰です。 |
automatic_relevance_determination | ベイジアン回帰です。 |
stochastic_gradient_descent | 回帰および分類用の確率的勾配降下法です。 |
perceptron | 二項分類用の線形モデルです。 |
passive_aggressive | 大規模タスク向けのオンライン学習です。 |
ransac | ロバストな線形回帰のためのランダムサンプルコンセンサスです。 |
theil_sen | ロバストな線形回帰のための Theil-Sen 推定量です。 |
huber | 外れ値に対してロバストな Huber 回帰です。 |
quantile | 条件付き分位数を予測するための分位数回帰です。 |
kernel_ridge | 非線形関係を扱うカーネルリッジ回帰 (KRR) です。 |
gaussian_process | 確率的回帰および分類のためのガウス過程です。 |
nu_svm | 分類および回帰用の SVM 変種です。 |
ada_boost | 分類用の AdaBoost です。 |
bagging | 過学習を軽減するためのアンサンブル手法です。 |
extra_trees | ランダムフォレストの拡張である Extra Trees です。 |
gradient_boosting_trees | 回帰および分類用の勾配ブースティングです。 |
hist_gradient_boosting | 大規模データセット向けのヒストグラムベース勾配ブースティングです。 |
linear_svm | 分類用の線形 SVM です。 |
lightgbm | LightGBM 勾配ブースティングフレームワークです。 |
affinity_propagation | データの類似性に基づくメッセージパッシングクラスタリングです。 |
birch | 大規模データセット向けのクラスタリングです。 |
feature_agglomeration | クラスタリングに基づく特徴量選択です。 |
mini_batch_kmeans | 大規模またはオンラインデータセット向けの k 平均法のミニバッチ版です。 |
mean_shift | 任意のクラスター形状に対応する重心ベースのクラスタリングです。 |
optics | 密度が異なるデータセット向けのクラスタリングです。 |
spectral | スペクトラルクラスタリングです。 |
spectral_bi | 2 次元(行および列)にわたるスペクトラルバイクラスタリングです。 |
spectral_co | 2 次元にわたるスペクトラルコクラスタリングです。 |
catboost | 分類および回帰用の CatBoost 勾配ブースティングです。 |
pca | 次元削減のための主成分分析 (PCA) です。 |
pgml.sampling
| サンプリング手法 | 説明 |
|---|---|
random | ランダムサンプリングです。 |
last | データセットの末尾から順次スキャンします。 |
stratified | 層別サンプリング(デフォルト)です。 |
pgml.runtime
| ランタイム | 説明 |
|---|---|
python | Python ランタイムです。 |
rust | Rust ランタイムです。 |
ハイパーパラメーター探索
search、search_params、および search_args を併用することで、モデルの最適なハイパーパラメーターを探索できます。
| パラメーター | 制御内容 | 例 |
|---|---|---|
search | 探索手法:grid(網羅的)または random(サンプリング) | 'grid' |
search_params | 評価対象のハイパーパラメーター範囲 | {"max_depth": [1, 2, 3], "n_estimators": [20, 80]} |
search_args | 反復回数(n_iter)または交差検証の分割数(cv) | {"cv": 3} |
grid:デカルト積を用いて、
search_params内のすべての組み合わせをトレーニングします。random:
search_paramsからランダムに組み合わせをサンプリングし、最大n_iter回反復します。
回帰タスクでは、R2 スコアに基づいて最適なハイパーパラメーター集合が選択されます。分類タスクでは、F1 スコアが使用されます。
例:3 分割交差検証を伴うグリッド探索
以下のクエリでは、XGBoost 分類器を max_depth および n_estimators についてグリッド探索でトレーニングします。評価される組み合わせの総数は len(max_depth) × len(n_estimators) × cv = 3 × 3 × 3 = 27 です。
SELECT * FROM pgml.train(
'手書き数字画像分類器',
'classification',
'pgml.digits',
'target',
algorithm => 'xgboost',
search => 'grid',
search_params => '{
"max_depth": [1, 3, 5],
"n_estimators": [20, 80, 160]
}',
search_args => '{"cv": 3}'
);前処理
preprocess JSON オブジェクトを pgml.train に渡すことで、各列の前処理を設定できます。前処理設定はトレーニング後に pgml.snapshots に保存され、推論時に新しいデータに自動的に適用されます。そのため、推論時には追加の設定は不要です。
列挙型エンコーディング
カテゴリ列を数値に変換します。
| 手法 | 説明 |
|---|---|
native | 非テキスト型を 32 ビット浮動小数点数に変換します(デフォルト)。 |
target | 各カテゴリを、そのカテゴリにおけるターゲット変数の平均値で置き換えます。 |
one_hot | ワンホットエンコーディングです。 |
ordinal | 事前定義された順序配列に基づき、各カテゴリに一意の整数を割り当てます。NULL 値はデフォルトでインデックス 0 に割り当てられます。 |
欠損値補完
NULL または NaN 値を計算された代替値で置き換えます。
| 手法 | 説明 |
|---|---|
error | NULL または NaN 値が検出された場合にエラーを返します(デフォルト)。 |
mean | トレーニングデータの平均値で置き換えます。 |
median | トレーニングデータの中央値で置き換えます。 |
mode | トレーニングデータで最も頻出する値で置き換えます。 |
min | トレーニングデータの最小値で置き換えます。 |
max | トレーニングデータの最大値で置き換えます。 |
zero | 0 で置き換えます。 |
スケーリング
特徴量を標準的な範囲にスケールすることで、モデルの汎化性能を向上させます。
| 手法 | 説明 |
|---|---|
preserve | スケーリングを行いません(デフォルト)。 |
standard | 平均を 0、分散を 1 に標準化します。 |
min-max | 指定された範囲(通常は 0–1)にスケールします。 |
max-abs | 絶対値の最大値で除算し、トレーニングセットにおける最大絶対値を 1 にします。 |
robust | 四分位範囲(Q1–Q3)に基づくスケーリングで、外れ値に対してロバストです。 |
デプロイメント
トレーニング後、プロジェクトのメタデータ、前処理設定、およびモデルパラメーターは内部テーブルに格納されます。推論時には、プロジェクト名または ID を参照するだけでよく、モデルの詳細を再度渡す必要はありません。
automatic_deploy(デフォルト値:true)を有効にすると、各トレーニング実行後に最も優れたパフォーマンスを発揮したモデルが自動的にデプロイされます。分類タスクでは F1 スコアが最も高いモデルがデプロイされ、回帰タスクでは R2 スコアが最も高いモデルがデプロイされます。
モデルを手動でデプロイするには、以下の pgml.deploy のオーバーロードのいずれかを使用します。
モデル ID によるデプロイメント
CREATE FUNCTION pgml."deploy"(
"model_id" bigint
) RETURNS TABLE (
"project" TEXT,
"strategy" TEXT,
"algorithm" TEXT
)
STRICT EXECUTE ON COORDINATOR
LANGUAGE c /* Rust */
AS 'MODULE_PATHNAME', 'deploy_model_wrapper';戦略によるデプロイメント
CREATE FUNCTION pgml."deploy"(
"project_name" TEXT,
"strategy" pgml.Strategy,
"algorithm" pgml.Algorithm DEFAULT NULL
) RETURNS TABLE (
"project" TEXT,
"strategy" TEXT,
"algorithm" TEXT
)
EXECUTE ON COORDINATOR
LANGUAGE c /* Rust */
AS 'MODULE_PATHNAME', 'deploy_strategy_wrapper';デプロイメント戦略(pgml.strategy)
| 戦略 | 説明 |
|---|---|
best_score | 評価指標が最も優れたモデルをデプロイします。 |
most_recent | 評価指標に関係なく、最も最近トレーニングされたモデルをデプロイします。 |
rollback | 以前のデプロイメントにロールバックします。 |
推論
predict を使用した単一行推論
pgml.predict は FLOAT4 値を返します。これは、分類タスクでは予測されたクラス、回帰タスクでは予測された数値です。プロジェクト名で解決されるモデルは、常にそのプロジェクトに対して最も最近デプロイされたモデルです。
pgml.predict を SELECT 文内で直接呼び出します。
-- プロジェクト名を使用して予測(最も最近デプロイされたモデルを解決)
SELECT target_column, pgml.predict('私のプロジェクト', row_data) AS prediction
FROM my_table
LIMIT 10;
-- 特定のモデル ID を使用して予測
SELECT target_column, pgml.predict(model_id, row_data) AS prediction
FROM my_table
LIMIT 10;pgml.predict は以下の入力型を受け付けます。
| 関数シグネチャ | 入力型 |
|---|---|
pgml.predict(project_name TEXT, row anyelement) | テーブル行 |
pgml.predict(model_id bigint, row anyelement) | モデル ID を指定したテーブル行 |
pgml.predict(project_name TEXT, features real[]) | FLOAT4 配列 |
pgml.predict(model_id bigint, features real[]) | FLOAT4 配列(モデル ID 指定) |
pgml.predict(project_name TEXT, features bigint[]) | BIGINT 配列 |
pgml.predict(project_name TEXT, features INT[]) | INT 配列 |
pgml.predict(project_name TEXT, features smallint[]) | SMALLINT 配列 |
pgml.predict(project_name TEXT, features double precision[]) | FLOAT8 配列 |
pgml.predict(project_name TEXT, features bool[]) | BOOL 配列 |
バッチ推論
複数行に対するバッチ推論には、predict_batch、predict_proba、または predict_joint を使用します。すべてのバッチ関数は、フラット化された 1 次元 FLOAT4 配列を入力として受け付け、FLOAT4 配列を返します。
predict_batch
標準的なバッチ推論には predict_batch を使用します。
-- プロジェクト名による呼び出し
CREATE FUNCTION pgml."predict_batch"(
"project_name" TEXT,
"features" real[]
) RETURNS SETOF real
IMMUTABLE STRICT PARALLEL SAFE
LANGUAGE c /* Rust */
AS 'MODULE_PATHNAME', 'predict_batch_wrapper';
-- モデル ID による呼び出し
CREATE FUNCTION pgml."predict_batch"(
"model_id" bigint,
"features" real[]
) RETURNS real[]
IMMUTABLE STRICT PARALLEL SAFE
LANGUAGE c /* Rust */
AS 'MODULE_PATHNAME', 'predict_model_batch_wrapper';predict_proba
predict_proba は、予測されたラベルだけでなく、各クラスの信頼確率が必要な場合に使用します。predict_batch と同じ入力を取りますが、各クラスの確率を返します。
-- プロジェクト名による呼び出し
CREATE FUNCTION pgml."predict_proba"(
"project_name" TEXT,
"features" real[]
) RETURNS real[]
IMMUTABLE STRICT PARALLEL SAFE
LANGUAGE c /* Rust */
AS 'MODULE_PATHNAME', 'predict_proba_wrapper';
-- モデル ID による呼び出し
CREATE FUNCTION pgml."predict_proba"(
"model_id" bigint,
"features" real[]
) RETURNS real[]
IMMUTABLE STRICT PARALLEL SAFE
LANGUAGE c /* Rust */
AS 'MODULE_PATHNAME', 'predict_model_proba_wrapper';predict_joint
predict_joint は、マルチラベル回帰タスクに使用します。この関数は、各入力行に対して多次元の予測を返します。分類タスクはサポートされていません。
-- プロジェクト名による呼び出し
CREATE FUNCTION pgml."predict_joint"(
"project_name" TEXT,
"features" real[]
) RETURNS real[]
IMMUTABLE STRICT PARALLEL SAFE
LANGUAGE c /* Rust */
AS 'MODULE_PATHNAME', 'predict_joint_wrapper';
-- モデル ID による呼び出し
CREATE FUNCTION pgml."predict_joint"(
"model_id" bigint,
"features" real[]
) RETURNS real[]
IMMUTABLE STRICT PARALLEL SAFE
LANGUAGE c /* Rust */
AS 'MODULE_PATHNAME', 'predict_model_joint_wrapper';例
以下の例では、分類、回帰、クラスタリング、次元削減、および前処理のエンドツーエンドワークフローを示します。各例は、データの読み込み、ベースラインモデルのトレーニング、予測の実行、追加のアルゴリズムおよびデプロイメント戦略の実験という同じパターンに従います。
前処理
この例では、ダイヤモンドデータセットを用いて、トレーニング前のカテゴリ変数のエンコーディングおよび数値特徴量のスケーリングを実演します。
-- ステップ 1:ダイヤモンドデータセットの読み込み(カテゴリ列を含む)
SELECT pgml.load_dataset('jdxcosta/diamonds');
-- データの確認
SELECT * FROM pgml."jdxcosta/diamonds" LIMIT 10;
-- 名前のないインデックスキー列を削除
ALTER TABLE pgml."jdxcosta/diamonds" DROP COLUMN "Unnamed: 0";
-- ステップ 2:前処理を伴うトレーニング:数値列の標準スケーリング、カテゴリ列のターゲットエンコーディング
SELECT pgml.train(
project_name => 'ダイヤモンド価格',
task => 'regression',
relation_name => 'pgml.jdxcosta/diamonds',
y_column_name => 'price',
algorithm => 'lightgbm',
preprocess => '{
"carat": {"scale": "standard"},
"depth": {"scale": "standard"},
"table": {"scale": "standard"},
"cut": {"encode": "target", "scale": "standard"},
"color": {"encode": "target", "scale": "standard"},
"clarity": {"encode": "target", "scale": "standard"}
}'
);
-- ステップ 3:予測の実行
-- 同質の ARRAY[] ではなく、異質な行(タプル)を渡します
SELECT price, pgml.predict('ダイヤモンド価格', (carat, cut, color, clarity, depth, "table", x, y, z)) AS prediction
FROM pgml."jdxcosta/diamonds"
LIMIT 10;