Oracle机器学习(Oracle Machine Learning for SQL,简称OML4SQL,早期版本称为Oracle Data Mining)是直接嵌在Oracle数据库内核里的一套机器学习框架。它最大的特点是:不需要把数据从数据库导出到Python或R环境,而是直接用SQL和PL/SQL完成数据探索、模型训练、评估和部署。对于数据量大、数据本身就已经存放在Oracle中的企业场景来说,这种方式省去了数据搬运的成本,也避免了ETL过程中的安全风险。本文将系统介绍OML4SQL的算法体系和使用方法,并给出完整的代码示例。

一、OML4SQL的核心算法体系
OML4SQL内置了三十多种算法,覆盖了监督学习和无监督学习两大类。监督学习算法包括决策树(Decision Tree)、朴素贝叶斯(Naive Bayes)、逻辑回归、支持向量机(SVM)、广义线性模型(GLM)等,主要用于分类和回归任务;无监督算法包括K-Means聚类、期望最大化(EM)、Apriori关联规则、奇异值分解(SVD)、NMF非负矩阵分解等,主要用于聚类、关联分析和特征降维。
此外还包含一些特色算法,比如用于异常检测的一类支持向量机(One-Class SVM)、用于属性重要性分析的Minimum Description Length,以及针对文本挖掘的TERM提取算法。这些算法在数据库内部以并行方式执行,能够充分利用Oracle的并行查询能力,处理千万级甚至上亿行的数据时优势明显。
使用这些算法的入口主要是两个包:DBMS_DATA_MINING负责模型的创建、应用、重命名和删除等管理操作,DBMS_DATA_MINING_TRANSFORM负责数据预处理,比如缺失值处理、数值归一化、类别编码等。理解这两个包的分工,是用好OML4SQL的基础。
二、环境准备与数据视图构建
开始建模之前,需要确认数据库用户具备相应的权限。DBA需要授予用户DMINING角色(或单独授予CREATE MINING MODEL等权限),并且用户要有足够的表空间配额,因为训练好的模型会作为对象存储在用户schema下。
OML4SQL要求数据必须通过一个视图或表提供给算法,这个视图被称为训练数据视图。需要注意一个关键点:每条训练样本必须能通过一个case ID唯一标识,且目标字段(如果有)必须包含在视图中。下面创建一个客户流失预测的训练视图示例:
-- 创建训练数据视图
CREATE OR REPLACE VIEW v_churn_train AS
SELECT c.cust_id,
c.age,
c.gender,
c.monthly_fee,
c.tenure_months,
p.avg_call_minutes,
p.data_usage_mb,
p.complaint_cnt,
CASE WHEN p.churn_flag = 'Y' THEN 1 ELSE 0 END AS is_churn
FROM customers c
JOIN customer_usage p ON c.cust_id = p.cust_id;
-- 授予数据挖掘权限(DBA执行)
GRANT DMINING TO analyst_user;
构建视图时建议把特征工程尽量做在这一层,比如衍生指标、分箱、组合特征等。这样模型训练时直接引用视图即可,逻辑清晰且便于复用。如果原始表数据质量较差,还需要借助DBMS_DATA_MINING_TRANSFORM包做自动化的缺失值填充和归一化。
三、训练一个决策树分类模型
以客户流失预测为例,决策树是最容易上手的算法,结果可解释性强,输出的规则可以直接转成业务语言。训练模型的核心是调用DBMS_DATA_MINING.CREATE_MODEL过程,需要指定模型名称、算法类型、训练视图、目标字段和设置表。
设置表(settings table)是OML4SQL控制算法超参数的机制,它是一个只有两列的表:参数名和参数值。先看完整示例:
-- 1. 创建设置表
CREATE TABLE dt_settings (
setting_name VARCHAR2(30),
setting_value VARCHAR2(4000)
);
-- 2. 插入算法设置
BEGIN
INSERT INTO dt_settings VALUES
(DBMS_DATA_MINING.algo_name, DBMS_DATA_MINING.algo_decision_tree);
INSERT INTO dt_settings VALUES
(DBMS_DATA_MINING.tree_term_max_depth, '6');
INSERT INTO dt_settings VALUES
(DBMS_DATA_MINING.tree_term_minpct_node, '0.05');
COMMIT;
END;
/
-- 3. 训练模型
BEGIN
DBMS_DATA_MINING.CREATE_MODEL(
model_name => 'CHURN_DT_MODEL',
mining_function => DBMS_DATA_MINING.classification,
data_table_name => 'v_churn_train',
case_id_column_name => 'cust_id',
target_column_name => 'is_churn',
settings_table_name => 'dt_settings'
);
END;
/
训练完成后,模型以对象形式存储在当前schema中,可以通过SELECT model_name FROM all_mining_models查看已创建的模型列表。如果想了解模型的细节,比如决策树的分裂规则,可以查询DM$VC_CHURN_DT_MODEL视图,OML4SQL会为每个模型自动生成一组DM$开头的模型视图,其中V开头的视图展示变量重要性,C开头的展示决策规则,这是模型可解释性的重要入口。
四、模型评分与批量预测
模型建好后,预测有两种方式。第一种是对单条或多条记录做实时预测,直接在SQL中使用PREDICTION函数;第二种是对整张表做批量评分,配合CREATE TABLE ... AS SELECT落地结果。两种方式的写法如下:
-- 实时预测:预测某个客户是否流失,并给出概率
SELECT PREDICTION(CHURN_DT_MODEL USING
35 AS age,
'M' AS gender,
128 AS monthly_fee,
24 AS tenure_months,
320 AS avg_call_minutes,
15 AS data_usage_mb,
3 AS complaint_cnt) AS pred_churn,
PREDICTION_PROBABILITY(CHURN_DT_MODEL USING
3 AS complaint_cnt) AS churn_prob
FROM dual;
-- 批量评分:对全体客户打分并落地
CREATE TABLE cust_churn_scores AS
SELECT c.cust_id,
PREDICTION(CHURN_DT_MODEL USING c.*) AS pred_churn,
PREDICTION_PROBABILITY(CHURN_DT_MODEL USING c.*) AS prob
FROM v_churn_predict c;
评分函数直接嵌入SQL的能力是OML4SQL最大的工程优势。预测逻辑可以塞进报表SQL、物化视图甚至触发器中,业务系统无需引入额外的预测服务,模型上线成本几乎为零。不过要注意,使用PREDICTION(... USING t.*)这种通配写法时,评分视图的列名必须与训练视图保持一致,否则会报列不匹配的错误。
五、其他常用算法的调用与场景选择
除了决策树,其他算法的调用方式基本一致,只是设置表中的algo_name参数不同。下面列出几个高频算法的关键配置和适用场景。
朴素贝叶斯适合特征相互独立、维度较高的分类场景,比如文本分类、营销响应预测,训练速度极快。K-Means聚类用于客户分群,需要指定簇数量。Apriori用于购物篮分析,挖掘商品关联规则,这几个算法的配置示例如下:
-- K-Means 聚类:客户分群
BEGIN
INSERT INTO km_settings VALUES
(DBMS_DATA_MINING.algo_name, DBMS_DATA_MINING.algo_kmeans);
INSERT INTO km_settings VALUES
(DBMS_DATA_MINING.clus_num_clusters, '5');
COMMIT;
DBMS_DATA_MINING.CREATE_MODEL(
model_name => 'CUST_SEGMENT',
mining_function => DBMS_DATA_MINING.clustering,
data_table_name => 'v_churn_train',
case_id_column_name => 'cust_id',
target_column_name => NULL, -- 聚类无目标字段
settings_table_name => 'km_settings'
);
END;
/
-- 聚类结果查询:查看每个客户归属的簇
SELECT cust_id,
CLUSTER_ID(CUST_SEGMENT USING v.*) AS cluster_id,
CLUSTER_PROBABILITY(CUST_SEGMENT USING v.*) AS prob
FROM v_churn_train v
WHERE ROWNUM <= 100;
关于算法选择,可以参考这样的经验:目标变量是分类标签且需要解释性时用决策树;特征众多且追求训练速度时用朴素贝叶斯;数据线性可分性差时用SVM;做客户分群用K-Means或EM;做商品推荐和货架摆放优化用Apriori;做异常检测比如反欺诈,用One-Class SVM比较合适。另外OML4SQL从18c开始引入了神经网络,从21c增强了时间序列算法(ESM),新版本用户可以按需选用。
六、使用中的常见坑与最佳实践
第一个常见问题是数据类型。目标列如果是VARCHAR2,OML4SQL会自动当作分类问题处理;如果是NUMBER且取值连续,则默认按回归处理,二者不可混淆,训练前务必确认目标列类型。第二个问题是自动数据准备开关,通过设置prep_auto参数为ON可以让数据库自动做归一化和缺失值处理,对SVM、GLM这类对量纲敏感的算法强烈建议开启。
第三个问题是不平衡样本。流失预测、反欺诈场景中正样本往往不足5%,直接训练会导致模型偏向多数类。解决办法是在设置表中配置clms_prior_table指定先验概率表,或者在训练视图中对多数类做抽样。第四个是模型管理:模型名称在schema内唯一,重复训练会报错,需要先用DBMS_DATA_MINING.DROP_MODEL删除旧模型,或者使用RENAME_MODEL做版本管理。
最后建议把训练脚本固化成存储过程,配合DBMS_SCHEDULER定时执行,实现模型的定期重训练。评分结果落地到专门的评分表,供下游报表和营销系统消费。这样一套流程跑通后,整个机器学习链路都留在数据库内部,运维复杂度远低于外部建模平台,非常适合数据已经集中在Oracle中的企业团队。
Oracle机器学习OML4SQL数据挖掘算法修改时间:2026-09-03 03:46:50