AnalyticDB for PostgreSQL V7.0 は、AI 向けに Hugging Face モデルを統合したデータベース内 AI/ML 機能と、機械学習向けの XGBoost、LightGBM、CatBoost、Linfa、およびすべての scikit-learn アルゴリズムを提供します。 この機能を使用して、テーブルまたはビュー内のデータに対して AI または機械学習のトレーニング、微調整、デプロイ、および推論を実行できます。 このトピックでは、AnalyticDB for PostgreSQL V7.0 で機械学習を使用してトレーニング、デプロイ、および推論を実行する方法について説明します。
トレーニング
pgml.train という名前のユーザー定義関数 (UDF) を作成して、トレーニングを実行できます。 この操作は、AnalyticDB for PostgreSQL コーディネーターノードでのみサポートされています。
構文
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 | プロジェクトの名前。 | 'Breast Cancer Detection' |
task | タスクの名前。 | 'classification' |
relation_name | トレーニングテーブルの名前。 SCHEMA.TABLE 形式で、現在のスキーマ以外のスキーマにあるテーブルの名前を指定できます。 | 'pgml.breast_cancer' |
y_column_name | テーブル内のトレーニング列の名前。 | 'mglignant' |
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 |
test_sampling | テストセットからデータを取得するために使用するサンプリング方法。パラメーターの説明からメソッドを取得できます。 | 'random' |
runtime | アルゴリズムが実装されているランタイム環境。有効な値: Python および Rust。 | 'python' |
automatic_deploy | 自動デプロイを有効にするかどうかを指定します。 | true |
materialize_snapshot | デプロイメントのマテリアライズを有効にするかどうかを指定します。 | true |
preprocess | 実行する前処理手順。 | {"col_name": {"impute": "mean", scale: "standard"}} |
トレーニングに使用するコア数を指定しない場合、タスクはデフォルトでシングルコアを使用します。 hyperparams パラメーターを使用して、トレーニングのためにアルゴリズムに渡すハイパーパラメーターを指定できます。 詳細については、トレーニングモデルのパラメータードキュメントを参照してください。 たとえば、XGBoost モデルでは、nthread パラメーターを使用して、トレーニングに使用するコア数を指定できます。
pgml 拡張機能のカスタム列挙型
次の表では、pgml.algorithm、pgml.sampling、および pgml.runtime カスタム列挙型でサポートされているアルゴリズム、サンプリング方法、およびランタイム環境について説明します。
次の表では、
pgml.algorithmカスタム列挙型でサポートされているアルゴリズムについて説明します。アルゴリズム
説明
linear
回帰分析に使用される線形モデル。
xgboost
最適化された分散勾配ブースティングライブラリ。
xgboost_random_forest
ランダムフォレストアルゴリズム用に特別に調整された XGBoost バージョン。
svm
分類と回帰に使用されるサポートベクターマシン (SVM) アルゴリズム。
lasso
統計と機械学習における回帰分析に使用されるアルゴリズム。
elastic_net
Lasso (L1) と Ridge (L2) の正則化を組み合わせた Elastic Net 回帰アルゴリズム。
ridge
過学習を防ぐために L2 正則化を使用する Ridge 回帰アルゴリズム。
kmeans
クラスタリングアルゴリズム。
dbscan
さまざまな形状のクラスターを識別できる密度ベースのクラスタリングアルゴリズム。
knn
回帰に使用される k 近傍法 (KNN) アルゴリズム。
random_forest
分類と回帰に使用されるアンサンブル学習アルゴリズム。
least_angle
Lasso アルゴリズムと互換性のある最小角回帰 (LARS) アルゴリズム。
lasso_least_angle
LARS と Lasso の機能を組み合わせた Lasso 最小角回帰アルゴリズム。
orthogonal_matching_pursuit
スパース信号回復に使用される貪欲アルゴリズム。
bayesian_ridge
事前分布を使用して回帰パラメーターを推定するベイズリッジ回帰アルゴリズム。
automatic_relevance_determination
ベイズ回帰アルゴリズム。
stochastic_gradient_descent
回帰と分類に使用されるシンプルで効率的な最適化アルゴリズム。
perceptron
2 値分類に使用される線形モデルアルゴリズム。
passive_aggressive
大規模学習に適したオンライン学習アルゴリズム。
ransac
ロバスト線形回帰に使用されるランダムサンプルコンセンサスアルゴリズム。
theil_sen
ロバスト線形回帰に使用される Theil-Sen 推定量。
huber
外れ値に対してロバストな Huber 回帰。
quantile
中央値などの条件付き分位数を予測する分位点回帰アルゴリズム。
kernel_ridge
カーネルトリックを使用して非線形関係を学習するカーネルリッジ回帰 (KRR) アルゴリズム。
gaussian_process
確率的回帰と分類に使用されるガウス過程アルゴリズム。
nu_svm
分類と回帰に使用されるアルゴリズム。 このアルゴリズムは、SVM アルゴリズムのバリアントです。
ada_boost
分類問題の解決に使用されるブースティングアルゴリズム。
bagging
過学習を軽減するために使用されるアンサンブルアルゴリズム。
extra_trees
ランダムフォレストアルゴリズムの拡張である Extra Trees アルゴリズム。
gradient_boosting_trees
回帰と分類の問題を解決するために使用されるブースティングアルゴリズム。
hist_gradient_boosting
大規模データセットに適した勾配ブースティングアルゴリズム。
linear_svm
分類問題の解決に適した線形 SVM。
lightgbm
Microsoft によって大規模データ向けに開発された勾配ブースティングフレームワーク。
affinity_propagation
データポイント間の類似性に基づくメッセージパッシングクラスタリングアルゴリズム。
birch
大規模データセットに適したクラスタリングアルゴリズム。
feature_agglomeration
特徴の選択に使用されるクラスタリングアルゴリズム。
mini_batch_kmeans
大規模またはオンラインデータセットに適したアルゴリズム。 このアルゴリズムは、k 平均クラスタリングのバリアントです。
mean_shift
任意の形状のクラスターを識別できる重心ベースのクラスタリングアルゴリズム。
optics
さまざまな密度のクラスターを識別できるアルゴリズム。
spectral
データのスペクトル特性を使用するスペクトラルクラスタリングアルゴリズム。
spectral_bi
行と列など、2 次元のデータを同時にクラスタリングするスペクトラルバイアスアルゴリズム。
spectral_co
2 次元のデータを同時にクラスタリングするスペクトラルコクラスタリングアルゴリズム。
catboost
分類と回帰の問題を解決するために使用される勾配ブースティングアルゴリズム。
pca
データの次元削減に使用されるアルゴリズム。
次の表では、
pgml.samplingカスタム列挙型でサポートされているサンプリング方法について説明します。サンプリング方法
説明
random
テストデータに対してランダムサンプリングを実行します。
last
シーケンシャルスキャンを実行して、テストデータの末尾を取得します。
stratified
テストデータに対して層化サンプリングを実行します。
次の表では、
pgml.runtimeカスタム列挙型でサポートされているランタイム環境について説明します。ランタイム環境
説明
Python
Python ランタイム環境。
Rust
Rust ランタイム環境。
ハイパーパラメーター検索
ハイパーパラメーター検索と交差検証を使用して、モデルトレーニングに最適なハイパーパラメーターセットを見つけることができます。 ハイパーパラメーター検索に関連するトレーニングパラメーターには、search、search_params、および search_args が含まれます。
次の表では、pgml.search カスタム列挙型でサポートされている検索方法について説明します。
検索方法
説明
grid
デカルト積を使用して、
search_paramsパラメーターで指定された検索ハイパーパラメーターのすべての可能な組み合わせをトレーニングします。random
search_argsパラメーターに基づいて、最大n_iterサンプリング反復まで、search_paramsパラメーターで指定された検索ハイパーパラメーターからパラメーターの組み合わせをランダムに選択します。search_paramsパラメーターは、最適なハイパーパラメーターセットを取得するために、ハイパーパラメーター検索で使用するハイパーパラメーターと対応するハイパーパラメーター値の範囲を指定します。 検索ハイパーパラメーターの詳細については、scikit-learn や XGBoost ドキュメントなど、使用するモデルアルゴリズムの公式ドキュメントを参照してください。次の表では、
search_argsパラメーターでサポートされている補足パラメーターについて説明します。JSONB 形式のパラメーター
説明
'{ "n_iter": K }'
モデルにハイパーパラメーター検索を実行させる反復回数。 このパラメーターは、pgml.search カスタム列挙型を random に設定した場合に適用できます。
'{ "cv": K }'
k分割交差検証のためにデータセットを分割する分割数。
例
search_paramsパラメーターで指定された検索ハイパーパラメーターの組み合わせを評価することにより、グリッド検索を実行してモデルをトレーニングします。 組み合わせの総数は、次の式を使用して計算されます:len(max_depth) × len(n_estimators) × k-fold = 3 × 3 × 3 = 27。説明回帰タスクの場合、デフォルトでは R2 スコアを使用して最適なハイパーパラメーターセットが選択されます。
分類タスクの場合、デフォルトでは F1 スコアを使用して最適なハイパーパラメーターセットが選択されます。
SELECT * FROM pgml.train( 'Handwritten Digit Image Classifier', '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 パラメーターを指定して、データを前処理できます。 プリプロセッサは、トレーニングデータのすべての列を一元的に構成できます。 pgml 拡張機能は、次のデータ前処理タイプをサポートしています。
トレーニング後、プリプロセッサに関する情報は pgml.snapshots メタデータテーブルに保存されます。 後で pgml.predict() 関数を呼び出すと、トレーニング中に定義したのと同じ前処理手順が新しい予測データに自動的に適用されます。
列挙型のエンコーディング
列挙型を数値型に変換します。
エンコード方式 | 説明 |
native | テキスト以外の型を 32 ビット浮動小数点型に変換します。 このメソッドはデフォルトのメソッドです。 |
target | 各カテゴリをそのカテゴリのターゲット変数の平均値に置き換えることにより、カテゴリ変数を数値に変換します。 |
one_hot | 列挙型を one-hot エンコード形式に変換します。 |
ordinal | 事前に定義された序数配列で指定されたインデックスに基づいて、各カテゴリに一意の整数を割り当てることにより、カテゴリデータを数値に変換します。 デフォルトでは、NULL 値にはインデックス 0 が割り当てられます。 |
欠損値の補完
NULL 値または NaN 値を数値に置き換えます。
補完方法 | 説明 |
error | トレーニングまたは推論中に NULL 値または NaN 値が検出されると、エラーが返されます。 このメソッドはデフォルトのメソッドです。 |
mean | NULL 値または NaN 値をトレーニングデータの平均値に置き換えます。 |
median | NULL 値または NaN 値をトレーニングデータの中央値に置き換えます。 |
mode | NULL 値または NaN 値をトレーニングデータで最も頻繁に出現する値に置き換えます。 |
min | NULL 値または NaN 値をトレーニングデータの最小値に置き換えます。 |
max | NULL 値または NaN 値をトレーニングデータの最大値に置き換えます。 |
zero | NULL 値または NaN 値を 0 に置き換えます。 |
スケーリング
すべての変数を標準範囲にスケーリングして、モデルの汎化を向上させます。
スケーリング方法 | 説明 |
preserve | スケーリングを実行しません。 このメソッドはデフォルトのメソッドです。 |
standard | 平均値を削除し、特徴を単位分散にスケーリングすることにより、特徴を標準化します。 |
min-max | 指定された最小値と最大値の間の範囲に特徴をスケーリングします。 ほとんどの場合、範囲は 0 から 1 の間です。 |
max-abs | 各特徴を最大絶対値で除算することによりデータをスケーリングします。これにより、トレーニングセットの各特徴の最大絶対値が 1 になることが保証されます。 |
robust | 統計の第 1 四分位数と第 3 四分位数で定義された範囲に基づいてデータをスケーリングします。 他の方法と比較して、この方法は外れ値の処理においてより堅牢です。 |
デプロイメント
デプロイメント中に、トレーニングプロジェクト情報、前処理方法、およびモデルパラメーターがメタデータテーブルに保存されます。 後続の推論では、推論を実行するためにプロジェクト番号または名前を指定するだけで済みます。これにより、推論プロセスが簡素化されます。
次の表では、pgml.strategy カスタム列挙型でサポートされているデプロイポリシーについて説明します。
デプロイポリシー | 説明 |
best_score | 最適なメトリックを達成したモデルをデプロイします。 |
most_recent | 最後にトレーニングされたモデルをデプロイし、メトリックに関する情報を無視します。 |
rollback | 現在のモデルの以前のデプロイにロールバックします。 |
automatic_deploy パラメーターは、トレーニング中にデプロイを実行するために使用されます。 このパラメーターのデフォルト値は true です。 このパラメーターは、複数のトレーニング中に最適なモデルを自動的に選択してデプロイします。 分類タスクの場合、デフォルトでは F1 スコアが最も高いモデルが選択されます。 回帰タスクの場合、デフォルトでは R2 スコアが最も高いモデルが選択されます。 また、次の UDF を使用して、トレーニング済みモデルを手動でデプロイすることもできます。
model_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';
推論
テキストに対して推論を実行する
プロジェクト名またはモデル ID に基づいて、predict() 関数を使用してテキストに対して推論を実行できます。 戻り値のデータ型は FLOAT4 です。 戻り値は、分類タスクの場合は入力データが属する予測クラスまたはカテゴリ、回帰タスクの場合は入力特徴に基づいて予測された数値です。 次の例は、さまざまなシナリオでテキストに対して推論を実行する方法を示しています。
プロジェクト名に基づいて識別されるモデルは、そのプロジェクトで最後にデプロイされたモデルです。
プロジェクト名に基づいて、テーブルのデータ行に対して推論を実行します。
CREATE FUNCTION pgml."predict"( "project_name" TEXT, "row" anyelement ) RETURNS real IMMUTABLE STRICT PARALLEL SAFE LANGUAGE c /* Rust */ AS 'MODULE_PATHNAME', 'predict_row_wrapper';モデル ID に基づいて、テーブルのデータ行に対して推論を実行します。
CREATE FUNCTION pgml."predict"( "model_id" bigint, "row" anyelement ) RETURNS real IMMUTABLE STRICT PARALLEL SAFE LANGUAGE c /* Rust */ AS 'MODULE_PATHNAME', 'predict_model_row_wrapper';プロジェクト名に基づいて、
FLOAT4特徴に対して推論を実行します。CREATE FUNCTION pgml."predict"( "project_name" TEXT, "features" real[] ) RETURNS real IMMUTABLE STRICT PARALLEL SAFE LANGUAGE c /* Rust */ AS 'MODULE_PATHNAME', 'predict_f32_wrapper';モデル ID に基づいて、
FLOAT4特徴に対して推論を実行します。CREATE FUNCTION pgml."predict"( "model_id" bigint, "features" real[] ) RETURNS real IMMUTABLE STRICT PARALLEL SAFE LANGUAGE c /* Rust */ AS 'MODULE_PATHNAME', 'predict_model_wrapper';プロジェクト名に基づいて、
BIGINT特徴に対して推論を実行します。CREATE FUNCTION pgml."predict"( "project_name" TEXT, "features" bigint[] ) RETURNS real IMMUTABLE STRICT PARALLEL SAFE LANGUAGE c /* Rust */ AS 'MODULE_PATHNAME', 'predict_i64_wrapper';プロジェクト名に基づいて、
INT特徴に対して推論を実行します。CREATE FUNCTION pgml."predict"( "project_name" TEXT, "features" INT[] ) RETURNS real IMMUTABLE STRICT PARALLEL SAFE LANGUAGE c /* Rust */ AS 'MODULE_PATHNAME', 'predict_i32_wrapper';プロジェクト名に基づいて、
SMALLINT特徴に対して推論を実行します。CREATE FUNCTION pgml."predict"( "project_name" TEXT, "features" smallint[] ) RETURNS real IMMUTABLE STRICT PARALLEL SAFE LANGUAGE c /* Rust */ AS 'MODULE_PATHNAME', 'predict_i16_wrapper';プロジェクト名に基づいて、
FLOAT8特徴に対して推論を実行します。CREATE FUNCTION pgml."predict"( "project_name" TEXT, "features" double precision[] ) RETURNS real IMMUTABLE STRICT PARALLEL SAFE LANGUAGE c /* Rust */ AS 'MODULE_PATHNAME', 'predict_f64_wrapper';プロジェクト名に基づいて、
BOOL特徴に対して推論を実行します。CREATE FUNCTION pgml."predict"( "project_name" TEXT, "features" bool[] ) RETURNS real /* f32 */ IMMUTABLE STRICT PARALLEL SAFE LANGUAGE c /* Rust */ AS 'MODULE_PATHNAME', 'predict_bool_wrapper';
一度に複数のテキストに対して推論を実行する
predict_batch()、predict_proba()、または predict_joint() 関数を使用して、プロジェクト名またはモデル ID に基づいて複数の FLOAT4 特徴セットに対して推論を実行できます。
複数の特徴セットは、1 次元配列にフラット化する必要があります。 戻り値は FLOAT4 値の配列です。
predict_batch
ほとんどの場合、predict_batch() 関数を使用して、一度に複数のテキストに対して推論を実行できます。 次の例は、さまざまなシナリオで一度に複数のテキストに対して推論を実行する方法を示しています。
モデル ID に基づいて、テーブルのデータ行に対して推論を実行します。
CREATE FUNCTION pgml."predict_batch"( "model_id" bigint, /* i64 */ "features" real[] /* alloc::vec::Vec<f32> */ ) RETURNS real[] /* alloc::vec::Vec<f32> */ IMMUTABLE STRICT PARALLEL SAFE LANGUAGE c /* Rust */ AS 'MODULE_PATHNAME', 'predict_model_batch_wrapper';プロジェクト名に基づいて、テーブルのデータ行に対して推論を実行します。
CREATE FUNCTION pgml."predict_batch"( "project_name" TEXT, /* &str */ "features" real[] /* alloc::vec::Vec<f32> */ ) RETURNS SETOF real /* f32 */ IMMUTABLE STRICT PARALLEL SAFE LANGUAGE c /* Rust */ AS 'MODULE_PATHNAME', 'predict_batch_wrapper';
predict_proba
信頼確率を返す場合は、predict_proba() 関数を使用することをお勧めします。 predict_proba() 関数は、predict_batch 関数と同様の方法で使用できますが、predict_proba() 関数は各クラスの信頼確率を返します。
モデル ID に基づいて、テーブルのデータ行に対して推論を実行します。
CREATE FUNCTION pgml."predict_proba"( "model_id" bigint, /* i64 */ "features" real[] /* alloc::vec::Vec<f32> */ ) RETURNS real[] /* alloc::vec::Vec<f32> */ IMMUTABLE STRICT PARALLEL SAFE LANGUAGE c /* Rust */ AS 'MODULE_PATHNAME', 'predict_model_proba_wrapper';プロジェクト名に基づいて、テーブルのデータ行に対して推論を実行します。
CREATE FUNCTION pgml."predict_proba"( "project_name" TEXT, /* &str */ "features" real[] /* alloc::vec::Vec<f32> */ ) RETURNS real[] /* alloc::vec::Vec<f32> */ IMMUTABLE STRICT PARALLEL SAFE LANGUAGE c /* Rust */ AS 'MODULE_PATHNAME', 'predict_proba_wrapper';
predict_joint
複数ラベルの列に対して推論を実行するには、predict_joint() 関数を使用します。 この関数は分類タスクをサポートしていません。 predict_joint() 関数は、特徴の各セットに対して多次元予測結果を返します。
モデル ID に基づいて、複数の FLOAT4 特徴セットに対して推論を実行します。
CREATE FUNCTION pgml."predict_joint"( "model_id" bigint, /* i64 */ "features" real[] /* alloc::vec::Vec<f32> */ ) RETURNS real[] /* alloc::vec::Vec<f32> */ IMMUTABLE STRICT PARALLEL SAFE LANGUAGE c /* Rust */ AS 'MODULE_PATHNAME', 'predict_model_joint_wrapper';プロジェクト名に基づいて、複数の FLOAT4 特徴セットに対して推論を実行します。
CREATE FUNCTION pgml."predict_joint"( "project_name" TEXT, /* &str */ "features" real[] /* alloc::vec::Vec<f32> */ ) RETURNS real[] /* alloc::vec::Vec<f32> */ IMMUTABLE STRICT PARALLEL SAFE LANGUAGE c /* Rust */ AS 'MODULE_PATHNAME', 'predict_joint_wrapper';
例
次の例は、分類、回帰、クラスタリング、次元削減、および前処理を実行するために使用される完全な SQL 構文を示しています。