Oracle 20c 新特性:XGBoost 機器學習演算法和 AutoML 的支援

資料和雲發表於2020-05-13

墨墨導讀:XGBoost是一個高效、可擴充套件的機器學習演算法,用於迴歸和分類(regression and classification),使得XGBoost Gradient Boosting開源包可用。

Oracle 20c資料庫中引入的一個新的機器學習演算法叫做XGBoost。XGBoost是一個開源軟體庫,它在大多數常用的資料科學、機器學習和軟體開發語言中提供了一個梯度提升框架。
該演算法是在之前的決策樹、Bagging、隨機森林、Boosting和梯度提升等工作的基礎上發展而來。XGBoost 是一個高效、可擴充套件的機器學習演算法,經過多年的研究、開發和驗證,XGBoost可以用於分類的典型用例,包括分類、迴歸和排名問題(regression and classification)。
OML4SQL XGBoost (Oracle Machine Learning for SQL XGBoost) 是一個可擴充套件的梯度樹提升系統,支援分類和迴歸。它提供了開源的梯度提升框架。透過準備訓練資料,呼叫XGBoost,構建和持久化模型,並應用該模型進行預測,使得XGBoost Gradient Boosting開源包在資料庫中可用。
Oracle 20c 新特性:XGBoost 機器學習演算法和 AutoML 的支援
你可以將XGBoost作為一個獨立的預測器使用,也可以將其整合到實際的生產流水線中,用於廣告點選率預測、危害風險預測、網頁文字分類等多種問題。
OML4SQL XGBoost演算法需要三種型別的引數:通用引數、助推器引數、任務引數。使用者透過模型設定表來設定引數。該演算法支援大部分開源專案的設定。
透過XGBoost,OML4SQL支援多種不同的分類和迴歸規範、排名模型和生存模型。在分類機器學習函式下支援二進位制和多類模型,而在迴歸機器學習函式下支援迴歸、排名、計數和存活模型。

為什麼 XGBoost 如此受到歡迎?


XGBoost 是基於決策樹的整合機器學習演算法,它以梯度提升(Gradient Boost)為框架。在非結構資料(影像、文字等)的預測問題中,人工神經網路的表現要優於其他演算法或框架。但在處理中小型結構資料或表格資料時,現在普遍認為基於決策樹的演算法是最好的。下圖列出了近年來基於樹的演算法的演變過程:



Oracle 20c 新特性:XGBoost 機器學習演算法和 AutoML 的支援
XGBoost 演算法最初是華盛頓大學的一個研究專案。陳天奇和 Carlos Guestrin 在 SIGKDD 2016 大會上發表的論文《XGBoost: A Scalable Tree Boosting System》在整個機器學習領域引起轟動。自發表以來,該演算法不僅多次贏得 Kaggle 競賽,還應用在多個前沿工業應用中,並推動其發展。許多資料科學家合作參與了 XGBoost 開源專案,GitHub 上的這一專案約有 350 個貢獻者,以及 3600 多條提交。和其他演算法相比,XGBoost 演算法的不同之處有以下幾點:

  1. 應用範圍廣泛:該演算法可以解決迴歸、分類、排序以及使用者自定義的預測問題;
  2. 可移植性:該演算法可以在 Windows、Linux 和 OS X 上流暢地執行;
  3. 語言:支援包括 C++、Python、R、Java、Scala 和 Julia 在內的幾乎所有主流程式語言;
  4. 雲整合:支援 AWS、Azure 和 Yarn 叢集,也可以很好地配合 Flink、 Spark 等其他生態系統。

演算法演進過程:

  1. 常規的機器學習模型(例如決策樹)僅使用訓練資料集來訓練單個模型,並且僅將此模型用於預測。儘管決策樹的建立非常簡單(並且非常快),具有模型可解釋性,但其預測能力可能不如大多數其他演算法好。
  2. 為了克服此限制,可以使用整合方法建立多個決策樹,並將其組合以用於預測目的。
  3. Bagging演算法(英語:Bootstrap aggregating,引導聚集演算法,又稱裝袋演算法)是一種使用多數表決將來自多個DT模型的預測進行合併的方法。
  4. 在裝袋方法的基礎上,Random Forest使用功能的不同子集和訓練資料的子集,以不同的方式將它們組合以建立DT模型的集合,並作為一個模型呈現給使用者。
  5. Boosting透過建立順序模型與每個後續模型的方式,採用一種更迭代的方法來完善模型,其重點是最大程度地減少先前模型的誤差。
  6. 梯度提升使用梯度下降演算法來最小化後續模型中的誤差。
  7. 藉助XGBoost,可以在上述步驟的基礎上進行並行處理,樹修剪,資料丟失處理,正則化以及實現更好的快取,記憶體和硬體最佳化。通常稱為梯度增強。

