2017-06-23 33 views
2

私はこれらの特徴とラベルを持っていますが、これは線形解法に満足できるほど線形ではありません。私はsklearnからSVR(カーネル= 'rbf')モデルを訓練しましたが、現在はテンソルフローでそれを行う時間があり、同じかより良い効果を得るために何を書くべきかを言うのは難しいです。Tensorflow。非線形回帰

enter image description here

あなたがそこにいる怠惰なオレンジ色のラインを参照していますか?そのオレンジ色のラインをやる気にさせる方法

import pandas as pd 
import numpy as np 
import tensorflow as tf 
import tqdm 
import matplotlib.pyplot as plt 
from omnicomm_data.test_data import get_model, clean_df 
import os 
from sklearn import preprocessing 

graph = tf.get_default_graph() 

# tf variables 
x_ = tf.placeholder(name="input", shape=[None, 1], dtype=np.float32) 
y_ = tf.placeholder(name="output", shape=[None, 1], dtype=np.float32) 
w = tf.Variable(tf.random_normal([]), name='weight') 
b = tf.Variable(tf.random_normal([]), name='bias') 
lin_model = tf.add(tf.multiply(x_, w), b) 

#loss 
loss = tf.reduce_mean(tf.pow(lin_model - y_, 2), name='loss') 
train_step = tf.train.GradientDescentOptimizer(0.000000025).minimize(loss) 

#nonlinear part 
nonlin_model = tf.tanh(tf.add(tf.multiply(x_, w), b)) 
nonlin_loss = tf.reduce_mean(tf.pow(nonlin_model - y_, 2), name='cost') 
train_step_nonlin = tf.train.GradientDescentOptimizer(0.000000025).minimize(nonlin_loss)  


# pandas data 
df_train = pd.read_csv('me_rate.csv', header=None) 

liters = df_train.iloc[:, 0].values.reshape(-1, 1) 
parrots = df_train.iloc[:, 1].values.reshape(-1, 1) 

#model for prediction 
mms = preprocessing.MinMaxScaler() 
rbf = get_model(path_to_model) 


n_epochs = 200 
train_errors = [] 
non_train_errors = [] 
test_errors = [] 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    for i in tqdm.tqdm(range(n_epochs)): 

     _, train_err, summ = sess.run([train_step, loss, summaries], 
           feed_dict={x_: parrots, y_: liters}) 
     summary_writer.add_summary(summ, i) 
     train_errors.append(train_err) 

     _, non_train_err, = sess.run([train_step_nonlin, nonlin_loss], 
             feed_dict={x_: parrots, y_: liters}) 
     non_train_errors.append(non_train_err) 


    plt.plot(list(range(n_epochs)), train_errors, label='train_lin') 
    plt.plot(list(range(n_epochs)), non_train_errors, label='train_nonlin') 
    plt.legend() 
    print(train_errors[:10]) 
    print(non_train_errors[:10]) 
    plt.show() 

    plt.scatter(parrots, liters, label='actual data') 
    plt.plot(parrots, sess.run(lin_model, feed_dict={x_: parrots}), label='linear (tf)') 
    plt.plot(parrots, sess.run(nonlin_model, feed_dict={x_: parrots}), label='nonlinear (tf)') 
    plt.plot(parrots, rbf.predict(mms.fit_transform(parrots)), label='rbf (sklearn)') 
    plt.legend() 
    plt.show() 

:それは決意

コードそのものであなたを満たしていませんか?

Part After。我々は(RBFとしてかなり良いではないが、そのはちょうどより多くの作業が必要)オレンジ色のラインのためのいくつかの改善を得た

import pandas as pd 
import numpy as np 
import tensorflow as tf 
import tqdm 
import matplotlib.pyplot as plt 
from omnicomm_data.test_data import get_model 
import os 
from sklearn import preprocessing 

graph = tf.get_default_graph() 

# tf variables 
x_ = tf.placeholder(name="input", shape=[None, 1], dtype=np.float32) 
y_ = tf.placeholder(name="output", shape=[None, 1], dtype=np.float32) 
w = tf.Variable(tf.random_normal([]), name='weight') 
b = tf.Variable(tf.random_normal([]), name='bias') 

# nonlinear 
nonlin_model = tf.add(tf.multiply(tf.tanh(x_), w), b) 
nonlin_loss = tf.reduce_mean(tf.pow(nonlin_model - y_, 2), name='cost') 
train_step_nonlin = tf.train.GradientDescentOptimizer(0.01).minimize(nonlin_loss) 


# pandas data 
df_train = pd.read_csv('me_rate.csv', header=None) 


liters = df_train.iloc[:, 0].values.reshape(-1, 1) 
parrots = df_train.iloc[:, 1].values.reshape(-1, 1) 


#model for prediction 
mms = preprocessing.MinMaxScaler() 
rbf = get_model(path_to_model) 


nz = preprocessing.MaxAbsScaler() # normalization coz tanh 
norm_parrots = nz.fit_transform(parrots) 
print(norm_parrots) 

n_epochs = 20000 
train_errors = [] 
non_train_errors = [] 
test_errors = [] 
weights = [] 
biases = [] 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    for i in tqdm.tqdm(range(n_epochs)): 

     _, non_train_err, weight, bias = sess.run([train_step_nonlin, nonlin_loss, w, b], 
             feed_dict={x_: norm_parrots, y_: liters}) 
     non_train_errors.append(non_train_err) 
     weights.append(weight) 
     biases.append(bias) 


    plt.scatter(norm_parrots, liters, label='actual data') 

    plt.plot(norm_parrots, sess.run(nonlin_model, feed_dict={x_: norm_parrots}), c='orange', label='nonlinear (tf)') 
    plt.plot(norm_parrots, rbf.predict(mms.fit_transform(parrots)), label='rbf (sklearn)') 
    plt.legend() 
    plt.show() 

enter image description here Asyoucanclearlysee:よう

コードが見えます。

+0

これは非常に良いです!しかし、あなたはSOの構造を保つために質問への実際の答えに答えを入れてください:) – OneHoopyFrood

答えて

2

あなたはtf.tanhをアクティブ化として使用しています。つまり、出力は[-1,1]の範囲で制限されています。したがって、あなたのデータには決して適合しません。

編集:既に修正されたタイプミスに気付いた部分を削除しました。

+0

ええ、私はコードをコピーした後に修正しましたが、ここでそれを修正するのを忘れてしまいました。悲しいことに、それはオレンジ色の線に助けになりませんでした。 –

+0

'tanh'機能を備えた@GrailFInderは動作しません。 –