すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:機械学習ユーザーガイド

最終更新日:Mar 28, 2026

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.250.25
test_samplingテストセットのサンプリング手法です。デフォルト値:stratified'random'
runtime実行環境です。有効な値:pythonrust'python'
automatic_deployトレーニング後に最適なモデルを自動的にデプロイするかどうかを指定します。デフォルト値:truetrue
materialize_snapshotトレーニングデータのスナップショットをマテリアライズするかどうかを指定します。デフォルト値:falsetrue
preprocessトレーニング前に各列に適用される前処理ステップです。「前処理」をご参照ください。{"col_name": {"impute": "mean", "scale": "standard"}}
トレーニングはデフォルトでシングルコアで実行されます。複数コアを利用する場合は、使用するアルゴリズムに対応するハイパーパラメーター(例:XGBoost の場合 nthread)を指定してください。

トレーニング後にトレーニング済みモデルとその評価指標を確認するには、pgml.trained_models をクエリします。

サポートされるアルゴリズム

以下の表では、pgml.algorithmpgml.sampling、および pgml.runtime 列挙型で利用可能なアルゴリズムを一覧表示します。

pgml.algorithm

アルゴリズム説明
linear回帰用の線形モデルです。
xgboost最適化された分散勾配ブースティングです。
xgboost_random_forestランダムフォレストアルゴリズム向けにチューニングされた XGBoost です。
svm分類および回帰用のサポートベクターマシン (SVM) です。
lassoLasso 回帰です。
elastic_netElastic net 回帰(L1 および L2 正則化を組み合わせたもの)です。
ridgeRidge 回帰(L2 正則化)です。
kmeansk 平均法クラスタリングです。
dbscanさまざまな形状のクラスターを検出する密度ベースのクラスタリングです。
knn回帰用の k 近傍法 (KNN) です。
random_forest分類および回帰用のアンサンブル学習です。
least_angle最小角回帰 (LARS) で、lasso と互換性があります。
lasso_least_angleLasso 最小角回帰(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 です。
lightgbmLightGBM 勾配ブースティングフレームワークです。
affinity_propagationデータの類似性に基づくメッセージパッシングクラスタリングです。
birch大規模データセット向けのクラスタリングです。
feature_agglomerationクラスタリングに基づく特徴量選択です。
mini_batch_kmeans大規模またはオンラインデータセット向けの k 平均法のミニバッチ版です。
mean_shift任意のクラスター形状に対応する重心ベースのクラスタリングです。
optics密度が異なるデータセット向けのクラスタリングです。
spectralスペクトラルクラスタリングです。
spectral_bi2 次元(行および列)にわたるスペクトラルバイクラスタリングです。
spectral_co2 次元にわたるスペクトラルコクラスタリングです。
catboost分類および回帰用の CatBoost 勾配ブースティングです。
pca次元削減のための主成分分析 (PCA) です。

pgml.sampling

サンプリング手法説明
randomランダムサンプリングです。
lastデータセットの末尾から順次スキャンします。
stratified層別サンプリング(デフォルト)です。

pgml.runtime

ランタイム説明
pythonPython ランタイムです。
rustRust ランタイムです。

ハイパーパラメーター探索

searchsearch_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 内のすべての組み合わせをトレーニングします。

  • randomsearch_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 値を計算された代替値で置き換えます。

手法説明
errorNULL または NaN 値が検出された場合にエラーを返します(デフォルト)。
meanトレーニングデータの平均値で置き換えます。
medianトレーニングデータの中央値で置き換えます。
modeトレーニングデータで最も頻出する値で置き換えます。
minトレーニングデータの最小値で置き換えます。
maxトレーニングデータの最大値で置き換えます。
zero0 で置き換えます。

スケーリング

特徴量を標準的な範囲にスケールすることで、モデルの汎化性能を向上させます。

手法説明
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.predictFLOAT4 値を返します。これは、分類タスクでは予測されたクラス、回帰タスクでは予測された数値です。プロジェクト名で解決されるモデルは、常にそのプロジェクトに対して最も最近デプロイされたモデルです。

pgml.predictSELECT 文内で直接呼び出します。

-- プロジェクト名を使用して予測(最も最近デプロイされたモデルを解決)
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_batchpredict_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';

以下の例では、分類、回帰、クラスタリング、次元削減、および前処理のエンドツーエンドワークフローを示します。各例は、データの読み込み、ベースラインモデルのトレーニング、予測の実行、追加のアルゴリズムおよびデプロイメント戦略の実験という同じパターンに従います。

分類

この例では、pgml.breast_cancer データセットを用いて乳癌検出モデルをトレーニングし、予測を実行して複数のアルゴリズムを比較します。

\timing on

-- ステップ 1:データセットの読み込み
SELECT pgml.load_dataset('breast_cancer');

-- データの確認
SELECT * FROM pgml.breast_cancer LIMIT 10;

-- ステップ 2:ベースラインモデルのトレーニング
SELECT * FROM pgml.train('乳癌検出', 'classification', 'pgml.breast_cancer', 'malignant');

-- ステップ 3:デプロイ済みモデルを使用した予測の実行
SELECT malignant, pgml.predict(
    '乳癌検出',
    (
        "mean radius", "mean texture", "mean perimeter", "mean area",
        "mean smoothness", "mean compactness", "mean concavity",
        "mean concave points", "mean symmetry", "mean fractal dimension",
        "radius error", "texture error", "perimeter error", "area error",
        "smoothness error", "compactness error", "concavity error",
        "concave points error", "symmetry error", "fractal dimension error",
        "worst radius", "worst texture", "worst perimeter", "worst area",
        "worst smoothness", "worst compactness", "worst concavity",
        "worst concave points", "worst symmetry", "worst fractal dimension"
    )
) AS prediction
FROM pgml.breast_cancer
LIMIT 10;

-- 予測されたラベルではなく、クラス確率を取得
SELECT malignant, pgml.predict_proba(
    '乳癌検出',
    ARRAY[
        "mean radius", "mean texture", "mean perimeter", "mean area",
        "mean smoothness", "mean compactness", "mean concavity",
        "mean concave points", "mean symmetry", "mean fractal dimension",
        "radius error", "texture error", "perimeter error", "area error",
        "smoothness error", "compactness error", "concavity error",
        "concave points error", "symmetry error", "fractal dimension error",
        "worst radius", "worst texture", "worst perimeter", "worst area",
        "worst smoothness", "worst compactness", "worst concavity",
        "worst concave points", "worst symmetry", "worst fractal dimension"
    ]
) AS prediction
FROM pgml.breast_cancer
LIMIT 10;

-- 初期トレーニング後、省略されたパラメーターは前回の実行から再利用されます。
-- 以下の呼び出しでは、上記のトレーニングデータスナップショットが再利用されます。

-- 線形モデル
SELECT * FROM pgml.train('乳癌検出', algorithm => 'ridge');
SELECT * FROM pgml.train('乳癌検出', algorithm => 'stochastic_gradient_descent');
SELECT * FROM pgml.train('乳癌検出', algorithm => 'perceptron');
SELECT * FROM pgml.train('乳癌検出', algorithm => 'passive_aggressive');

-- サポートベクターマシン
SELECT * FROM pgml.train('乳癌検出', algorithm => 'svm');
SELECT * FROM pgml.train('乳癌検出', algorithm => 'nu_svm');
SELECT * FROM pgml.train('乳癌検出', algorithm => 'linear_svm');

-- アンサンブル
SELECT * FROM pgml.train('乳癌検出', algorithm => 'ada_boost');
SELECT * FROM pgml.train('乳癌検出', algorithm => 'bagging');
SELECT * FROM pgml.train('乳癌検出', algorithm => 'extra_trees', hyperparams => '{"n_estimators": 10}');
SELECT * FROM pgml.train('乳癌検出', algorithm => 'gradient_boosting_trees', hyperparams => '{"n_estimators": 10}');
SELECT * FROM pgml.train('乳癌検出', algorithm => 'random_forest', hyperparams => '{"n_estimators": 10}');

-- 勾配ブースティング
SELECT * FROM pgml.train('乳癌検出', algorithm => 'xgboost', hyperparams => '{"n_estimators": 10}');

-- F1 スコアで上位のモデルを確認
SELECT trained_models.* FROM pgml.trained_models
JOIN pgml.models ON models.id = trained_models.id
ORDER BY models.metrics->>'f1' DESC LIMIT 5;

-- 特定のアルゴリズムをデプロイ
SELECT * FROM pgml.deploy('乳癌検出', 'most_recent', 'random_forest');

-- デプロイ済みモデルの確認
SELECT * FROM pgml.deployed_models ORDER BY deployed_at DESC LIMIT 5;

-- XGBoost に対するハイパーパラメーター探索の実行
SELECT pgml.train(
    '乳癌検出',
    algorithm => 'xgboost',
    search => 'grid',
    search_params => '{
        "n_estimators": [2, 4],
        "max_depth": [1, 2, 3]
    }'
);

