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

AnalyticDB:機械学習の使用

最終更新日:Apr 08, 2025

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-learnXGBoost ドキュメントなど、使用するモデルアルゴリズムの公式ドキュメントを参照してください。

{ "max_depth": [1, 2, 3, 4] }

search_args

検索方法の補足パラメーター。 詳細については、scikit-learnXGBoost ドキュメントなど、使用するモデルアルゴリズムの公式ドキュメントを参照してください。

{ "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.algorithmpgml.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 ランタイム環境。

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

ハイパーパラメーター検索と交差検証を使用して、モデルトレーニングに最適なハイパーパラメーターセットを見つけることができます。 ハイパーパラメーター検索に関連するトレーニングパラメーターには、searchsearch_params、および search_args が含まれます。

  • 次の表では、pgml.search カスタム列挙型でサポートされている検索方法について説明します。

    検索方法

    説明

    grid

    デカルト積を使用して、search_params パラメーターで指定された検索ハイパーパラメーターのすべての可能な組み合わせをトレーニングします。

    random

    search_args パラメーターに基づいて、最大 n_iter サンプリング反復まで、search_params パラメーターで指定された検索ハイパーパラメーターからパラメーターの組み合わせをランダムに選択します。

  • search_params パラメーターは、最適なハイパーパラメーターセットを取得するために、ハイパーパラメーター検索で使用するハイパーパラメーターと対応するハイパーパラメーター値の範囲を指定します。 検索ハイパーパラメーターの詳細については、scikit-learnXGBoost ドキュメントなど、使用するモデルアルゴリズムの公式ドキュメントを参照してください。

  • 次の表では、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 構文を示しています。

分類

-- エラー時に終了 (psql)
-- \set ON_ERROR_STOP true
\timing on

SELECT pgml.load_dataset('breast_cancer');

-- データセットを表示する
SELECT * FROM pgml.breast_cancer LIMIT 10;

-- データを分類するためのシンプルなモデルをトレーニングする
SELECT * FROM pgml.train('Breast Cancer Detection', 'classification', 'pgml.breast_cancer', 'malignant');

-- 予測を確認する
SELECT malignant, pgml.predict(
    'Breast Cancer Detection', 
    (
        "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(
    'Breast Cancer Detection',
    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('Breast Cancer Detection', algorithm => 'ridge');
SELECT * FROM pgml.train('Breast Cancer Detection', algorithm => 'stochastic_gradient_descent');
SELECT * FROM pgml.train('Breast Cancer Detection', algorithm => 'perceptron');
SELECT * FROM pgml.train('Breast Cancer Detection', algorithm => 'passive_aggressive');

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

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

-- その他
-- ガウス過程は、トイデータセットでも通常のテストにはコストがかかりすぎます
-- SELECT * FROM pgml.train('Breast Cancer Detection', algorithm => 'gaussian_process', hyperparams => '{"max_iter_predict": 100, "warm_start": true}');

-- 勾配ブースティング
SELECT * FROM pgml.train('Breast Cancer Detection', algorithm => 'xgboost', hyperparams => '{"n_estimators": 10}');
-- SELECT * FROM pgml.train('Breast Cancer Detection', algorithm => 'xgboost_random_forest', hyperparams => '{"n_estimators": 10}');
-- SELECT * FROM pgml.train('Breast Cancer Detection', algorithm => 'lightgbm', hyperparams => '{"n_estimators": 1}');
-- ヒストグラム勾配ブースティングは、トイデータセットでも通常のテストにはコストがかかりすぎます
-- SELECT * FROM pgml.train('Breast Cancer Detection', algorithm => 'hist_gradient_boosting', hyperparams => '{"max_iter": 2}');


-- すべてのハードワークを確認する
SELECT trained_models.* FROM pgml.trained_models 
JOIN pgml.models on models.id = trained_models.id
ORDER BY models.metrics->>'f1' DESC LIMIT 5;

-- 予測用に random_forest モデルをデプロイする
SELECT * FROM pgml.deploy('Breast Cancer Detection', 'most_recent', 'random_forest');
-- そのスループットを確認する
SELECT * FROM pgml.deployed_models ORDER BY deployed_at DESC LIMIT 5;

-- 好きなアルゴリズムでハイパーパラメーター検索を実行する
SELECT pgml.train(
    'Breast Cancer Detection', 
    algorithm => 'xgboost', 
    search => 'grid', 
    search_params => '{
        "n_estimators": [2, 4],
        "max_depth": [1, 2, 3]
    }'
);

-- 予測用に「最適な」モデルをデプロイする
SELECT * FROM pgml.deploy('Breast Cancer Detection', 'best_score');
SELECT * FROM pgml.deploy('Breast Cancer Detection', 'most_recent');
SELECT * FROM pgml.deploy('Breast Cancer Detection', 'rollback');
SELECT * FROM pgml.deploy('Breast Cancer Detection', 'best_score', 'svm');

-- 改善された予測を確認する
SELECT malignant, pgml.predict(
    'Breast Cancer Detection', 
    (
        "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 pgml.load_dataset('diabetes');

-- データセットを表示する
SELECT * FROM pgml.diabetes LIMIT 10;

-- データに対してシンプルなモデルをトレーニングする
SELECT * FROM pgml.train('Diabetes Progression', 'regression', 'pgml.diabetes', 'target');

-- 予測を確認する
SELECT target, pgml.predict('Diabetes Progression', (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 = 'Diabetes Progression'
    LIMIT 1
) models
LIMIT 10;

--
-- プロジェクトがトレーニングされた後、省略されたパラメーターは以前のトレーニング実行から再利用されます
-- これらの例では、最初の呼び出しからのトレーニングデータのスナップショットを再利用します。
--

-- 線形モデル
SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'ridge');
SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'lasso');
SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'elastic_net');
SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'least_angle');
SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'lasso_least_angle');
SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'orthogonal_matching_pursuit');
SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'bayesian_ridge');
SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'automatic_relevance_determination');
SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'stochastic_gradient_descent');
SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'passive_aggressive');
SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'ransac');
SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'theil_sen', hyperparams => '{"max_iter": 10, "max_subpopulation": 100}');
SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'huber');
-- 分位点回帰は、トイデータセットでも通常のテストにはコストがかかりすぎます
-- SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'quantile');

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

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

