質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

1回答

2645閲覧

複数の目的変数に対する回帰について

cc_trader

総合スコア7

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

2クリップ

投稿2019/09/01 21:50

編集2022/01/12 10:55

深層ニューラルネットワークを用いて、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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

R.Shigemori

2019/09/01 23:06

2つの目的変数は-∞~+∞の値をとる連続値という理解でいいでしょうか? コスト関数には二乗誤差平均を用いているという理解でいいでしょう? コードの記述ミスの可能性もあるので、質問を編集してコードを追記したほうがいいと思います
tiitoi

2019/09/02 02:30

データの正規化等はちゃんとやってるのでしょうか? 単純な回帰問題なら Deep Learning を使わないで、sklearn にあるようなアルゴリズムを使ったほうが精度がいいかと思います。
cc_trader

2019/09/02 10:54

R.Shigemori 様 早々にご助言頂きましてありがとうございました。 teratail での質問方法にも不慣れで、大変失礼致しました。 ご指摘に従い、質問を編集しコードを追記させて頂きました。 2つの目的変数は-∞~+∞ではなく、0~a(有限値)の値をとる 連続値になり、コスト関数には二乗誤差平均を用いております。
cc_trader

2019/09/02 10:57

tiitoi 様 早々にご助言下さりありがとうございました。 はい、正規化については施しているつもりですが、今一度確認してみます。 sklearn についてもご教示頂きありがとうございました。承知しました。 付属のアルゴリズムについても勉強してみます。
guest

回答1

0

確信はありませんが、とりあえず可能性がありそうなことを記載します。

まず、活性化関数にreluを用いていますが、reluは計算結果がマイナスだとゼロが出力されるという非線形の変化をする特性があります。今回は回帰という線形が仮定されるものなので、sigmoid関数か恒等関数のほうがいいように思います。
次に、損失関数にmseを使用していますがkerasの公式ドキュメントを確認して期待する損失関数になっていることを確認したほうがいいと思います。

モデルの作り方として、シンプルなモデルから少しづつ複雑にしていったほうがいいと思います。
まず、隠れ層なしのモデルから始めて、隠れ層を徐々に追加し、その後に活性化関数に手を加えるという感じにすれば、期待する結果に近づけることができるはずです

投稿2019/09/02 21:24

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問