凤7

导航

 

多元线性回归问题求解使用的数据集是经典的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,改变超参数学习率有效数据增多,望给出修改意见

 

posted on 2020-05-04 14:36  凤7  阅读(402)  评论(0编辑  收藏  举报