MXNetで回帰
MichaelA.Nielsen,"NeuralNetworksandDeepLearning",Determina<onPress,2015ThisworkislicensedunderaCrea<veCommonsAEribu<on-NonCommercial3.0UnportedLicense.
Tokyo.R#53@渋谷ファーストプレイス,TwiEer:@siero5335
自己紹介 TwiEerID:@siero5335
仕事:化学物質曝露影響の解析 化学分析法の開発 専門:環境化学、分析化学
興味:生理活性物質の一斉分析 関連分野へのデータ解析応用hoxo-m
2
MXNet?
みんな大好きdmlc製のDeeplearning用ライブラリいろんな言語に対応,GPUも利用可早い(らしい)
引用:hEps://github.com/dmlc/mxnet
R-packageについてのドキュメントは最近移動した模様hEp://mxnet.readthedocs.org/en/latest/packages/r/index.html
hEp://tjo.hatenablog.com/entry/2016/03/29/180000
hEp://keiku.hatenablog.jp/entry/2016/03/31/172456
MXNetについての記事が続々と
畳み込みニューラルネットやKaggleDataを使った実践など
hEp://tjo.hatenablog.com/entry/2016/03/29/180000
hEp://keiku.hatenablog.jp/entry/2016/03/31/172456
MXNetについての記事が続々と
畳み込みニューラルネットやKaggleDataを使った実践など上記は判別の話だが自分がよく使うのは回帰なので調べてみた
MXNetの線形回帰:データ読み込み・定義
library(mlbench)library(mxnet)#データ分割・読み込みdata(BostonHousing,package="mlbench")train.ind=seq(1,506,3)train.x=data.matrix(BostonHousing[train.ind,-14])train.y=BostonHousing[train.ind,14]test.x=data.matrix(BostonHousing[-train.ind,-14])test.y=BostonHousing[-train.ind,14]#入力データの定義data<-mx.symbol.Variable("data”)
参照:“NeuralNetworkwithMXNetinFiveMinutes”hEp://mxnet.readthedocs.org/en/latest/packages/r/fiveMinutesNeuralNetwork.html
#結合形式,data設定,隠れ層の数指定fc1<-mx.symbol.FullyConnected(data,num_hidden=1)#出力層を線形回帰に指定lro<-mx.symbol.LinearRegressionOutput(fc1)mx.set.seed(0)model1<-mx.model.FeedForward.create(lro,X=train.x,y=train.y,ctx=mx.cpu(),num.round=50,array.batch.size=20,learning.rate=2e-6,momentum=0.9,eval.metric=mx.metric.rmse)#testデータへの当てはめpreds1=predict(model1,test.x)#RMSE算出sqrt(mean((preds1-test.y)^2))#モデルの図示graph.viz(model1$symbol$as.json())
MXNetの線形回帰:パラメータ設定・結果確認1
参照:“NeuralNetworkwithMXNetinFiveMinutes”hEp://mxnet.readthedocs.org/en/latest/packages/r/fiveMinutesNeuralNetwork.html
#結合形式,data設定,隠れ層のユニット数指定fc1<-mx.symbol.FullyConnected(data,num_hidden=1)#出力層を線形回帰に指定lro<-mx.symbol.LinearRegressionOutput(fc1)mx.set.seed(0)model1<-mx.model.FeedForward.create(lro,X=train.x,y=train.y,ctx=mx.cpu(),num.round=50,array.batch.size=20,learning.rate=2e-6,momentum=0.9,eval.metric=mx.metric.rmse)#testデータへの当てはめpreds1=predict(model1,test.x)#RMSE算出sqrt(mean((preds1-test.y)^2))#モデルの図示graph.viz(model1$symbol$as.json())
MXNetの線形回帰:パラメータ設定・結果確認2回帰分析の場合、出力層直前の隠れ層のユニット数は1でないとだめ
参照:“NeuralNetworkwithMXNetinFiveMinutes”hEp://mxnet.readthedocs.org/en/latest/packages/r/fiveMinutesNeuralNetwork.html
#結合形式,data設定,隠れ層のユニット数指定fc1<-mx.symbol.FullyConnected(data,num_hidden=1)#出力層を線形回帰に指定lro<-mx.symbol.LinearRegressionOutput(fc1)mx.set.seed(0)model1<-mx.model.FeedForward.create(lro,X=train.x,y=train.y,ctx=mx.cpu(),num.round=50,array.batch.size=20,learning.rate=2e-6,momentum=0.9,eval.metric=mx.metric.rmse)#testデータへの当てはめpreds1=predict(model1,test.x)#RMSE算出sqrt(mean((preds1-test.y)^2))#モデルの図示graph.viz(model1$symbol$as.json())
MXNetの線形回帰:パラメータ設定・結果確認3
この他にmx.symbol.MAERegressionOutputmx.symbol.Logis<cRegressionOutputが関数として用意されている。
回帰分析の場合、出力層直前の隠れ層のユニット数は1でないとだめ
参照:“NeuralNetworkwithMXNetinFiveMinutes”hEp://mxnet.readthedocs.org/en/latest/packages/r/fiveMinutesNeuralNetwork.html
#結合形式,data設定,隠れ層のユニット数指定fc1<-mx.symbol.FullyConnected(data,num_hidden=1)#出力層を線形回帰に指定lro<-mx.symbol.LinearRegressionOutput(fc1)mx.set.seed(0)model1<-mx.model.FeedForward.create(lro,X=train.x,y=train.y,ctx=mx.cpu(),num.round=50,array.batch.size=20,learning.rate=2e-6,momentum=0.9,eval.metric=mx.metric.rmse)#testデータへの当てはめpreds1=predict(model1,test.x)#RMSE算出sqrt(mean((preds1-test.y)^2))#モデルの図示graph.viz(model1$symbol$as.json())
MXNetの線形回帰:パラメータ設定・結果確認4
パラメータの設定
この他にmx.symbol.MAERegressionOutputmx.symbol.Logis<cRegressionOutputが関数として用意されている。
回帰分析の場合、出力層直前の隠れ層のユニット数は1でないとだめ
参照:“NeuralNetworkwithMXNetinFiveMinutes”hEp://mxnet.readthedocs.org/en/latest/packages/r/fiveMinutesNeuralNetwork.html
#結合形式,data設定,隠れ層のユニット数指定fc1<-mx.symbol.FullyConnected(data,num_hidden=1)#出力層を線形回帰に指定lro<-mx.symbol.LinearRegressionOutput(fc1)mx.set.seed(0)model1<-mx.model.FeedForward.create(lro,X=train.x,y=train.y,ctx=mx.cpu(),num.round=50,array.batch.size=20,learning.rate=2e-6,momentum=0.9,eval.metric=mx.metric.rmse)#testデータへの当てはめpreds1=predict(model1,test.x)#RMSE算出sqrt(mean((preds1-test.y)^2))#モデルの図示graph.viz(model1$symbol$as.json())
MXNetの線形回帰:パラメータ設定・結果確認5
パラメータの設定
この他にmx.symbol.MAERegressionOutputmx.symbol.Logis<cRegressionOutputが関数として用意されている。
回帰分析の場合、出力層直前の隠れ層のユニット数は1でないとだめ
参照:“NeuralNetworkwithMXNetinFiveMinutes”hEp://mxnet.readthedocs.org/en/latest/packages/r/fiveMinutesNeuralNetwork.html
mx.set.seed(0)model1<-mx.model.FeedForward.create(lro,X=train.x,y=train.y,ctx=mx.cpu(),num.round=50,array.batch.size=20,learning.rate=2e-6,momentum=0.9,eval.metric=mx.metric.rmse)Starttrainingwith1devices[1]Train-rmse=16.0632830097341[2]Train-rmse=12.2792378026774[3]Train-rmse=11.1984627690848[4]Train-rmse=10.2645244456113[5]Train-rmse=9.49711029707845・・・[50]Train-rmse=8.24580523984314
MXNetの線形回帰:実行結果
参照:“NeuralNetworkwithMXNetinFiveMinutes”hEp://mxnet.readthedocs.org/en/latest/packages/r/fiveMinutesNeuralNetwork.html
mx.set.seed(0)model1<-mx.model.FeedForward.create(lro,X=train.x,y=train.y,ctx=mx.cpu(),num.round=50,array.batch.size=20,learning.rate=2e-6,momentum=0.9,eval.metric=mx.metric.rmse)Starttrainingwith1devices[1]Train-rmse=16.0632830097341[2]Train-rmse=12.2792378026774[3]Train-rmse=11.1984627690848[4]Train-rmse=10.2645244456113[5]Train-rmse=9.49711029707845・・・[50]Train-rmse=8.24580523984314#RMSE算出sqrt(mean((preds1-test.y)^2))[1]7.800502
MXNetの線形回帰:実行結果
参照:“NeuralNetworkwithMXNetinFiveMinutes”hEp://mxnet.readthedocs.org/en/latest/packages/r/fiveMinutesNeuralNetwork.html
mx.set.seed(0)model1<-mx.model.FeedForward.create(lro,X=train.x,y=train.y,ctx=mx.cpu(),num.round=50,array.batch.size=20,learning.rate=2e-6,momentum=0.9,eval.metric=mx.metric.rmse)Starttrainingwith1devices[1]Train-rmse=16.0632830097341[2]Train-rmse=12.2792378026774[3]Train-rmse=11.1984627690848[4]Train-rmse=10.2645244456113[5]Train-rmse=9.49711029707845・・・[50]Train-rmse=8.24580523984314#RMSE算出sqrt(mean((preds1-test.y)^2))[1]7.800502
MXNetの線形回帰:実行結果
参照:“NeuralNetworkwithMXNetinFiveMinutes”hEp://mxnet.readthedocs.org/en/latest/packages/r/fiveMinutesNeuralNetwork.html
#モデルの図示graph.viz(model1$symbol$as.json())
MXNetの線形回帰+深層ニューラルネットの場合
#結合形式,data設定,隠れ層の数指定fc1<-mx.symbol.FullyConnected(data,name="fc1",num_hidden=128)act1<-mx.symbol.Ac<va<on(fc1,name="relu1",act_type="relu")drop1<-mx.symbol.Dropout(act1,p=0.5,name="drop1")fc2<-mx.symbol.FullyConnected(drop1,name="fc2",num_hidden=64)act2<-mx.symbol.Ac<va<on(fc2,name="relu2",act_type="relu")drop2<-mx.symbol.Dropout(act2,p=0.5,name="drop2")fc3<-mx.symbol.FullyConnected(drop2,name="fc3",num_hidden=1)#出力層を線形回帰に指定lro2<-mx.symbol.LinearRegressionOutput(fc3)
mx.set.seed(0)model2<-mx.model.FeedForward.create(lro2,X=train.x,y=train.y,ctx=mx.cpu(),num.round=50,array.batch.size=20,learning.rate=2e-6,momentum=0.9,eval.metric=mx.metric.rmse)Starttrainingwith1devices[1]Train-rmse=24.2765298493927[2]Train-rmse=24.2690448139394[3]Train-rmse=24.2609693838471[4]Train-rmse=24.2502836327908[5]Train-rmse=24.2384326028005・・・[50]Train-rmse=10.7532270057404#RMSE算出sqrt(mean((preds2-test.y)^2))[1]8.511512
MXNetの線形回帰+深層ニューラルネット:結果
mx.set.seed(0)model2<-mx.model.FeedForward.create(lro2,X=train.x,y=train.y,ctx=mx.cpu(),num.round=50,array.batch.size=20,learning.rate=2e-6,momentum=0.9,eval.metric=mx.metric.rmse)Starttrainingwith1devices[1]Train-rmse=24.2765298493927[2]Train-rmse=24.2690448139394[3]Train-rmse=24.2609693838471[4]Train-rmse=24.2502836327908[5]Train-rmse=24.2384326028005・・・[50]Train-rmse=10.7532270057404#RMSE算出sqrt(mean((preds2-test.y)^2))[1]8.511512
MXNetの線形回帰+深層ニューラルネット:結果
#モデルの図示graph.viz(model2$symbol$as.json())ちゃんとDeepになってる →
mx.set.seed(0)model2<-mx.model.FeedForward.create(lro2,X=train.x,y=train.y,ctx=mx.cpu(),num.round=50,array.batch.size=20,learning.rate=2e-6,momentum=0.9,eval.metric=mx.metric.rmse)Starttrainingwith1devices[1]Train-rmse=24.2765298493927[2]Train-rmse=24.2690448139394[3]Train-rmse=24.2609693838471[4]Train-rmse=24.2502836327908[5]Train-rmse=24.2384326028005・・・[50]Train-rmse=10.7532270057404#Model2のRMSE[1]8.511512#Model1のRMSE[1]7.800502
MXNetの線形回帰+深層ニューラルネット:結果
#モデルの図示graph.viz(model2$symbol$as.json())ちゃんとDeepになってる →
Deepにしたらこの条件では性能が落ちてる…安易に深くすりゃ良いわけではないちゃんとしたチューニングや使い分けが必要
Enjoy!