#はじめに
画像の分類やオブジェクト認識などの問題でDNNが注目されていまして,たくさんのサンプルコードが公開されています.これらは分類(classification)の問題ですが,回帰(regression)の問題をDNNで解きたい場面もあると思います.本稿ではtensorFlowとscikit-learnのデータセットを用いて回帰の問題を解いてみようと思います.
#データセット
scikit-learnの"diabetes"のデータセットを用います.これは糖尿病患者の生理学的な特徴量(10次元, real)と1年後の病状を表すターゲット(1次元, int)をセットにしたデータです.特徴量は$\pm0.2$に正規化されており,ターゲットの値域は$25<y<346$となっています.各特徴量がそれぞれの値が何を意味しているか理解していませんが,とりあえず回してみます.サンプル数は442です.
#ネットワーク構造
全結合構造(MLP)を用います.
入力は10次元,中間層は256次元,出力層は1次元です.活性化関数としてランプ関数( relu()
)を用いますが,出力層では活性化関数を用いずに直接出力とします.入出力は正規化等はせずそのまま使いました.
#コード
#特徴量
x = tf.placeholder("float", shape=[None, 10])
#ターゲット
y_ = tf.placeholder("float", shape=[None, 1])
w1 = tf.Variable(tf.truncated_normal([10, 256], stddev=0.1))
b1 = tf.Variable(tf.constant(1.0, shape=[256]))
h1 = tf.nn.relu(tf.matmul(x, w1) + b1)
w2 = tf.Variable(tf.truncated_normal([256, 1], stddev=0.1))
b2 = tf.Variable(tf.constant(1.0, shape=[1]))
y = tf.nn.relu(tf.matmul(h1, w2) + b2)
#二乗誤差
loss = tf.reduce_sum(tf.square(y - y_))
train_step = tf.train.AdagradOptimizer(0.05).minimize(loss)
入力が10次元の特徴ベクトルと1次元のターゲットとなります.誤差として二乗誤差を用いてAdagradOptimizer
によって最小化します.
#おわりに
回帰の問題においても分類の問題と同様の発想で,最終出力層のみ変更することで対応できました.今回はデータに対して特に前処理を行いませんでしが,生のデータであれば正規化等の処理が重要になってくると思われます.