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;
/