我正在尝试使用Tensorflow实现非线性回归(基于Tanh(x)的4个线性项和4个非线性项。
应该最小化的平方误差之和仅增加。经过相对较少的训练步骤后,权重和偏差变为“inf”
应该有一个简单的解决方案,类似于OLS系数
DETAIL Inputs.csv是一个1323x5表。因变量(y)是第一列,其余列(X1至X4)是四个特征。
前几行显示在这里
[
代码计算并比较两个模型 a)使用OLS的线性多变量模型 b)使用4个线性输出加4个非线性输入的混合Q模型。此模型在TensorFlow中实现
下面列出了python代码。它部分基于this Stack Overlow question
import pandas as pd, numpy as np, tensorflow as tf
from tqdm import tqdm as metered #progress bar
import matplotlib.pyplot as plt
import statsmodels.api as sm
from sklearn import preprocessing
# pandas data
df_train = d.read_csv(r'C:\Ajax\DS\inputs1.csv',sep="|")
obs=df_train.shape[0]
cols=df_train.shape[1]-1
dblcols = cols*2
graph = tf.get_default_graph()
# tf variables
x_ = tf.placeholder(name="input", shape=[None, cols], dtype=np.float32)
y_ = tf.placeholder(name="output", shape=[None, 1], dtype=np.float32)
wts = tf.Variable(tf.random_normal([dblcols,1]), name='weight')
b = tf.Variable(tf.random_normal([]), name='bias')
dependents= df_train["Y"].values.reshape(-1, 1)
feats = df_train.iloc[:, 1:1+cols].values.reshape(-1, cols)
本节实现OLS(多元线性回归)
ones = np.ones(obs).reshape(obs,1)
feats1 = np.concatenate((feats, ones), axis=1)
model1 = sm.OLS(dependents, feats1).fit()
print (model1.summary())
OLS_Yhat = model1.predict(feats1)
本节实现了包含4个线性项和4个非线性项的Q模型
agg= tf.concat((x_ , tf.tanh(x_)),axis=1)
Qmodel = tf.add(tf.matmul(agg, wts) , b)
ssq = tf.square(y_ - Qmodel, name='cost')
ssq1= tf.reduce_sum(ssq)
LR=.01
train_op = tf.train.GradientDescentOptimizer(LR).minimize(ssq1)
nz = preprocessing.MaxAbsScaler()
Zfeats1 = nz.fit_transform(feats)
Zfeats = Zfeats1 - np.mean(Zfeats1,axis=0)
print("\nNormalized feats\n", Zfeats[:9,:],"\nstdev=",np.std(Zfeats),"\n" )
n_epochs = 10000
train_errors, nt_errors, weights, biases = [],[],[],[]
config = tf.ConfigProto(device_count = {'GPU': 0})
fig, ax = plt.subplots()
fig = plt.gcf()
fig.set_size_inches(7, 7)
ax.set_ylabel(r'Prediction', fontsize=15)
ax.set_xlabel(r'Actual', fontsize=15)
ax.set_title('OLS and Q predictors')
ax.grid(True)
fig.tight_layout()
训练圈:
with tf.Session(config=config) as sess:
sess.run(tf.global_variables_initializer())
for i in metered(range(n_epochs)):
uu, err2, weight, bias = sess.run([train_op, ssq1, wts, b],
feed_dict={x_: Zfeats, y_: dependents})
out1.append(uu)
nt_errors.append(err2)
weights.append(weight)
biases.append(bias)
NN_yhat = sess.run(Qmodel, feed_dict={x_: Zfeats})
ax.scatter(dependents, NN_yhat, c='red', label='Q')
ax.scatter(dependents, OLS_Yhat, c='blue', label='OLS')
plt.legend()
plt.show()
该代码旨在将两个模型(在垂直轴上)生成的预测与实际数据(在水平轴上)进行比较。
注意,在10到30次迭代之后,权重和偏差呈指数增长并变为无穷大或NAN。平方误差之和随着时期呈指数增长。
将学习率从.01降低到.001无济于事。它需要3倍的历元,但错误单调增加,权重最终变为inf
OLS模型可以看到蓝色。但Qmodel无法显示,显然是因为一个1323x1的NAN数组被返回为NN_yhat
我还想了解为什么没有归还给uu。