33 XGBoost

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

33.1 XGBoostについて

OracleのXGBoostでは、トレーニング・データが準備され、モデルが作成されて保持され、分類および回帰のためにそのモデルが適用されます。

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

XGBoostを独立した予測子として使用することや、クリック率予測、危険性予測、Webテキスト分類などの幅広い問題のために実社会の生産パイプラインに組み込むことができます。

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

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

また、XGBoostでは、パーティション化されたモデルがサポートされており、データ準備が内部化されています。現在、XGBoostはOracle Database Linuxプラットフォームでのみ使用できます。

33.2 XGBoost機能制約

機能相互作用制約を使用すると、ユーザーはどの変数を相互作用できるか、できないかを指定できます。主要な相互作用に焦点を当て、ノイズを排除することで、予測パフォーマンスの向上に役立ちます。これによって、より一般化された予測になる可能性があります。

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

単調制約により、ブースティングされたモデルの機能に単調性制約を適用できます。多くの状況では、純粋な関係がなんらかの方法で制約されるという強い前提が存在する可能性があります。これは、商業的要因(特定の機能の相互作用のみが対象となる)または調査中の科学的主題のタイプが原因である可能性があります。制約の典型的な形式は、一部の機能に予測応答への単調なつながりがあることです。このような状況では、単調制約を採用してモデルの予測パフォーマンスを向上できます。たとえば、Xが機能[x1,…, xi , …, xn]の機能ベクトルで、ƒ(X)が予測応答であるとします。この場合、xi ≤ xi'が増加制約の場合は常にƒ(X) ≤ ƒ(X')となり、xi ≤ xi'が減少制約の場合は常にƒ(X) ≥ ƒ(X')となります。これらの機能制約は、「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/23aiを参照してください。

33.3 XGBoost AFTモデル

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

生存分析の目標には、ある事象の時間パターンの評価、様々な人のグループでの生存時間の分布の比較、特定の要因が対象事象の尤度に影響するかどうか、およびどの程度影響するかを判断することが含まれます。打切りデータの存在は生存解析の重要な特徴です。観測期間内に事象を経験していない人は、打切りとしてラベル付けされます。打切りは、登録されたすべての被験者が対象事象を実証する前に終了した研究や、事象を経験する前に研究から離れた被験者など、様々な理由で事象までの時間が記録されない、ある種の欠損データの問題です。右打切りは、純粋な事象時間Tの下限lのみを認識する(T > l)ものとして定義されます。右打切りが行われるのは、たとえば、被験者の生年月日がわかっているが、追跡調査ができなくなり、その被験者が引き続き生存している場合、または研究が終了した場合です。右打切りされたデータに遭遇することはよくあります。対象事象が研究に組み込まれる前に発生し、正確な日付が不明な場合、データは左打切りされることになります。区間打切りは、事象が2つの観測または検査の間に発生したと説明するしかない場合に発生します。

Cox比例ハザード・モデルと加速故障時間(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個の係数で構成されるベクトルです。<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;
/

33.4 XGBoostでのスコアリング

サポートされているSQL関数の使用によって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は、各観測について、予測、および対応する予測確率を返します(分類のみ)。