32 XGBoost

XGBoostは、XGBoost Gradient Boostingオープン・ソース・パッケージを使用可能にする、回帰および分類用の効率が高いスケーラブルな機械学習アルゴリズムです。

32.1 XGBoostについて

Oracle Machine Learning for SQL XGBoostでは、トレーニング・データの準備、XGBoostの起動、モデルの作成と保持、予測のためのモデルの適用を実施します。

Oracle Machine Learning for SQL XGBoostは、分類と回帰の両方をサポートするスケーラブルな勾配ツリー・ブースティング・システムです。これにより、オープン・ソースの勾配ブースティング・フレームワークが使用可能になります。

XGBoostをスタンドアロンの予測子として使用することも、広告クリックスルー率の予測、ハザード・リスクの予測、Webテキスト分類といった幅広い問題に対処するために、実際の生産パイプラインに組み込むこともできます。

Oracle Machine Learning for SQL XGBoostアルゴリズムでは、汎用パラメータ、ブースタ・パラメータおよびタスク・パラメータの3種類のパラメータを使用します。パラメータはモデル設定表から設定します。このアルゴリズムでは、オープン・ソース・プロジェクトの設定のほとんどがサポートされています。

XGBoostを介して、Oracle Machine Learning for SQLでは様々な分類および回帰の仕様、ランク付けモデル、生存モデルがサポートされています。分類の機械学習手法では2項モデルと多クラス・モデルがサポートされているのに対し、回帰の機械学習手法では回帰、ランク付け、計数および生存がサポートされています。

また、XGBoostでは、パーティション化されたモデルのサポートやデータ準備の取込みも行われます。現在、XGBoostはOracle Database Linuxプラットフォームでのみ使用できます。

32.2 XGBoost機能制約

特徴相互作用制約では、どの変数に相互作用を許可するか、または許可しないかを指定できます。主要な相互作用に焦点を当てノイズを排除することは、予測パフォーマンスの向上につながります。その一方で、より一般的な予測が導かれる可能性があります。

特徴相互作用制約は、相互作用を許可する特徴のグループの観点で説明されます。ディシジョン・ツリーのトラバース・パスに一緒に表示される変数は相互作用します。その理由は子ノードの条件が親ノードの条件に依存するためです。専門知識を含めたモデリング・タスクを熟しているユーザーにとって、このような追加の制御をモデル適合に利用できることは有益なことです。これらの制約が適用されたとき、Oracle Machine Learning for SQLではさらに多くのXGBoost機能がサポートされます。

単調性制約では、ブースト・モデルの特徴に単調性の制約を適用できます。強い前提が存在し、真の関係がなんらかの形で制約される状況は珍しいことではありません。そのような状況は、商業的要因(特定の特徴相互作用のみに関心がある)や調査中の科学的課題のタイプによって発生します。一般的な制約の形は、いくつかの特徴が予測応答と単調の関係を持つ状態です。この場合、単調制約を使用してモデルの予測パフォーマンスを向上できる可能性があります。たとえば、特徴ベクターがX、特徴が[x1,…, xi , …, xn]、予測応答がƒ(X)であるとします。この場合、ƒ(X) ≤ ƒ(X’)xi ≤ xi’のときは制約の増大、ƒ(X) ≥ ƒ(X’)xi ≤ xi’のときは制約の減少です。これらの特徴制約は、DBMS_DATA_MINING - アルゴリズムの設定: XGBoostにリストされています。

次の例では、XGBoostアルゴリズムを使用して機能制約を定義するためのコード・スニペットを表示します。XGBoost interaction_constraints設定は、相互作用制約を指定するために使用されます。この例では、アフィニティ・カードのロイヤルティ・プログラムに好反応を示す可能性が最も高い顧客を予測しています。
-----------------------------------------------------------------------
--   Build a Classification Model using Interaction Contraints
-----------------------------------------------------------------------
-- The interaction constraints setting can be used to specify permitted 
-- interactions in the model. The constraints must be specified 
-- in the form of nested list, where each inner list is a group of 
-- features (column names) that are allowed to interact with each other.
-- For example, assume x0, x1, x2, x3, x4, x5 and x6 are 
-- the feature names (column names) of interest.
-- Then setting value [[x0,x1,x2],[x0,x4],[x5,x6]] specifies that:
--   * Features x0, x1 and x2 are allowed to interact with each other 
--   but with no other feature.
--   * Features x0 & x4 are allowed to interact with one another 
--   but with no other feature.
--   * Features x5 and x6 are allowed to interact with each other 
--   but with no other feature.
-------------------------------------------------------------------------
  