-- 異なる戦略によるデプロイメント
SELECT * FROM pgml.deploy('乳癌検出', 'best_score');
SELECT * FROM pgml.deploy('乳癌検出', 'most_recent');
SELECT * FROM pgml.deploy('乳癌検出', 'rollback');
SELECT * FROM pgml.deploy('乳癌検出', 'best_score', 'svm');

-- 再デプロイ後の予測の確認
SELECT malignant, pgml.predict(
    '乳癌検出',
    (
        "mean radius", "mean texture", "mean perimeter", "mean area",
        "mean smoothness", "mean compactness", "mean concavity",
        "mean concave points", "mean symmetry", "mean fractal dimension",
        "radius error", "texture error", "perimeter error", "area error",
        "smoothness error", "compactness error", "concavity error",
        "concave points error", "symmetry error", "fractal dimension error",
        "worst radius", "worst texture", "worst perimeter", "worst area",
        "worst smoothness", "worst compactness", "worst concavity",
        "worst concave points", "worst symmetry", "worst fractal dimension"
    )
) AS prediction
FROM pgml.breast_cancer
LIMIT 10;

回帰

この例では、糖尿病進行度モデルをトレーニングし、複数のアルゴリズムを比較します。

-- ステップ 1:データセットの読み込み
SELECT pgml.load_dataset('diabetes');

