多元线性回归问题求解使用的数据集是经典的boston房价数据。一共506个数据,后面56个数据我将其划了出来作为测试集。比较的简单,主要是学习步骤与算法。
该数据集每一个样本包括12个特征变量和该地区的平均房价。
1 import tensorflow as tf 2 import matplotlib.pyplot as plt 3 import numpy as np 4 import pandas as pd 5 from sklearn.utils import shuffle 6 7 # 读取数据文件 8 df=pd.read_csv("data/boston.csv",header=0) 9 10 # 显示数据摘要描述信息 11 # print(df.describe()) 12 # 获取df的值 13 df=df.values 14 # 将df转化为np的数组格式 15 df=np.array(df) 16 17 # 对特征数据【0到11】列做(0-1)归一化 18 for i in range(12): 19 df[:,i]=(df[:,i]-df[:,i].min()/df[:,i].max()-df[:,i].min()) 20 21 # x_data为前12列特征数据 22 x_data=df[:,:12] 23 # y_data为最后一列标签数据 24 y_data=df[:,12] 25 26 # 模型定义 27 28 # 定义占位符,None表示行的数量未知 29 x=tf.placeholder(tf.float32,[None,12]) #12个特征数据 30 y=tf.placeholder(tf.float32,[None,1]) #1个标签数据 31 32 # 定义一个命名空间 33 with tf.name_scope("Model"): 34 # w初始值为shape=(12,1)的随机数 35 w=tf.Variable(tf.random_normal([12,1],stddev=0.01)) 36 # b初始值为1.0 37 b=tf.Variable(1.0) 38 # w和x矩阵相乘,用matmul,不能用mutiply或* 39 def model(x,w,b): 40 return tf.matmul(x,w)+b 41 # 预测计算操作,前向计算结点 42 pred=model(x,w,b) 43 44 # 模型训练 45 46 train_epochs=2 #迭代轮次 47 learning_rate=0.01 #学习率 48 49 # 定义均方差损失函数 50 with tf.name_scope("LossFunction"): 51 loss_function=tf.reduce_mean(tf.pow(y-pred,2)) #均方误差 52 53 # 创建优化器 54 optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function) 55 56 # 声明会话 57 sess=tf.Session() 58 init=tf.global_variables_initializer() 59 sess.run(init) 60 61 # 迭代训练 62 for epoch in range(train_epochs): 63 loss_sum=0.0 64 for xs,ys in zip(x_data,y_data): 65 xs=xs.reshape(1,12) 66 ys=ys.reshape(1,1) #Feed数据必须和Placeholder的shape一致 67 68 _,loss=sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys}) 69 loss_sum=loss_sum+loss 70 71 # 打乱数据顺序 72 x_data,y_data=shuffle(x_data,y_data) 73 74 b0=b.eval(session=sess) 75 w0=w.eval(session=sess) 76 loss_average=loss_sum/len(y_data) 77 78 print("epoch=",epoch+1,"loss=",loss_average,"b=",b0,"w=",w0) 79 80 81 # 导入测试集 82 83 # 通过pandas读取数据文件 84 df_test = pd.read_csv("D:\boston1.csv", header=0) 85 86 # 显示数据摘要描述信息 87 print(df_test.describe()) 88 # 获得df的值 89 df_test=df_test.values 90 # 将df转化为np的数组格式 91 df_test=np.array(df_test) 92 # x_data是前面12列的特征数据 93 x_data_test=df[:,:12] 94 # y是最后1列标签数据 95 y_data_test=df_test[:,12] 96 print(y_data_test,y_data_test.shape) 97 # 预测模型 98 # 选取测试集的第36个数据测试,也可以选择其他的。 99 n=36 100 x_data_test=x_data_test[36].reshape(1,12) 101 predict=sess.run(pred,feed_dict={x:x_data_test}) 102 print("预测值:%f"%predict) 103 104 target=int(y_data_test[n]) 105 print("标签值:%d"%target)
在迭代训练的输出有问题输出只有几个有效数据,剩下的都是nan,改变超参数学习率有效数据增多,望给出修改意见