日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opendolphin_使用DolphinDB进行机器学习

發(fā)布時(shí)間:2025/3/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opendolphin_使用DolphinDB进行机器学习 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。