1

私は現在、6つのパラメータに基づいて住宅の価格を予測するために、次のコードを実行しています:回帰運動の巨大な損失!バッチインプットによるテスト?

import pandas as pd 
import tensorflow as tf 
import numpy as np 

housing = pd.read_csv('cal_housing_clean.csv') 

X = housing.iloc[:,0:6] 
y = housing.iloc[:,6:] 

from sklearn.model_selection import train_test_split 

X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3) 

from sklearn.preprocessing import MinMaxScaler 
scaler = MinMaxScaler() 
scaler.fit(X_train) 
X_train = pd.DataFrame(data=scaler.transform(X_train),columns = X_train.columns,index=X_train.index) 
X_test = pd.DataFrame(data=scaler.transform(X_test),columns = X_test.columns,index=X_test.index) 

X_data = tf.placeholder(dtype = "float", shape=[None,6]) 
y_target = tf.placeholder(dtype = "float", shape=[None,1]) 

hidden_layer_nodes = 10 

w1 = tf.Variable(tf.random_normal(shape=[6,hidden_layer_nodes])) 
b1 = tf.Variable(tf.random_normal(shape=[hidden_layer_nodes])) 
w2 = tf.Variable(tf.random_normal(shape=[hidden_layer_nodes,1])) 
b2 = tf.Variable(tf.random_normal(shape=[1])) 

hidden_output = tf.nn.relu(tf.add(tf.matmul(X_data,w1),b1)) 
y_output = tf.add(tf.matmul(hidden_output,w2),b2) 

loss = tf.reduce_mean(tf.square(y_target-y_output)) 

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.00001) 
train = optimizer.minimize(loss) 

init = tf.global_variables_initializer() 

steps = 100000 

with tf.Session() as sess: 

    sess.run(init) 

    for i in range(steps): 

     sess.run(train, feed_dict={X_data:X_train,y_target:y_train}) 

     if i%500 == 0: 

      print('Currently on step {}'.format(i)) 

      training_cost = sess.run(loss, feed_dict={X_data:X_test,y_target:y_test}) 
      print("Training cost=", training_cost/6192) 

    training_cost = sess.run(loss, feed_dict={X_data:X_test,y_target:y_test}) 
    print("Training cost=", training_cost/6192) 

私はここだけで全損失を分割したりすることを、test_setはデータの6192行が含まれているためと考えその値によって誤差が問題を解決するだろうが、残念ながら私は次の出力に達する:私は100または20万に近い値を持ちたいときにエラーが約2万台に下がるだろう

Currently on step 0 
Training cost= 9190063.95866 
Currently on step 500 
Training cost= 9062077.85013 
Currently on step 1000 
Training cost= 8927415.89664 
Currently on step 1500 
Training cost= 8795428.38243 
Currently on step 2000 
Training cost= 8666037.25065 
Currently on step 2500 
Training cost= 8539182.30491 
Currently on step 3000 
Training cost= 8414841.71576 

ているが。

おそらく、私のコードには、近似値が非常に悪いというエラーがあります。私は同じ結果で別のlearning_ratesも試しました。

また、テストデータをバッチで送信してモデルをテストしようとしたかったのです。私はこの試みた:

if i%500 == 0: 

    rand_ind = np.random.randint(len(X_test),size=8) 

    feed = {X_data:X_test[rand_ind],y_target:y_test[rand_ind]} 

    loss = tf.reduce_sum(tf.square(y_target-y_output))/8 

    print(sess.run(loss,feed_dict=feed)) 

を残念ながら私はいつも、私はそれが「ないインデックスに」rand_indで選んだインデックス、と言われています。

答えて

1

tf.train.AdamOptimizerを試して、学習率を上げることができます(おそらく約0.1)。これにより、収束率が向上します。

+0

残念ながら、以前のようにエラーがさらに大きくなっています – Schnurrberto

+0

申し訳ありませんが、実際にはすでに改善されている860000周りの損失は本当に低くなります。私のコードの中に、より良い損失を得ることを妨げる他のミスがありますか?私はその話題にはまったく新しく、正しい損失とオプティマイザ機能の選択に特に問題があると言わざるを得ない。 全体のセットではなく、より小さなバッチで損失をチェックするほうが助かりますか?私はrand_ind = np.random.random_integers(len(X_test)+1)とフィード= {X_data:X_test.iloc [rand_ind:rand_ind + 8、:]、y_target:y_test.iloc [rand_ind]でデータフレームから行を選択しようとしました:rand_ind + 8、:]} – Schnurrberto

+0

申し訳ありません、あなたの質問は私には分かりません。 StackOverflowとは異なる質問がある場合は、StackOverflowで別の質問をすることがあります。 btw損失が下がっている場合は、学習率をさらに上げることができます(1、1.5など)。 –