-- データの確認
SELECT * FROM pgml.diabetes LIMIT 10;

-- ステップ 2:ベースラインモデルのトレーニング
SELECT * FROM pgml.train('糖尿病進行度', 'regression', 'pgml.diabetes', 'target');

-- ステップ 3:予測の実行
SELECT target, pgml.predict('糖尿病進行度', (age, sex, bmi, bp, s1, s2, s3, s4, s5, s6)) AS prediction
FROM pgml.diabetes
LIMIT 10;

-- 特定のモデル ID に対する予測の確認
SELECT model_id, target, pgml.predict(model_id, (age, sex, bmi, bp, s1, s2, s3, s4, s5, s6)) AS prediction
FROM pgml.diabetes
CROSS JOIN LATERAL (
    SELECT pgml.models.id AS model_id FROM pgml.models
    INNER JOIN pgml.projects
    ON pgml.models.project_id = pgml.projects.id
    WHERE pgml.projects.name = '糖尿病進行度'
    LIMIT 1
) models
LIMIT 10;

-- 初期トレーニング後、省略されたパラメーターは前回の実行から再利用されます。

-- 線形モデル
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'ridge');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'lasso');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'elastic_net');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'least_angle');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'lasso_least_angle');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'orthogonal_matching_pursuit');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'bayesian_ridge');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'automatic_relevance_determination');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'stochastic_gradient_descent');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'passive_aggressive');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'ransac');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'theil_sen', hyperparams => '{"max_iter": 10, "max_subpopulation": 100}');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'huber');

-- サポートベクターマシン
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'svm', hyperparams => '{"max_iter": 100}');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'nu_svm', hyperparams => '{"max_iter": 10}');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'linear_svm', hyperparams => '{"max_iter": 100}');

-- アンサンブル
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'ada_boost', hyperparams => '{"n_estimators": 5}');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'bagging', hyperparams => '{"n_estimators": 5}');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'extra_trees', hyperparams => '{"n_estimators": 5}');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'gradient_boosting_trees', hyperparams => '{"n_estimators": 5}');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'random_forest', hyperparams => '{"n_estimators": 5}');

-- 勾配ブースティング
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'xgboost', hyperparams => '{"n_estimators": 10}');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'catboost', hyperparams => '{"n_estimators": 10}');

-- 実行時間の比較
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'linear', runtime => 'python');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'linear', runtime => 'rust');
SELECT * FROM pgml.train('糖尿病進行度', algorithm => 'xgboost', runtime => 'rust', hyperparams => '{"n_estimators": 10}');

-- 平均二乗誤差で上位のモデルを確認
SELECT trained_models.* FROM pgml.trained_models
JOIN pgml.models ON models.id = trained_models.id
ORDER BY models.metrics->>'mean_squared_error' DESC LIMIT 5;

-- デプロイおよび確認
SELECT * FROM pgml.deploy('糖尿病進行度', 'most_recent', 'random_forest');
SELECT * FROM pgml.deployed_models ORDER BY deployed_at DESC LIMIT 5;

-- ハイパーパラメーター探索
SELECT pgml.train(
    '糖尿病進行度',
    algorithm => 'xgboost',
    hyperparams => '{"eval_metric": "rmse"}'::JSONB,
    search => 'grid',
    search_params => '{
        "max_depth": [1, 2],
        "n_estimators": [20, 40]
    }'
);