BEGIN DBMS_DATA_MINING.DROP_MODEL('XGB_CLASS_MODEL_INTERACTIONS');
EXCEPTION WHEN OTHERS THEN NULL; END;
/
    
DECLARE
    v_setlst DBMS_DATA_MINING.SETTING_LIST;
BEGIN
    v_setlst('ALGO_NAME')   := 'ALGO_XGBOOST';
    v_setlst('PREP_AUTO')   := 'ON';
    v_setlst('max_depth')   := '2';
    v_setlst('eta')         := '1';
    v_setlst('num_round')   := '100';
    v_setlst('interaction_constraints')  := '[[YRS_RESIDENCE, OCCUPATION], 
                                              [OCCUPATION, Y_BOX_GAMES], 
                                              [BULK_PACK_DISKETTES, 
                                              BOOKKEEPING_APPLICATION]]';
        
    DBMS_DATA_MINING.CREATE_MODEL2(
            MODEL_NAME          => 'XGB_CLASS_MODEL_INTERACTIONS',
            MINING_FUNCTION     => 'CLASSIFICATION',
            DATA_QUERY          => 'SELECT * FROM TRAIN_DATA_CLAS',
            SET_LIST            =>  v_setlst,
            CASE_ID_COLUMN_NAME => 'CUST_ID',
            TARGET_COLUMN_NAME  => 'AFFINITY_CARD'); 
        
    DBMS_OUTPUT.PUT_LINE('Created model: XGB_CLASS_MODEL_INTERACTIONS');
END;
/

完全な例を表示するには、https://github.com/oracle-samples/oracle-db-examples/tree/main/machine-learning/sql/23cを参照してください。

32.3 XGBoost AFTモデル

生存分析は、生物有機体の死や機械システムの故障など、1つまたは複数の発生の間の経過時間を調べる統計分野です。

生存分析の目標は、イベント時間のパターンの評価や様々な人間グループの生存期間分布の比較のほか、特定の要因が対象イベントの尤度に影響するかどうかとその程度を調査することにあります。生存分析では、打ち切りデータの存在が重要な特徴になります。観測期間中にイベントを経験しなかった人は、「打ち切り」のラベルが付けられます。打ち切りはデータ欠損問題の1つで、様々な理由でイベントまでの時間が記録されないことを指します。たとえば、対象イベントがすべての登録被験者で発生する前に調査が終了になった、イベントを経験する前に被験者が調査から離脱したなどの理由が考えられます。右側打ち切りとは、真のイベント時間Tの下限lのみがわかっている状態(T > l)と定義されています。右側打ち切りが発生するのは、被験者の生年月日はわかっているけれども、追跡不能になった時点または調査終了時点において生存者が不明であるような場合です。右側打ち切りのデータは珍しくありません。被験者が調査に含められる前に対象イベントが発生したけれども、正確な日付が不明である場合のデータを左側打ち切りと呼びます。区間打ち切りが発生するのは、発生が2つの観測または調査時点の間で発生したとしか説明できない場合です。

Cox比例ハザード・モデルとAccelerated Failure Time(AFT)モデルという2つの主要な生存分析方法があります。Oracle Machine Learning for SQLでは、これら両方のモデルがサポートされています。

Cox回帰は右側打ち切りの生存時間データで機能します。ハザード率は、被験者が特定の時間まで存続していることを前提に、Cox比例ハザード・モデル回帰モデルにおいて不全のリスク(対象イベントを被るリスクまたは尤度)がどれだけあるかを示すものです。Cox予測はハザード率スケールで返されます。Cox比例ハザード・モデルの形式は次のとおりです:

h (t,x) = h0(t)eβx

