多元线性回归问题(Tensorflow 求解)

JM 2020-05-04

多元线性回归问题求解使用的数据集是经典的boston房价数据。一共506个数据,后面56个数据我将其划了出来作为测试集。比较的简单,主要是学习步骤与算法。

该数据集每一个样本包括12个特征变量和该地区的平均房价。

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.utils import shuffle

# 读取数据文件
df=pd.read_csv("data/boston.csv",header=0)

# 显示数据摘要描述信息
# print(df.describe())
# 获取df的值
df=df.values
# 将df转化为np的数组格式
df=np.array(df)

# 对特征数据【0到11】列做(0-1)归一化
for i in range(12):
    df[:,i]=(df[:,i]-df[:,i].min()/df[:,i].max()-df[:,i].min())

# x_data为前12列特征数据
x_data=df[:,:12]
# y_data为最后一列标签数据
y_data=df[:,12]

# 模型定义

# 定义占位符,None表示行的数量未知
x=tf.placeholder(tf.float32,[None,12])  #12个特征数据
y=tf.placeholder(tf.float32,[None,1])   #1个标签数据

# 定义一个命名空间
with tf.name_scope("Model"):
    # w初始值为shape=(12,1)的随机数
    w=tf.Variable(tf.random_normal([12,1],stddev=0.01))
    # b初始值为1.0
    b=tf.Variable(1.0)
    # w和x矩阵相乘,用matmul,不能用mutiply或*
    def model(x,w,b):
        return tf.matmul(x,w)+b
    # 预测计算操作,前向计算结点
    pred=model(x,w,b)

# 模型训练

train_epochs=2 #迭代轮次
learning_rate=0.01  #学习率

# 定义均方差损失函数
with tf.name_scope("LossFunction"):
    loss_function=tf.reduce_mean(tf.pow(y-pred,2))  #均方误差

# 创建优化器
optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)

# 声明会话
sess=tf.Session()
init=tf.global_variables_initializer()
sess.run(init)

# 迭代训练
for epoch in range(train_epochs):
    loss_sum=0.0
    for xs,ys in zip(x_data,y_data):
        xs=xs.reshape(1,12)
        ys=ys.reshape(1,1)  #Feed数据必须和Placeholder的shape一致

        _,loss=sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys})
        loss_sum=loss_sum+loss

    # 打乱数据顺序
    x_data,y_data=shuffle(x_data,y_data)

    b0=b.eval(session=sess)
    w0=w.eval(session=sess)
    loss_average=loss_sum/len(y_data)

    print("epoch=",epoch+1,"loss=",loss_average,"b=",b0,"w=",w0)


 # 导入测试集

# 通过pandas读取数据文件
df_test = pd.read_csv("D:\\boston1.csv", header=0)

# 显示数据摘要描述信息
print(df_test.describe())
# 获得df的值
df_test=df_test.values
# 将df转化为np的数组格式
df_test=np.array(df_test)
# x_data是前面12列的特征数据
x_data_test=df[:,:12]
# y是最后1列标签数据
y_data_test=df_test[:,12]
print(y_data_test,y_data_test.shape)
# 预测模型
# 选取测试集的第36个数据测试,也可以选择其他的。
n=36
x_data_test=x_data_test[36].reshape(1,12)
predict=sess.run(pred,feed_dict={x:x_data_test})
print("预测值:%f"%predict)

target=int(y_data_test[n])
print("标签值:%d"%target)

在迭代训练的输出有问题输出只有几个有效数据,剩下的都是nan,改变超参数学习率有效数据增多,望给出修改意见

相关推荐