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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

758閲覧

Tensorflowで重回帰?

yamato_user

総合スコア2321

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/09/06 09:59

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

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

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

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

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

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

guest

回答1

0

重回帰について

重回帰は独立した説明変数がふたつ以上の回帰なので、tensorflowのモデルも重回帰です。あえていうとtensorflowのモデルはパラメーターの推定に数値計算的アプローチが用いられているのであって、あらかじめ導出された計算式を用いる解析的アプローチではありません。よって、proglabさんがいう「重回帰」が解析的アプローチによるものを指し示しているのであれば、tensorflowでは自力で実装しない限り不可能ということになります

予測精度について

予測精度をnp.mean(略)の結果で判断していると思いますが、使用する計算方法がいいと思いません。この方法だと1000倍と100分の1の誤差だと500.005、100倍と1000分の1だと50.0005となります。しかしながら1.0を基準とするとどちらも等価(つまり100倍と100分の1は大きいほうへ外れるか、小さいほうへ外れるのかの違いであって距離的には等価)となるように計算するべきです。

具体的にいうと対数変換したものの二乗平均を計算するといいと思います。先の例について、底を10として対数変換すると、3と-2、2と-3になるので二乗平均を計算すると誤差が等価になります。
たしか、sklearn.metricsに関数があったはずなので、調べてみてください

投稿2019/09/07 04:35

R.Shigemori

総合スコア3376

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問