博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如果不能用Python执行机器学习,那该用什么呢?
阅读量:2108 次
发布时间:2019-04-29

本文共 4073 字,大约阅读时间需要 13 分钟。

全文共3403字,预计学习时长9分钟

图源:unsplash

长期学习数据科学的人一定知道如何用Python、R和Julia这些语言执行机器学习任务。然而,如果速度很关键,但硬件很有限,或者所在公司仅使用SQL进行预测分析,又该怎么办呢?答案就是——数据库内的机器学习。

 

本文使用的是Oracle Cloud。它是免费的,你可以注册并创建一个OLTP数据库 (19c版本,有0.2TB的存储空间)。完成之后,下载云钱包并通过SQL Developer或任何其他工具建立连接。这个过程至少要花费10分钟,但操作很简单,所以这里不多做赘述。

 

下面将使用Oracle机器学习(OML)在著名的Iris数据集中训练一个分类模型。选择它是因为无须任何准备,只需要创建表格并插入数据。

 

 

数据准备

 

如前所述,要创建一个表格来保存Iris数据集,然后将数据加载到其中。OML要求使用一个列作为行ID(序列),因此要记住:

 

CREATE SEQUENCE seq_iris;CREATE TABLE iris_data(    iris_id      NUMBER DEFAULT seq_iris.NEXTVAL,    sepal_length NUMBER,    sepal_width  NUMBER,    petal_length NUMBER,    petal_width  NUMBER,    species      VARCHAR2(16));

现在可以下载数据并进行加载了:

 

 

 

当一个模态窗口弹出时,只需提供下载CSV的路径并多次点击Next。SQL开发员无需帮助也能正确完成工作。

 

 

 

 

模型训练

 

现在可以动手做一些有趣的事情了。训练分类模型可以分解为多个步骤,例如训练/测试分割、模型训练和模型评估,我们从最简单的开始。

 

训练/测试分割

 

Oracle常用两个视图完成该步骤:一个用于训练数据,一个用于测试数据。可以轻松创建这些神奇PL/SQL:

 

BEGIN    EXECUTE IMMEDIATE         ‘CREATE OR REPLACE VIEW         iris_train_data AS         SELECT * FROM iris_data         SAMPLE (75) SEED (42)’;    EXECUTE IMMEDIATE         ‘CREATE OR REPLACE VIEW         iris_test_data AS         SELECT * FROM iris_data         MINUS         SELECT * FROM iris_train_data’;END;/

该脚本完成下列两件事:

 

· 创建一个训练视图-75%的数据 (SAMPLE (75)) 在随机种子42中分割( SEED (42))。

· 创建一个测试视图-区分整个数据集和训练视图

 

数据储存在叫做iris_train_data和iris_test_data的视图中,猜猜看它们分别存什么。

 

SELECT COUNT(*) FROM iris_train_data;>>> 111SELECT COUNT(*) FROM iris_test_data;>>> 39

模型训练

 

模型训练最简单的方法是无须创建额外的设置表格,只执行单一过程的DBMS_DATA_MINING包。使用决策树算法来训练模型。方法如下:

 

DECLARE     v_setlstDBMS_DATA_MINING.SETTING_LIST;BEGIN    v_setlst(‘PREP_AUTO’) := ‘ON’;    v_setlst(‘ALGO_NAME’) :=‘ALGO_DECISION_TREE’;     DBMS_DATA_MINING.CREATE_MODEL2(        ‘iris_clf_model’,        ‘CLASSIFICATION’,        ‘SELECT * FROM iris_train_data’,        v_setlst,        ‘iris_id’,        ‘species’    );END;/

CREATE_MODEL2过程接受多种参数。接着我们对进入的参数进行解释:

 

· iris_clf_model — 只是模型名称,它可以是任何东西。

· CLASSIFICATION — 正在进行的机器学习任务,因某种原因必须大写。

· SELECT * FROM iris_train_data — 指定训练数据存储位置。

· v_setlst — 模型的上述设置列表。

· iris_id — 序列类型列的名称(每个值都是唯一的)。

· species — 目标变量的名称(试图预测的东西)

 

执行这一模块需要一到两秒钟,执行完毕就可以开始计算了!

 

 

