如果不能用Python执行机器学习,那该用什么呢?

发表于:2020-11-13 10:40

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:读芯术    来源:51CTO

  长期学习数据科学的人一定知道如何用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; 
  >>> 111 
  SELECT 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,现在,你又掌握了一种解决机器学习任务的方法。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号