多元线性回归问题求解使用的数据集是经典的boston房价数据。一共506个数据,后面56个数据我将其划了出来作为测试集。比较的简单,主要是学习步骤与算法。
另外顺带提供一个数据集网站——阿里天池,网站链接: 阿里天池数据集
类似的网站还有很多,但是个人觉得广泛浏览还不如专注一个。
该数据集每一个样本包括12个特征变量和该地区的平均房价。
数据读取
%matplotlib notebook
# 导入相关库
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.utils import shuffle
# 通过pandas读取数据文件
df=pd.read_csv("D:\\boston.csv",header=0)
# 显示数据摘要描述信息
print(df.describe())
# 获得df的值
df=df.values
print(df)
# 将df转化为np的数组格式
df=np.array(df)
print(df)
这里由于是多个变量,故和单变量采取的方法不同,多元线性回归的数据要进行归一化处理。
# 数据归一化处理
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]
print(x_data)
# y是最后1列标签数据
y_data=df[:,12]
print(y_data,y_data.shape)
…………
上面可以看出训练数据450个。(整的有点少,重在学习)
定义模型
# 定义训练数据的占位符
x=tf.placeholder(tf.float32,[None,12],name='X') #12个特征数据(12列)
y=tf.placeholder(tf.float32,[None,1],name='Y')#1个标签数据(1列)
由于多个变量,权值不同,故要采用的是矩阵叉乘。(用到了线性代数里面最简单基础的知识)😀
# 定义模型结构
with tf.name_scope('Model'): # 声明一个命名空间
# 初始化值为shape=(12,1)的随机数
w=tf.Variable(tf.random_normal([12,1],stddev=0.01),name='W')
# b 初始值为1.0
b=tf.Variable(1.0,name='b')
# w和x矩阵相乘matmul
def model(x,w,b):
return tf.matmul(x,w)+b
# 预测计算操作,定义一个前向计算节点
pred=model(x,w,b)
'''
注意的是:命名空间name_scope
Tensorflow计算图模型中常有数以千计节点,在可视化过程中很难显示出来,故用name_scope为变量划分范围,在可视化中就表示计算图的一个层级。
'''
训练模型
# 设置训练的超参数
# 迭代轮次
train_epochs=60
# 学习率
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)
# 迭代训练模型
#feed的数据要和placeholder的shape一致
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)
_,loss=sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys})
loss_sum+=loss
# 洗牌
x_data,y_data=shuffle(x_data,y_data)
b0temp=b.eval(session=sess)
w0temp=w.eval(session=sess)
loss_average=loss_sum/len(y_data)
print("epoch=",epoch+1,"loss_average=",loss_average,"b=",b0temp,"w=",w0temp)
模型预测
# 导入测试集
# 通过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)
预测值:21.364008
标签值:19
可以看到相差不大,但这并不意味着模型调教的好,有一定的偶然性,毕竟训练集比较少哈哈哈。
其实房价问题远没有这么简单,实际房价影响因素也会比这多得多,因此模型调教不太准确很正常,这里也是通过一个简单的数据集合进行多变量线性回归问题来学习注意事项以及基本步骤。
还只是一个炼丹白白,需要坚持不懈的努力!