透過以下幾個示意圖,我們可以大致瞭解一下以上提到的各種 ML 演算法。

  1. 決策樹,以非常快速的、可解釋的模型,來進行判斷選擇,支援決策

    Oracle 20c 新特性:XGBoost 機器學習演算法和 AutoML 的支援
  2. 多決策樹,用於組合預測,增加準確性

    Oracle 20c 新特性:XGBoost 機器學習演算法和 AutoML 的支援
  3. Bagging 演算法,也就是所謂的 裝袋演算法

    Oracle 20c 新特性:XGBoost 機器學習演算法和 AutoML 的支援
    Bagging 特點在“隨機取樣”。隨機取樣(bootsrap)就是從訓練集採集固定個數的樣本,但是每採集一個樣本後,都將樣本放回。也就是說,之前採集到的樣本在放回後有可能繼續被採集到。
  4. Random Forest ,隨機森林 演算法
    RF在實際中使用非常頻繁,其本質上和bagging並無不同,只是RF更具體一些。一般而言可以將RF理解為bagging和DT(CART)的結合。隨機森林是由很多決策樹構成的,不同決策樹之間沒有關聯。
    Oracle 20c 新特性:XGBoost 機器學習演算法和 AutoML 的支援
    RF中的基學習器使用的是CART樹,由於演算法本身能降低方差(variance),所以會選擇完全生長的CART樹。抽樣方法使用bootstrap,除此之外,RF認為隨機程度越高,演算法的效果越好。所以RF中還經常隨機選取樣本的特徵屬性、甚至於將樣本的特徵屬性透過對映矩陣對映到隨機的子空間來增大子模型的隨機性、多樣性。RF預測的結果為子樹結果的平均值。RF具有很好的降噪性,相比單棵的CART樹,RF模型邊界更加平滑,置信區間也比較大。一般而言,RF中,樹越多模型越穩定。

    Oracle 20c 新特性:XGBoost 機器學習演算法和 AutoML 的支援
  5. Boosting
    Boosting 和 bagging 最本質的差別在於他對基礎模型不是一致對待的,而是經過不停的考驗和篩選來挑選出「精英」,然後給精英更多的投票權,表現不好的基礎模型則給較少的投票權,然後綜合所有人的投票得到最終結果。大部分情況下,經過 boosting 得到的結果偏差(bias)更小。

    Oracle 20c 新特性:XGBoost 機器學習演算法和 AutoML 的支援
  6. 梯度提升樹演算法
    梯度提升樹演算法實際上是提升演算法的擴充套件版,在原始的提升演算法中,如果損失函式為平方損失或指數損失,求解損失函式的最小值問題會非常簡單,但如果損失函式為更一般的函式(如絕對值損失函式或Huber損失函式等),目標值的求解就會相對複雜很多。
    梯度提升演算法,是在第?輪基礎模型中,利用損失函式的負梯度值作為該輪基礎模型損失值的近似,並利用這個近似值構建下一輪基礎模型。利用損失函式的負梯度值近似殘差的計算就是梯度提升演算法在提升演算法上的擴充套件,這樣的擴充套件使得目標函式的求解更為方便。
  7. XGBoost
    就是在上述演算法的基礎上進行並行處理,樹修剪,資料丟失處理,正則化以及實現更好的快取,記憶體和硬體最佳化。因而通常稱為梯度增強。

下面的例子使用一組客戶的人口統計學和購買資料來預測客戶對親情卡計劃的反應。這些資料來自於SH Schema中的基表,展示了 Oracle 資料庫在機器學習方面的增強。
這個例子使用了XGBoost演算法和CLASSIFICATION機器學習功能。
建立和填充一個設定表


-- Create the setting table xgc_sh_settings.

CREATE TABLE xgc_sh_settings(setting_name VARCHAR2(30), 

                             setting_value VARCHAR2(128)); 

-- Populate the settings table.

BEGIN

  INSERT INTO xgc_sh_settings (setting_name, setting_value) VALUES

    (dbms_data_mining.algo_name, dbms_data_mining.algo_xgboost);

  -- For 0/1 target, choose binary:logistic as the objective.

  INSERT INTO xgc_sh_settings (setting_name, setting_value) VALUES

    (dbms_data_mining.xgboost_objective, 'binary:logistic');

  INSERT INTO xgc_sh_settings (setting_name, setting_value) VALUES

    (dbms_data_mining.xgboost_max_depth, '3');

  INSERT INTO xgc_sh_settings (setting_name, setting_value) VALUES

    (dbms_data_mining.xgboost_eta, '1');

  -- Choose error and auc as eval_metric to evaluate the training dataset.

  INSERT INTO xgc_sh_settings (setting_name, setting_value) VALUES

   (dbms_data_mining.xgboost_eval_metric, 'error,auc');

  INSERT INTO xgc_sh_settings (setting_name, setting_value) VALUES

    (dbms_data_mining.xgboost_num_round, '10');

END;

/



建立一個模型並顯示模型設定:

-- Create a model.
BEGIN
 DBMS_DATA_MINING.CREATE_MODEL(
   model_name          => 'XGC_SH_MODEL',
   mining_function     => dbms_data_mining.classification,
   data_table_name     => 'mining_data_build_v',
   case_id_column_name => 'cust_id',
   target_column_name  => 'affinity_card',
   settings_table_name => 'xgc_sh_settings');
