Tensorflowで重回帰ってできないんですか?
どこのサイトを見ても、下記のような確率的勾配降下法を使った「疑似重回帰」の例しか載っていません。
Python
1import tensorflow as tf 2import numpy as np 3 4# 読み込み 5from sklearn.datasets import load_boston 6boston = load_boston() 7 8# データ分割 9from sklearn.model_selection import train_test_split 10X_train, X_test, y_train, y_test = X_train, X_test, y_train, y_test = train_test_split(boston['data'], boston['target'], test_size=0.3, random_state=0) 11 12# 型変換(変数の型はとりあえず、全てfloat32に変換しておけば間違いない) 13X_train = X_train.astype(np.float32) 14X_test = X_test.astype(np.float32) 15y_train = y_train.astype(np.float32) 16y_test = y_test.astype(np.float32) 17 18# 正規化 19import scipy.stats as sp 20X_train=sp.zscore(X_train,axis=1) 21X_test=sp.zscore(X_test,axis=1) 22 23# 説明変数の数 24x_num = X_train.shape[1] 25 26# 説明変数のPlaceholder 27X = tf.placeholder(tf.float32, shape = [None, x_num ]) 28 29# 目的変数のPlaceholder 30Y = tf.placeholder(tf.float32) 31 32# 回帰係数 33W = tf.Variable(tf.random_uniform([x_num, 1])) 34 35# 定数校 36b = tf.Variable(tf.zeros([1])) 37 38# 予測値算出式の定義 39y = tf.add(tf.matmul(X, W), b) 40 41# 損失関数の定義 42loss = tf.reduce_mean(tf.square(y - Y)) 43 44# 最適化基準の定義 45optimizer = tf.train.GradientDescentOptimizer(0.01) 46train = optimizer.minimize(loss) 47 48with tf.Session() as sess: 49 # 変数を使う場合は初期化が必要 50 sess.run(tf.global_variables_initializer()) 51 52 # 学習開始 53 for step in range(2001): 54 55 # 最適化実施 56 sess.run(train, feed_dict={X: X_train, Y: y_train}) 57 58 # 最新の回帰係数と定数校の記憶 59 W_new=sess.run(W) 60 b_new=sess.run(b) 61 62 # 経過出力 63 if step % 20 == 0: 64 print(step,sess.run(W),sess.run(b)) 65 66# 予測値の算出 67prediction=np.add(np.matmul(X_train, W_new), b_new) 68print(prediction) 69 70# 乖離度の算出 71np.mean( 72 np.abs( 73 (y_train-prediction)/y_train 74 ) 75)*100
また、上記の「疑似重回帰」の結果が思っているより悪いです。Placeholderの使い方を間違っているのでしょうか?上記は、bostonデータを、全説明変数を使って予測したものですが、下記の1説明変数のみを使って予測した結果よりも悪いです。なぜでしょうか?bostonのようなきれいなデータなら、説明変数が多い方が精度がいいはずなので、何か間違っているのではないかと考えます。
Python
1import tensorflow as tf 2import numpy as np 3 4# 読み込み 5from sklearn.datasets import load_boston 6boston = load_boston() 7 8# データ分割 9from sklearn.model_selection import train_test_split 10X_train, X_test, y_train, y_test = X_train, X_test, y_train, y_test = train_test_split(boston['data'], boston['target'], test_size=0.3, random_state=0) 11 12# 型変換(変数の型はとりあえず、全てfloat32に変換しておけば間違いない) 13X_train = X_train.astype(np.float32) 14X_test = X_test.astype(np.float32) 15y_train = y_train.astype(np.float32) 16y_test = y_test.astype(np.float32) 17 18# 正規化 19import scipy.stats as sp 20X_train=sp.zscore(X_train,axis=1) 21X_test=sp.zscore(X_test,axis=1) 22 23"""最適化 24""" 25# 回帰係数の定義 26W = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) 27# 定数項の定義 28b = tf.Variable(tf.random_uniform([1])) 29# 回帰式の定義 30y = W * X_train[:,0] + b 31 32# 損失関数の定義 33loss = tf.reduce_mean(tf.square(y - y_train)) 34 35# 最適化基準の定義 36optimizer = tf.train.GradientDescentOptimizer(0.01) 37train = optimizer.minimize(loss) 38 39with tf.Session() as sess: 40 # 変数を使う場合は初期化が必要 41 sess.run(tf.global_variables_initializer()) 42 43 # 学習開始 44 for step in range(2001): 45 # 最適化実施 46 sess.run(train) 47 48 # 最新の回帰係数と定数校の記憶 49 W_new = sess.run(W) 50 b_new = sess.run(b) 51 52 # 経過出力 53 if step % 20 == 0: 54 print(step, sess.run(W), sess.run(b)) 55 56prediction = X_train[:,0] * W_new + b_new 57print(prediction) 58 59np.mean( 60 np.abs( 61 (y_train-prediction)/y_train 62 ) 63)*100
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。