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