h(t)はベースライン・ハザード、xは共変量、βは推定パラメータで、結果におよぼす共変量の影響を表しています。Cox比例ハザード・モデルの推定量は、絶対リスクではなく相対リスクとして解釈されます。

AFTモデルでは、モデルを左側、右側または区間打ち切りのデータに適合させます。AFTモデルは生存分析において最もよく使用されるモデルの1つで、対象イベントまでの時間がモデル化されます。AFTはパラメータ(応答データの分布を仮定する)生存モデルです。AFTモデルの結果には直感的な物理的解釈があります。このモデルの形式は次のとおりです:

ln Y = < W, X> + σZ

Xは、Rdのベクターで特徴を表しています。Wはd係数で構成されるベクターで、それぞれが1つの特徴に対応しています。<W, X>は、Rdの通常のドット積です。Yは、出力ラベルをモデル化するランダム変数です。Zは既知の確率分布のランダム変数です。正規分布、ロジスティック分布、極値分布が一般的な選択です。これはノイズを表します。σはノイズのサイズをスケールするパラメータです。

XGBoostまたは勾配ブースティングで機能するAFTモデルの形式は次のとおりです:

ln Y = T(x) + σZ

T(x)はディシジョン・ツリー・アンサンブルの出力を表しており、指定された入力xを使用しています。Zはランダム変数であり、式lnY=T(x)+σZの尤度が定義されている可能性があります。結果、XGBoostの目的は、適切なツリー・アンサンブルT(x)に適合させることによって、尤度(対数)を最大化することです。

AFTパラメータは、DBMS_DATA_MINING - アルゴリズムの設定: XGBoostにリストされています。

次の例では、XGBoostアルゴリズムを使用した生存分析のコード・スニペットを表示します。この例では、生存分析のデータを含むSURVIVAL_DATA表が作成されます。XGBoostのAFT設定aft_right_bound_column_nameaft_loss_distributionおよびaft_loss_distribution_scaleがこの例で示されます。
-----------------------------------------------------------------------------
--         Create a data table with left and right bound columns
-----------------------------------------------------------------------------

-- The data table 'SURVIVAL_DATA' contains both exact data point and 
-- right-censored data point. The left bound column is set by 
-- parameter target_column_name. The right bound column is set 
-- by setting aft_right_bound_column_name.

-- For right censored data point, the right bound is infinity,
-- which is represented as NULL in the right bound column.

BEGIN EXECUTE IMMEDIATE 'DROP TABLE SURVIVAL_DATA';
EXCEPTION WHEN OTHERS THEN NULL; END;
/ 
CREATE TABLE SURVIVAL_DATA (INST NUMBER, LBOUND NUMBER, AGE NUMBER, 
                            SEX NUMBER, PHECOG NUMBER, PHKARNO NUMBER, 
                            PATKARNO NUMBER, MEALCAL NUMBER, WTLOSS NUMBER, 
                            RBOUND NUMBER);                
INSERT INTO SURVIVAL_DATA VALUES(26, 235, 63, 2, 0, 100,  90,  413,  0,   NULL);
INSERT INTO SURVIVAL_DATA VALUES(22, 444, 75, 2, 2,  70,  70,  438,  8,   444);
INSERT INTO SURVIVAL_DATA VALUES(16, 806, 44, 1, 1,  80,  80, 1025,  1,   NULL);
INSERT INTO SURVIVAL_DATA VALUES(16, 551, 77, 2, 2,  80,  60,  750, 28,   NULL);
INSERT INTO SURVIVAL_DATA VALUES(3,  202, 50, 2, 0, 100, 100,  635,  1,   NULL);
INSERT INTO SURVIVAL_DATA VALUES(7,  583, 68, 1, 1,  60,  70, 1025,  7,   583);
INSERT INTO SURVIVAL_DATA VALUES(32, 135, 60, 1, 1,  90,  70, 1275,  0,   135);
INSERT INTO SURVIVAL_DATA VALUES(21, 237, 69, 1, 1,  80,  70, NULL, NULL, NULL);
INSERT INTO SURVIVAL_DATA VALUES(26, 356, 53, 2, 1,  90,  90, NULL,   2,  NULL);
INSERT INTO SURVIVAL_DATA VALUES(13, 387, 56, 1, 2,  80,  60, 1075, NULL, 387);

