新聞中心
本文轉(zhuǎn)載自公眾號(hào)“讀芯術(shù)”(ID:AI_Discovery)

長(zhǎng)期學(xué)習(xí)數(shù)據(jù)科學(xué)的人一定知道如何用Python、R和Julia這些語(yǔ)言執(zhí)行機(jī)器學(xué)習(xí)任務(wù)。然而,如果速度很關(guān)鍵,但硬件很有限,或者所在公司僅使用SQL進(jìn)行預(yù)測(cè)分析,又該怎么辦呢?答案就是——數(shù)據(jù)庫(kù)內(nèi)的機(jī)器學(xué)習(xí)。
本文使用的是Oracle Cloud。它是免費(fèi)的,你可以注冊(cè)并創(chuàng)建一個(gè)OLTP數(shù)據(jù)庫(kù) (19c版本,有0.2TB的存儲(chǔ)空間)。完成之后,下載云錢包并通過(guò)SQL Developer或任何其他工具建立連接。這個(gè)過(guò)程至少要花費(fèi)10分鐘,但操作很簡(jiǎn)單,所以這里不多做贅述。
下面將使用Oracle機(jī)器學(xué)習(xí)(OML)在著名的Iris數(shù)據(jù)集中訓(xùn)練一個(gè)分類模型。選擇它是因?yàn)闊o(wú)須任何準(zhǔn)備,只需要?jiǎng)?chuàng)建表格并插入數(shù)據(jù)。
數(shù)據(jù)準(zhǔn)備
如前所述,要?jiǎng)?chuàng)建一個(gè)表格來(lái)保存Iris數(shù)據(jù)集,然后將數(shù)據(jù)加載到其中。OML要求使用一個(gè)列作為行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)
- );
現(xiàn)在可以下載數(shù)據(jù)并進(jìn)行加載了:
當(dāng)一個(gè)模態(tài)窗口彈出時(shí),只需提供下載CSV的路徑并多次點(diǎn)擊Next。SQL開(kāi)發(fā)員無(wú)需幫助也能正確完成工作。
模型訓(xùn)練
現(xiàn)在可以動(dòng)手做一些有趣的事情了。訓(xùn)練分類模型可以分解為多個(gè)步驟,例如訓(xùn)練/測(cè)試分割、模型訓(xùn)練和模型評(píng)估,我們從最簡(jiǎn)單的開(kāi)始。
訓(xùn)練/測(cè)試分割
Oracle常用兩個(gè)視圖完成該步驟:一個(gè)用于訓(xùn)練數(shù)據(jù),一個(gè)用于測(cè)試數(shù)據(jù)。可以輕松創(chuàng)建這些神奇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;
- /
該腳本完成下列兩件事:
- 創(chuàng)建一個(gè)訓(xùn)練視圖-75%的數(shù)據(jù) (SAMPLE (75)) 在隨機(jī)種子42中分割( SEED (42))。
- 創(chuàng)建一個(gè)測(cè)試視圖-區(qū)分整個(gè)數(shù)據(jù)集和訓(xùn)練視圖
數(shù)據(jù)儲(chǔ)存在叫做iris_train_data和iris_test_data的視圖中,猜猜看它們分別存什么。
- SELECT COUNT(*) FROM iris_train_data;
- >>> 111
- SELECT COUNT(*) FROM iris_test_data;
- >>> 39
模型訓(xùn)練
模型訓(xùn)練最簡(jiǎn)單的方法是無(wú)須創(chuàng)建額外的設(shè)置表格,只執(zhí)行單一過(guò)程的DBMS_DATA_MINING包。使用決策樹(shù)算法來(lái)訓(xùn)練模型。方法如下:
- 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過(guò)程接受多種參數(shù)。接著我們對(duì)進(jìn)入的參數(shù)進(jìn)行解釋:
- iris_clf_model — 只是模型名稱,它可以是任何東西。
- CLASSIFICATION — 正在進(jìn)行的機(jī)器學(xué)習(xí)任務(wù),因某種原因必須大寫。
- SELECT * FROM iris_train_data — 指定訓(xùn)練數(shù)據(jù)存儲(chǔ)位置。
- v_setlst — 模型的上述設(shè)置列表。
- iris_id — 序列類型列的名稱(每個(gè)值都是唯一的)。
- species — 目標(biāo)變量的名稱(試圖預(yù)測(cè)的東西)
執(zhí)行這一模塊需要一到兩秒鐘,執(zhí)行完畢就可以開(kāi)始計(jì)算了!
模型評(píng)價(jià)
使用該腳本評(píng)估此模型:
- BEGIN
- DBMS_DATA_MINING.APPLY(
- ‘iris_clf_model’,
- ‘iris_test_data’,
- ‘iris_id’,
- ‘iris_apply_result’
- );
- END;
- /
它將iris_clf_model應(yīng)用于不可見(jiàn)測(cè)試數(shù)據(jù)iris_test_data,并將評(píng)估結(jié)果存儲(chǔ)到iris_apply_result表中。
行數(shù)更多(39×3),但突顯了要點(diǎn)。這還不夠直觀,所以下面以一種稍微不同的方式來(lái)展示結(jié)果:
- 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;
- /
確實(shí)很多,但上述腳本不能再簡(jiǎn)化了。下面進(jìn)行分解:
- CURSOR—得到所有不同的iris_ids(因?yàn)閕ris_apply_results 表中有重復(fù))。
- curr_y, curr_yhat, num_correct, num_total 是存儲(chǔ)每次迭代中的實(shí)際種類和預(yù)測(cè)種類、正確分類數(shù)量和測(cè)試項(xiàng)總數(shù)的變量。
- 對(duì)于每個(gè)唯一的iris_id 得到實(shí)際種類(來(lái)自匹配ID的iris_test_data)和預(yù)測(cè)種類(在 iris_apply_results 表中預(yù)測(cè)概率最高)
- 輕松檢查實(shí)際值和預(yù)測(cè)值是否相同——這表明分類是正確的。
- 變量 num_total 和 num_correct 在每次迭代中更新。
- 最后,將模型性能打印到控制臺(tái)。
下面為該腳本輸出:
- 測(cè)試集有39個(gè)用例
- 39個(gè)樣本中,正確分類的有37個(gè)
- 結(jié)果準(zhǔn)確率為95%
以上就是模型評(píng)估的基本內(nèi)容。
并不是所有人在工作中都能使用Python,現(xiàn)在,你又掌握了一種解決機(jī)器學(xué)習(xí)任務(wù)的方法。
網(wǎng)站標(biāo)題:如果不能用Python執(zhí)行機(jī)器學(xué)習(xí),那該用什么呢?
標(biāo)題URL:http://www.dlmjj.cn/article/dhcgegi.html


咨詢
建站咨詢
