Rを用いた機械学習モデルの構築の練習とそのメモである. 後述のRのpackageを用いて自身のMDシミュレーションを用いた研究に機械学習を導入することを目指す. 正確性を担保するためREADME.mdは日本語で記すが, 英語の練習も兼ねて英語 (README_(English).md) でも記す.
私の研究は, MD計算を用いて系に電圧を印加した際のカチオンの多孔質カーボンへの選択的吸着の特性を調査するものである. 本試行はRを用いてカチオンの質量 mass
, 価数 valent
, 第一/第二水和半径 r1/r2
, RDFの最大値 gr_max
並びに系に印加した電圧 vol
, 系の細孔径 pore_d
の7つの特徴量から細孔内へカチオンが吸着される確率 pred_P
を予測するモデルを作成する. data数は157個.
packages about ML
caret package
packages about MPI
doParallel package
packages about NN
nnet packeage
neuralnet package
install.packeges('[package name]')
(When you use packages after installation, don't forget library([package name])
.)
This package can calculate with MPI on your PC.
cl_n <- detectCores()
cl <- makePSOCKcluster(cl_n)
registerDoParallel(cl)
This package can construct 3 layers NN.
nn <- nnet(train_data, train_labels, size = 100, rang = 0.5, decay = 0, maxit = 1000)
Optimizer: BFGS method
act. func. (hidden): logistic sigmoid
act. func. (output): softmax or linear conbination
err. func.: MSE or closs enthoropy(?)
About this detail, please shows here.
hess=TRUEにしてヘッセ行列の固有値を出力しておくことで, モデルの簡易的な評価ができる. (w∗で評価されたヘッセ行列が正定値ならばw∗は極小点である. 確認法はeigen(nn$Hess, T)$vectors)
. here)
This package can construct large scare NN model.
nn <- neuralnet(formula = formula.nn,
data = train,
hidden = c(5), #the number of nodes in hidden layers: c(1st layer, 2nd layer, 3rd layer,,,)
act.fct="logistic", #select activated func. logistic/tanh
learningrate = 0.01,
threshold = 0.01,
stepmax = 1e+07,
err.fct = "sse", #select error func. ce(logistics)/sse()
startweights = NULL,
learningrate.factor = list(minus = 10.0, plus=10.0),
algorithm = "backprop",
linear.output=TRUE #If this model is logistic regression, this term sets "FALSE"
)
Optimizer: Back propagation, RPROP+ or RPROP-.
act. func.: logistic sigmoid, tanh or linear conbination
err. func.: MSE or closs enthoropy
About this detail, please shows here.
This package can deal with many ML. In this trial, I use it for data processing mainly.
About this detail, please shows here.
norm <- function(x){
return(abs(x-normalization[1,])/(normalization[2,]-normalization[1,]))
}
normed_data <- apply(dataset, 1, norm)
normed_data <- do.call("rbind", normed_data)
今回のdatasetは一様分布であるため, 上記の正規化を行った. 正規化の尺度を未知datasetと統一するため, 特徴量の最大値と最小値を記したnormalization.txtを別途用意し, このファイル内の数値を用いて正規化を行った.
#sinple multiple regression
sol.m <- lm(s_data$Ptotal~.,data=s_data)
#multiple regression considered exchange interaction
sol.m <- lm(s_data$Ptotal~.^2,data=s_data)
この関数でのs_data
は前述の7つの特徴量を示す.
このモデルはstep(sol.m)
関数を用いて変数減少法により最適化した.
good points
- 3層以上の複雑なNNを構築できる.
- act. func.やoptimizerなど様々な種類を指定できる.
- NNのplotをすることができる.
bad points
- neuralnet functionでは, 訓練データをdatasetとlabelに分けずに指定するので, label未知データを用いる場合どのように読み込めば良いか分からない.
- もっと高性能なReLU関数を使うことができない.
- DLモデルを構築することができるが, 個人所有のPCではdoParallerl packageを用いても4層以上のNNは処理しきれない.
good points
- 簡単.
- コンソールに tensorflow みたく学習過程が表示されるので見やすい.
- neuralnet packageに比べて学習が早く感じた.
bad points
- 最大3層NNまでしか組めない.
- NNモデルのplot機能が無い.
- 学習の収束地点はglobal minimumではない. (学習毎に結果が異なる.)
- 活性化関数の指定法がちゃんと理解できていない. (多分恒等関数とsoftmaxが使える) → 中間層は多分logistic sigmoid関数. 出力層はlinear outputとsoftmax関数が選べる.
色々調べながら取り組んだ結果, 一応モデルとしては完成した. そもそもdatasetがあまり多くないという問題を抱えているためこれからも様々なpackageを利用してみたい. Rはpackageごとの長所短所の差が激しいため, 汎用性の高いPythonのtensorflowでも似たようなモデルを構築したい.
nnet packageを用いて作成した100nodesの3層NNはtrain accuracy(RSME): 0.02, test accuracy(RMSE): 0.10 を示した.
この個人的なまとめを書いていて思ったが, caret packageがすごく使いやすそうなので今後勉強していきたい.
現状自分が抱える問題点, 疑問点を以下に記す.
- datasetでカバーされていない範囲の数値をパラメータとして予測に用いていいのか. (pore_d = 11までしかdatasetはカバーされていないが, pore_d = 15の時の数値を予測することが可能か.) → 多分ダメ.
- 未知datasetの正規化はどの尺度で行えばいいのか. → 多分training datasetと同じ尺度で行う.
- neuralnet packageに未知datasetを読み込ませて予測するにはどうすればいいのか. → 未知datasetのp_totalにダミーの数値を置いて導入する. (クライアントPCのスペックが低いため未試行.)
- RでReLU関数を用いるにはどのような関数を定義すればいいのか. → sigmoid libraryのrelu(x)
関数で使用可能. ただしact. func. として組み込めるのはneuralnet()
関数のみ.
ReLU <- function(x){
relu(x)
}
nn <- neuralnet(formula = formula.nn,
data = train,
hidden = c(5,5),
act.fct = ReLU,
learningrate = 0.01,
threshold = 0.01,
stepmax = 1e+06,
err.fct = "sse",
linear.output=TRUE)