模型评价

 

使用该脚本评估此模型:

 

BEGIN    DBMS_DATA_MINING.APPLY(        ‘iris_clf_model’,         ‘iris_test_data’,         ‘iris_id’,         ‘iris_apply_result’    );END;/

它将iris_clf_model应用于不可见测试数据iris_test_data,并将评估结果存储到iris_apply_result表中。

 

 

行数更多(39×3),但突显了要点。这还不够直观,所以下面以一种稍微不同的方式来展示结果:

 

DECLARE      CURSOR iris_ids IS          SELECT DISTINCT(iris_id) iris_id         FROM iris_apply_result          ORDER BY iris_id;     curr_y      VARCHAR2(16);     curr_yhat   VARCHAR2(16);     num_correct INTEGER := 0;     num_total   INTEGER := 0;BEGIN    FOR r_id IN iris_ids LOOP        BEGIN            EXECUTE IMMEDIATE                 ‘SELECT species FROM                 iris_test_data                 WHERE iris_id = ‘ ||r_id.iris_id                INTO curr_y;            EXECUTE IMMEDIATE                 ‘SELECT prediction                 FROM iris_apply_result                 WHERE iris_id = ‘ ||r_id.iris_id ||                ‘AND probability = (                   SELECTMAX(probability)                        FROMiris_apply_result                        WHERE iris_id = ‘|| r_id.iris_id ||                    ‘)’ INTO curr_yhat;        END;         num_total := num_total + 1;        IF curr_y = curr_yhat THEN             num_correct := num_correct +1;        END IF;     END LOOP;     DBMS_OUTPUT.PUT_LINE(‘Num. testcases: ‘         || num_total);    DBMS_OUTPUT.PUT_LINE(‘Num. correct :‘         || num_correct);    DBMS_OUTPUT.PUT_LINE(‘Accuracy : ‘         || ROUND((num_correct /num_total), 2));END;/

确实很多,但上述脚本不能再简化了。下面进行分解:

 

· CURSOR—得到所有不同的iris_ids(因为iris_apply_results 表中有重复)。

· curr_y, curr_yhat, num_correct, num_total 是存储每次迭代中的实际种类和预测种类、正确分类数量和测试项总数的变量。

· 对于每个唯一的iris_id 得到实际种类(来自匹配ID的iris_test_data)和预测种类(在 iris_apply_results 表中预测概率最高)

· 轻松检查实际值和预测值是否相同——这表明分类是正确的。

· 变量 num_total 和 num_correct 在每次迭代中更新。

· 最后,将模型性能打印到控制台。

 

下面为该脚本输出:

 

 

 

· 测试集有39个用例

· 39个样本中,正确分类的有37个

· 结果准确率为95%

 

以上就是模型评估的基本内容。

 

并不是所有人在工作中都能使用Python,现在,你又掌握了一种解决机器学习任务的方法。

 

一起分享AI学习与发展的干货

欢迎关注全平台AI垂类自媒体 “读芯术”

(添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)

转载地址:http://wbyef.baihongyu.com/

你可能感兴趣的文章
微信小程序-调用-腾讯视频-解决方案
查看>>
giuhub搭建及常用操作
查看>>
phpStudy安装yaf扩展
查看>>
密码 加密 加盐 常用操作记录
查看>>
TP 分页后,调用指定页。
查看>>
Oracle数据库中的(+)连接
查看>>
java-oracle中几十个实用的PL/SQL
查看>>
PLSQL常用方法汇总
查看>>
详细介绍Oracle sqlplus命令
查看>>
几个基本的 Sql Plus 命令 和 例子
查看>>
PLSQL单行函数和组函数详解
查看>>
Oracle PL/SQL语言初级教程之异常处理
查看>>
Oracle PL/SQL语言初级教程之游标
查看>>
Oracle PL/SQL语言初级教程之操作和控制语言
查看>>
Oracle PL/SQL语言初级教程之过程和函数
查看>>
Oracle PL/SQL语言初级教程之表和视图
查看>>
Oracle PL/SQL语言初级教程之完整性约束
查看>>
PL/SQL学习笔记
查看>>
如何分析SQL语句
查看>>
结构化查询语言(SQL)原理
查看>>