深層ニューラルネットワークを用いて、4つの説明変数から2つの目的変数に対する回帰を試しています。
目的変数を1つにした場合と比較すると、訓練誤差も汎化誤差も比較にならないほど悪化してしまいます。場合によっては、出力変数ベクトルが全て同一 ((x1, y1) = (x2, y2) = ...(xn, yn)) になってしまうこともあります。
なお、データ数は2万(訓練データ1.6万、テストデータ:0.4万)で、使用しているソフトウェアは keras 、隠れ層の数は5、各層のノード数は32、活性化関数は Relu、最適化アルゴリズムは Adam です。
隠れ層の数を変えたり、各層のノード数を変えてもあまり効果は見られず、困っています。
説明変数の数やデータ数を増やすことは効果があるでしょうか?深層学習を勉強し始めたばかりの素人なのですが、何か予測精度を向上する方法をご存知でしたらご教示頂けますと幸いです。
どうぞよろしくお願い申し上げます。
なお、keras のコードは以下になります。
df = pd.read_csv('./data.csv')
x = df.loc[:, 'f_' : 'g_']
y = df.loc[:, 'x_' : 'y_']
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, shuffle= False)
x_train_mean = x_train.mean(axis=0) # 正規化
x_train_std = x_train.std(axis=0)
x_train -= x_train_mean
x_train /= x_train_std
y_train_mean = y_train.mean()
y_train_std = y_train.std()
y_train -= y_train_mean
y_train /= y_train_std
x_test -= x_train_mean
x_test /= x_train_std
y_test -= y_train_mean
y_test /= y_train_std
from keras.models import Sequential
from keras.layers import Dense, Activation
model = Sequential()
model.add(Dense(32, activation='relu', input_shape=(x_train.shape[1],))) # 入力層
model.add(Dense(32, activation='relu')) # 隠れ層(5層)
model.add(Dense(32, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(2)) # 出力層
from keras.optimizers import adam
model.compile(optimizer = 'adam', # 最適化アルゴリズム: Adam
loss = 'mse', # 損失関数: mse(平均二乗誤差)
metrics = ['mae']) # 評価関数: mae(平均絶対誤差)
history = model.fit(x_train, y_train, # トレーニングデータ
batch_size = 1, # バッチサイズ
epochs = 100, # エポック数
verbose = 1, # ログ出力の指定
validation_data = (x_test, y_test)) # テストデータ
model.predict(x_test)