-----------------------------------------------------------------------------
--             Build an XGBoost survival model with survival:aft
-----------------------------------------------------------------------------

BEGIN DBMS_DATA_MINING.DROP_MODEL('XGB_SURVIVAL_MODEL');
EXCEPTION WHEN OTHERS THEN NULL; END;
/
DECLARE
    v_setlst DBMS_DATA_MINING.SETTING_LIST;
BEGIN
    v_setlst('ALGO_NAME')                    := 'ALGO_XGBOOST';
    v_setlst('max_depth')                    := '6';
    v_setlst('eval_metric')                  := 'aft-nloglik';
    v_setlst('num_round')                    := '100';
    v_setlst('objective')                    := 'survival:aft';
    v_setlst('aft_right_bound_column_name')  := 'rbound';
    v_setlst('aft_loss_distribution')        := 'normal';
    v_setlst('aft_loss_distribution_scale')  := '1.20';
    v_setlst('eta')                          := '0.05';
    v_setlst('lambda')                       := '0.01';
    v_setlst('alpha')                        := '0.02';
    v_setlst('tree_method')                  := 'hist';

    DBMS_DATA_MINING.CREATE_MODEL2(
        MODEL_NAME          => 'XGB_SURVIVAL_MODEL',
        MINING_FUNCTION     => 'REGRESSION',
        DATA_QUERY          => 'SELECT * FROM SURVIVAL_DATA',
        TARGET_COLUMN_NAME  => 'LBOUND',
        CASE_ID_COLUMN_NAME =>  NULL,
        SET_LIST            =>  v_setlst);
END;
/

32.4 ランキング方法

Oracle Machine Learningは、XGBoostによるペアワイズおよびリストワイズのランキング方式をサポートしています。

トレーニング・データセットについては、複数のセットを用意して、各セットはオブジェクトとそのランキングを表すラベルで構成します。ランキング関数は、トレーニング・データの特定の損失関数を最小化することで構成します。テスト・データを使用して、ランク付けされたオブジェクトのリストを取得するためにランキング関数を適用します。XGBoostでは、回帰関数を使用することでランキングが有効になります。OML4SQLは、XGBoostによるペアワイズおよびリストワイズのランキング方式をサポートしています。

ペアワイズ・ランキング: このアプローチでは、オブジェクトのペアを学習インスタンスと見なします。ペアとリストは、同じcase_id値を指定することで定義されています。オブジェクトのペアがあれば、このアプローチにより、そのペアに最適な順序が付けられます。ペアワイズの損失は、2つのオブジェクトの順序によって定義されます。OML4SQLの場合、このアルゴリズムでは、ランキングの平均反転回数を最小化することを目的として、ペアワイズ・ランキングの実行にLambdaMARTを使用します。

リストワイズ・ランキング: このアプローチでは、複数のランク付けされたオブジェクトのリストを学習インスタンスとして採用します。リスト内の項目には、同一のcase_idを設定する必要があります。このアルゴリズムでは、リストワイズ・ランキングを実行するためにLambdaMARTを使用します。

参照:

ノート:

hyperparameterという用語は、モデル設定でも同じ意味で使用されます。

32.5 XGBoostを使用したスコアリング

XGBoostを使用してスコアリングする方法を学習します。

分類のXGBoostモデルでサポートされているSQLスコアリング関数は、PREDICTIONPREDICTION_COSTPREDICTION_DETAILSPREDICTION_PROBABILITYおよびPREDICTION_SETです。

回帰のXGBoostモデルでサポートされているスコアリング関数は、PREDICTIONおよびPREDICTION_DETAILSです。

予測関数からは、次の情報が返されます。

  • PREDICTIONは予測値を返します。
  • PREDICTION_COSTは、指定した予測のコストの測度をOracle NUMBERとして返します(分類のみ)。
  • PREDICTION_DETAILSは、SHAP (SHapley Additive exPlanation)の寄与率を返します。
  • PREDICTION_PROBABILITYは、指定された予測の確率を返します(分類のみ)。
  • PREDICTION_SETは、観測値ごとに予測とそれに対応する予測確率を返します(分類のみ)。