-- その他
-- カーネルリッジは、トイデータセットでも通常のテストにはコストがかかりすぎます
-- SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'kernel_ridge');
-- ガウス過程は、トイデータセットでも通常のテストにはコストがかかりすぎます
-- SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'gaussian_process');

-- 勾配ブースティング
SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'xgboost', hyperparams => '{"n_estimators": 10}');
SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'catboost', hyperparams => '{"n_estimators": 10}');
-- SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'xgboost_random_forest', hyperparams => '{"n_estimators": 10}');
-- SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'lightgbm', hyperparams => '{"n_estimators": 1}');
-- ヒストグラム勾配ブースティングは、トイデータセットでも通常のテストにはコストがかかりすぎます
-- SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'hist_gradient_boosting', hyperparams => '{"max_iter": 10}');

-- ランタイム
SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'linear', runtime => 'python');
SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'linear', runtime => 'rust');

--SELECT * FROM pgml.train('Diabetes Progression', algorithm => 'xgboost', runtime => 'python', hyperparams => '{"n_estimators": 1}'); -- 遅すぎる
SELECT * FROM pgml.train('Diabetes Progression', 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;

-- 予測用に random_forest モデルをデプロイする
SELECT * FROM pgml.deploy('Diabetes Progression', 'most_recent', 'random_forest');
-- そのスループットを確認する
SELECT * FROM pgml.deployed_models ORDER BY deployed_at DESC LIMIT 5;

-- 好きなアルゴリズムでハイパーパラメーター検索を実行する
SELECT pgml.train(
    'Diabetes Progression', 
    algorithm => 'xgboost',
    hyperparams => '{"eval_metric": "rmse"}'::JSONB,
    search => 'grid', 
    search_params => '{
        "max_depth": [1, 2], 
        "n_estimators": [20, 40]
    }'
);

-- 予測用に「最適な」モデルをデプロイする
SELECT * FROM pgml.deploy('Diabetes Progression', 'best_score');
SELECT * FROM pgml.deploy('Diabetes Progression', 'most_recent');
SELECT * FROM pgml.deploy('Diabetes Progression', 'rollback');
SELECT * FROM pgml.deploy('Diabetes Progression', 'best_score', 'svm');

-- 改善された予測を確認する
SELECT target, pgml.predict('Diabetes Progression', (age, sex, bmi, bp, s1, s2, s3, s4, s5, s6)) AS prediction
FROM pgml.diabetes 
LIMIT 10;

クラスタリング

-- この例では、sklean digits データセットに対してモデルをトレーニングします
-- これは、UCI ML 手書き数字データセットのテストセットのコピーです
-- https://archive.ics.uci.edu/ml/datasets/Optical+Recognition+of+Handwritten+Digits
--
-- これは、クラスタリングのために単一の配列特徴列を持つテーブルを使用する方法を示しています。
-- ベクトル列でも同様のことができます
--