-- 異なる戦略によるデプロイメント
SELECT * FROM pgml.deploy('糖尿病進行度', 'best_score');
SELECT * FROM pgml.deploy('糖尿病進行度', 'most_recent');
SELECT * FROM pgml.deploy('糖尿病進行度', 'rollback');
SELECT * FROM pgml.deploy('糖尿病進行度', 'best_score', 'svm');

-- 再デプロイ後の予測の確認
SELECT target, pgml.predict('糖尿病進行度', (age, sex, bmi, bp, s1, s2, s3, s4, s5, s6)) AS prediction
FROM pgml.diabetes
LIMIT 10;

クラスタリング

この例では、pgml.digits データセットを用いて手書き数字画像をクラスタリングします。教師なし学習のために単一の配列特徴列を使用する方法を示します。

pgml.digits データセットは、UCI ML 手書き数字データセット から派生しています。
\timing on

-- ステップ 1:データセットの読み込み
SELECT pgml.load_dataset('digits');

-- 教師なし学習用のラベルなしビューを作成
CREATE VIEW pgml.digit_vectors AS
SELECT image FROM pgml.digits;

-- データの確認
SELECT left(image::text, 40) || ',...}' FROM pgml.digit_vectors LIMIT 10;

-- ステップ 2:k 平均法クラスタリングモデルのトレーニング
SELECT * FROM pgml.train('手書き数字クラスター', 'clustering', 'pgml.digit_vectors', hyperparams => '{"n_clusters": 10}');

-- ステップ 3:クラスター割り当ての確認
SELECT target, pgml.predict('手書き数字クラスター', image) AS prediction
FROM pgml.digits
LIMIT 10;

-- 他のクラスタリングアルゴリズムの試行
SELECT * FROM pgml.train('手書き数字クラスター', algorithm => 'affinity_propagation');
SELECT * FROM pgml.train('手書き数字クラスター', algorithm => 'birch', hyperparams => '{"n_clusters": 10}');
SELECT * FROM pgml.train('手書き数字クラスター', algorithm => 'kmeans', hyperparams => '{"n_clusters": 10}');
SELECT * FROM pgml.train('手書き数字クラスター', algorithm => 'mini_batch_kmeans', hyperparams => '{"n_clusters": 10}');

次元削減

この例では、主成分分析(PCA)を用いて 64 次元の手書き数字画像ベクターを次元削減します。

\timing on

-- ステップ 1:データセットの読み込み
SELECT pgml.load_dataset('digits');

-- データの確認
SELECT left(image::text, 40) || ',...}', target FROM pgml.digits LIMIT 10;

-- ラベルなしの画像ベクターのビューを作成
CREATE VIEW digit_vectors AS
SELECT image FROM pgml.digits;

-- ステップ 2:PCA 分解モデルのトレーニング
SELECT * FROM pgml.train('手書き数字の次元削減', 'decomposition', 'digit_vectors');

-- ステップ 3:分解済みベクターの確認
SELECT target, pgml.decompose('手書き数字の次元削減', image) AS pca
FROM pgml.digits
LIMIT 10;

-- 3 成分に削減
-- 初期トレーニング後、省略されたパラメーターは前回の実行から再利用されます。
SELECT * FROM pgml.train('手書き数字の次元削減', hyperparams => '{"n_components": 3}');

-- 削減済みベクターの確認
SELECT target, pgml.decompose('手書き数字の次元削減', image) AS pca
FROM pgml.digits
LIMIT 10;

-- 累積寄与率で上位のモデルを確認
SELECT trained_models.* FROM pgml.trained_models
JOIN pgml.models ON models.id = trained_models.id
ORDER BY models.metrics->>'cumulative_explained_variance' DESC LIMIT 5;

-- PCA モデルのデプロイ
SELECT * FROM pgml.deploy('手書き数字の次元削減', 'most_recent', 'pca');
SELECT * FROM pgml.deployed_models ORDER BY deployed_at DESC LIMIT 5;

-- デプロイメント戦略の切り替え
SELECT * FROM pgml.deploy('手書き数字の次元削減', 'best_score');
SELECT * FROM pgml.deploy('手書き数字の次元削減', 'most_recent');
SELECT * FROM pgml.deploy('手書き数字の次元削減', 'rollback');
SELECT * FROM pgml.deploy('手書き数字の次元削減', 'best_score', 'pca');

-- 再デプロイ後の予測の実行
SELECT target, pgml.predict('手書き数字の次元削減', image) AS prediction
FROM pgml.digits
LIMIT 10;

前処理

この例では、ダイヤモンドデータセットを用いて、トレーニング前のカテゴリ変数のエンコーディングおよび数値特徴量のスケーリングを実演します。

-- ステップ 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;