END;
/
-- Display the model settings.
SELECT setting_name, setting_value
 FROM user_mining_model_settings
 WHERE model_name = 'XGC_SH_MODEL'
 ORDER BY setting_name;
-- The query produces the following output.
SETTING_NAME                   SETTING_VALUE
------------------------------ ------------------------------
ALGO_NAME                      ALGO_XGBOOST
CLAS_WEIGHTS_BALANCED          OFF
ODMS_DETAILS                   ODMS_ENABLE
ODMS_MISSING_VALUE_TREATMENT   ODMS_MISSING_VALUE_AUTO
ODMS_SAMPLING                  ODMS_SAMPLING_DISABLE
PREP_AUTO                      ON
booster                        gbtree
eta                            1
eval_metric                    error,auc
max_depth                      3
ntree_limit                    0
num_round                      10
objective                      binary:logistic
13 rows selected.


顯示 TOP 10 屬性的重要性排列:

-- Show the atribute importance of the top 10 important features.
SELECT * 
  FROM(SELECT attribute_name, attribute_value, gain, cover, frequency
         FROM DM$VIXGC_SH_MODEL
         ORDER BY gain desc)
  WHERE rownum <= 10;
The query produces the following output.
ATTRIBUTE_NAME            ATTRIBUTE_VALUE   GAIN  COVER FREQUENCY
------------------------- --------------- ------ ------ ---------
YRS_RESIDENCE                               .259   .143      .117
HOUSEHOLD_SIZE            2                 .110   .044      .033
AGE                                         .093   .156      .250
HOUSEHOLD_SIZE            9+                .085   .031      .033
CUST_MARITAL_STATUS       NeverM            .073   .067      .033
BOOKKEEPING_APPLICATION                     .055   .035      .033
EDUCATION                 Bach.             .053   .047      .033
OCCUPATION                Prof.             .048   .032      .033
EDUCATION                 Masters           .045   .052      .050
OCCUPATION                Other             .029   .055      .033
10 rows selected.

使用XGBoost進行迴歸
這個例子使用了XGBoost演算法和REGRESSION機器學習函式。
建立和填充一個設定表:

-- Create the setting table xgr_sh_settings.
CREATE TABLE xgr_sh_settings(setting_name VARCHAR2(30),
                            setting_value VARCHAR2(128));
-- Populate the settings table.
BEGIN
 INSERT INTO xgr_sh_settings (setting_name, setting_value) VALUES
   (dbms_data_mining.algo_name, dbms_data_mining.algo_xgboost);
 -- For 0/1 target, choose binary:logistic as the objective.
 INSERT INTO xgr_sh_settings (setting_name, setting_value) VALUES
   (dbms_data_mining.xgboost_booster, 'gblinear');
 INSERT INTO xgr_sh_settings (setting_name, setting_value) VALUES
   (dbms_data_mining.xgboost_alpha, '0.0001');
 INSERT INTO xgr_sh_settings (setting_name, setting_value) VALUES
   (dbms_data_mining.xgboost_lambda, '1');
 INSERT INTO xgr_sh_settings (setting_name, setting_value) VALUES
   (dbms_data_mining.xgboost_num_round, '100');
END;
/

建立一個模型並顯示模型設定:

-- Create a model.
BEGIN
 DBMS_DATA_MINING.CREATE_MODEL(
   model_name          => 'XGR_SH_MODEL',
   mining_function     => dbms_data_mining.regression,
   data_table_name     => 'mining_data_build_v',
   case_id_column_name => 'cust_id',
   target_column_name  => 'age',
   settings_table_name => 'xgr_sh_settings');
END;
/
-- Display the model settings.
SELECT setting_name, setting_value
 FROM user_mining_model_settings
 WHERE model_name = 'XGR_SH_MODEL'
 ORDER BY setting_name;
The query produces the following output.
SETTING_NAME                   SETTING_VALUE
------------------------------ ------------------------------
ALGO_NAME                      ALGO_XGBOOST
ODMS_DETAILS                   ODMS_ENABLE
ODMS_MISSING_VALUE_TREATMENT   ODMS_MISSING_VALUE_AUTO
ODMS_SAMPLING                  ODMS_SAMPLING_DISABLE
PREP_AUTO                      ON
alpha                          0.0001
booster                        gblinear
lambda                         1
ntree_limit                    0
num_round                      100
10 rows selected.


顯示屬性的重要性:

-- Show the atribute importance of the top 5 important features.
SSELECT *
 FROM(SELECT attribute_name, attribute_value, weight
       FROM DM$VIXGR_SH_MODEL
       ORDER BY abs(weight) desc)
 WHERE rownum <= 5;
The query produces the following output.
ATTRIBUTE_NAME         ATTRIBUTE_VALUE WEIGHT
---------------------- --------------- ------
YRS_RESIDENCE                           3.109
HOME_THEATER_PACKAGE                    2.332
Y_BOX_GAMES                            -1.804
CUST_MARITAL_STATUS    NeverM          -1.131
HOUSEHOLD_SIZE         1                -.696
5 rows selected.

參考:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31556440/viewspace-2691695/,如需轉載,請註明出處,否則將追究法律責任。

相關文章