-- エラー時に終了 (psql)
-- \set ON_ERROR_STOP true
\timing on

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;

-- データを分類するためのシンプルなモデルをトレーニングする
SELECT * FROM pgml.train('Handwritten Digit Clusters', 'clustering', 'pgml.digit_vectors', hyperparams => '{"n_clusters": 10}');

-- 予測を確認する
SELECT target, pgml.predict('Handwritten Digit Clusters', image) AS prediction
FROM pgml.digits
LIMIT 10;

SELECT * FROM pgml.train('Handwritten Digit Clusters', algorithm => 'affinity_propagation');
SELECT * FROM pgml.train('Handwritten Digit Clusters', algorithm => 'birch', hyperparams => '{"n_clusters": 10}');
SELECT * FROM pgml.train('Handwritten Digit Clusters', algorithm => 'kmeans', hyperparams => '{"n_clusters": 10}');
SELECT * FROM pgml.train('Handwritten Digit Clusters', algorithm => 'mini_batch_kmeans', hyperparams => '{"n_clusters": 10}');

次元削減

-- この例では、sklean digits データセットの画像の次元を削減します
-- これは、UCI ML 手書き数字データセットのテストセットのコピーです
-- https://archive.ics.uci.edu/ml/datasets/Optical+Recognition+of+Handwritten+Digits
--
-- これは、次元削減のために単一の配列特徴列を持つテーブルを使用して分解する方法を示しています。
--
-- エラー時に終了 (psql)
-- \set ON_ERROR_STOP true
\timing on

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;

SELECT * FROM pgml.train('Handwritten Digits Reduction', 'decomposition', 'digit_vectors');

-- 分解されたベクトルを確認する
SELECT target, pgml.decompose('Handwritten Digits Reduction', image) AS pca
FROM pgml.digits
LIMIT 10;

--
-- プロジェクトがトレーニングされた後、省略されたパラメーターは以前のトレーニング実行から再利用されます
-- これらの例では、最初の呼び出しからのトレーニングデータのスナップショットを再利用します。
--

-- 画像ベクトルを 64 次元から 3 つのコンポーネントに削減できます
SELECT * FROM pgml.train('Handwritten Digits Reduction', hyperparams => '{"n_components": 3}');

-- 削減されたベクトルを確認する
SELECT target, pgml.decompose('Handwritten Digits Reduction', 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('Handwritten Digits Reduction', 'most_recent', 'pca');
-- そのスループットを確認する
SELECT * FROM pgml.deployed_models ORDER BY deployed_at DESC LIMIT 5;

-- 予測用に「最適な」モデルをデプロイする
SELECT * FROM pgml.deploy('Handwritten Digits Reduction', 'best_score');
SELECT * FROM pgml.deploy('Handwritten Digits Reduction', 'most_recent');
SELECT * FROM pgml.deploy('Handwritten Digits Reduction', 'rollback');
SELECT * FROM pgml.deploy('Handwritten Digits Reduction', 'best_score', 'pca');

-- 改善された予測を確認する
SELECT target, pgml.predict('Handwritten Digits Reduction', image) AS prediction
FROM pgml.digits
LIMIT 10;

前処理

-- テキストカテゴリ変数を含む diamonds データセットを読み込む
SELECT pgml.load_dataset('jdxcosta/diamonds');

-- データを表示する
SELECT * FROM pgml."jdxcosta/diamonds" LIMIT 10;

-- トレーニングに役立たないため、Unamed 列を削除する(代わりにビューを作成することもできます)
ALTER TABLE pgml."jdxcosta/diamonds" DROP COLUMN "Unnamed: 0";

-- 数値変数をスケーリングし、カテゴリ変数をターゲットエンコードするためのプリプロセッサを使用してモデルをトレーニングする
SELECT pgml.train(
       project_name => 'Diamond prices',
       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"}
                  }'
);

-- いくつかの予測を実行する。同種の ARRAY [] ではなく、異種行 (タプル) を入力として渡していることに注意してください。
SELECT price, pgml.predict('Diamond prices', (carat, cut, color, clarity, depth, "table", x, y, z)) AS prediction
FROM pgml."jdxcosta/diamonds"
LIMIT 10;

-- これは、より多くのアルゴリズムにとって難しいデータセットであり、前処理と追加の特徴エンジニアリングにとって良い課題となります。 次は何ですか?