opendolphin_使用DolphinDB进行机器学习
DolphinDB實(shí)現(xiàn)了一系列常用的機(jī)器學(xué)習(xí)算法,例如最小二乘回歸、隨機(jī)森林、K-平均等,使用戶能夠方便地完成回歸、分類、聚類等任務(wù)。這篇教程會(huì)通過具體的例子,介紹用DolphinDB腳本語言進(jìn)行機(jī)器學(xué)習(xí)的流程。本文的所有例子都基于DolphinDB 1.10.9。
1. 第一個(gè)例子:對小樣本數(shù)據(jù)進(jìn)行分類
1.1 加載數(shù)據(jù)
將數(shù)據(jù)下載到本地后,在DolphinDB中用loadText導(dǎo)入:
wineSchema = table(
`Label`Alcohol`MalicAcid`Ash`AlcalinityOfAsh`Magnesium`TotalPhenols`Flavanoids`NonflavanoidPhenols`Proanthocyanins`ColorIntensity`Hue`OD280_OD315`Proline as name,
`INT`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE as type
)
wine = loadText("D:/dataset/wine.data", schema=wineSchema)
1.2 數(shù)據(jù)預(yù)處理
DolphinDB的randomForestClassifier函數(shù)要求類的標(biāo)簽的取值是[0, classNum)之間的整數(shù)。下載得到的wine數(shù)據(jù)的分類標(biāo)簽為1, 2, 3,需要更新為0, 1, 2:
update wine set Label = Label - 1
將數(shù)據(jù)按7:3分為訓(xùn)練集和測試集。本例編寫了一個(gè)trainTestSplit函數(shù)以便劃分。
def trainTestSplit(x, testRatio) {
xSize = x.size()
testSize = xSize * testRatio
r = (0..(xSize-1)).shuffle()
return x[r > testSize], x[r <= testSize]
}
wineTrain, wineTest = trainTestSplit(wine, 0.3)
wineTrain.size() // 124
wineTest.size() // 54
1.3 使用randomForestClassifier進(jìn)行隨機(jī)森林分類
對訓(xùn)練集調(diào)用randomForestClassifier函數(shù)進(jìn)行隨機(jī)森林分類。該函數(shù)有四個(gè)必選參數(shù),分別是:ds: 輸入的數(shù)據(jù)源,本例中用sqlDS函數(shù)生成。
yColName: 數(shù)據(jù)源中因變量的列名。
xColNames: 數(shù)據(jù)源中自變量的列名。
numClasses: 類的個(gè)數(shù)。
model = randomForestClassifier(
sqlDS(),
yColName=`Label,
xColNames=`Alcohol`MalicAcid`Ash`AlcalinityOfAsh`Magnesium`TotalPhenols`Flavanoids`NonflavanoidPhenols`Proanthocyanins`ColorIntensity`Hue`OD280_OD315`Proline,
numClasses=3
)
用訓(xùn)練得到的模型,對測試集進(jìn)行預(yù)測:
predicted = model.predict(wineTest)
觀察預(yù)測正確率:
> sum(predicted == wineTest.Label) \ wineTest.size();
0.925926
1.4 模型持久化
用saveModel函數(shù)將訓(xùn)練得到的模型保存到磁盤上:
model = loadModel("D:/model/wineModel.bin")
predicted = model.predict(wineTest)
用loadModel函數(shù)加載磁盤上的模型,并用于預(yù)測:
model = loadModel("D:/model/wineModel.bin")
predicted = model.predict(wineTest)
2.分布式機(jī)器學(xué)習(xí)
上面的例子只是一個(gè)在小數(shù)據(jù)上的玩具。與常見的機(jī)器學(xué)習(xí)庫不同,DolphinDB是為分布式環(huán)境而設(shè)計(jì)的,許多內(nèi)置的機(jī)器學(xué)習(xí)算法對分布式環(huán)境有良好的支持。
本章將介紹如何在DolphinDB分布式數(shù)據(jù)庫上用邏輯回歸算法完成分類模型的訓(xùn)練。
現(xiàn)有一個(gè)DolphinDB分布式數(shù)據(jù)庫,按股票名分區(qū),存儲(chǔ)了各股票在2010年到2018年的每日ohlc數(shù)據(jù)。
我們將用以下九個(gè)變量作為預(yù)測的指標(biāo):開盤價(jià)、最高價(jià)、最低價(jià)、收盤價(jià)、當(dāng)天開盤價(jià)與前一天收盤價(jià)的差、當(dāng)天開盤價(jià)與前一天開盤價(jià)的差、10天的移動(dòng)平均值、相關(guān)系數(shù)、相對強(qiáng)弱指標(biāo)(relative strength index, RSI)。
我們將用第二天的收盤價(jià)是否大于當(dāng)天的收盤價(jià)作為預(yù)測的目標(biāo)。
2.1 數(shù)據(jù)預(yù)處理
在本例中,原始數(shù)據(jù)中的空值,可以通過ffill函數(shù)填充;對原始數(shù)據(jù)求10天移動(dòng)平均值和RSI后,結(jié)果的前10行將會(huì)是空值,需要去除。我們將用DolphinDBModules.
use ta
def preprocess(t) {
ohlc = select ffill(Open) as Open, ffill(High) as High, ffill(Low) as Low, ffill(Close) as Close from t
update ohlc set OpenClose = Open - prev(Close), OpenOpen = Open - prev(Open), S_10 = mavg(Close, 10), RSI = ta::rsi(Close, 10), Target = iif(next(Close) > Close, 1, 0)
update ohlc set Corr = mcorr(Close, S_10, 10)
return ohlc[10:]
}
加載數(shù)據(jù)后,通過sqlDS生成數(shù)據(jù)源,并通過transDS!用預(yù)處理函數(shù)轉(zhuǎn)化數(shù)據(jù)源:
ohlc = database("dfs://trades").loadTable("ohlc")
ds = sqlDS().transDS!(preprocess)
2.2 調(diào)用logisticRegression函數(shù)訓(xùn)練
函數(shù)logisticRegression有三個(gè)必選參數(shù):ds: 輸入的數(shù)據(jù)源。
yColName: 數(shù)據(jù)源中因變量的列名。
xColNames: 數(shù)據(jù)源中自變量的列名。
上一節(jié)已經(jīng)生成了輸入的數(shù)據(jù)源,可以直接用作參數(shù)。
model = logisticRegression(ds, `Target, `Open`High`Low`Close`OpenClose`OpenOpen`S_10`RSI`Corr)
用訓(xùn)練的模型對一支股票的數(shù)據(jù)進(jìn)行預(yù)測并計(jì)算分類準(zhǔn)確率:
aapl = preprocess(select * from ohlc where Ticker = `AAPL)
predicted = model.predict(aapl)
score = sum(predicted == appl.Target) \ aapl.size() // 0.756522
3. 使用PCA為數(shù)據(jù)降維
主成分分析(Principal Component Analysis, PCA)是一個(gè)機(jī)器學(xué)習(xí)中的使用技巧。如果數(shù)據(jù)的維度太高,學(xué)習(xí)算法的效率可能很低下,通過PCA,將高維數(shù)據(jù)映射到低維空間,同時(shí)盡可能最小化信息損失,可以解決維度災(zāi)難的問題。PCA的另一個(gè)應(yīng)用是數(shù)據(jù)可視化。二維或三維的數(shù)據(jù)能便于用戶理解。
以對wine數(shù)據(jù)進(jìn)行分類為例,輸入的數(shù)據(jù)集有13個(gè)因變量,對數(shù)據(jù)源調(diào)用pca函數(shù),觀察各主成分的方差權(quán)重。將normalize參數(shù)設(shè)為true,以對數(shù)據(jù)進(jìn)行歸一化處理。
xColNames = `Alcohol`MalicAcid`Ash`AlcalinityOfAsh`Magnesium`TotalPhenols`Flavanoids`NonflavanoidPhenols`Proanthocyanins`ColorIntensity`Hue`OD280_OD315`Proline
pcaRes = pca(
sqlDS(),
colNames=xColNames,
normalize=true
)
返回值是一個(gè)字典,觀察其中的explainedVarianceRatio,會(huì)發(fā)現(xiàn)壓縮后的前三個(gè)維度的方差權(quán)重已經(jīng)非常大,壓縮為三個(gè)維度足夠用于訓(xùn)練:
> pcaRes.explainedVarianceRatio;
[0.209316,0.201225,0.121788,0.088709,0.077805,0.075314,0.058028,0.045604,0.038463,0.031485,0.021256,0.018073,0.012934]
我們只保留前三個(gè)主成分:
components = pcaRes.components.transpose()[:3]
將主成分分析矩陣應(yīng)用于輸入的數(shù)據(jù)集,并調(diào)用randomForestClassifier進(jìn)行訓(xùn)練。
def principalComponents(t, components, yColName, xColNames) {
res = matrix(t[xColNames]).dot(components).table()
res[yColName] = t[yColName]
return res
}
ds = sqlDS()
ds.transDS!(principalComponents{, components, `Class, xColNames})
model = randomForestClassifier(ds, yColName=`Class, xColNames=`col0`col1, numClasses=3)
對測試集進(jìn)行預(yù)測時(shí),也需要提取測試集的主成分:
model.predict(wineTest.principalComponents(components, `Class, xColNames))
4. 使用DolphinDB插件進(jìn)行機(jī)器學(xué)習(xí)
除了內(nèi)置的經(jīng)典機(jī)器學(xué)習(xí)算法,DolphinDB還提供了一些插件。利用這些插件,我們可以方便地用DolphinDB地腳本語言調(diào)用第三方庫進(jìn)行機(jī)器學(xué)習(xí)。本節(jié)將以DolphinDB XGBoost插件為例,介紹使用插件進(jìn)行機(jī)器學(xué)習(xí)的方法。
4.1 加載XGBoost插件
從DolphinDB Plugin的GitHub頁面下載已經(jīng)編譯好的XGBoost插件到本地。然后在DolphinDB中運(yùn)行l(wèi)oadPlugin(pathToXgboost),其中pathToXgboost是下載的PluginXgboost.txt的路徑:
pathToXgboost = "C:/DolphinDB/plugin/xgboost/PluginXgboost.txt"
loadPlugin(pathToXgboost)
4.2 調(diào)用插件函數(shù)進(jìn)行訓(xùn)練、預(yù)測
同樣使用wine數(shù)據(jù)。XGBoost插件的訓(xùn)練函數(shù)xgboost::train的語法為xgboost::train(Y, X, [params], [numBoostRound=10], [xgbModel]),我們將訓(xùn)練數(shù)據(jù)wineTrain的Label列單獨(dú)取出來作為輸入的Y,將其他列保留作為輸入的X:
Y = exec Label from wineTrain
X = select Alcohol, MalicAcid, Ash, AlcalinityOfAsh, Magnesium, TotalPhenols, Flavanoids, NonflavanoidPhenols, Proanthocyanins, ColorIntensity, Hue, OD280_OD315, Proline from wineTrain
訓(xùn)練前需要設(shè)置參數(shù)params字典。我們將訓(xùn)練一個(gè)多分類模型,故將params中的objective設(shè)為"multi:softmax",將分類的類別數(shù)num_class設(shè)為3。其他常見的參數(shù)有:booster: 可以取"gbtree"或"gblinear"。gbtree采用基于樹的模型進(jìn)行提升計(jì)算,gblinear采用線性模型。
eta: 步長收縮值。每一步提升,會(huì)按eta收縮特征的權(quán)重,以防止過擬合。取值范圍是[0,1],默認(rèn)值是0.3。
gamma: 最小的損失減少值,僅當(dāng)分裂樹節(jié)點(diǎn)產(chǎn)生的損失減小大于gamma時(shí)才會(huì)分裂。取值范圍是[0,∞],默認(rèn)值是0。
max_depth: 樹的最大深度。取值范圍是[0,∞],默認(rèn)值是6。
subsample: 采樣的比例。減少這個(gè)參數(shù)的值可以避免過擬合。取值范圍是(0,1],默認(rèn)值是1。
lambda: L2正則的懲罰系數(shù)。默認(rèn)值是0。
alpha: L1正則的懲罰系數(shù)。默認(rèn)值是0。
seed: 隨機(jī)數(shù)種子。默認(rèn)值是0。
其他參數(shù)參見XGBoost的官方文檔。
在本例中,我們將設(shè)置objective, num_class, max_depth, eta, subsample這些參數(shù):
params = {
objective: "multi:softmax",
num_class: 3,
max_depth: 5,
eta: 0.1,
subsample: 0.9
}
訓(xùn)練模型,預(yù)測并計(jì)算分類準(zhǔn)確率:
model = xgboost::train(Y, X, params)
testX = select Alcohol, MalicAcid, Ash, AlcalinityOfAsh, Magnesium, TotalPhenols, Flavanoids, NonflavanoidPhenols, Proanthocyanins, ColorIntensity, Hue, OD280_OD315, Proline from wineTest
predicted = xgboost::predict(model, testX)
sum(predicted == wineTest.Label) \ wineTest.size() // 0.962963
同樣,可以將模型持久化或加載已有模型:
xgboost::saveModel(model, "xgboost001.mdl")
model = xgboost::loadModel("xgboost001.mdl")
通過指定xgboost::train的xgbModel參數(shù),對已有的模型進(jìn)行增量訓(xùn)練:
model = xgboost::train(Y, X, params, , model)
附錄:DolphinDB機(jī)器學(xué)習(xí)函數(shù)
A. 機(jī)器學(xué)習(xí)訓(xùn)練函數(shù)
B. 機(jī)器學(xué)習(xí)工具函數(shù)
C. 機(jī)器學(xué)習(xí)插件
總結(jié)
以上是生活随笔為你收集整理的opendolphin_使用DolphinDB进行机器学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wepy公共样式_wepy框架开发小程序
- 下一篇: 乐易家智能机器人价格_安川焊接机器人价格