导读: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开源包在数据库中可用。
你可以将XGBoost作为一个独立的预测器使用,也可以将其整合到实际的生产流水线中,用于广告点击率预测、危害风险预测、网页文本分类等多种问题。
OML4SQL XGBoost算法需要三种类型的参数:通用参数、助推器参数、任务参数。用户通过模型设置表来设置参数。该算法支持大部分开源项目的设置。
通过XGBoost,OML4SQL支持多种不同的分类和回归规范、排名模型和生存模型。在分类机器学习函数下支持二进制和多类模型,而在回归机器学习函数下支持回归、排名、计数和存活模型。 为什么 XGBoost 如此受到欢迎? XGBoost 是基于决策树的集成机器学习算法,它以梯度提升(Gradient Boost)为框架。在非结构数据(图像、文本等)的预测问题中,人工神经网络的表现要优于其他算法或框架。但在处理中小型结构数据或表格数据时,现在普遍认为基于决策树的算法是最好的。下图列出了近年来基于树的算法的演变过程:
XGBoost 算法最初是华盛顿大学的一个研究项目。陈天奇和 Carlos Guestrin 在 SIGKDD 2016 大会上发表的论文《XGBoost: A Scalable Tree Boosting System》在整个机器学习领域引起轰动。自发表以来,该算法不仅多次赢得 Kaggle 竞赛,还应用在多个前沿工业应用中,并推动其发展。许多数据科学家合作参与了 XGBoost 开源项目,GitHub 上的这一项目约有 350 个贡献者,以及 3600 多条提交。和其他算法相比,XGBoost 算法的不同之处有以下几点:
算法演进过程:
通过以下几个示意图,我们可以大致了解一下以上提到的各种 ML 算法。
Bagging 特点在“随机采样”。随机采样(bootsrap)就是从训练集采集固定个数的样本,但是每采集一个样本后,都将样本放回。也就是说,之前采集到的样本在放回后有可能继续被采集到。
RF中的基学习器使用的是CART树,由于算法本身能降低方差(variance),所以会选择完全生长的CART树。抽样方法使用bootstrap,除此之外,RF认为随机程度越高,算法的效果越好。所以RF中还经常随机选取样本的特征属性、甚至于将样本的特征属性通过映射矩阵映射到随机的子空间来增大子模型的随机性、多样性。RF预测的结果为子树结果的平均值。RF具有很好的降噪性,相比单棵的CART树,RF模型边界更加平滑,置信区间也比较大。一般而言,RF中,树越多模型越稳定。
下面的例子使用一组客户的人口统计学和购买数据来预测客户对亲情卡计划的反应。这些数据来自于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.
参考:https://docs.oracle.com/en/database/oracle/oracle-database/20/dmcon/xgboost.html#GUID-EC483612-5A6F-4B25-867F-562B0AFCD265