株価の予測にこのニューラルネットワークは間違っていませんか?
株価の予測をしたいのですが、なかなかうまく行きません。
具体的には学習が全く進まないです。
私のこのニューラルネットワークの使い方自体は間違っていませんか?
[Input](すべて平均に対する倍率で正規化されています)
0 株価 始値
1 株価 高値
2 株価 安値
3 株価 終値
4 この日の特徴A
5 この日の特徴B
この日の特徴AとBは独自アルゴリズムで計算したその日の特徴になります。
今後の株価の上昇などに関連性があります。
私は誤検知を取り除きたいために機械学習をしようと試みています。
[Output]いずれかが1になります
0 最後のタイムステップから10日以内に1割上昇
1 最後のタイムステップか10日以内に特に変動なし
2 最後のタイムステップか10日以内に1割下洛
タイムステップは100です。
ミニバッチは32です。
epochは10です。(最初は1だったけど学習が微動だにしないので上げた)
===========INPUT===================
[[[ 1.0357, 1.0513, 1.0147 ... 0.9730 0.9695, 0.9734],
[ 1.0388, 1.0341, 1.0022 ... 0.9656 0.9734, 0.9734],
[ 1.0427, 1.0513, 1.0201 ... 0.9734 0.9734, 0.9738],
[ 1.0318, 1.0287, 0.9855 ... 0.9656 0.9664, 0.9734],
[ 1.6755, 1.2601, 0.3456 ... 0 0.7736, 6.7037],
[ 0.3751, 0.3616, 1.1761 ... 0.2864 0.5629, 0.4131]],
[[ 1.0821, 1.0801, 1.0601 ... 1.3061 1.3001, 1.2961],
[ 1.1001, 1.0901, 1.0401 ... 1.2981 1.2821, 1.3381],
[ 1.1001, 1.0901, 1.0601 ... 1.3101 1.3001, 1.3381],
[ 1.0801, 1.0621, 1.0241 ... 1.2601 1.2821, 1.2961],
[ 0.0688, 0.9349, 0.0838 ... 1.6641 0, 0.3009],
[ 1.3479, 0.0673, 0 ... 0.6315 0.9210, 58.8286]],
[[ 1.0900, 1.0708, 1.0708 ... 1.0900 1.0836, 1.0772],
[ 1.0772, 1.0580, 1.1157 ... 1.0836 1.0708, 1.0516],
[ 1.0964, 1.0708, 1.1157 ... 1.0900 1.0836, 1.0772],
[ 1.0772, 1.0451, 1.0708 ... 1.0772 1.0708, 1.0516],
[ 0.2267, 0.9888, 0 ... 0.5150 2.3653, 0],
[ 1.7519, 0.6446, 1.7559 ... 2.0206 0.2649, 9.3929]],
...,
[[ 0.9925, 0.9925, 0.9953 ... 1.0109 1.0091, 1.0119],
[ 0.9925, 0.9971, 0.9888 ... 1.0063 1.0119, 1.0082],
[ 0.9971, 0.9980, 0.9953 ... 1.0119 1.0119, 1.0128],
[ 0.9925, 0.9879, 0.9852 ... 1.0063 1.0073, 1.0063],
[ 0.5251, 0.5053, 0.4411 ... 1.9785 0.9391, 7.1644],
[ 0.9026, 0, 0.8412 ... 0.1732 0.1513, 0.0467]],
[[ 0.7903, 0.7764, 0.7875 ... 1.0193 1.0165, 0.9216],
[ 0.7764, 0.8015, 0.7819 ... 1.0221 1.0109, 0.9160],
[ 0.7959, 0.8015, 0.7959 ... 1.0584 1.0556, 0.9355],
[ 0.7764, 0.7764, 0.7819 ... 1.0193 1.0054, 0.8881],
[ 0.7363, 0.3788, 0.3158 ... 0.4995 0.6567, 6.4159],
[ 0.1783, 0.3246, 0.8313 ... 0.6535 0.3348, 0.1456]],
[[ 0.8960, 0.9086, 0.9194 ... 0.9844 0.9553, 0.9875],
[ 0.8935, 0.9169, 0.9068 ... 0.9680 0.9585, 1.0159],
[ 0.8960, 0.9219, 0.9225 ... 0.9869 0.9831, 1.0229],
[ 0.8821, 0.9023, 0.9017 ... 0.9642 0.9553, 0.9818],
[ 4.5974, 0, 0.6352 ... 0.4522 0.6429, 0.7656],
[ 0.3374, 0.3450, 1.0265 ... 1.5891 2.2172, 7.6396]]]
=================OUTPUT==================
[[[ 0, 0, 0 ... 0 0, 0],
[ 0, 0, 0 ... 0 0, 1.0000],
[ 0, 0, 0 ... 0 0, 0]],
[[ 0, 0, 0 ... 0 0, 1.0000],
[ 0, 0, 0 ... 0 0, 0],
[ 0, 0, 0 ... 0 0, 0]],
[[ 0, 0, 0 ... 0 0, 0],
[ 0, 0, 0 ... 0 0, 0],
[ 0, 0, 0 ... 0 0, 1.0000]],
...,
[[ 0, 0, 0 ... 0 0, 0],
[ 0, 0, 0 ... 0 0, 0],
[ 0, 0, 0 ... 0 0, 1.0000]],
[[ 0, 0, 0 ... 0 0, 0],
[ 0, 0, 0 ... 0 0, 1.0000],
[ 0, 0, 0 ... 0 0, 0]],
[[ 0, 0, 0 ... 0 0, 1.0000],
[ 0, 0, 0 ... 0 0, 0],
[ 0, 0, 0 ... 0 0, 0]]]
===========INPUT MASK===================
[[ 1.0000, 1.0000, 1.0000 ... 1.0000 1.0000, 1.0000],
[ 1.0000, 1.0000, 1.0000 ... 1.0000 1.0000, 1.0000],
[ 1.0000, 1.0000, 1.0000 ... 1.0000 1.0000, 1.0000],
...,
[ 1.0000, 1.0000, 1.0000 ... 1.0000 1.0000, 1.0000],
[ 1.0000, 1.0000, 1.0000 ... 1.0000 1.0000, 1.0000],
[ 1.0000, 1.0000, 1.0000 ... 1.0000 1.0000, 1.0000]]
===========OUTPUT MASK===================
[[ 0, 0, 0 ... 0 0, 1.0000],
[ 0, 0, 0 ... 0 0, 1.0000],
[ 0, 0, 0 ... 0 0, 1.0000],
...,
[ 0, 0, 0 ... 0 0, 1.0000],
[ 0, 0, 0 ... 0 0, 1.0000],
[ 0, 0, 0 ... 0 0, 1.0000]]
NumInputs = 6
NumOutputs = 3
NumLstmLayers = 256
val conf = NeuralNetConfiguration.Builder()
.seed(19920528)
.weightInit(WeightInit.XAVIER)
.miniBatch(true)
.updater(Adam())
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
.list()
.layer(LSTM.Builder()
.nIn(NumInputs)
.nOut(NumLstmLayers)
.activation(Activation.TANH)
.build()
)
.layer(LSTM.Builder()
.nIn(NumLstmLayers)
.nOut(NumLstmLayers)
.activation(Activation.TANH)
.build()
)
.layer(RnnOutputLayer.Builder(LossFunctions.LossFunction.MCXENT)
.nIn(NumLstmLayers)
.nOut(NumOutputs)
.activation(Activation.SOFTMAX)
.build()
)
// .backpropType(BackpropType.TruncatedBPTT)
// .tBPTTForwardLength(5)
// .tBPTTBackwardLength(5)
.build()
val nn = MultiLayerNetwork(conf)
nn.init()
追記
もしかしたら解決…?
ミニバッチで学習していますが、そのミニバッチ内のアウトプットパターンが均等になるようにデータを用意していました。
今回の場合、アウトプットが3パターンならミニバッチの数を3の倍数にし、
out[0]=0
out[1]=0
out[2]=1
out[0]=0
out[1]=1
out[2]=0
out[0]=1
out[1]=0
out[2]=0
out[0]=0
out[1]=0
out[2]=1
out[0]=0
out[1]=1
out[2]=0
out[0]=1
out[1]=0
out[2]=0
のようにアウトプットパーターンが均等になるようにデータを用意していました。
ミニバッチなのでアウトプットが相殺されて学習できなかったのでしょうか?