当前位置: 首页 > 科技观察

如果你不能用Python进行机器学习,你应该使用什么?

时间:2023-03-18 00:45:25 科技观察

本文转载自公众号“阅读术”(ID:AI_Discovery)长期研究数据科学的人一定知道如何用Python、R、和茱莉亚。但是,如果速度至关重要但硬件有限,或者您在一家仅使用SQL进行预测分析的公司工作怎么办?答案是——数据库内机器学习。本文使用Oracle云。它是免费的,您可以注册并创建一个OLTP数据库(版本19c,具有0.2TB的存储空间)。完成后,下载云钱包并通过SQLDeveloper或任何其他工具连接。这个过程至少需要10分钟,但是操作非常简单,这里就不赘述了。接下来,我们将使用Oracle机器学习(OML)在著名的Iris数据集上训练分类模型。之所以选择它,是因为除了创建表和插入数据外,它不需要任何准备工作。数据准备如前所述,创建一个表来保存Iris数据集,然后将数据加载到其中。OML要求使用列作为行ID(序列),因此请记住:CREATESEQUENCEseq_iris;CREATETABLEiris_data(iris_idNUMBERDEFAULTseq_iris.NEXTVAL,sepal_lengthNUMBER,sepal_widthNUMBER,petal_lengthNUMBER,petal_widthNUMBER,speciesVARCHAR2(16));现在你可以下载数据了当模式窗口弹出时,只需提供下载CSV的路径并多次点击下一步。SQL开发人员无需帮助即可正确完成工作。模型训练现在是时候动手做一些有趣的事情了。训练分类模型可以分解为训练/测试拆分、模型训练和模型评估等多个步骤,我们从最简单的开始。训练/测试拆分Oracle通常使用两种视图来执行此操作:一种用于训练数据,另一种用于测试数据。这些神奇的PL/SQL可以轻松创建:BEGINEXECUTEIMMEDIATE'CREATEORREPLACEVIEWWiris_train_dataASSELECT*FROMiris_dataSAMPLE(75)SEED(42)';EXECUTEIMMEDIATE'CREATEORREPLACEVIEWWiris_test_dataASSELECT*FROMiris_dataMINUSSELECT*FROMMiris_train_data';数据(SAMPLE(75))被分成随机种子42(SEED(42))。创建一个测试视图——将整个数据集与训练视图分开数据存储在名为iris_train_data和iris_test_data的视图中,猜猜它们分别存储什么。SELECTCOUNT(*)FROMiris_train_data;>>>111SELECTCOUNT(*)FROMiris_test_data;>>>39模型训练模型训练最简单的方法是执行单进程DBMS_DATA_MINING包而不创建额外的设置表。使用决策树算法训练模型。该方法如下:'SELECT'F,'iris_id','species');END;/CREATE_MODEL2过程接受各种参数。然后我们解释一下传入的参数:iris_clf_model——就是模型名称,可以是任何东西。分类——正在进行的机器学习任务,由于某种原因必须大写。SELECT*FROMiris_train_data—指定训练数据存储位置。v_setlst—模型的上述设置列表。iris_id—序列类型列的名称(每个值都是唯一的)。species—目标变量的名称(你要预测的是什么)执行这个模块需要一两秒,执行完就可以开始计算了!模型评估使用此脚本评估此模型:BEGINDBMS_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),但要明白这一点。这还不够直观,所以下面以一种稍微不同的方式来展示结果:DECLARECURSORiris_idsISSELECTDISTINCT(iris_id)iris_idFROMiris_apply_resultORDERBYiris_id;curr_yVARCHAR2(16);curr_yhatVARCHAR2(16);num_correctINTEGER:=0;num_totalINTEGER:=0;BEGINFORr_idINiris_idsLOOPBEGINEXECUTEIMMEDIATE'SELECTspeciesFROMiris_test_dataWHEREiris_id='||r_id.iris_idINTOcurr_y;EXECUTEIMMEDIATE'SELECTpredictionFROMiris_apply_resultWHEREiris_id='||r_id.iris_id||'ANDprobability=(SELECTMAX(probability)FROMiris_apply_resultWHEREiris_id='||r_id.iris_id||')'INTOcurr_ytorr=1;=curr_yhatTHENnum_correct:=num_correct+1;ENDIF;ENDLOOP;DBMS_OUTPUT.PUT_LINE('Num.testcases:'||num_total);DBMS_OUTPUT.PUT_LINE('Num.correct:'||num_correct);DBMS_OUTPUT.PUT_LINE('准确性:'||ROUND((num_correct/num_total),2));END;/确实很多,但是上面的脚本不能再简化了。这是细分:CURSOR-获取所有不同的iris_id(因为iris_apply_results表中有重复项)。curr_y、curr_yhat、num_correct、num_total是存储实际和预测类别、正确分类数和每次迭代的测试项总数的变量。对于每个唯一的iris_id获取实际物种(从iris_test_data匹配ID)和预测物种(iris_apply_results表中的最高预测概率)轻松检查实际值和预测值是否相同——这表明分类是正确的。变量num_total和num_correct在每次迭代中更新。最后,模型性能被打印到控制台。以下是脚本的输出:测试集中有39个测试用例。在39个样本中,有37个被正确分类。结果准确率95%以上,这是模型评价的基本内容。不是每个人都能在工作中使用Python,而现在,您有了另一种方法来解决机器学习任务。